* #29632: Added libsndfile dep
jni: updated sflphone
diff --git a/jni/libsndfile-1.0.25/src/.deps/aiff.Plo b/jni/libsndfile-1.0.25/src/.deps/aiff.Plo
new file mode 100644
index 0000000..f0ced94
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/aiff.Plo
@@ -0,0 +1,120 @@
+aiff.lo: aiff.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/ctype.h /usr/include/inttypes.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h sndfile.h sfendian.h \
+ /usr/include/byteswap.h common.h chanmap.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/ctype.h:
+
+/usr/include/inttypes.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+chanmap.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/alaw.Plo b/jni/libsndfile-1.0.25/src/.deps/alaw.Plo
new file mode 100644
index 0000000..560060f
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/alaw.Plo
@@ -0,0 +1,132 @@
+alaw.lo: alaw.c sfconfig.h config.h /usr/include/math.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/include/bits/huge_val.h /usr/include/bits/huge_valf.h \
+ /usr/include/bits/huge_vall.h /usr/include/bits/inf.h \
+ /usr/include/bits/nan.h /usr/include/bits/mathdef.h \
+ /usr/include/bits/mathcalls.h /usr/include/bits/mathinline.h sndfile.h \
+ /usr/include/stdio.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/sys/types.h /usr/include/time.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/select.h /usr/include/bits/select.h \
+ /usr/include/bits/sigset.h /usr/include/bits/time.h \
+ /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h common.h \
+ /usr/include/stdlib.h /usr/include/bits/waitflags.h \
+ /usr/include/bits/waitstatus.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/math.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+sndfile.h:
+
+/usr/include/stdio.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+common.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/au.Plo b/jni/libsndfile-1.0.25/src/.deps/au.Plo
new file mode 100644
index 0000000..d8df2e8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/au.Plo
@@ -0,0 +1,123 @@
+au.lo: au.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/bits/byteswap.h \
+ /usr/include/bits/byteswap-16.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/stdlib.h /usr/include/ctype.h \
+ sndfile.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/audio_detect.Plo b/jni/libsndfile-1.0.25/src/.deps/audio_detect.Plo
new file mode 100644
index 0000000..53b2273
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/audio_detect.Plo
@@ -0,0 +1,136 @@
+audio_detect.lo: audio_detect.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/unistd.h /usr/include/bits/posix_opt.h \
+ /usr/include/bits/environments.h /usr/include/bits/confname.h \
+ /usr/include/getopt.h /usr/include/string.h /usr/include/xlocale.h \
+ /usr/include/bits/string.h /usr/include/bits/string2.h \
+ /usr/include/errno.h /usr/include/bits/errno.h \
+ /usr/include/linux/errno.h /usr/include/asm/errno.h \
+ /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \
+ common.h /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h sndfile.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/unistd.h:
+
+/usr/include/bits/posix_opt.h:
+
+/usr/include/bits/environments.h:
+
+/usr/include/bits/confname.h:
+
+/usr/include/getopt.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/errno.h:
+
+/usr/include/bits/errno.h:
+
+/usr/include/linux/errno.h:
+
+/usr/include/asm/errno.h:
+
+/usr/include/asm-generic/errno.h:
+
+/usr/include/asm-generic/errno-base.h:
+
+common.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+sndfile.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/avr.Plo b/jni/libsndfile-1.0.25/src/.deps/avr.Plo
new file mode 100644
index 0000000..c57a61c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/avr.Plo
@@ -0,0 +1,113 @@
+avr.lo: avr.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/string.h /usr/include/xlocale.h \
+ /usr/include/bits/string.h /usr/include/bits/string2.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/stdlib.h sndfile.h /usr/include/sys/types.h \
+ /usr/include/time.h /usr/include/sys/select.h /usr/include/bits/select.h \
+ /usr/include/bits/sigset.h /usr/include/bits/time.h \
+ /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/stdlib.h:
+
+sndfile.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/broadcast.Plo b/jni/libsndfile-1.0.25/src/.deps/broadcast.Plo
new file mode 100644
index 0000000..69804d3
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/broadcast.Plo
@@ -0,0 +1,109 @@
+broadcast.lo: broadcast.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/string.h /usr/include/xlocale.h \
+ /usr/include/bits/string.h /usr/include/bits/string2.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/stdlib.h common.h /usr/include/bits/waitflags.h \
+ /usr/include/bits/waitstatus.h /usr/include/sys/types.h \
+ /usr/include/time.h /usr/include/sys/select.h /usr/include/bits/select.h \
+ /usr/include/bits/sigset.h /usr/include/bits/time.h \
+ /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h \
+ /usr/include/alloca.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h sndfile.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/stdlib.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+sndfile.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/caf.Plo b/jni/libsndfile-1.0.25/src/.deps/caf.Plo
new file mode 100644
index 0000000..2fca9ff
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/caf.Plo
@@ -0,0 +1,143 @@
+caf.lo: caf.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/ctype.h /usr/include/math.h \
+ /usr/include/bits/huge_val.h /usr/include/bits/huge_valf.h \
+ /usr/include/bits/huge_vall.h /usr/include/bits/inf.h \
+ /usr/include/bits/nan.h /usr/include/bits/mathdef.h \
+ /usr/include/bits/mathcalls.h /usr/include/bits/mathinline.h \
+ /usr/include/inttypes.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h sndfile.h sfendian.h \
+ /usr/include/byteswap.h common.h chanmap.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/ctype.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+/usr/include/inttypes.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+chanmap.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/chanmap.Plo b/jni/libsndfile-1.0.25/src/.deps/chanmap.Plo
new file mode 100644
index 0000000..33972ad
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/chanmap.Plo
@@ -0,0 +1,111 @@
+chanmap.lo: chanmap.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h sndfile.h common.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h chanmap.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+sndfile.h:
+
+common.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+chanmap.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/chunk.Plo b/jni/libsndfile-1.0.25/src/.deps/chunk.Plo
new file mode 100644
index 0000000..2910889
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/chunk.Plo
@@ -0,0 +1,114 @@
+chunk.lo: chunk.c sfconfig.h config.h /usr/include/stdlib.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/types.h \
+ /usr/include/bits/typesizes.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h sndfile.h /usr/include/stdio.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+sndfile.h:
+
+/usr/include/stdio.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/command.Plo b/jni/libsndfile-1.0.25/src/.deps/command.Plo
new file mode 100644
index 0000000..5988770
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/command.Plo
@@ -0,0 +1,131 @@
+command.lo: command.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/string.h /usr/include/xlocale.h \
+ /usr/include/bits/string.h /usr/include/bits/string2.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/stdlib.h /usr/include/math.h /usr/include/bits/huge_val.h \
+ /usr/include/bits/huge_valf.h /usr/include/bits/huge_vall.h \
+ /usr/include/bits/inf.h /usr/include/bits/nan.h \
+ /usr/include/bits/mathdef.h /usr/include/bits/mathcalls.h \
+ /usr/include/bits/mathinline.h sndfile.h /usr/include/sys/types.h \
+ /usr/include/time.h /usr/include/sys/select.h /usr/include/bits/select.h \
+ /usr/include/bits/sigset.h /usr/include/bits/time.h \
+ /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h common.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+sndfile.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/common.Plo b/jni/libsndfile-1.0.25/src/.deps/common.Plo
new file mode 100644
index 0000000..01add06
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/common.Plo
@@ -0,0 +1,144 @@
+common.lo: common.c config.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/string.h /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/bits/byteswap.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/bits/byteswap-16.h /usr/include/stdlib.h \
+ /usr/include/ctype.h /usr/include/math.h /usr/include/bits/huge_val.h \
+ /usr/include/bits/huge_valf.h /usr/include/bits/huge_vall.h \
+ /usr/include/bits/inf.h /usr/include/bits/nan.h \
+ /usr/include/bits/mathdef.h /usr/include/bits/mathcalls.h \
+ /usr/include/bits/mathinline.h /usr/include/time.h \
+ /usr/include/bits/time.h /usr/include/sys/time.h \
+ /usr/include/sys/select.h /usr/include/bits/select.h \
+ /usr/include/bits/sigset.h sndfile.h /usr/include/stdio.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/sys/types.h \
+ /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h sfendian.h \
+ sfconfig.h config.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h
+
+config.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/string.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+/usr/include/time.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+sndfile.h:
+
+/usr/include/stdio.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+sfendian.h:
+
+sfconfig.h:
+
+config.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/dither.Plo b/jni/libsndfile-1.0.25/src/.deps/dither.Plo
new file mode 100644
index 0000000..091688d
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/dither.Plo
@@ -0,0 +1,114 @@
+dither.lo: dither.c sfconfig.h config.h /usr/include/stdlib.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/types.h \
+ /usr/include/bits/typesizes.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h sndfile.h \
+ /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \
+ /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/string.h /usr/include/xlocale.h \
+ /usr/include/bits/string.h /usr/include/bits/string2.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+sndfile.h:
+
+/usr/include/stdio.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/double64.Plo b/jni/libsndfile-1.0.25/src/.deps/double64.Plo
new file mode 100644
index 0000000..6f62eb5
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/double64.Plo
@@ -0,0 +1,155 @@
+double64.lo: double64.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/limits.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/syslimits.h \
+ /usr/include/limits.h /usr/include/bits/posix1_lim.h \
+ /usr/include/bits/local_lim.h /usr/include/linux/limits.h \
+ /usr/include/bits/posix2_lim.h /usr/include/math.h \
+ /usr/include/bits/huge_val.h /usr/include/bits/huge_valf.h \
+ /usr/include/bits/huge_vall.h /usr/include/bits/inf.h \
+ /usr/include/bits/nan.h /usr/include/bits/mathdef.h \
+ /usr/include/bits/mathcalls.h /usr/include/bits/mathinline.h sndfile.h \
+ sfendian.h /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/limits.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/syslimits.h:
+
+/usr/include/limits.h:
+
+/usr/include/bits/posix1_lim.h:
+
+/usr/include/bits/local_lim.h:
+
+/usr/include/linux/limits.h:
+
+/usr/include/bits/posix2_lim.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/dwd.Plo b/jni/libsndfile-1.0.25/src/.deps/dwd.Plo
new file mode 100644
index 0000000..8593fc4
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/dwd.Plo
@@ -0,0 +1,123 @@
+dwd.lo: dwd.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/bits/byteswap.h \
+ /usr/include/bits/byteswap-16.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/stdlib.h /usr/include/ctype.h \
+ sndfile.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/dwvw.Plo b/jni/libsndfile-1.0.25/src/.deps/dwvw.Plo
new file mode 100644
index 0000000..86aeb9c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/dwvw.Plo
@@ -0,0 +1,136 @@
+dwvw.lo: dwvw.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/math.h \
+ /usr/include/bits/huge_val.h /usr/include/bits/huge_valf.h \
+ /usr/include/bits/huge_vall.h /usr/include/bits/inf.h \
+ /usr/include/bits/nan.h /usr/include/bits/mathdef.h \
+ /usr/include/bits/mathcalls.h /usr/include/bits/mathinline.h sndfile.h \
+ sfendian.h /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/file_io.Plo b/jni/libsndfile-1.0.25/src/.deps/file_io.Plo
new file mode 100644
index 0000000..feed9a9
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/file_io.Plo
@@ -0,0 +1,146 @@
+file_io.lo: file_io.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/unistd.h /usr/include/bits/posix_opt.h \
+ /usr/include/bits/environments.h /usr/include/bits/confname.h \
+ /usr/include/getopt.h /usr/include/string.h /usr/include/xlocale.h \
+ /usr/include/bits/string.h /usr/include/bits/string2.h \
+ /usr/include/fcntl.h /usr/include/bits/fcntl.h /usr/include/bits/stat.h \
+ /usr/include/errno.h /usr/include/bits/errno.h \
+ /usr/include/linux/errno.h /usr/include/asm/errno.h \
+ /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \
+ /usr/include/sys/stat.h sndfile.h common.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/unistd.h:
+
+/usr/include/bits/posix_opt.h:
+
+/usr/include/bits/environments.h:
+
+/usr/include/bits/confname.h:
+
+/usr/include/getopt.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/errno.h:
+
+/usr/include/bits/errno.h:
+
+/usr/include/linux/errno.h:
+
+/usr/include/asm/errno.h:
+
+/usr/include/asm-generic/errno.h:
+
+/usr/include/asm-generic/errno-base.h:
+
+/usr/include/sys/stat.h:
+
+sndfile.h:
+
+common.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/flac.Plo b/jni/libsndfile-1.0.25/src/.deps/flac.Plo
new file mode 100644
index 0000000..dc64b04
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/flac.Plo
@@ -0,0 +1,163 @@
+flac.lo: flac.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/fcntl.h /usr/include/bits/fcntl.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/ctype.h /usr/include/math.h \
+ /usr/include/bits/huge_val.h /usr/include/bits/huge_valf.h \
+ /usr/include/bits/huge_vall.h /usr/include/bits/inf.h \
+ /usr/include/bits/nan.h /usr/include/bits/mathdef.h \
+ /usr/include/bits/mathcalls.h /usr/include/bits/mathinline.h sndfile.h \
+ common.h /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h \
+ /usr/include/FLAC/stream_decoder.h /usr/include/FLAC/export.h \
+ /usr/include/FLAC/format.h /usr/include/FLAC/ordinals.h \
+ /usr/include/inttypes.h /usr/include/FLAC/stream_encoder.h \
+ /usr/include/FLAC/stream_decoder.h /usr/include/FLAC/metadata.h \
+ /usr/include/FLAC/callback.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/ctype.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+sndfile.h:
+
+common.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/FLAC/stream_decoder.h:
+
+/usr/include/FLAC/export.h:
+
+/usr/include/FLAC/format.h:
+
+/usr/include/FLAC/ordinals.h:
+
+/usr/include/inttypes.h:
+
+/usr/include/FLAC/stream_encoder.h:
+
+/usr/include/FLAC/stream_decoder.h:
+
+/usr/include/FLAC/metadata.h:
+
+/usr/include/FLAC/callback.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/float32.Plo b/jni/libsndfile-1.0.25/src/.deps/float32.Plo
new file mode 100644
index 0000000..20067c9
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/float32.Plo
@@ -0,0 +1,155 @@
+float32.lo: float32.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/limits.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/syslimits.h \
+ /usr/include/limits.h /usr/include/bits/posix1_lim.h \
+ /usr/include/bits/local_lim.h /usr/include/linux/limits.h \
+ /usr/include/bits/posix2_lim.h /usr/include/math.h \
+ /usr/include/bits/huge_val.h /usr/include/bits/huge_valf.h \
+ /usr/include/bits/huge_vall.h /usr/include/bits/inf.h \
+ /usr/include/bits/nan.h /usr/include/bits/mathdef.h \
+ /usr/include/bits/mathcalls.h /usr/include/bits/mathinline.h sndfile.h \
+ sfendian.h /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/limits.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/syslimits.h:
+
+/usr/include/limits.h:
+
+/usr/include/bits/posix1_lim.h:
+
+/usr/include/bits/local_lim.h:
+
+/usr/include/linux/limits.h:
+
+/usr/include/bits/posix2_lim.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/g72x.Plo b/jni/libsndfile-1.0.25/src/.deps/g72x.Plo
new file mode 100644
index 0000000..a929081
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/g72x.Plo
@@ -0,0 +1,138 @@
+g72x.lo: g72x.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/math.h \
+ /usr/include/bits/huge_val.h /usr/include/bits/huge_valf.h \
+ /usr/include/bits/huge_vall.h /usr/include/bits/inf.h \
+ /usr/include/bits/nan.h /usr/include/bits/mathdef.h \
+ /usr/include/bits/mathcalls.h /usr/include/bits/mathinline.h sndfile.h \
+ sfendian.h /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h G72x/g72x.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+G72x/g72x.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/gsm610.Plo b/jni/libsndfile-1.0.25/src/.deps/gsm610.Plo
new file mode 100644
index 0000000..ef3fb09
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/gsm610.Plo
@@ -0,0 +1,140 @@
+gsm610.lo: gsm610.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/math.h \
+ /usr/include/bits/huge_val.h /usr/include/bits/huge_valf.h \
+ /usr/include/bits/huge_vall.h /usr/include/bits/inf.h \
+ /usr/include/bits/nan.h /usr/include/bits/mathdef.h \
+ /usr/include/bits/mathcalls.h /usr/include/bits/mathinline.h sndfile.h \
+ sfendian.h /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h wav_w64.h GSM610/gsm.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+wav_w64.h:
+
+GSM610/gsm.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/htk.Plo b/jni/libsndfile-1.0.25/src/.deps/htk.Plo
new file mode 100644
index 0000000..d5739f8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/htk.Plo
@@ -0,0 +1,123 @@
+htk.lo: htk.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/bits/byteswap.h \
+ /usr/include/bits/byteswap-16.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/stdlib.h /usr/include/ctype.h \
+ sndfile.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/id3.Plo b/jni/libsndfile-1.0.25/src/.deps/id3.Plo
new file mode 100644
index 0000000..3e0cb9b
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/id3.Plo
@@ -0,0 +1,123 @@
+id3.lo: id3.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/bits/byteswap.h \
+ /usr/include/bits/byteswap-16.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/stdlib.h /usr/include/ctype.h \
+ sndfile.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/ima_adpcm.Plo b/jni/libsndfile-1.0.25/src/.deps/ima_adpcm.Plo
new file mode 100644
index 0000000..94985ef
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/ima_adpcm.Plo
@@ -0,0 +1,136 @@
+ima_adpcm.lo: ima_adpcm.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/math.h \
+ /usr/include/bits/huge_val.h /usr/include/bits/huge_valf.h \
+ /usr/include/bits/huge_vall.h /usr/include/bits/inf.h \
+ /usr/include/bits/nan.h /usr/include/bits/mathdef.h \
+ /usr/include/bits/mathcalls.h /usr/include/bits/mathinline.h sndfile.h \
+ sfendian.h /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/ima_oki_adpcm.Plo b/jni/libsndfile-1.0.25/src/.deps/ima_oki_adpcm.Plo
new file mode 100644
index 0000000..44c7f2b
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/ima_oki_adpcm.Plo
@@ -0,0 +1,112 @@
+ima_oki_adpcm.lo: ima_oki_adpcm.c sfconfig.h config.h \
+ /usr/include/string.h /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/bits/byteswap.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/bits/byteswap-16.h /usr/include/stdlib.h common.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h sndfile.h \
+ /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \
+ /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h ima_oki_adpcm.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/string.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/stdlib.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+sndfile.h:
+
+/usr/include/stdio.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+ima_oki_adpcm.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/interleave.Plo b/jni/libsndfile-1.0.25/src/.deps/interleave.Plo
new file mode 100644
index 0000000..692a9aa
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/interleave.Plo
@@ -0,0 +1,115 @@
+interleave.lo: interleave.c sfendian.h sfconfig.h config.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/types.h \
+ /usr/include/bits/typesizes.h /usr/include/bits/byteswap-16.h \
+ /usr/include/stdlib.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h sndfile.h \
+ /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \
+ /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h common.h /usr/include/string.h \
+ /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h
+
+sfendian.h:
+
+sfconfig.h:
+
+config.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/stdlib.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+sndfile.h:
+
+/usr/include/stdio.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+common.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/ircam.Plo b/jni/libsndfile-1.0.25/src/.deps/ircam.Plo
new file mode 100644
index 0000000..6f36ee9
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/ircam.Plo
@@ -0,0 +1,123 @@
+ircam.lo: ircam.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/bits/byteswap.h \
+ /usr/include/bits/byteswap-16.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/stdlib.h /usr/include/ctype.h \
+ sndfile.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/macbinary3.Plo b/jni/libsndfile-1.0.25/src/.deps/macbinary3.Plo
new file mode 100644
index 0000000..0d888c5
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/macbinary3.Plo
@@ -0,0 +1,114 @@
+macbinary3.lo: macbinary3.c sfconfig.h config.h /usr/include/stdlib.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/types.h \
+ /usr/include/bits/typesizes.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h sndfile.h /usr/include/stdio.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+sndfile.h:
+
+/usr/include/stdio.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/macos.Plo b/jni/libsndfile-1.0.25/src/.deps/macos.Plo
new file mode 100644
index 0000000..d39267c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/macos.Plo
@@ -0,0 +1,119 @@
+macos.lo: macos.c sfconfig.h config.h /usr/include/stdlib.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/types.h \
+ /usr/include/bits/typesizes.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/sys/stat.h \
+ /usr/include/bits/stat.h sndfile.h /usr/include/stdio.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/sys/stat.h:
+
+/usr/include/bits/stat.h:
+
+sndfile.h:
+
+/usr/include/stdio.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/mat4.Plo b/jni/libsndfile-1.0.25/src/.deps/mat4.Plo
new file mode 100644
index 0000000..d9b9aca
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/mat4.Plo
@@ -0,0 +1,145 @@
+mat4.lo: mat4.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/bits/byteswap.h \
+ /usr/include/bits/byteswap-16.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/stdlib.h /usr/include/ctype.h \
+ /usr/include/math.h /usr/include/bits/huge_val.h \
+ /usr/include/bits/huge_valf.h /usr/include/bits/huge_vall.h \
+ /usr/include/bits/inf.h /usr/include/bits/nan.h \
+ /usr/include/bits/mathdef.h /usr/include/bits/mathcalls.h \
+ /usr/include/bits/mathinline.h sndfile.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/mat5.Plo b/jni/libsndfile-1.0.25/src/.deps/mat5.Plo
new file mode 100644
index 0000000..5a634c3
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/mat5.Plo
@@ -0,0 +1,145 @@
+mat5.lo: mat5.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/bits/byteswap.h \
+ /usr/include/bits/byteswap-16.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/stdlib.h /usr/include/ctype.h \
+ /usr/include/math.h /usr/include/bits/huge_val.h \
+ /usr/include/bits/huge_valf.h /usr/include/bits/huge_vall.h \
+ /usr/include/bits/inf.h /usr/include/bits/nan.h \
+ /usr/include/bits/mathdef.h /usr/include/bits/mathcalls.h \
+ /usr/include/bits/mathinline.h sndfile.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/mpc2k.Plo b/jni/libsndfile-1.0.25/src/.deps/mpc2k.Plo
new file mode 100644
index 0000000..699bb9b
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/mpc2k.Plo
@@ -0,0 +1,123 @@
+mpc2k.lo: mpc2k.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/bits/byteswap.h \
+ /usr/include/bits/byteswap-16.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/stdlib.h /usr/include/ctype.h \
+ sndfile.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/ms_adpcm.Plo b/jni/libsndfile-1.0.25/src/.deps/ms_adpcm.Plo
new file mode 100644
index 0000000..474d587
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/ms_adpcm.Plo
@@ -0,0 +1,138 @@
+ms_adpcm.lo: ms_adpcm.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/math.h \
+ /usr/include/bits/huge_val.h /usr/include/bits/huge_valf.h \
+ /usr/include/bits/huge_vall.h /usr/include/bits/inf.h \
+ /usr/include/bits/nan.h /usr/include/bits/mathdef.h \
+ /usr/include/bits/mathcalls.h /usr/include/bits/mathinline.h sndfile.h \
+ sfendian.h /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h wav_w64.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+wav_w64.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/nist.Plo b/jni/libsndfile-1.0.25/src/.deps/nist.Plo
new file mode 100644
index 0000000..6d444c1
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/nist.Plo
@@ -0,0 +1,123 @@
+nist.lo: nist.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/bits/byteswap.h \
+ /usr/include/bits/byteswap-16.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/stdlib.h /usr/include/ctype.h \
+ sndfile.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/ogg.Plo b/jni/libsndfile-1.0.25/src/.deps/ogg.Plo
new file mode 100644
index 0000000..c355425
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/ogg.Plo
@@ -0,0 +1,168 @@
+ogg.lo: ogg.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/bits/byteswap.h \
+ /usr/include/bits/byteswap-16.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/stdlib.h /usr/include/ctype.h \
+ /usr/include/math.h /usr/include/bits/huge_val.h \
+ /usr/include/bits/huge_valf.h /usr/include/bits/huge_vall.h \
+ /usr/include/bits/inf.h /usr/include/bits/nan.h \
+ /usr/include/bits/mathdef.h /usr/include/bits/mathcalls.h \
+ /usr/include/bits/mathinline.h /usr/include/unistd.h \
+ /usr/include/bits/posix_opt.h /usr/include/bits/environments.h \
+ /usr/include/bits/confname.h /usr/include/getopt.h sndfile.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h /usr/include/ogg/ogg.h /usr/include/ogg/os_types.h \
+ /usr/include/ogg/config_types.h /usr/include/inttypes.h ogg.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+/usr/include/unistd.h:
+
+/usr/include/bits/posix_opt.h:
+
+/usr/include/bits/environments.h:
+
+/usr/include/bits/confname.h:
+
+/usr/include/getopt.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
+
+/usr/include/ogg/ogg.h:
+
+/usr/include/ogg/os_types.h:
+
+/usr/include/ogg/config_types.h:
+
+/usr/include/inttypes.h:
+
+ogg.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/ogg_pcm.Plo b/jni/libsndfile-1.0.25/src/.deps/ogg_pcm.Plo
new file mode 100644
index 0000000..f96b84b
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/ogg_pcm.Plo
@@ -0,0 +1,157 @@
+ogg_pcm.lo: ogg_pcm.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/bits/byteswap.h \
+ /usr/include/bits/byteswap-16.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/stdlib.h /usr/include/ctype.h \
+ /usr/include/math.h /usr/include/bits/huge_val.h \
+ /usr/include/bits/huge_valf.h /usr/include/bits/huge_vall.h \
+ /usr/include/bits/inf.h /usr/include/bits/nan.h \
+ /usr/include/bits/mathdef.h /usr/include/bits/mathcalls.h \
+ /usr/include/bits/mathinline.h /usr/include/unistd.h \
+ /usr/include/bits/posix_opt.h /usr/include/bits/environments.h \
+ /usr/include/bits/confname.h /usr/include/getopt.h sndfile.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+/usr/include/unistd.h:
+
+/usr/include/bits/posix_opt.h:
+
+/usr/include/bits/environments.h:
+
+/usr/include/bits/confname.h:
+
+/usr/include/getopt.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/ogg_speex.Plo b/jni/libsndfile-1.0.25/src/.deps/ogg_speex.Plo
new file mode 100644
index 0000000..303d14b
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/ogg_speex.Plo
@@ -0,0 +1,157 @@
+ogg_speex.lo: ogg_speex.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/bits/byteswap.h \
+ /usr/include/bits/byteswap-16.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/stdlib.h /usr/include/ctype.h \
+ /usr/include/math.h /usr/include/bits/huge_val.h \
+ /usr/include/bits/huge_valf.h /usr/include/bits/huge_vall.h \
+ /usr/include/bits/inf.h /usr/include/bits/nan.h \
+ /usr/include/bits/mathdef.h /usr/include/bits/mathcalls.h \
+ /usr/include/bits/mathinline.h /usr/include/unistd.h \
+ /usr/include/bits/posix_opt.h /usr/include/bits/environments.h \
+ /usr/include/bits/confname.h /usr/include/getopt.h sndfile.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+/usr/include/unistd.h:
+
+/usr/include/bits/posix_opt.h:
+
+/usr/include/bits/environments.h:
+
+/usr/include/bits/confname.h:
+
+/usr/include/getopt.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/ogg_vorbis.Plo b/jni/libsndfile-1.0.25/src/.deps/ogg_vorbis.Plo
new file mode 100644
index 0000000..3384394
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/ogg_vorbis.Plo
@@ -0,0 +1,176 @@
+ogg_vorbis.lo: ogg_vorbis.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/bits/byteswap.h \
+ /usr/include/bits/byteswap-16.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/stdlib.h /usr/include/ctype.h \
+ /usr/include/math.h /usr/include/bits/huge_val.h \
+ /usr/include/bits/huge_valf.h /usr/include/bits/huge_vall.h \
+ /usr/include/bits/inf.h /usr/include/bits/nan.h \
+ /usr/include/bits/mathdef.h /usr/include/bits/mathcalls.h \
+ /usr/include/bits/mathinline.h /usr/include/unistd.h \
+ /usr/include/bits/posix_opt.h /usr/include/bits/environments.h \
+ /usr/include/bits/confname.h /usr/include/getopt.h sndfile.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h /usr/include/ogg/ogg.h /usr/include/ogg/os_types.h \
+ /usr/include/ogg/config_types.h /usr/include/inttypes.h \
+ /usr/include/vorbis/codec.h /usr/include/vorbis/vorbisenc.h \
+ /usr/include/vorbis/codec.h ogg.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+/usr/include/unistd.h:
+
+/usr/include/bits/posix_opt.h:
+
+/usr/include/bits/environments.h:
+
+/usr/include/bits/confname.h:
+
+/usr/include/getopt.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
+
+/usr/include/ogg/ogg.h:
+
+/usr/include/ogg/os_types.h:
+
+/usr/include/ogg/config_types.h:
+
+/usr/include/inttypes.h:
+
+/usr/include/vorbis/codec.h:
+
+/usr/include/vorbis/vorbisenc.h:
+
+/usr/include/vorbis/codec.h:
+
+ogg.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/paf.Plo b/jni/libsndfile-1.0.25/src/.deps/paf.Plo
new file mode 100644
index 0000000..90fb06c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/paf.Plo
@@ -0,0 +1,145 @@
+paf.lo: paf.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/fcntl.h /usr/include/bits/fcntl.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/ctype.h /usr/include/math.h \
+ /usr/include/bits/huge_val.h /usr/include/bits/huge_valf.h \
+ /usr/include/bits/huge_vall.h /usr/include/bits/inf.h \
+ /usr/include/bits/nan.h /usr/include/bits/mathdef.h \
+ /usr/include/bits/mathcalls.h /usr/include/bits/mathinline.h sndfile.h \
+ sfendian.h /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/ctype.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/pcm.Plo b/jni/libsndfile-1.0.25/src/.deps/pcm.Plo
new file mode 100644
index 0000000..15092bc
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/pcm.Plo
@@ -0,0 +1,136 @@
+pcm.lo: pcm.c sfconfig.h config.h /usr/include/math.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/include/bits/huge_val.h /usr/include/bits/huge_valf.h \
+ /usr/include/bits/huge_vall.h /usr/include/bits/inf.h \
+ /usr/include/bits/nan.h /usr/include/bits/mathdef.h \
+ /usr/include/bits/mathcalls.h /usr/include/bits/mathinline.h sndfile.h \
+ /usr/include/stdio.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/sys/types.h /usr/include/time.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/select.h /usr/include/bits/select.h \
+ /usr/include/bits/sigset.h /usr/include/bits/time.h \
+ /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/stdlib.h /usr/include/bits/waitflags.h \
+ /usr/include/bits/waitstatus.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/math.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+sndfile.h:
+
+/usr/include/stdio.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/pvf.Plo b/jni/libsndfile-1.0.25/src/.deps/pvf.Plo
new file mode 100644
index 0000000..bb0282e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/pvf.Plo
@@ -0,0 +1,123 @@
+pvf.lo: pvf.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/bits/byteswap.h \
+ /usr/include/bits/byteswap-16.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/stdlib.h /usr/include/ctype.h \
+ sndfile.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/raw.Plo b/jni/libsndfile-1.0.25/src/.deps/raw.Plo
new file mode 100644
index 0000000..9e312b1
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/raw.Plo
@@ -0,0 +1,109 @@
+raw.lo: raw.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h sndfile.h /usr/include/sys/types.h \
+ /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/select.h /usr/include/bits/select.h \
+ /usr/include/bits/sigset.h /usr/include/bits/time.h \
+ /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h common.h \
+ /usr/include/stdlib.h /usr/include/bits/waitflags.h \
+ /usr/include/bits/waitstatus.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+sndfile.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+common.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/rf64.Plo b/jni/libsndfile-1.0.25/src/.deps/rf64.Plo
new file mode 100644
index 0000000..f5e2ea2
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/rf64.Plo
@@ -0,0 +1,125 @@
+rf64.lo: rf64.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/bits/byteswap.h \
+ /usr/include/bits/byteswap-16.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/stdlib.h /usr/include/ctype.h \
+ sndfile.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h wav_w64.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
+
+wav_w64.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/rx2.Plo b/jni/libsndfile-1.0.25/src/.deps/rx2.Plo
new file mode 100644
index 0000000..301f527
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/rx2.Plo
@@ -0,0 +1,116 @@
+rx2.lo: rx2.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/string.h /usr/include/xlocale.h \
+ /usr/include/bits/string.h /usr/include/bits/string2.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/stdlib.h /usr/include/ctype.h sndfile.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+sndfile.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/sd2.Plo b/jni/libsndfile-1.0.25/src/.deps/sd2.Plo
new file mode 100644
index 0000000..ac669f5
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/sd2.Plo
@@ -0,0 +1,116 @@
+sd2.lo: sd2.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/ctype.h sndfile.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/ctype.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/sds.Plo b/jni/libsndfile-1.0.25/src/.deps/sds.Plo
new file mode 100644
index 0000000..8c71eae
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/sds.Plo
@@ -0,0 +1,145 @@
+sds.lo: sds.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/fcntl.h /usr/include/bits/fcntl.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/ctype.h /usr/include/math.h \
+ /usr/include/bits/huge_val.h /usr/include/bits/huge_valf.h \
+ /usr/include/bits/huge_vall.h /usr/include/bits/inf.h \
+ /usr/include/bits/nan.h /usr/include/bits/mathdef.h \
+ /usr/include/bits/mathcalls.h /usr/include/bits/mathinline.h sndfile.h \
+ sfendian.h /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/ctype.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/sndfile.Plo b/jni/libsndfile-1.0.25/src/.deps/sndfile.Plo
new file mode 100644
index 0000000..7f5c86a
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/sndfile.Plo
@@ -0,0 +1,119 @@
+sndfile.lo: sndfile.c sfconfig.h config.h /usr/include/stdlib.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/types.h \
+ /usr/include/bits/typesizes.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/ctype.h /usr/include/assert.h \
+ sndfile.h /usr/include/stdio.h /usr/include/libio.h \
+ /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/ctype.h:
+
+/usr/include/assert.h:
+
+sndfile.h:
+
+/usr/include/stdio.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/strings.Plo b/jni/libsndfile-1.0.25/src/.deps/strings.Plo
new file mode 100644
index 0000000..241abd8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/strings.Plo
@@ -0,0 +1,131 @@
+strings.lo: strings.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/string.h /usr/include/xlocale.h \
+ /usr/include/bits/string.h /usr/include/bits/string2.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/stdlib.h /usr/include/math.h /usr/include/bits/huge_val.h \
+ /usr/include/bits/huge_valf.h /usr/include/bits/huge_vall.h \
+ /usr/include/bits/inf.h /usr/include/bits/nan.h \
+ /usr/include/bits/mathdef.h /usr/include/bits/mathcalls.h \
+ /usr/include/bits/mathinline.h sndfile.h /usr/include/sys/types.h \
+ /usr/include/time.h /usr/include/sys/select.h /usr/include/bits/select.h \
+ /usr/include/bits/sigset.h /usr/include/bits/time.h \
+ /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h common.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+sndfile.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/svx.Plo b/jni/libsndfile-1.0.25/src/.deps/svx.Plo
new file mode 100644
index 0000000..830ea9e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/svx.Plo
@@ -0,0 +1,116 @@
+svx.lo: svx.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/string.h /usr/include/xlocale.h \
+ /usr/include/bits/string.h /usr/include/bits/string2.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/stdlib.h /usr/include/ctype.h sndfile.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+sndfile.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/test_audio_detect.Po b/jni/libsndfile-1.0.25/src/.deps/test_audio_detect.Po
new file mode 100644
index 0000000..9ce06a8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/test_audio_detect.Po
@@ -0,0 +1 @@
+# dummy
diff --git a/jni/libsndfile-1.0.25/src/.deps/test_broadcast_var.Po b/jni/libsndfile-1.0.25/src/.deps/test_broadcast_var.Po
new file mode 100644
index 0000000..9ce06a8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/test_broadcast_var.Po
@@ -0,0 +1 @@
+# dummy
diff --git a/jni/libsndfile-1.0.25/src/.deps/test_conversions.Po b/jni/libsndfile-1.0.25/src/.deps/test_conversions.Po
new file mode 100644
index 0000000..9ce06a8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/test_conversions.Po
@@ -0,0 +1 @@
+# dummy
diff --git a/jni/libsndfile-1.0.25/src/.deps/test_endswap.Po b/jni/libsndfile-1.0.25/src/.deps/test_endswap.Po
new file mode 100644
index 0000000..9ce06a8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/test_endswap.Po
@@ -0,0 +1 @@
+# dummy
diff --git a/jni/libsndfile-1.0.25/src/.deps/test_file_io.Po b/jni/libsndfile-1.0.25/src/.deps/test_file_io.Po
new file mode 100644
index 0000000..9ce06a8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/test_file_io.Po
@@ -0,0 +1 @@
+# dummy
diff --git a/jni/libsndfile-1.0.25/src/.deps/test_float.Po b/jni/libsndfile-1.0.25/src/.deps/test_float.Po
new file mode 100644
index 0000000..9ce06a8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/test_float.Po
@@ -0,0 +1 @@
+# dummy
diff --git a/jni/libsndfile-1.0.25/src/.deps/test_ima_oki_adpcm.Po b/jni/libsndfile-1.0.25/src/.deps/test_ima_oki_adpcm.Po
new file mode 100644
index 0000000..9ce06a8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/test_ima_oki_adpcm.Po
@@ -0,0 +1 @@
+# dummy
diff --git a/jni/libsndfile-1.0.25/src/.deps/test_log_printf.Po b/jni/libsndfile-1.0.25/src/.deps/test_log_printf.Po
new file mode 100644
index 0000000..9ce06a8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/test_log_printf.Po
@@ -0,0 +1 @@
+# dummy
diff --git a/jni/libsndfile-1.0.25/src/.deps/test_main.Po b/jni/libsndfile-1.0.25/src/.deps/test_main.Po
new file mode 100644
index 0000000..9ce06a8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/test_main.Po
@@ -0,0 +1 @@
+# dummy
diff --git a/jni/libsndfile-1.0.25/src/.deps/test_strncpy_crlf.Po b/jni/libsndfile-1.0.25/src/.deps/test_strncpy_crlf.Po
new file mode 100644
index 0000000..9ce06a8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/test_strncpy_crlf.Po
@@ -0,0 +1 @@
+# dummy
diff --git a/jni/libsndfile-1.0.25/src/.deps/txw.Plo b/jni/libsndfile-1.0.25/src/.deps/txw.Plo
new file mode 100644
index 0000000..db809af
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/txw.Plo
@@ -0,0 +1,123 @@
+txw.lo: txw.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/bits/byteswap.h \
+ /usr/include/bits/byteswap-16.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/stdlib.h /usr/include/ctype.h \
+ sndfile.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/ulaw.Plo b/jni/libsndfile-1.0.25/src/.deps/ulaw.Plo
new file mode 100644
index 0000000..e748845
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/ulaw.Plo
@@ -0,0 +1,132 @@
+ulaw.lo: ulaw.c sfconfig.h config.h /usr/include/math.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/include/bits/huge_val.h /usr/include/bits/huge_valf.h \
+ /usr/include/bits/huge_vall.h /usr/include/bits/inf.h \
+ /usr/include/bits/nan.h /usr/include/bits/mathdef.h \
+ /usr/include/bits/mathcalls.h /usr/include/bits/mathinline.h sndfile.h \
+ /usr/include/stdio.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/sys/types.h /usr/include/time.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/select.h /usr/include/bits/select.h \
+ /usr/include/bits/sigset.h /usr/include/bits/time.h \
+ /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h common.h \
+ /usr/include/stdlib.h /usr/include/bits/waitflags.h \
+ /usr/include/bits/waitstatus.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/math.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+sndfile.h:
+
+/usr/include/stdio.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+common.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/voc.Plo b/jni/libsndfile-1.0.25/src/.deps/voc.Plo
new file mode 100644
index 0000000..662e87c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/voc.Plo
@@ -0,0 +1,114 @@
+voc.lo: voc.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h sndfile.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/vox_adpcm.Plo b/jni/libsndfile-1.0.25/src/.deps/vox_adpcm.Plo
new file mode 100644
index 0000000..dda2ac6
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/vox_adpcm.Plo
@@ -0,0 +1,138 @@
+vox_adpcm.lo: vox_adpcm.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/math.h \
+ /usr/include/bits/huge_val.h /usr/include/bits/huge_valf.h \
+ /usr/include/bits/huge_vall.h /usr/include/bits/inf.h \
+ /usr/include/bits/nan.h /usr/include/bits/mathdef.h \
+ /usr/include/bits/mathcalls.h /usr/include/bits/mathinline.h sndfile.h \
+ sfendian.h /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h ima_oki_adpcm.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+ima_oki_adpcm.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/w64.Plo b/jni/libsndfile-1.0.25/src/.deps/w64.Plo
new file mode 100644
index 0000000..fe84ce3
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/w64.Plo
@@ -0,0 +1,118 @@
+w64.lo: w64.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/string.h /usr/include/xlocale.h \
+ /usr/include/bits/string.h /usr/include/bits/string2.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/stdlib.h /usr/include/ctype.h /usr/include/time.h \
+ /usr/include/bits/time.h sndfile.h /usr/include/sys/types.h \
+ /usr/include/sys/select.h /usr/include/bits/select.h \
+ /usr/include/bits/sigset.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h wav_w64.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+/usr/include/time.h:
+
+/usr/include/bits/time.h:
+
+sndfile.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
+
+wav_w64.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/wav.Plo b/jni/libsndfile-1.0.25/src/.deps/wav.Plo
new file mode 100644
index 0000000..fcd2cba
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/wav.Plo
@@ -0,0 +1,120 @@
+wav.lo: wav.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/ctype.h /usr/include/inttypes.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h sndfile.h sfendian.h \
+ /usr/include/byteswap.h common.h wav_w64.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/ctype.h:
+
+/usr/include/inttypes.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+wav_w64.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/wav_w64.Plo b/jni/libsndfile-1.0.25/src/.deps/wav_w64.Plo
new file mode 100644
index 0000000..d7c9e0e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/wav_w64.Plo
@@ -0,0 +1,118 @@
+wav_w64.lo: wav_w64.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/string.h /usr/include/xlocale.h \
+ /usr/include/bits/string.h /usr/include/bits/string2.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/stdlib.h /usr/include/ctype.h /usr/include/time.h \
+ /usr/include/bits/time.h sndfile.h /usr/include/sys/types.h \
+ /usr/include/sys/select.h /usr/include/bits/select.h \
+ /usr/include/bits/sigset.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h wav_w64.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+/usr/include/time.h:
+
+/usr/include/bits/time.h:
+
+sndfile.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
+
+wav_w64.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/windows.Plo b/jni/libsndfile-1.0.25/src/.deps/windows.Plo
new file mode 100644
index 0000000..020b01e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/windows.Plo
@@ -0,0 +1,5 @@
+windows.lo: windows.c sfconfig.h config.h
+
+sfconfig.h:
+
+config.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/wve.Plo b/jni/libsndfile-1.0.25/src/.deps/wve.Plo
new file mode 100644
index 0000000..be21e0c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/wve.Plo
@@ -0,0 +1,123 @@
+wve.lo: wve.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/bits/byteswap.h \
+ /usr/include/bits/byteswap-16.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/stdlib.h /usr/include/ctype.h \
+ sndfile.h sfendian.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/alloca.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/ctype.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/alloca.h:
diff --git a/jni/libsndfile-1.0.25/src/.deps/xi.Plo b/jni/libsndfile-1.0.25/src/.deps/xi.Plo
new file mode 100644
index 0000000..a7f1f46
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.deps/xi.Plo
@@ -0,0 +1,145 @@
+xi.lo: xi.c sfconfig.h config.h /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/fcntl.h /usr/include/bits/fcntl.h /usr/include/bits/stat.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/ctype.h /usr/include/math.h \
+ /usr/include/bits/huge_val.h /usr/include/bits/huge_valf.h \
+ /usr/include/bits/huge_vall.h /usr/include/bits/inf.h \
+ /usr/include/bits/nan.h /usr/include/bits/mathdef.h \
+ /usr/include/bits/mathcalls.h /usr/include/bits/mathinline.h sndfile.h \
+ sfendian.h /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h \
+ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/byteswap.h \
+ common.h
+
+sfconfig.h:
+
+config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/ctype.h:
+
+/usr/include/math.h:
+
+/usr/include/bits/huge_val.h:
+
+/usr/include/bits/huge_valf.h:
+
+/usr/include/bits/huge_vall.h:
+
+/usr/include/bits/inf.h:
+
+/usr/include/bits/nan.h:
+
+/usr/include/bits/mathdef.h:
+
+/usr/include/bits/mathcalls.h:
+
+/usr/include/bits/mathinline.h:
+
+sndfile.h:
+
+sfendian.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdint.h:
+
+/usr/include/stdint.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/byteswap.h:
+
+common.h:
diff --git a/jni/libsndfile-1.0.25/src/.libs/aiff.o b/jni/libsndfile-1.0.25/src/.libs/aiff.o
new file mode 100644
index 0000000..ccefb46
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/aiff.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/alaw.o b/jni/libsndfile-1.0.25/src/.libs/alaw.o
new file mode 100644
index 0000000..20352b7
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/alaw.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/au.o b/jni/libsndfile-1.0.25/src/.libs/au.o
new file mode 100644
index 0000000..d080826
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/au.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/audio_detect.o b/jni/libsndfile-1.0.25/src/.libs/audio_detect.o
new file mode 100644
index 0000000..4b0ac83
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/audio_detect.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/avr.o b/jni/libsndfile-1.0.25/src/.libs/avr.o
new file mode 100644
index 0000000..2086f80
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/avr.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/broadcast.o b/jni/libsndfile-1.0.25/src/.libs/broadcast.o
new file mode 100644
index 0000000..ff10feb
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/broadcast.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/caf.o b/jni/libsndfile-1.0.25/src/.libs/caf.o
new file mode 100644
index 0000000..f7e2c6e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/caf.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/chanmap.o b/jni/libsndfile-1.0.25/src/.libs/chanmap.o
new file mode 100644
index 0000000..9fdf482
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/chanmap.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/chunk.o b/jni/libsndfile-1.0.25/src/.libs/chunk.o
new file mode 100644
index 0000000..b017fa7
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/chunk.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/command.o b/jni/libsndfile-1.0.25/src/.libs/command.o
new file mode 100644
index 0000000..e0af80c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/command.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/common.o b/jni/libsndfile-1.0.25/src/.libs/common.o
new file mode 100644
index 0000000..e4af3ba
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/common.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/dither.o b/jni/libsndfile-1.0.25/src/.libs/dither.o
new file mode 100644
index 0000000..fbe2210
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/dither.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/double64.o b/jni/libsndfile-1.0.25/src/.libs/double64.o
new file mode 100644
index 0000000..fcf5a2d
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/double64.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/dwd.o b/jni/libsndfile-1.0.25/src/.libs/dwd.o
new file mode 100644
index 0000000..bbf4f53
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/dwd.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/dwvw.o b/jni/libsndfile-1.0.25/src/.libs/dwvw.o
new file mode 100644
index 0000000..78e59e4
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/dwvw.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/file_io.o b/jni/libsndfile-1.0.25/src/.libs/file_io.o
new file mode 100644
index 0000000..5b4d298
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/file_io.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/flac.o b/jni/libsndfile-1.0.25/src/.libs/flac.o
new file mode 100644
index 0000000..6e714be
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/flac.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/float32.o b/jni/libsndfile-1.0.25/src/.libs/float32.o
new file mode 100644
index 0000000..45874f5
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/float32.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/g72x.o b/jni/libsndfile-1.0.25/src/.libs/g72x.o
new file mode 100644
index 0000000..fc58640
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/g72x.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/gsm610.o b/jni/libsndfile-1.0.25/src/.libs/gsm610.o
new file mode 100644
index 0000000..11d133e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/gsm610.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/htk.o b/jni/libsndfile-1.0.25/src/.libs/htk.o
new file mode 100644
index 0000000..d7bdece
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/htk.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/id3.o b/jni/libsndfile-1.0.25/src/.libs/id3.o
new file mode 100644
index 0000000..2540047
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/id3.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/ima_adpcm.o b/jni/libsndfile-1.0.25/src/.libs/ima_adpcm.o
new file mode 100644
index 0000000..2e3e9df
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/ima_adpcm.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/ima_oki_adpcm.o b/jni/libsndfile-1.0.25/src/.libs/ima_oki_adpcm.o
new file mode 100644
index 0000000..22a34d7
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/ima_oki_adpcm.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/interleave.o b/jni/libsndfile-1.0.25/src/.libs/interleave.o
new file mode 100644
index 0000000..586d543
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/interleave.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/ircam.o b/jni/libsndfile-1.0.25/src/.libs/ircam.o
new file mode 100644
index 0000000..d335598
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/ircam.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/libcommon.a b/jni/libsndfile-1.0.25/src/.libs/libcommon.a
new file mode 100644
index 0000000..3539cd3
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/libcommon.a
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/libcommon.la b/jni/libsndfile-1.0.25/src/.libs/libcommon.la
new file mode 120000
index 0000000..4f909b7
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/libcommon.la
@@ -0,0 +1 @@
+../libcommon.la
\ No newline at end of file
diff --git a/jni/libsndfile-1.0.25/src/.libs/libsndfile.a b/jni/libsndfile-1.0.25/src/.libs/libsndfile.a
new file mode 100644
index 0000000..5f9e29f
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/libsndfile.a
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/libsndfile.la b/jni/libsndfile-1.0.25/src/.libs/libsndfile.la
new file mode 120000
index 0000000..f3c83c0
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/libsndfile.la
@@ -0,0 +1 @@
+../libsndfile.la
\ No newline at end of file
diff --git a/jni/libsndfile-1.0.25/src/.libs/libsndfile.lai b/jni/libsndfile-1.0.25/src/.libs/libsndfile.lai
new file mode 100644
index 0000000..ec8692e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/libsndfile.lai
@@ -0,0 +1,41 @@
+# libsndfile.la - a libtool library file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='libsndfile.so.1'
+
+# Names of this library.
+library_names='libsndfile.so.1.0.25 libsndfile.so.1 libsndfile.so'
+
+# The name of the static archive.
+old_library='libsndfile.a'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags=''
+
+# Libraries that this one depends upon.
+dependency_libs=' -lFLAC -lvorbisenc -lvorbis -logg -lm'
+
+# Names of additional weak libraries provided by this library
+weak_library_names=''
+
+# Version information for libsndfile.
+current=1
+age=0
+revision=25
+
+# Is this an already installed library?
+installed=yes
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=no
+
+# Files to dlopen/dlpreopen
+dlopen=''
+dlpreopen=''
+
+# Directory that this library needs to be installed in:
+libdir='/usr/local/lib'
diff --git a/jni/libsndfile-1.0.25/src/.libs/libsndfile.so b/jni/libsndfile-1.0.25/src/.libs/libsndfile.so
new file mode 120000
index 0000000..9d2d0fc
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/libsndfile.so
@@ -0,0 +1 @@
+libsndfile.so.1.0.25
\ No newline at end of file
diff --git a/jni/libsndfile-1.0.25/src/.libs/libsndfile.so.1 b/jni/libsndfile-1.0.25/src/.libs/libsndfile.so.1
new file mode 120000
index 0000000..9d2d0fc
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/libsndfile.so.1
@@ -0,0 +1 @@
+libsndfile.so.1.0.25
\ No newline at end of file
diff --git a/jni/libsndfile-1.0.25/src/.libs/libsndfile.so.1.0.25 b/jni/libsndfile-1.0.25/src/.libs/libsndfile.so.1.0.25
new file mode 100755
index 0000000..192e6c0
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/libsndfile.so.1.0.25
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/macbinary3.o b/jni/libsndfile-1.0.25/src/.libs/macbinary3.o
new file mode 100644
index 0000000..185752d
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/macbinary3.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/macos.o b/jni/libsndfile-1.0.25/src/.libs/macos.o
new file mode 100644
index 0000000..70593a7
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/macos.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/mat4.o b/jni/libsndfile-1.0.25/src/.libs/mat4.o
new file mode 100644
index 0000000..2a8dc4d
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/mat4.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/mat5.o b/jni/libsndfile-1.0.25/src/.libs/mat5.o
new file mode 100644
index 0000000..0222bab
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/mat5.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/mpc2k.o b/jni/libsndfile-1.0.25/src/.libs/mpc2k.o
new file mode 100644
index 0000000..701f299
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/mpc2k.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/ms_adpcm.o b/jni/libsndfile-1.0.25/src/.libs/ms_adpcm.o
new file mode 100644
index 0000000..8b4cad4
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/ms_adpcm.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/nist.o b/jni/libsndfile-1.0.25/src/.libs/nist.o
new file mode 100644
index 0000000..304a553
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/nist.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/ogg.o b/jni/libsndfile-1.0.25/src/.libs/ogg.o
new file mode 100644
index 0000000..22be08b
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/ogg.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/ogg_pcm.o b/jni/libsndfile-1.0.25/src/.libs/ogg_pcm.o
new file mode 100644
index 0000000..178af8c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/ogg_pcm.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/ogg_speex.o b/jni/libsndfile-1.0.25/src/.libs/ogg_speex.o
new file mode 100644
index 0000000..78bf60a
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/ogg_speex.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/ogg_vorbis.o b/jni/libsndfile-1.0.25/src/.libs/ogg_vorbis.o
new file mode 100644
index 0000000..5a1134f
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/ogg_vorbis.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/paf.o b/jni/libsndfile-1.0.25/src/.libs/paf.o
new file mode 100644
index 0000000..382ad64
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/paf.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/pcm.o b/jni/libsndfile-1.0.25/src/.libs/pcm.o
new file mode 100644
index 0000000..065a45c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/pcm.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/pvf.o b/jni/libsndfile-1.0.25/src/.libs/pvf.o
new file mode 100644
index 0000000..ef90507
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/pvf.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/raw.o b/jni/libsndfile-1.0.25/src/.libs/raw.o
new file mode 100644
index 0000000..96aff43
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/raw.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/rf64.o b/jni/libsndfile-1.0.25/src/.libs/rf64.o
new file mode 100644
index 0000000..00f1ea7
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/rf64.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/rx2.o b/jni/libsndfile-1.0.25/src/.libs/rx2.o
new file mode 100644
index 0000000..344d66c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/rx2.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/sd2.o b/jni/libsndfile-1.0.25/src/.libs/sd2.o
new file mode 100644
index 0000000..541aef9
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/sd2.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/sds.o b/jni/libsndfile-1.0.25/src/.libs/sds.o
new file mode 100644
index 0000000..49dac99
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/sds.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/sndfile.o b/jni/libsndfile-1.0.25/src/.libs/sndfile.o
new file mode 100644
index 0000000..0e02b32
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/sndfile.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/strings.o b/jni/libsndfile-1.0.25/src/.libs/strings.o
new file mode 100644
index 0000000..b5cfe76
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/strings.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/svx.o b/jni/libsndfile-1.0.25/src/.libs/svx.o
new file mode 100644
index 0000000..171d3c1
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/svx.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/txw.o b/jni/libsndfile-1.0.25/src/.libs/txw.o
new file mode 100644
index 0000000..07fc6b1
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/txw.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/ulaw.o b/jni/libsndfile-1.0.25/src/.libs/ulaw.o
new file mode 100644
index 0000000..50dd3ce
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/ulaw.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/voc.o b/jni/libsndfile-1.0.25/src/.libs/voc.o
new file mode 100644
index 0000000..2007b28
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/voc.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/vox_adpcm.o b/jni/libsndfile-1.0.25/src/.libs/vox_adpcm.o
new file mode 100644
index 0000000..031dcf9
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/vox_adpcm.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/w64.o b/jni/libsndfile-1.0.25/src/.libs/w64.o
new file mode 100644
index 0000000..7ede10b
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/w64.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/wav.o b/jni/libsndfile-1.0.25/src/.libs/wav.o
new file mode 100644
index 0000000..3aa67e2
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/wav.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/wav_w64.o b/jni/libsndfile-1.0.25/src/.libs/wav_w64.o
new file mode 100644
index 0000000..1e8be78
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/wav_w64.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/windows.o b/jni/libsndfile-1.0.25/src/.libs/windows.o
new file mode 100644
index 0000000..ccd9b1f
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/windows.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/wve.o b/jni/libsndfile-1.0.25/src/.libs/wve.o
new file mode 100644
index 0000000..6828152
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/wve.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/.libs/xi.o b/jni/libsndfile-1.0.25/src/.libs/xi.o
new file mode 100644
index 0000000..871129d
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/.libs/xi.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/G72x/.deps/.dirstamp b/jni/libsndfile-1.0.25/src/G72x/.deps/.dirstamp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/.deps/.dirstamp
diff --git a/jni/libsndfile-1.0.25/src/G72x/.deps/g721.Plo b/jni/libsndfile-1.0.25/src/G72x/.deps/g721.Plo
new file mode 100644
index 0000000..6eca3c1
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/.deps/g721.Plo
@@ -0,0 +1,5 @@
+G72x/g721.lo: G72x/g721.c G72x/g72x.h G72x/g72x_priv.h
+
+G72x/g72x.h:
+
+G72x/g72x_priv.h:
diff --git a/jni/libsndfile-1.0.25/src/G72x/.deps/g723_16.Plo b/jni/libsndfile-1.0.25/src/G72x/.deps/g723_16.Plo
new file mode 100644
index 0000000..68754bd
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/.deps/g723_16.Plo
@@ -0,0 +1,5 @@
+G72x/g723_16.lo: G72x/g723_16.c G72x/g72x.h G72x/g72x_priv.h
+
+G72x/g72x.h:
+
+G72x/g72x_priv.h:
diff --git a/jni/libsndfile-1.0.25/src/G72x/.deps/g723_24.Plo b/jni/libsndfile-1.0.25/src/G72x/.deps/g723_24.Plo
new file mode 100644
index 0000000..75311b7
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/.deps/g723_24.Plo
@@ -0,0 +1,5 @@
+G72x/g723_24.lo: G72x/g723_24.c G72x/g72x.h G72x/g72x_priv.h
+
+G72x/g72x.h:
+
+G72x/g72x_priv.h:
diff --git a/jni/libsndfile-1.0.25/src/G72x/.deps/g723_40.Plo b/jni/libsndfile-1.0.25/src/G72x/.deps/g723_40.Plo
new file mode 100644
index 0000000..90c3d23
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/.deps/g723_40.Plo
@@ -0,0 +1,5 @@
+G72x/g723_40.lo: G72x/g723_40.c G72x/g72x.h G72x/g72x_priv.h
+
+G72x/g72x.h:
+
+G72x/g72x_priv.h:
diff --git a/jni/libsndfile-1.0.25/src/G72x/.deps/g72x.Plo b/jni/libsndfile-1.0.25/src/G72x/.deps/g72x.Plo
new file mode 100644
index 0000000..277b5de
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/.deps/g72x.Plo
@@ -0,0 +1,97 @@
+G72x/g72x.lo: G72x/g72x.c /usr/include/stdio.h /usr/include/features.h \
+ /usr/include/stdc-predef.h /usr/include/sys/cdefs.h \
+ /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \
+ /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h G72x/g72x.h G72x/g72x_priv.h
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+G72x/g72x.h:
+
+G72x/g72x_priv.h:
diff --git a/jni/libsndfile-1.0.25/src/G72x/.deps/g72x_test.Po b/jni/libsndfile-1.0.25/src/G72x/.deps/g72x_test.Po
new file mode 100644
index 0000000..9ce06a8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/.deps/g72x_test.Po
@@ -0,0 +1 @@
+# dummy
diff --git a/jni/libsndfile-1.0.25/src/G72x/.dirstamp b/jni/libsndfile-1.0.25/src/G72x/.dirstamp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/.dirstamp
diff --git a/jni/libsndfile-1.0.25/src/G72x/.libs/g721.o b/jni/libsndfile-1.0.25/src/G72x/.libs/g721.o
new file mode 100644
index 0000000..1583c9f
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/.libs/g721.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/G72x/.libs/g723_16.o b/jni/libsndfile-1.0.25/src/G72x/.libs/g723_16.o
new file mode 100644
index 0000000..0cabd81
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/.libs/g723_16.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/G72x/.libs/g723_24.o b/jni/libsndfile-1.0.25/src/G72x/.libs/g723_24.o
new file mode 100644
index 0000000..d97a362
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/.libs/g723_24.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/G72x/.libs/g723_40.o b/jni/libsndfile-1.0.25/src/G72x/.libs/g723_40.o
new file mode 100644
index 0000000..614d183
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/.libs/g723_40.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/G72x/.libs/g72x.o b/jni/libsndfile-1.0.25/src/G72x/.libs/g72x.o
new file mode 100644
index 0000000..aa35abf
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/.libs/g72x.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/G72x/.libs/libg72x.a b/jni/libsndfile-1.0.25/src/G72x/.libs/libg72x.a
new file mode 100644
index 0000000..6400358
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/.libs/libg72x.a
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/G72x/.libs/libg72x.la b/jni/libsndfile-1.0.25/src/G72x/.libs/libg72x.la
new file mode 120000
index 0000000..adfd646
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/.libs/libg72x.la
@@ -0,0 +1 @@
+../libg72x.la
\ No newline at end of file
diff --git a/jni/libsndfile-1.0.25/src/G72x/ChangeLog b/jni/libsndfile-1.0.25/src/G72x/ChangeLog
new file mode 100644
index 0000000..aa108df
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/ChangeLog
@@ -0,0 +1,50 @@
+2001-06-05  Erik de Castro Lopo  <erikd@mega-nerd.com>
+
+	* g72x.c
+	Added {} in function update () to prevent 'ambiguous else' warning messages.
+
+2000-07-14  Erik de Castro Lopo  <erikd@mega-nerd.com>
+
+	* g72x.c
+	Modified g72x_init_state () to fit in with the new structure of the code.
+	Implemented g72x_encode_block () and g72x_decode_block ().
+
+2000-07-12  Erik de Castro Lopo  <erikd@mega-nerd.com>
+
+    * g72x.h
+    Moved nearly all definitions and function prototypes from this file have been 
+    moved to private.h.
+    Added an enum defining the 4 different G72x ADPCM codecs.
+    Added new function prototypes to define a cleaner interface to the encoder 
+    and decoder. This new interface also allows samples to be processed in blocks
+    rather than on a sample by sample basis like the original code.
+    
+    * private.h
+    Added prototypes moved from g72x.h.
+    Changed struct g72x_state to a typedef struct { .. } G72x_PRIVATE.
+    Added fields to G72x_PRIVATE required for working on blocks of samples.
+
+2000-06-07  Erik de Castro Lopo  <erikd@mega-nerd.com>
+
+    * g72x.c
+    Fixed all compiler warnings.
+    Removed functions tandem_adjust() which is not required by libsndfile.
+    
+    * g721.c
+    Fixed all compiler warnings.
+    Removed functions tandem_adjust_alaw() and tandem_adjust_ulaw () which are not 
+    required by libsndfile.
+    Removed second parameter to g721_encoder () which is not required.
+
+    * g72x.h
+    Removed in_coding and out_coding parameters from all functions. These allowed
+    g72x encoding/decoding to/from A-law or u-law and are not required by libsndfile.
+    Removed unneeded defines for A-law, u-law and linear encoding.
+
+    * g723_16.c
+    Removed second parameter (in_coding) for g723_16_encoder().    
+    Removed second parameter (out_coding) for g723_16_decoder().
+    
+    * private.h
+    New file containing prototypes and tyepdefs private to G72x code.
+    
diff --git a/jni/libsndfile-1.0.25/src/G72x/README b/jni/libsndfile-1.0.25/src/G72x/README
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/README
diff --git a/jni/libsndfile-1.0.25/src/G72x/README.original b/jni/libsndfile-1.0.25/src/G72x/README.original
new file mode 100644
index 0000000..23b0e7d
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/README.original
@@ -0,0 +1,94 @@
+The files in this directory comprise ANSI-C language reference implementations
+of the CCITT (International Telegraph and Telephone Consultative Committee)
+G.711, G.721 and G.723 voice compressions.  They have been tested on Sun
+SPARCstations and passed 82 out of 84 test vectors published by CCITT
+(Dec. 20, 1988) for G.721 and G.723.  [The two remaining test vectors,
+which the G.721 decoder implementation for u-law samples did not pass,
+may be in error because they are identical to two other vectors for G.723_40.]
+
+This source code is released by Sun Microsystems, Inc. to the public domain.
+Please give your acknowledgement in product literature if this code is used
+in your product implementation.
+
+Sun Microsystems supports some CCITT audio formats in Solaris 2.0 system
+software.  However, Sun's implementations have been optimized for higher
+performance on SPARCstations.
+
+
+The source files for CCITT conversion routines in this directory are:
+
+	g72x.h		header file for g721.c, g723_24.c and g723_40.c
+	g711.c		CCITT G.711 u-law and A-law compression
+	g72x.c		common denominator of G.721 and G.723 ADPCM codes
+	g721.c		CCITT G.721 32Kbps ADPCM coder (with g72x.c)
+	g723_24.c	CCITT G.723 24Kbps ADPCM coder (with g72x.c)
+	g723_40.c	CCITT G.723 40Kbps ADPCM coder (with g72x.c)
+
+
+Simple conversions between u-law, A-law, and 16-bit linear PCM are invoked
+as follows:
+
+	unsigned char		ucode, acode;
+	short			pcm_val;
+
+	ucode = linear2ulaw(pcm_val);
+	ucode = alaw2ulaw(acode);
+
+	acode = linear2alaw(pcm_val);
+	acode = ulaw2alaw(ucode);
+
+	pcm_val = ulaw2linear(ucode);
+	pcm_val = alaw2linear(acode);
+
+
+The other CCITT compression routines are invoked as follows:
+
+	#include "g72x.h"
+
+	struct g72x_state	state;
+	int			sample, code;
+
+	g72x_init_state(&state);
+	code = {g721,g723_24,g723_40}_encoder(sample, coding, &state);
+	sample = {g721,g723_24,g723_40}_decoder(code, coding, &state);
+
+where
+	coding = AUDIO_ENCODING_ULAW	for 8-bit u-law samples
+		 AUDIO_ENCODING_ALAW	for 8-bit A-law samples
+		 AUDIO_ENCODING_LINEAR	for 16-bit linear PCM samples
+
+
+
+This directory also includes the following sample programs:
+
+	encode.c	CCITT ADPCM encoder
+	decode.c	CCITT ADPCM decoder
+	Makefile	makefile for the sample programs
+
+
+The sample programs contain examples of how to call the various compression
+routines and pack/unpack the bits.  The sample programs read byte streams from
+stdin and write to stdout.  The input/output data is raw data (no file header
+or other identifying information is embedded).  The sample programs are
+invoked as follows:
+
+	encode [-3|4|5] [-a|u|l] <infile >outfile
+	decode [-3|4|5] [-a|u|l] <infile >outfile
+where:
+	-3	encode to (decode from) G.723 24kbps (3-bit) data
+	-4	encode to (decode from) G.721 32kbps (4-bit) data [the default]
+	-5	encode to (decode from) G.723 40kbps (5-bit) data
+	-a	encode from (decode to) A-law data
+	-u	encode from (decode to) u-law data [the default]
+	-l	encode from (decode to) 16-bit linear data
+
+Examples:
+	# Read 16-bit linear and output G.721
+	encode -4 -l <pcmfile >g721file
+
+	# Read 40Kbps G.723 and output A-law
+	decode -5 -a <g723file >alawfile
+
+	# Compress and then decompress u-law data using 24Kbps G.723
+	encode -3 <ulawin | deoced -3 >ulawout
+
diff --git a/jni/libsndfile-1.0.25/src/G72x/g721.c b/jni/libsndfile-1.0.25/src/G72x/g721.c
new file mode 100644
index 0000000..d305ba8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/g721.c
@@ -0,0 +1,155 @@
+/*
+ * This source code is a product of Sun Microsystems, Inc. and is provided
+ * for unrestricted use.  Users may copy or modify this source code without
+ * charge.
+ *
+ * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
+ * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun source code is provided with no support and without any obligation on
+ * the part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California  94043
+ */
+
+/*
+ * g721.c
+ *
+ * Description:
+ *
+ * g721_encoder(), g721_decoder()
+ *
+ * These routines comprise an implementation of the CCITT G.721 ADPCM
+ * coding algorithm.  Essentially, this implementation is identical to
+ * the bit level description except for a few deviations which
+ * take advantage of work station attributes, such as hardware 2's
+ * complement arithmetic and large memory.  Specifically, certain time
+ * consuming operations such as multiplications are replaced
+ * with lookup tables and software 2's complement operations are
+ * replaced with hardware 2's complement.
+ *
+ * The deviation from the bit level specification (lookup tables)
+ * preserves the bit level performance specifications.
+ *
+ * As outlined in the G.721 Recommendation, the algorithm is broken
+ * down into modules.  Each section of code below is preceded by
+ * the name of the module which it is implementing.
+ *
+ */
+
+#include "g72x.h"
+#include "g72x_priv.h"
+
+static short qtab_721[7] = {-124, 80, 178, 246, 300, 349, 400};
+/*
+ * Maps G.721 code word to reconstructed scale factor normalized log
+ * magnitude values.
+ */
+static short	_dqlntab[16] = {-2048, 4, 135, 213, 273, 323, 373, 425,
+				425, 373, 323, 273, 213, 135, 4, -2048};
+
+/* Maps G.721 code word to log of scale factor multiplier. */
+static short	_witab[16] = {-12, 18, 41, 64, 112, 198, 355, 1122,
+				1122, 355, 198, 112, 64, 41, 18, -12};
+/*
+ * Maps G.721 code words to a set of values whose long and short
+ * term averages are computed and then compared to give an indication
+ * how stationary (steady state) the signal is.
+ */
+static short	_fitab[16] = {0, 0, 0, 0x200, 0x200, 0x200, 0x600, 0xE00,
+				0xE00, 0x600, 0x200, 0x200, 0x200, 0, 0, 0};
+
+/*
+ * g721_encoder()
+ *
+ * Encodes the input vale of linear PCM, A-law or u-law data sl and returns
+ * the resulting code. -1 is returned for unknown input coding value.
+ */
+int
+g721_encoder(
+	int		sl,
+	G72x_STATE *state_ptr)
+{
+	short		sezi, se, sez;		/* ACCUM */
+	short		d;			/* SUBTA */
+	short		sr;			/* ADDB */
+	short		y;			/* MIX */
+	short		dqsez;			/* ADDC */
+	short		dq, i;
+
+	/* linearize input sample to 14-bit PCM */
+	sl >>= 2;			/* 14-bit dynamic range */
+
+	sezi = predictor_zero(state_ptr);
+	sez = sezi >> 1;
+	se = (sezi + predictor_pole(state_ptr)) >> 1;	/* estimated signal */
+
+	d = sl - se;				/* estimation difference */
+
+	/* quantize the prediction difference */
+	y = step_size(state_ptr);		/* quantizer step size */
+	i = quantize(d, y, qtab_721, 7);	/* i = ADPCM code */
+
+	dq = reconstruct(i & 8, _dqlntab[i], y);	/* quantized est diff */
+
+	sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq;	/* reconst. signal */
+
+	dqsez = sr + sez - se;			/* pole prediction diff. */
+
+	update(4, y, _witab[i] << 5, _fitab[i], dq, sr, dqsez, state_ptr);
+
+	return (i);
+}
+
+/*
+ * g721_decoder()
+ *
+ * Description:
+ *
+ * Decodes a 4-bit code of G.721 encoded data of i and
+ * returns the resulting linear PCM, A-law or u-law value.
+ * return -1 for unknown out_coding value.
+ */
+int
+g721_decoder(
+	int		i,
+	G72x_STATE *state_ptr)
+{
+	short		sezi, sei, sez, se;	/* ACCUM */
+	short		y;			/* MIX */
+	short		sr;			/* ADDB */
+	short		dq;
+	short		dqsez;
+
+	i &= 0x0f;			/* mask to get proper bits */
+	sezi = predictor_zero(state_ptr);
+	sez = sezi >> 1;
+	sei = sezi + predictor_pole(state_ptr);
+	se = sei >> 1;			/* se = estimated signal */
+
+	y = step_size(state_ptr);	/* dynamic quantizer step size */
+
+	dq = reconstruct(i & 0x08, _dqlntab[i], y); /* quantized diff. */
+
+	sr = (dq < 0) ? (se - (dq & 0x3FFF)) : se + dq;	/* reconst. signal */
+
+	dqsez = sr - se + sez;			/* pole prediction diff. */
+
+	update(4, y, _witab[i] << 5, _fitab[i], dq, sr, dqsez, state_ptr);
+
+	/* sr was 14-bit dynamic range */
+	return (sr << 2);	
+}
+
diff --git a/jni/libsndfile-1.0.25/src/G72x/g721.lo b/jni/libsndfile-1.0.25/src/G72x/g721.lo
new file mode 100644
index 0000000..f9c938b
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/g721.lo
@@ -0,0 +1,12 @@
+# G72x/g721.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/g721.o'
+
+# Name of the non-PIC object
+non_pic_object='g721.o'
+
diff --git a/jni/libsndfile-1.0.25/src/G72x/g721.o b/jni/libsndfile-1.0.25/src/G72x/g721.o
new file mode 100644
index 0000000..00be76e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/g721.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/G72x/g723_16.c b/jni/libsndfile-1.0.25/src/G72x/g723_16.c
new file mode 100644
index 0000000..ae90b6c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/g723_16.c
@@ -0,0 +1,162 @@
+/*
+ * This source code is a product of Sun Microsystems, Inc. and is provided
+ * for unrestricted use.  Users may copy or modify this source code without
+ * charge.
+ *
+ * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
+ * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun source code is provided with no support and without any obligation on
+ * the part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California  94043
+ */
+/* 16kbps version created, used 24kbps code and changing as little as possible.
+ * G.726 specs are available from ITU's gopher or WWW site (http://www.itu.ch)
+ * If any errors are found, please contact me at mrand@tamu.edu
+ *      -Marc Randolph
+ */
+
+/*
+ * g723_16.c
+ *
+ * Description:
+ *
+ * g723_16_encoder(), g723_16_decoder()
+ *
+ * These routines comprise an implementation of the CCITT G.726 16 Kbps
+ * ADPCM coding algorithm.  Essentially, this implementation is identical to
+ * the bit level description except for a few deviations which take advantage
+ * of workstation attributes, such as hardware 2's complement arithmetic.
+ *
+ */
+
+#include "g72x.h"
+#include "g72x_priv.h"
+
+/*
+ * Maps G.723_16 code word to reconstructed scale factor normalized log
+ * magnitude values.  Comes from Table 11/G.726
+ */
+static short   _dqlntab[4] = { 116, 365, 365, 116}; 
+
+/* Maps G.723_16 code word to log of scale factor multiplier.
+ *
+ * _witab[4] is actually {-22 , 439, 439, -22}, but FILTD wants it
+ * as WI << 5  (multiplied by 32), so we'll do that here 
+ */
+static short   _witab[4] = {-704, 14048, 14048, -704};
+
+/*
+ * Maps G.723_16 code words to a set of values whose long and short
+ * term averages are computed and then compared to give an indication
+ * how stationary (steady state) the signal is.
+ */
+
+/* Comes from FUNCTF */
+static short   _fitab[4] = {0, 0xE00, 0xE00, 0};
+
+/* Comes from quantizer decision level tables (Table 7/G.726)
+ */
+static short qtab_723_16[1] = {261};
+
+
+/*
+ * g723_16_encoder()
+ *
+ * Encodes a linear PCM, A-law or u-law input sample and returns its 2-bit code.
+ * Returns -1 if invalid input coding value.
+ */
+int
+g723_16_encoder(
+       int             sl,
+       G72x_STATE *state_ptr)
+{
+       short           sei, sezi, se, sez;     /* ACCUM */
+       short           d;                      /* SUBTA */
+       short           y;                      /* MIX */
+       short           sr;                     /* ADDB */
+       short           dqsez;                  /* ADDC */
+       short           dq, i;
+
+		/* linearize input sample to 14-bit PCM */
+		sl >>= 2;               /* sl of 14-bit dynamic range */
+
+       sezi = predictor_zero(state_ptr);
+       sez = sezi >> 1;
+       sei = sezi + predictor_pole(state_ptr);
+       se = sei >> 1;                  /* se = estimated signal */
+
+       d = sl - se;                    /* d = estimation diff. */
+
+       /* quantize prediction difference d */
+       y = step_size(state_ptr);       /* quantizer step size */
+       i = quantize(d, y, qtab_723_16, 1);  /* i = ADPCM code */
+
+             /* Since quantize() only produces a three level output
+              * (1, 2, or 3), we must create the fourth one on our own
+              */
+       if (i == 3)                          /* i code for the zero region */
+         if ((d & 0x8000) == 0)             /* If d > 0, i=3 isn't right... */
+           i = 0;
+           
+       dq = reconstruct(i & 2, _dqlntab[i], y); /* quantized diff. */
+
+       sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq; /* reconstructed signal */
+
+       dqsez = sr + sez - se;          /* pole prediction diff. */
+
+       update(2, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+
+       return (i);
+}
+
+/*
+ * g723_16_decoder()
+ *
+ * Decodes a 2-bit CCITT G.723_16 ADPCM code and returns
+ * the resulting 16-bit linear PCM, A-law or u-law sample value.
+ * -1 is returned if the output coding is unknown.
+ */
+int
+g723_16_decoder(
+       int             i,
+       G72x_STATE *state_ptr)
+{
+       short           sezi, sei, sez, se;     /* ACCUM */
+       short           y;                      /* MIX */
+       short           sr;                     /* ADDB */
+       short           dq;
+       short           dqsez;
+
+       i &= 0x03;                      /* mask to get proper bits */
+       sezi = predictor_zero(state_ptr);
+       sez = sezi >> 1;
+       sei = sezi + predictor_pole(state_ptr);
+       se = sei >> 1;                  /* se = estimated signal */
+
+       y = step_size(state_ptr);       /* adaptive quantizer step size */
+       dq = reconstruct(i & 0x02, _dqlntab[i], y); /* unquantize pred diff */
+
+       sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq); /* reconst. signal */
+
+       dqsez = sr - se + sez;                  /* pole prediction diff. */
+
+       update(2, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+
+		/* sr was of 14-bit dynamic range */
+		return (sr << 2);       
+}
+
diff --git a/jni/libsndfile-1.0.25/src/G72x/g723_16.lo b/jni/libsndfile-1.0.25/src/G72x/g723_16.lo
new file mode 100644
index 0000000..bae838c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/g723_16.lo
@@ -0,0 +1,12 @@
+# G72x/g723_16.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/g723_16.o'
+
+# Name of the non-PIC object
+non_pic_object='g723_16.o'
+
diff --git a/jni/libsndfile-1.0.25/src/G72x/g723_16.o b/jni/libsndfile-1.0.25/src/G72x/g723_16.o
new file mode 100644
index 0000000..601dfa0
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/g723_16.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/G72x/g723_24.c b/jni/libsndfile-1.0.25/src/G72x/g723_24.c
new file mode 100644
index 0000000..02b6c24
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/g723_24.c
@@ -0,0 +1,139 @@
+/*
+ * This source code is a product of Sun Microsystems, Inc. and is provided
+ * for unrestricted use.  Users may copy or modify this source code without
+ * charge.
+ *
+ * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
+ * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun source code is provided with no support and without any obligation on
+ * the part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California  94043
+ */
+
+/*
+ * g723_24.c
+ *
+ * Description:
+ *
+ * g723_24_encoder(), g723_24_decoder()
+ *
+ * These routines comprise an implementation of the CCITT G.723 24 Kbps
+ * ADPCM coding algorithm.  Essentially, this implementation is identical to
+ * the bit level description except for a few deviations which take advantage
+ * of workstation attributes, such as hardware 2's complement arithmetic.
+ *
+ */
+
+#include "g72x.h"
+#include "g72x_priv.h"
+
+/*
+ * Maps G.723_24 code word to reconstructed scale factor normalized log
+ * magnitude values.
+ */
+static short	_dqlntab[8] = {-2048, 135, 273, 373, 373, 273, 135, -2048};
+
+/* Maps G.723_24 code word to log of scale factor multiplier. */
+static short	_witab[8] = {-128, 960, 4384, 18624, 18624, 4384, 960, -128};
+
+/*
+ * Maps G.723_24 code words to a set of values whose long and short
+ * term averages are computed and then compared to give an indication
+ * how stationary (steady state) the signal is.
+ */
+static short	_fitab[8] = {0, 0x200, 0x400, 0xE00, 0xE00, 0x400, 0x200, 0};
+
+static short qtab_723_24[3] = {8, 218, 331};
+
+/*
+ * g723_24_encoder()
+ *
+ * Encodes a linear PCM, A-law or u-law input sample and returns its 3-bit code.
+ * Returns -1 if invalid input coding value.
+ */
+int
+g723_24_encoder(
+	int		sl,
+	G72x_STATE *state_ptr)
+{
+	short		sei, sezi, se, sez;	/* ACCUM */
+	short		d;			/* SUBTA */
+	short		y;			/* MIX */
+	short		sr;			/* ADDB */
+	short		dqsez;			/* ADDC */
+	short		dq, i;
+
+	/* linearize input sample to 14-bit PCM */
+	sl >>= 2;		/* sl of 14-bit dynamic range */
+
+	sezi = predictor_zero(state_ptr);
+	sez = sezi >> 1;
+	sei = sezi + predictor_pole(state_ptr);
+	se = sei >> 1;			/* se = estimated signal */
+
+	d = sl - se;			/* d = estimation diff. */
+
+	/* quantize prediction difference d */
+	y = step_size(state_ptr);	/* quantizer step size */
+	i = quantize(d, y, qtab_723_24, 3);	/* i = ADPCM code */
+	dq = reconstruct(i & 4, _dqlntab[i], y); /* quantized diff. */
+
+	sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq; /* reconstructed signal */
+
+	dqsez = sr + sez - se;		/* pole prediction diff. */
+
+	update(3, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+
+	return (i);
+}
+
+/*
+ * g723_24_decoder()
+ *
+ * Decodes a 3-bit CCITT G.723_24 ADPCM code and returns
+ * the resulting 16-bit linear PCM, A-law or u-law sample value.
+ * -1 is returned if the output coding is unknown.
+ */
+int
+g723_24_decoder(
+	int		i,
+	G72x_STATE *state_ptr)
+{
+	short		sezi, sei, sez, se;	/* ACCUM */
+	short		y;			/* MIX */
+	short		sr;			/* ADDB */
+	short		dq;
+	short		dqsez;
+
+	i &= 0x07;			/* mask to get proper bits */
+	sezi = predictor_zero(state_ptr);
+	sez = sezi >> 1;
+	sei = sezi + predictor_pole(state_ptr);
+	se = sei >> 1;			/* se = estimated signal */
+
+	y = step_size(state_ptr);	/* adaptive quantizer step size */
+	dq = reconstruct(i & 0x04, _dqlntab[i], y); /* unquantize pred diff */
+
+	sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq); /* reconst. signal */
+
+	dqsez = sr - se + sez;			/* pole prediction diff. */
+
+	update(3, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+
+	return (sr << 2);	/* sr was of 14-bit dynamic range */
+}
+
diff --git a/jni/libsndfile-1.0.25/src/G72x/g723_24.lo b/jni/libsndfile-1.0.25/src/G72x/g723_24.lo
new file mode 100644
index 0000000..4ed0d3f
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/g723_24.lo
@@ -0,0 +1,12 @@
+# G72x/g723_24.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/g723_24.o'
+
+# Name of the non-PIC object
+non_pic_object='g723_24.o'
+
diff --git a/jni/libsndfile-1.0.25/src/G72x/g723_24.o b/jni/libsndfile-1.0.25/src/G72x/g723_24.o
new file mode 100644
index 0000000..f420014
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/g723_24.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/G72x/g723_40.c b/jni/libsndfile-1.0.25/src/G72x/g723_40.c
new file mode 100644
index 0000000..d520395
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/g723_40.c
@@ -0,0 +1,153 @@
+/*
+ * This source code is a product of Sun Microsystems, Inc. and is provided
+ * for unrestricted use.  Users may copy or modify this source code without
+ * charge.
+ *
+ * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
+ * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun source code is provided with no support and without any obligation on
+ * the part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California  94043
+ */
+
+/*
+ * g723_40.c
+ *
+ * Description:
+ *
+ * g723_40_encoder(), g723_40_decoder()
+ *
+ * These routines comprise an implementation of the CCITT G.723 40Kbps
+ * ADPCM coding algorithm.  Essentially, this implementation is identical to
+ * the bit level description except for a few deviations which
+ * take advantage of workstation attributes, such as hardware 2's
+ * complement arithmetic.
+ *
+ * The deviation from the bit level specification (lookup tables),
+ * preserves the bit level performance specifications.
+ *
+ * As outlined in the G.723 Recommendation, the algorithm is broken
+ * down into modules.  Each section of code below is preceded by
+ * the name of the module which it is implementing.
+ *
+ */
+
+#include "g72x.h"
+#include "g72x_priv.h"
+
+/*
+ * Maps G.723_40 code word to ructeconstructed scale factor normalized log
+ * magnitude values.
+ */
+static short	_dqlntab[32] = {-2048, -66, 28, 104, 169, 224, 274, 318,
+				358, 395, 429, 459, 488, 514, 539, 566,
+				566, 539, 514, 488, 459, 429, 395, 358,
+				318, 274, 224, 169, 104, 28, -66, -2048};
+
+/* Maps G.723_40 code word to log of scale factor multiplier. */
+static short	_witab[32] = {448, 448, 768, 1248, 1280, 1312, 1856, 3200,
+			4512, 5728, 7008, 8960, 11456, 14080, 16928, 22272,
+			22272, 16928, 14080, 11456, 8960, 7008, 5728, 4512,
+			3200, 1856, 1312, 1280, 1248, 768, 448, 448};
+
+/*
+ * Maps G.723_40 code words to a set of values whose long and short
+ * term averages are computed and then compared to give an indication
+ * how stationary (steady state) the signal is.
+ */
+static short	_fitab[32] = {0, 0, 0, 0, 0, 0x200, 0x200, 0x200,
+			0x200, 0x200, 0x400, 0x600, 0x800, 0xA00, 0xC00, 0xC00,
+			0xC00, 0xC00, 0xA00, 0x800, 0x600, 0x400, 0x200, 0x200,
+			0x200, 0x200, 0x200, 0, 0, 0, 0, 0};
+
+static short qtab_723_40[15] = {-122, -16, 68, 139, 198, 250, 298, 339,
+				378, 413, 445, 475, 502, 528, 553};
+
+/*
+ * g723_40_encoder()
+ *
+ * Encodes a 16-bit linear PCM, A-law or u-law input sample and retuens
+ * the resulting 5-bit CCITT G.723 40Kbps code.
+ * Returns -1 if the input coding value is invalid.
+ */
+int	g723_40_encoder (int sl, G72x_STATE *state_ptr)
+{
+	short		sei, sezi, se, sez;	/* ACCUM */
+	short		d;			/* SUBTA */
+	short		y;			/* MIX */
+	short		sr;			/* ADDB */
+	short		dqsez;			/* ADDC */
+	short		dq, i;
+
+	/* linearize input sample to 14-bit PCM */
+	sl >>= 2;		/* sl of 14-bit dynamic range */
+
+	sezi = predictor_zero(state_ptr);
+	sez = sezi >> 1;
+	sei = sezi + predictor_pole(state_ptr);
+	se = sei >> 1;			/* se = estimated signal */
+
+	d = sl - se;			/* d = estimation difference */
+
+	/* quantize prediction difference */
+	y = step_size(state_ptr);	/* adaptive quantizer step size */
+	i = quantize(d, y, qtab_723_40, 15);	/* i = ADPCM code */
+
+	dq = reconstruct(i & 0x10, _dqlntab[i], y);	/* quantized diff */
+
+	sr = (dq < 0) ? se - (dq & 0x7FFF) : se + dq; /* reconstructed signal */
+
+	dqsez = sr + sez - se;		/* dqsez = pole prediction diff. */
+
+	update(5, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+
+	return (i);
+}
+
+/*
+ * g723_40_decoder()
+ *
+ * Decodes a 5-bit CCITT G.723 40Kbps code and returns
+ * the resulting 16-bit linear PCM, A-law or u-law sample value.
+ * -1 is returned if the output coding is unknown.
+ */
+int	g723_40_decoder	(int i, G72x_STATE *state_ptr)
+{
+	short		sezi, sei, sez, se;	/* ACCUM */
+	short		y ;			/* MIX */
+	short		sr;			/* ADDB */
+	short		dq;
+	short		dqsez;
+
+	i &= 0x1f;			/* mask to get proper bits */
+	sezi = predictor_zero(state_ptr);
+	sez = sezi >> 1;
+	sei = sezi + predictor_pole(state_ptr);
+	se = sei >> 1;			/* se = estimated signal */
+
+	y = step_size(state_ptr);	/* adaptive quantizer step size */
+	dq = reconstruct(i & 0x10, _dqlntab[i], y);	/* estimation diff. */
+
+	sr = (dq < 0) ? (se - (dq & 0x7FFF)) : (se + dq); /* reconst. signal */
+
+	dqsez = sr - se + sez;		/* pole prediction diff. */
+
+	update(5, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+
+	return (sr << 2);	/* sr was of 14-bit dynamic range */
+}
+
diff --git a/jni/libsndfile-1.0.25/src/G72x/g723_40.lo b/jni/libsndfile-1.0.25/src/G72x/g723_40.lo
new file mode 100644
index 0000000..2971bad
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/g723_40.lo
@@ -0,0 +1,12 @@
+# G72x/g723_40.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/g723_40.o'
+
+# Name of the non-PIC object
+non_pic_object='g723_40.o'
+
diff --git a/jni/libsndfile-1.0.25/src/G72x/g723_40.o b/jni/libsndfile-1.0.25/src/G72x/g723_40.o
new file mode 100644
index 0000000..a41a6b6
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/g723_40.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/G72x/g72x.c b/jni/libsndfile-1.0.25/src/G72x/g72x.c
new file mode 100644
index 0000000..3fae81a
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/g72x.c
@@ -0,0 +1,644 @@
+/*
+ * This source code is a product of Sun Microsystems, Inc. and is provided
+ * for unrestricted use.  Users may copy or modify this source code without
+ * charge.
+ *
+ * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
+ * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun source code is provided with no support and without any obligation on
+ * the part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California  94043
+ */
+
+/*
+ * g72x.c
+ *
+ * Common routines for G.721 and G.723 conversions.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "g72x.h"
+#include "g72x_priv.h"
+
+static G72x_STATE * g72x_state_new (void) ;
+static int unpack_bytes (int bits, int blocksize, const unsigned char * block, short * samples) ;
+static int pack_bytes (int bits, const short * samples, unsigned char * block) ;
+
+static
+short power2 [15] =
+{	1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80,
+	0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000
+} ;
+
+/*
+ * quan()
+ *
+ * quantizes the input val against the table of size short integers.
+ * It returns i if table[i - 1] <= val < table[i].
+ *
+ * Using linear search for simple coding.
+ */
+static
+int quan (int val, short *table, int size)
+{
+	int		i;
+
+	for (i = 0; i < size; i++)
+		if (val < *table++)
+			break;
+	return (i);
+}
+
+/*
+ * fmult()
+ *
+ * returns the integer product of the 14-bit integer "an" and
+ * "floating point" representation (4-bit exponent, 6-bit mantessa) "srn".
+ */
+static
+int fmult (int an, int srn)
+{
+	short		anmag, anexp, anmant;
+	short		wanexp, wanmant;
+	short		retval;
+
+	anmag = (an > 0) ? an : ((-an) & 0x1FFF);
+	anexp = quan(anmag, power2, 15) - 6;
+	anmant = (anmag == 0) ? 32 :
+	    (anexp >= 0) ? anmag >> anexp : anmag << -anexp;
+	wanexp = anexp + ((srn >> 6) & 0xF) - 13;
+
+	/*
+	** The original was :
+	**		wanmant = (anmant * (srn & 0x3F) + 0x30) >> 4 ;
+	** but could see no valid reason for the + 0x30.
+	** Removed it and it improved the SNR of the codec.
+	*/
+
+	wanmant = (anmant * (srn & 0x3F)) >> 4 ;
+
+	retval = (wanexp >= 0) ? ((wanmant << wanexp) & 0x7FFF) :
+	    (wanmant >> -wanexp);
+
+	return (((an ^ srn) < 0) ? -retval : retval);
+}
+
+static G72x_STATE * g72x_state_new (void)
+{	return calloc (1, sizeof (G72x_STATE)) ;
+}
+
+/*
+ * private_init_state()
+ *
+ * This routine initializes and/or resets the G72x_PRIVATE structure
+ * pointed to by 'state_ptr'.
+ * All the initial state values are specified in the CCITT G.721 document.
+ */
+void private_init_state (G72x_STATE *state_ptr)
+{
+	int		cnta;
+
+	state_ptr->yl = 34816;
+	state_ptr->yu = 544;
+	state_ptr->dms = 0;
+	state_ptr->dml = 0;
+	state_ptr->ap = 0;
+	for (cnta = 0; cnta < 2; cnta++) {
+		state_ptr->a[cnta] = 0;
+		state_ptr->pk[cnta] = 0;
+		state_ptr->sr[cnta] = 32;
+	}
+	for (cnta = 0; cnta < 6; cnta++) {
+		state_ptr->b[cnta] = 0;
+		state_ptr->dq[cnta] = 32;
+	}
+	state_ptr->td = 0;
+}	/* private_init_state */
+
+struct g72x_state * g72x_reader_init (int codec, int *blocksize, int *samplesperblock)
+{	G72x_STATE *pstate ;
+
+	if ((pstate = g72x_state_new ()) == NULL)
+		return NULL ;
+
+	private_init_state (pstate) ;
+
+	pstate->encoder = NULL ;
+
+	switch (codec)
+	{	case G723_16_BITS_PER_SAMPLE : /* 2 bits per sample. */
+				pstate->decoder = g723_16_decoder ;
+				*blocksize = G723_16_BYTES_PER_BLOCK ;
+				*samplesperblock = G723_16_SAMPLES_PER_BLOCK ;
+				pstate->codec_bits = 2 ;
+				pstate->blocksize = G723_16_BYTES_PER_BLOCK ;
+				pstate->samplesperblock = G723_16_SAMPLES_PER_BLOCK ;
+				break ;
+
+		case G723_24_BITS_PER_SAMPLE : /* 3 bits per sample. */
+				pstate->decoder = g723_24_decoder ;
+				*blocksize = G723_24_BYTES_PER_BLOCK ;
+				*samplesperblock = G723_24_SAMPLES_PER_BLOCK ;
+				pstate->codec_bits = 3 ;
+				pstate->blocksize = G723_24_BYTES_PER_BLOCK ;
+				pstate->samplesperblock = G723_24_SAMPLES_PER_BLOCK ;
+				break ;
+
+		case G721_32_BITS_PER_SAMPLE : /* 4 bits per sample. */
+				pstate->decoder = g721_decoder ;
+				*blocksize = G721_32_BYTES_PER_BLOCK ;
+				*samplesperblock = G721_32_SAMPLES_PER_BLOCK ;
+				pstate->codec_bits = 4 ;
+				pstate->blocksize = G721_32_BYTES_PER_BLOCK ;
+				pstate->samplesperblock = G721_32_SAMPLES_PER_BLOCK ;
+				break ;
+
+		case G721_40_BITS_PER_SAMPLE : /* 5 bits per sample. */
+				pstate->decoder = g723_40_decoder ;
+				*blocksize = G721_40_BYTES_PER_BLOCK ;
+				*samplesperblock = G721_40_SAMPLES_PER_BLOCK ;
+				pstate->codec_bits = 5 ;
+				pstate->blocksize = G721_40_BYTES_PER_BLOCK ;
+				pstate->samplesperblock = G721_40_SAMPLES_PER_BLOCK ;
+				break ;
+
+		default :
+				free (pstate) ;
+				return NULL ;
+		} ;
+
+	return pstate ;
+}	/* g72x_reader_init */
+
+struct g72x_state * g72x_writer_init (int codec, int *blocksize, int *samplesperblock)
+{	G72x_STATE *pstate ;
+
+	if ((pstate = g72x_state_new ()) == NULL)
+		return NULL ;
+
+	private_init_state (pstate) ;
+	pstate->decoder = NULL ;
+
+	switch (codec)
+	{	case G723_16_BITS_PER_SAMPLE : /* 2 bits per sample. */
+				pstate->encoder = g723_16_encoder ;
+				*blocksize = G723_16_BYTES_PER_BLOCK ;
+				*samplesperblock = G723_16_SAMPLES_PER_BLOCK ;
+				pstate->codec_bits = 2 ;
+				pstate->blocksize = G723_16_BYTES_PER_BLOCK ;
+				pstate->samplesperblock = G723_16_SAMPLES_PER_BLOCK ;
+				break ;
+
+		case G723_24_BITS_PER_SAMPLE : /* 3 bits per sample. */
+				pstate->encoder = g723_24_encoder ;
+				*blocksize = G723_24_BYTES_PER_BLOCK ;
+				*samplesperblock = G723_24_SAMPLES_PER_BLOCK ;
+				pstate->codec_bits = 3 ;
+				pstate->blocksize = G723_24_BYTES_PER_BLOCK ;
+				pstate->samplesperblock = G723_24_SAMPLES_PER_BLOCK ;
+				break ;
+
+		case G721_32_BITS_PER_SAMPLE : /* 4 bits per sample. */
+				pstate->encoder = g721_encoder ;
+				*blocksize = G721_32_BYTES_PER_BLOCK ;
+				*samplesperblock = G721_32_SAMPLES_PER_BLOCK ;
+				pstate->codec_bits = 4 ;
+				pstate->blocksize = G721_32_BYTES_PER_BLOCK ;
+				pstate->samplesperblock = G721_32_SAMPLES_PER_BLOCK ;
+				break ;
+
+		case G721_40_BITS_PER_SAMPLE : /* 5 bits per sample. */
+				pstate->encoder = g723_40_encoder ;
+				*blocksize = G721_40_BYTES_PER_BLOCK ;
+				*samplesperblock = G721_40_SAMPLES_PER_BLOCK ;
+				pstate->codec_bits = 5 ;
+				pstate->blocksize = G721_40_BYTES_PER_BLOCK ;
+				pstate->samplesperblock = G721_40_SAMPLES_PER_BLOCK ;
+				break ;
+
+		default :
+				free (pstate) ;
+				return NULL ;
+		} ;
+
+	return pstate ;
+}	/* g72x_writer_init */
+
+int g72x_decode_block (G72x_STATE *pstate, const unsigned char *block, short *samples)
+{	int	k, count ;
+
+	count = unpack_bytes (pstate->codec_bits, pstate->blocksize, block, samples) ;
+
+	for (k = 0 ; k < count ; k++)
+		samples [k] = pstate->decoder (samples [k], pstate) ;
+
+	return 0 ;
+}	/* g72x_decode_block */
+
+int g72x_encode_block (G72x_STATE *pstate, short *samples, unsigned char *block)
+{	int k, count ;
+
+	for (k = 0 ; k < pstate->samplesperblock ; k++)
+		samples [k] = pstate->encoder (samples [k], pstate) ;
+
+	count = pack_bytes (pstate->codec_bits, samples, block) ;
+
+	return count ;
+}	/* g72x_encode_block */
+
+/*
+ * predictor_zero()
+ *
+ * computes the estimated signal from 6-zero predictor.
+ *
+ */
+int  predictor_zero (G72x_STATE *state_ptr)
+{
+	int		i;
+	int		sezi;
+
+	sezi = fmult(state_ptr->b[0] >> 2, state_ptr->dq[0]);
+	for (i = 1; i < 6; i++)			/* ACCUM */
+		sezi += fmult(state_ptr->b[i] >> 2, state_ptr->dq[i]);
+	return (sezi);
+}
+/*
+ * predictor_pole()
+ *
+ * computes the estimated signal from 2-pole predictor.
+ *
+ */
+int  predictor_pole(G72x_STATE *state_ptr)
+{
+	return (fmult(state_ptr->a[1] >> 2, state_ptr->sr[1]) +
+	    fmult(state_ptr->a[0] >> 2, state_ptr->sr[0]));
+}
+/*
+ * step_size()
+ *
+ * computes the quantization step size of the adaptive quantizer.
+ *
+ */
+int  step_size (G72x_STATE *state_ptr)
+{
+	int		y;
+	int		dif;
+	int		al;
+
+	if (state_ptr->ap >= 256)
+		return (state_ptr->yu);
+	else {
+		y = state_ptr->yl >> 6;
+		dif = state_ptr->yu - y;
+		al = state_ptr->ap >> 2;
+		if (dif > 0)
+			y += (dif * al) >> 6;
+		else if (dif < 0)
+			y += (dif * al + 0x3F) >> 6;
+		return (y);
+	}
+}
+
+/*
+ * quantize()
+ *
+ * Given a raw sample, 'd', of the difference signal and a
+ * quantization step size scale factor, 'y', this routine returns the
+ * ADPCM codeword to which that sample gets quantized.  The step
+ * size scale factor division operation is done in the log base 2 domain
+ * as a subtraction.
+ */
+int quantize(
+	int		d,	/* Raw difference signal sample */
+	int		y,	/* Step size multiplier */
+	short	*table,	/* quantization table */
+	int		size)	/* table size of short integers */
+{
+	short		dqm;	/* Magnitude of 'd' */
+	short		expon;	/* Integer part of base 2 log of 'd' */
+	short		mant;	/* Fractional part of base 2 log */
+	short		dl;	/* Log of magnitude of 'd' */
+	short		dln;	/* Step size scale factor normalized log */
+	int		i;
+
+	/*
+	 * LOG
+	 *
+	 * Compute base 2 log of 'd', and store in 'dl'.
+	 */
+	dqm = abs(d);
+	expon = quan(dqm >> 1, power2, 15);
+	mant = ((dqm << 7) >> expon) & 0x7F;	/* Fractional portion. */
+	dl = (expon << 7) + mant;
+
+	/*
+	 * SUBTB
+	 *
+	 * "Divide" by step size multiplier.
+	 */
+	dln = dl - (y >> 2);
+
+	/*
+	 * QUAN
+	 *
+	 * Obtain codword i for 'd'.
+	 */
+	i = quan(dln, table, size);
+	if (d < 0)			/* take 1's complement of i */
+		return ((size << 1) + 1 - i);
+	else if (i == 0)		/* take 1's complement of 0 */
+		return ((size << 1) + 1); /* new in 1988 */
+	else
+		return (i);
+}
+/*
+ * reconstruct()
+ *
+ * Returns reconstructed difference signal 'dq' obtained from
+ * codeword 'i' and quantization step size scale factor 'y'.
+ * Multiplication is performed in log base 2 domain as addition.
+ */
+int
+reconstruct(
+	int		sign,	/* 0 for non-negative value */
+	int		dqln,	/* G.72x codeword */
+	int		y)	/* Step size multiplier */
+{
+	short		dql;	/* Log of 'dq' magnitude */
+	short		dex;	/* Integer part of log */
+	short		dqt;
+	short		dq;	/* Reconstructed difference signal sample */
+
+	dql = dqln + (y >> 2);	/* ADDA */
+
+	if (dql < 0) {
+		return ((sign) ? -0x8000 : 0);
+	} else {		/* ANTILOG */
+		dex = (dql >> 7) & 15;
+		dqt = 128 + (dql & 127);
+		dq = (dqt << 7) >> (14 - dex);
+		return ((sign) ? (dq - 0x8000) : dq);
+	}
+}
+
+
+/*
+ * update()
+ *
+ * updates the state variables for each output code
+ */
+void
+update(
+	int		code_size,	/* distinguish 723_40 with others */
+	int		y,		/* quantizer step size */
+	int		wi,		/* scale factor multiplier */
+	int		fi,		/* for long/short term energies */
+	int		dq,		/* quantized prediction difference */
+	int		sr,		/* reconstructed signal */
+	int		dqsez,		/* difference from 2-pole predictor */
+	G72x_STATE *state_ptr)	/* coder state pointer */
+{
+	int		cnt;
+	short		mag, expon;	/* Adaptive predictor, FLOAT A */
+	short		a2p = 0;	/* LIMC */
+	short		a1ul;		/* UPA1 */
+	short		pks1;		/* UPA2 */
+	short		fa1;
+	char		tr;		/* tone/transition detector */
+	short		ylint, thr2, dqthr;
+	short  		ylfrac, thr1;
+	short		pk0;
+
+	pk0 = (dqsez < 0) ? 1 : 0;	/* needed in updating predictor poles */
+
+	mag = dq & 0x7FFF;		/* prediction difference magnitude */
+	/* TRANS */
+	ylint = state_ptr->yl >> 15;	/* exponent part of yl */
+	ylfrac = (state_ptr->yl >> 10) & 0x1F;	/* fractional part of yl */
+	thr1 = (32 + ylfrac) << ylint;		/* threshold */
+	thr2 = (ylint > 9) ? 31 << 10 : thr1;	/* limit thr2 to 31 << 10 */
+	dqthr = (thr2 + (thr2 >> 1)) >> 1;	/* dqthr = 0.75 * thr2 */
+	if (state_ptr->td == 0)		/* signal supposed voice */
+		tr = 0;
+	else if (mag <= dqthr)		/* supposed data, but small mag */
+		tr = 0;			/* treated as voice */
+	else				/* signal is data (modem) */
+		tr = 1;
+
+	/*
+	 * Quantizer scale factor adaptation.
+	 */
+
+	/* FUNCTW & FILTD & DELAY */
+	/* update non-steady state step size multiplier */
+	state_ptr->yu = y + ((wi - y) >> 5);
+
+	/* LIMB */
+	if (state_ptr->yu < 544)	/* 544 <= yu <= 5120 */
+		state_ptr->yu = 544;
+	else if (state_ptr->yu > 5120)
+		state_ptr->yu = 5120;
+
+	/* FILTE & DELAY */
+	/* update steady state step size multiplier */
+	state_ptr->yl += state_ptr->yu + ((-state_ptr->yl) >> 6);
+
+	/*
+	 * Adaptive predictor coefficients.
+	 */
+	if (tr == 1) {			/* reset a's and b's for modem signal */
+		state_ptr->a[0] = 0;
+		state_ptr->a[1] = 0;
+		state_ptr->b[0] = 0;
+		state_ptr->b[1] = 0;
+		state_ptr->b[2] = 0;
+		state_ptr->b[3] = 0;
+		state_ptr->b[4] = 0;
+		state_ptr->b[5] = 0;
+	} else {			/* update a's and b's */
+		pks1 = pk0 ^ state_ptr->pk[0];		/* UPA2 */
+
+		/* update predictor pole a[1] */
+		a2p = state_ptr->a[1] - (state_ptr->a[1] >> 7);
+		if (dqsez != 0) {
+			fa1 = (pks1) ? state_ptr->a[0] : -state_ptr->a[0];
+			if (fa1 < -8191)	/* a2p = function of fa1 */
+				a2p -= 0x100;
+			else if (fa1 > 8191)
+				a2p += 0xFF;
+			else
+				a2p += fa1 >> 5;
+
+			if (pk0 ^ state_ptr->pk[1])
+			{	/* LIMC */
+				if (a2p <= -12160)
+					a2p = -12288;
+				else if (a2p >= 12416)
+					a2p = 12288;
+				else
+					a2p -= 0x80;
+				}
+			else if (a2p <= -12416)
+				a2p = -12288;
+			else if (a2p >= 12160)
+				a2p = 12288;
+			else
+				a2p += 0x80;
+		}
+
+		/* TRIGB & DELAY */
+		state_ptr->a[1] = a2p;
+
+		/* UPA1 */
+		/* update predictor pole a[0] */
+		state_ptr->a[0] -= state_ptr->a[0] >> 8;
+		if (dqsez != 0)
+		{	if (pks1 == 0)
+				state_ptr->a[0] += 192;
+			else
+				state_ptr->a[0] -= 192;
+			} ;
+
+		/* LIMD */
+		a1ul = 15360 - a2p;
+		if (state_ptr->a[0] < -a1ul)
+			state_ptr->a[0] = -a1ul;
+		else if (state_ptr->a[0] > a1ul)
+			state_ptr->a[0] = a1ul;
+
+		/* UPB : update predictor zeros b[6] */
+		for (cnt = 0; cnt < 6; cnt++) {
+			if (code_size == 5)		/* for 40Kbps G.723 */
+				state_ptr->b[cnt] -= state_ptr->b[cnt] >> 9;
+			else			/* for G.721 and 24Kbps G.723 */
+				state_ptr->b[cnt] -= state_ptr->b[cnt] >> 8;
+			if (dq & 0x7FFF) {			/* XOR */
+				if ((dq ^ state_ptr->dq[cnt]) >= 0)
+					state_ptr->b[cnt] += 128;
+				else
+					state_ptr->b[cnt] -= 128;
+			}
+		}
+	}
+
+	for (cnt = 5; cnt > 0; cnt--)
+		state_ptr->dq[cnt] = state_ptr->dq[cnt-1];
+	/* FLOAT A : convert dq[0] to 4-bit exp, 6-bit mantissa f.p. */
+	if (mag == 0) {
+		state_ptr->dq[0] = (dq >= 0) ? 0x20 : 0xFC20;
+	} else {
+		expon = quan(mag, power2, 15);
+		state_ptr->dq[0] = (dq >= 0) ?
+		    (expon << 6) + ((mag << 6) >> expon) :
+		    (expon << 6) + ((mag << 6) >> expon) - 0x400;
+	}
+
+	state_ptr->sr[1] = state_ptr->sr[0];
+	/* FLOAT B : convert sr to 4-bit exp., 6-bit mantissa f.p. */
+	if (sr == 0) {
+		state_ptr->sr[0] = 0x20;
+	} else if (sr > 0) {
+		expon = quan(sr, power2, 15);
+		state_ptr->sr[0] = (expon << 6) + ((sr << 6) >> expon);
+	} else if (sr > -32768) {
+		mag = -sr;
+		expon = quan(mag, power2, 15);
+		state_ptr->sr[0] =  (expon << 6) + ((mag << 6) >> expon) - 0x400;
+	} else
+		state_ptr->sr[0] = (short) 0xFC20;
+
+	/* DELAY A */
+	state_ptr->pk[1] = state_ptr->pk[0];
+	state_ptr->pk[0] = pk0;
+
+	/* TONE */
+	if (tr == 1)		/* this sample has been treated as data */
+		state_ptr->td = 0;	/* next one will be treated as voice */
+	else if (a2p < -11776)	/* small sample-to-sample correlation */
+		state_ptr->td = 1;	/* signal may be data */
+	else				/* signal is voice */
+		state_ptr->td = 0;
+
+	/*
+	 * Adaptation speed control.
+	 */
+	state_ptr->dms += (fi - state_ptr->dms) >> 5;		/* FILTA */
+	state_ptr->dml += (((fi << 2) - state_ptr->dml) >> 7);	/* FILTB */
+
+	if (tr == 1)
+		state_ptr->ap = 256;
+	else if (y < 1536)					/* SUBTC */
+		state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
+	else if (state_ptr->td == 1)
+		state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
+	else if (abs((state_ptr->dms << 2) - state_ptr->dml) >=
+	    (state_ptr->dml >> 3))
+		state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
+	else
+		state_ptr->ap += (-state_ptr->ap) >> 4;
+
+	return ;
+} /* update */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+unpack_bytes (int bits, int blocksize, const unsigned char * block, short * samples)
+{	unsigned int    in_buffer = 0 ;
+	unsigned char	in_byte ;
+	int				k, in_bits = 0, bindex = 0 ;
+
+	for (k = 0 ; bindex <= blocksize && k < G72x_BLOCK_SIZE ; k++)
+	{	if (in_bits < bits)
+		{	in_byte = block [bindex++] ;
+
+			in_buffer |= (in_byte << in_bits);
+			in_bits += 8;
+			}
+		samples [k] = in_buffer & ((1 << bits) - 1);
+		in_buffer >>= bits;
+		in_bits -= bits;
+		} ;
+
+	return k ;
+} /* unpack_bytes */
+
+static int
+pack_bytes (int bits, const short * samples, unsigned char * block)
+{
+	unsigned int	out_buffer = 0 ;
+	int				k, bindex = 0, out_bits = 0 ;
+	unsigned char	out_byte ;
+
+	for (k = 0 ; k < G72x_BLOCK_SIZE ; k++)
+	{	out_buffer |= (samples [k] << out_bits) ;
+		out_bits += bits ;
+		if (out_bits >= 8)
+		{	out_byte = out_buffer & 0xFF ;
+			out_bits -= 8 ;
+			out_buffer >>= 8 ;
+			block [bindex++] = out_byte ;
+			}
+		} ;
+
+	return bindex ;
+} /* pack_bytes */
+
diff --git a/jni/libsndfile-1.0.25/src/G72x/g72x.h b/jni/libsndfile-1.0.25/src/G72x/g72x.h
new file mode 100644
index 0000000..d7631e6
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/g72x.h
@@ -0,0 +1,91 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/*
+** This file is not the same as the original file from Sun Microsystems. Nearly
+** all the original definitions and function prototypes that were in the file
+** of this name have been moved to g72x_priv.h.
+*/
+
+#ifndef G72X_HEADER_FILE
+#define	G72X_HEADER_FILE
+
+/*
+** Number of samples per block to process.
+** Must be a common multiple of possible bits per sample : 2, 3, 4, 5 and 8.
+*/
+#define	G72x_BLOCK_SIZE		(3 * 5 * 8)
+
+/*
+**	Identifiers for the differing kinds of G72x ADPCM codecs.
+**	The identifiers also define the number of encoded bits per sample.
+*/
+
+enum
+{	G723_16_BITS_PER_SAMPLE = 2,
+	G723_24_BITS_PER_SAMPLE = 3,
+	G723_40_BITS_PER_SAMPLE = 5,
+
+	G721_32_BITS_PER_SAMPLE = 4,
+	G721_40_BITS_PER_SAMPLE = 5,
+
+	G723_16_SAMPLES_PER_BLOCK = G72x_BLOCK_SIZE,
+	G723_24_SAMPLES_PER_BLOCK = G723_24_BITS_PER_SAMPLE * (G72x_BLOCK_SIZE / G723_24_BITS_PER_SAMPLE),
+	G723_40_SAMPLES_PER_BLOCK = G723_40_BITS_PER_SAMPLE * (G72x_BLOCK_SIZE / G723_40_BITS_PER_SAMPLE),
+
+	G721_32_SAMPLES_PER_BLOCK = G72x_BLOCK_SIZE,
+	G721_40_SAMPLES_PER_BLOCK = G721_40_BITS_PER_SAMPLE * (G72x_BLOCK_SIZE / G721_40_BITS_PER_SAMPLE),
+
+	G723_16_BYTES_PER_BLOCK = (G723_16_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8,
+	G723_24_BYTES_PER_BLOCK = (G723_24_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8,
+	G723_40_BYTES_PER_BLOCK = (G723_40_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8,
+
+	G721_32_BYTES_PER_BLOCK = (G721_32_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8,
+	G721_40_BYTES_PER_BLOCK = (G721_40_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8
+} ;
+
+/* Forward declaration of of g72x_state. */
+
+struct g72x_state ;
+
+/* External function definitions. */
+
+struct g72x_state * g72x_reader_init (int codec, int *blocksize, int *samplesperblock) ;
+struct g72x_state * g72x_writer_init (int codec, int *blocksize, int *samplesperblock) ;
+/*
+**	Initialize the ADPCM state table for the given codec.
+**	Return 0 on success, 1 on fail.
+*/
+
+int g72x_decode_block (struct g72x_state *pstate, const unsigned char *block, short *samples) ;
+/*
+**	The caller fills data->block with data->bytes bytes before calling the
+**	function. The value data->bytes must be an integer multiple of
+**	data->blocksize and be <= data->max_bytes.
+**	When it returns, the caller can read out data->samples samples.
+*/
+
+int g72x_encode_block (struct g72x_state *pstate, short *samples, unsigned char *block) ;
+/*
+**	The caller fills state->samples some integer multiple data->samples_per_block
+**	(up to G72x_BLOCK_SIZE) samples before calling the function.
+**	When it returns, the caller can read out bytes encoded bytes.
+*/
+
+#endif /* !G72X_HEADER_FILE */
+
diff --git a/jni/libsndfile-1.0.25/src/G72x/g72x.lo b/jni/libsndfile-1.0.25/src/G72x/g72x.lo
new file mode 100644
index 0000000..e442796
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/g72x.lo
@@ -0,0 +1,12 @@
+# G72x/g72x.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/g72x.o'
+
+# Name of the non-PIC object
+non_pic_object='g72x.o'
+
diff --git a/jni/libsndfile-1.0.25/src/G72x/g72x.o b/jni/libsndfile-1.0.25/src/G72x/g72x.o
new file mode 100644
index 0000000..3ce8025
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/g72x.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/G72x/g72x_priv.h b/jni/libsndfile-1.0.25/src/G72x/g72x_priv.h
new file mode 100644
index 0000000..867c64b
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/g72x_priv.h
@@ -0,0 +1,109 @@
+/*
+ * This source code is a product of Sun Microsystems, Inc. and is provided
+ * for unrestricted use.  Users may copy or modify this source code without
+ * charge.
+ *
+ * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
+ * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun source code is provided with no support and without any obligation on
+ * the part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California  94043
+ */
+
+#ifndef G72X_PRIVATE_H
+#define G72X_PRIVATE_H
+
+#ifdef __cplusplus
+#error "This code is not designed to be compiled with a C++ compiler."
+#endif
+
+/*
+** The following is the definition of the state structure used by the
+** G.721/G.723 encoder and decoder to preserve their internal state
+** between successive calls.  The meanings of the majority of the state
+** structure fields are explained in detail in the CCITT Recommendation
+** G.721.  The field names are essentially identical to variable names
+** in the bit level description of the coding algorithm included in this
+** Recommendation.
+*/
+
+struct g72x_state
+{	long  yl;	/* Locked or steady state step size multiplier. */
+	short yu;	/* Unlocked or non-steady state step size multiplier. */
+	short dms;	/* Short term energy estimate. */
+	short dml;	/* Long term energy estimate. */
+	short ap;	/* Linear weighting coefficient of 'yl' and 'yu'. */
+
+	short a[2];	/* Coefficients of pole portion of prediction filter. */
+	short b[6];	/* Coefficients of zero portion of prediction filter. */
+	short pk[2];	/*
+					** Signs of previous two samples of a partially
+					** reconstructed signal.
+					**/
+	short dq[6];	/*
+					** Previous 6 samples of the quantized difference
+					** signal represented in an internal floating point
+					** format.
+					**/
+	short sr[2];	/*
+			 		** Previous 2 samples of the quantized difference
+					** signal represented in an internal floating point
+					** format.
+					*/
+	char td;	/* delayed tone detect, new in 1988 version */
+
+	/*	The following struct members were added for libsndfile. The original
+	**	code worked by calling a set of functions on a sample by sample basis
+	**	which is slow on architectures like Intel x86. For libsndfile, this
+	**	was changed so that the encoding and decoding routines could work on
+	**	a block of samples at a time to reduce the function call overhead.
+	*/
+	int		(*encoder) (int, struct g72x_state* state) ;
+	int		(*decoder) (int, struct g72x_state* state) ;
+
+	int		codec_bits, blocksize, samplesperblock ;
+} ;
+
+typedef struct g72x_state G72x_STATE ;
+
+int	predictor_zero (G72x_STATE *state_ptr);
+
+int	predictor_pole (G72x_STATE *state_ptr);
+
+int	step_size (G72x_STATE *state_ptr);
+
+int	quantize (int d, int	y, short *table, int size);
+
+int	reconstruct (int sign, int dqln,	int y);
+
+void update (int code_size, int y, int wi, int fi, int dq, int sr, int dqsez, G72x_STATE *state_ptr);
+
+int g721_encoder	(int sample, G72x_STATE *state_ptr);
+int g721_decoder	(int code, G72x_STATE *state_ptr);
+
+int g723_16_encoder	(int sample, G72x_STATE *state_ptr);
+int g723_16_decoder	(int code, G72x_STATE *state_ptr);
+
+int g723_24_encoder	(int sample, G72x_STATE *state_ptr);
+int g723_24_decoder	(int code, G72x_STATE *state_ptr);
+
+int g723_40_encoder	(int sample, G72x_STATE *state_ptr);
+int g723_40_decoder	(int code, G72x_STATE *state_ptr);
+
+void private_init_state (G72x_STATE *state_ptr) ;
+
+#endif /* G72X_PRIVATE_H */
diff --git a/jni/libsndfile-1.0.25/src/G72x/g72x_test.c b/jni/libsndfile-1.0.25/src/G72x/g72x_test.c
new file mode 100644
index 0000000..79cabce
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/g72x_test.c
@@ -0,0 +1,214 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "g72x.h"
+#include "g72x_priv.h"
+
+#ifndef		M_PI
+#define		M_PI		3.14159265358979323846264338
+#endif
+
+#define		BUFFER_SIZE		(1<<14) /* Should be (1<<14) */
+#define		SAMPLE_RATE		11025
+
+
+static void g721_test	(void) ;
+static void g723_test	(double margin) ;
+
+static void	gen_signal_double (double *data, double scale, int datalen) ;
+static int error_function (double data, double orig, double margin) ;
+
+static int	oct_save_short	(short *a, short *b, int len) ;
+
+int
+main (int argc, char *argv [])
+{	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 ("           g721  - test G721 encoder and decoder\n") ;
+		printf ("           g723  - test G721 encoder and decoder\n") ;
+		printf ("           all   - perform all tests\n") ;
+		exit (1) ;
+		} ;
+
+	bDoAll=!strcmp (argv [1], "all");
+
+	if (bDoAll || ! strcmp (argv [1], "g721"))
+	{	g721_test	() ;
+		nTests++ ;
+		} ;
+
+	if (bDoAll || ! strcmp (argv [1], "g723"))
+	{	g723_test	(0.53) ;
+		nTests++ ;
+		} ;
+
+	if (nTests == 0)
+	{	printf ("Mono : ************************************\n") ;
+		printf ("Mono : *  No '%s' test defined.\n", argv [1]) ;
+		printf ("Mono : ************************************\n") ;
+		return 1 ;
+		} ;
+
+	return 0 ;
+} /* main */
+
+static void
+g721_test	(void)
+{
+	return ;
+} /* g721_test */
+
+static void
+g723_test	(double margin)
+{	static double	orig_buffer [BUFFER_SIZE] ;
+	static short 	orig [BUFFER_SIZE] ;
+	static short 	data [BUFFER_SIZE] ;
+
+	G72x_STATE encoder_state, decoder_state ;
+
+	long	k ;
+	int 	code, position, max_err ;
+
+	private_init_state (&encoder_state) ;
+	encoder_state.encoder = g723_24_encoder ;
+	encoder_state.codec_bits = 3 ;
+
+	private_init_state (&decoder_state) ;
+	decoder_state.decoder = g723_24_decoder ;
+	decoder_state.codec_bits = 3 ;
+
+	memset (data, 0, BUFFER_SIZE * sizeof (short)) ;
+	memset (orig, 0, BUFFER_SIZE * sizeof (short)) ;
+
+	printf ("    g723_test    : ") ;
+	fflush (stdout) ;
+
+	gen_signal_double (orig_buffer, 32000.0, BUFFER_SIZE) ;
+	for (k = 0 ; k < BUFFER_SIZE ; k++)
+		orig [k] = (short) orig_buffer [k] ;
+
+	/* Write and read data here. */
+	position = 0 ;
+	max_err = 0 ;
+	for (k = 0 ; k < BUFFER_SIZE ; k++)
+	{	code = encoder_state.encoder (orig [k], &encoder_state) ;
+		data [k] = decoder_state.decoder (code, &decoder_state) ;
+		if (abs (orig [k] - data [k]) > max_err)
+		{	position = k ;
+			max_err = abs (orig [k] - data [k]) ;
+			} ;
+		} ;
+
+	printf ("\n\nMax error of %d at postion %d.\n", max_err, position) ;
+
+	for (k = 0 ; k < BUFFER_SIZE ; k++)
+	{	if (error_function (data [k], orig [k], margin))
+		{	printf ("Line %d: Incorrect sample A (#%ld : %d should be %d).\n", __LINE__, k, data [k], orig [k]) ;
+			oct_save_short (orig, data, BUFFER_SIZE) ;
+			exit (1) ;
+			} ;
+		} ;
+
+
+	printf ("ok\n") ;
+
+	return ;
+} /* g723_test */
+
+
+#define		SIGNAL_MAXVAL	30000.0
+#define		DECAY_COUNT		1000
+
+static void
+gen_signal_double (double *gendata, double scale, int gendatalen)
+{	int		k, ramplen ;
+	double	amp = 0.0 ;
+
+	ramplen = DECAY_COUNT ;
+
+	for (k = 0 ; k < gendatalen ; k++)
+	{	if (k <= ramplen)
+			amp = scale * k / ((double) ramplen) ;
+		else if (k > gendatalen - ramplen)
+			amp = scale * (gendatalen - k) / ((double) ramplen) ;
+
+		gendata [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_double */
+
+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 int
+oct_save_short	(short *a, short *b, int len)
+{	FILE 	*file ;
+	int		k ;
+
+	if (! (file = fopen ("error.dat", "w")))
+		return 1 ;
+
+	fprintf (file, "# Not created by Octave\n") ;
+
+	fprintf (file, "# name: a\n") ;
+	fprintf (file, "# type: matrix\n") ;
+	fprintf (file, "# rows: %d\n", len) ;
+	fprintf (file, "# columns: 1\n") ;
+
+	for (k = 0 ; k < len ; k++)
+		fprintf (file, "% d\n", a [k]) ;
+
+	fprintf (file, "# name: b\n") ;
+	fprintf (file, "# type: matrix\n") ;
+	fprintf (file, "# rows: %d\n", len) ;
+	fprintf (file, "# columns: 1\n") ;
+
+	for (k = 0 ; k < len ; k++)
+		fprintf (file, "% d\n", b [k]) ;
+
+	fclose (file) ;
+	return 0 ;
+} /* oct_save_short */
+
diff --git a/jni/libsndfile-1.0.25/src/G72x/libg72x.la b/jni/libsndfile-1.0.25/src/G72x/libg72x.la
new file mode 100644
index 0000000..b6d2d1c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/G72x/libg72x.la
@@ -0,0 +1,41 @@
+# libg72x.la - a libtool library file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname=''
+
+# Names of this library.
+library_names=''
+
+# The name of the static archive.
+old_library='libg72x.a'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags=''
+
+# Libraries that this one depends upon.
+dependency_libs=' -lm'
+
+# Names of additional weak libraries provided by this library
+weak_library_names=''
+
+# Version information for libg72x.
+current=
+age=
+revision=
+
+# Is this an already installed library?
+installed=no
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=no
+
+# Files to dlopen/dlpreopen
+dlopen=''
+dlpreopen=''
+
+# Directory that this library needs to be installed in:
+libdir=''
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.deps/.dirstamp b/jni/libsndfile-1.0.25/src/GSM610/.deps/.dirstamp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.deps/.dirstamp
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.deps/add.Plo b/jni/libsndfile-1.0.25/src/GSM610/.deps/add.Plo
new file mode 100644
index 0000000..1e665f9
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.deps/add.Plo
@@ -0,0 +1,48 @@
+GSM610/add.lo: GSM610/add.c /usr/include/stdio.h /usr/include/features.h \
+ /usr/include/stdc-predef.h /usr/include/sys/cdefs.h \
+ /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \
+ /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/assert.h GSM610/gsm610_priv.h
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/assert.h:
+
+GSM610/gsm610_priv.h:
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.deps/code.Plo b/jni/libsndfile-1.0.25/src/GSM610/.deps/code.Plo
new file mode 100644
index 0000000..efbc919
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.deps/code.Plo
@@ -0,0 +1,75 @@
+GSM610/code.lo: GSM610/code.c /usr/include/stdlib.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/types.h \
+ /usr/include/bits/typesizes.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h GSM610/gsm610_priv.h
+
+/usr/include/stdlib.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+GSM610/gsm610_priv.h:
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.deps/decode.Plo b/jni/libsndfile-1.0.25/src/GSM610/.deps/decode.Plo
new file mode 100644
index 0000000..6218e22
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.deps/decode.Plo
@@ -0,0 +1,46 @@
+GSM610/decode.lo: GSM610/decode.c /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h GSM610/gsm610_priv.h
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+GSM610/gsm610_priv.h:
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.deps/gsm_create.Plo b/jni/libsndfile-1.0.25/src/GSM610/.deps/gsm_create.Plo
new file mode 100644
index 0000000..7a2e0bd
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.deps/gsm_create.Plo
@@ -0,0 +1,99 @@
+GSM610/gsm_create.lo: GSM610/gsm_create.c GSM610/config.h \
+ /usr/include/stdio.h /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h \
+ /usr/include/string.h /usr/include/xlocale.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h GSM610/gsm.h GSM610/gsm610_priv.h
+
+GSM610/config.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
+
+/usr/include/string.h:
+
+/usr/include/xlocale.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+GSM610/gsm.h:
+
+GSM610/gsm610_priv.h:
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.deps/gsm_decode.Plo b/jni/libsndfile-1.0.25/src/GSM610/.deps/gsm_decode.Plo
new file mode 100644
index 0000000..adc972c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.deps/gsm_decode.Plo
@@ -0,0 +1,49 @@
+GSM610/gsm_decode.lo: GSM610/gsm_decode.c GSM610/gsm610_priv.h \
+ GSM610/gsm.h /usr/include/stdio.h /usr/include/features.h \
+ /usr/include/stdc-predef.h /usr/include/sys/cdefs.h \
+ /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \
+ /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h
+
+GSM610/gsm610_priv.h:
+
+GSM610/gsm.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.deps/gsm_destroy.Plo b/jni/libsndfile-1.0.25/src/GSM610/.deps/gsm_destroy.Plo
new file mode 100644
index 0000000..535c354
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.deps/gsm_destroy.Plo
@@ -0,0 +1,87 @@
+GSM610/gsm_destroy.lo: GSM610/gsm_destroy.c GSM610/gsm.h \
+ /usr/include/stdio.h /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h GSM610/config.h /usr/include/stdlib.h \
+ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/byteswap.h /usr/include/bits/byteswap-16.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/alloca.h
+
+GSM610/gsm.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+GSM610/config.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/bits/waitflags.h:
+
+/usr/include/bits/waitstatus.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/bits/byteswap.h:
+
+/usr/include/bits/byteswap-16.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/alloca.h:
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.deps/gsm_encode.Plo b/jni/libsndfile-1.0.25/src/GSM610/.deps/gsm_encode.Plo
new file mode 100644
index 0000000..aac0b31
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.deps/gsm_encode.Plo
@@ -0,0 +1,49 @@
+GSM610/gsm_encode.lo: GSM610/gsm_encode.c GSM610/gsm610_priv.h \
+ GSM610/gsm.h /usr/include/stdio.h /usr/include/features.h \
+ /usr/include/stdc-predef.h /usr/include/sys/cdefs.h \
+ /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \
+ /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h
+
+GSM610/gsm610_priv.h:
+
+GSM610/gsm.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.deps/gsm_option.Plo b/jni/libsndfile-1.0.25/src/GSM610/.deps/gsm_option.Plo
new file mode 100644
index 0000000..a2caf3e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.deps/gsm_option.Plo
@@ -0,0 +1,49 @@
+GSM610/gsm_option.lo: GSM610/gsm_option.c GSM610/gsm610_priv.h \
+ GSM610/gsm.h /usr/include/stdio.h /usr/include/features.h \
+ /usr/include/stdc-predef.h /usr/include/sys/cdefs.h \
+ /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \
+ /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h
+
+GSM610/gsm610_priv.h:
+
+GSM610/gsm.h:
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.deps/long_term.Plo b/jni/libsndfile-1.0.25/src/GSM610/.deps/long_term.Plo
new file mode 100644
index 0000000..5b41b38
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.deps/long_term.Plo
@@ -0,0 +1,48 @@
+GSM610/long_term.lo: GSM610/long_term.c /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/assert.h GSM610/gsm610_priv.h
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/assert.h:
+
+GSM610/gsm610_priv.h:
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.deps/lpc.Plo b/jni/libsndfile-1.0.25/src/GSM610/.deps/lpc.Plo
new file mode 100644
index 0000000..0c1966f
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.deps/lpc.Plo
@@ -0,0 +1,48 @@
+GSM610/lpc.lo: GSM610/lpc.c /usr/include/stdio.h /usr/include/features.h \
+ /usr/include/stdc-predef.h /usr/include/sys/cdefs.h \
+ /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \
+ /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/assert.h GSM610/gsm610_priv.h
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/assert.h:
+
+GSM610/gsm610_priv.h:
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.deps/preprocess.Plo b/jni/libsndfile-1.0.25/src/GSM610/.deps/preprocess.Plo
new file mode 100644
index 0000000..acb7ed6
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.deps/preprocess.Plo
@@ -0,0 +1,48 @@
+GSM610/preprocess.lo: GSM610/preprocess.c /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/assert.h GSM610/gsm610_priv.h
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/assert.h:
+
+GSM610/gsm610_priv.h:
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.deps/rpe.Plo b/jni/libsndfile-1.0.25/src/GSM610/.deps/rpe.Plo
new file mode 100644
index 0000000..922c9e0
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.deps/rpe.Plo
@@ -0,0 +1,48 @@
+GSM610/rpe.lo: GSM610/rpe.c /usr/include/stdio.h /usr/include/features.h \
+ /usr/include/stdc-predef.h /usr/include/sys/cdefs.h \
+ /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \
+ /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/assert.h GSM610/gsm610_priv.h
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/assert.h:
+
+GSM610/gsm610_priv.h:
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.deps/short_term.Plo b/jni/libsndfile-1.0.25/src/GSM610/.deps/short_term.Plo
new file mode 100644
index 0000000..e482da8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.deps/short_term.Plo
@@ -0,0 +1,48 @@
+GSM610/short_term.lo: GSM610/short_term.c /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/stdc-predef.h \
+ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
+ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/typesizes.h \
+ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
+ /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/assert.h GSM610/gsm610_priv.h
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/stdc-predef.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/include/gnu/stubs-64.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/assert.h:
+
+GSM610/gsm610_priv.h:
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.deps/table.Plo b/jni/libsndfile-1.0.25/src/GSM610/.deps/table.Plo
new file mode 100644
index 0000000..ea02224
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.deps/table.Plo
@@ -0,0 +1,3 @@
+GSM610/table.lo: GSM610/table.c GSM610/gsm610_priv.h
+
+GSM610/gsm610_priv.h:
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.dirstamp b/jni/libsndfile-1.0.25/src/GSM610/.dirstamp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.dirstamp
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.libs/add.o b/jni/libsndfile-1.0.25/src/GSM610/.libs/add.o
new file mode 100644
index 0000000..92fa6d5
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.libs/add.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.libs/code.o b/jni/libsndfile-1.0.25/src/GSM610/.libs/code.o
new file mode 100644
index 0000000..ec28da9
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.libs/code.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.libs/decode.o b/jni/libsndfile-1.0.25/src/GSM610/.libs/decode.o
new file mode 100644
index 0000000..1395b85
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.libs/decode.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.libs/gsm_create.o b/jni/libsndfile-1.0.25/src/GSM610/.libs/gsm_create.o
new file mode 100644
index 0000000..bae5258
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.libs/gsm_create.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.libs/gsm_decode.o b/jni/libsndfile-1.0.25/src/GSM610/.libs/gsm_decode.o
new file mode 100644
index 0000000..509732a
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.libs/gsm_decode.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.libs/gsm_destroy.o b/jni/libsndfile-1.0.25/src/GSM610/.libs/gsm_destroy.o
new file mode 100644
index 0000000..aa943bf
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.libs/gsm_destroy.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.libs/gsm_encode.o b/jni/libsndfile-1.0.25/src/GSM610/.libs/gsm_encode.o
new file mode 100644
index 0000000..5c9b7c3
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.libs/gsm_encode.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.libs/gsm_option.o b/jni/libsndfile-1.0.25/src/GSM610/.libs/gsm_option.o
new file mode 100644
index 0000000..aed87f1
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.libs/gsm_option.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.libs/libgsm.a b/jni/libsndfile-1.0.25/src/GSM610/.libs/libgsm.a
new file mode 100644
index 0000000..bfb011f
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.libs/libgsm.a
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.libs/libgsm.la b/jni/libsndfile-1.0.25/src/GSM610/.libs/libgsm.la
new file mode 120000
index 0000000..31bfd5f
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.libs/libgsm.la
@@ -0,0 +1 @@
+../libgsm.la
\ No newline at end of file
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.libs/long_term.o b/jni/libsndfile-1.0.25/src/GSM610/.libs/long_term.o
new file mode 100644
index 0000000..571b4b3
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.libs/long_term.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.libs/lpc.o b/jni/libsndfile-1.0.25/src/GSM610/.libs/lpc.o
new file mode 100644
index 0000000..e93e780
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.libs/lpc.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.libs/preprocess.o b/jni/libsndfile-1.0.25/src/GSM610/.libs/preprocess.o
new file mode 100644
index 0000000..d7c8118
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.libs/preprocess.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.libs/rpe.o b/jni/libsndfile-1.0.25/src/GSM610/.libs/rpe.o
new file mode 100644
index 0000000..d90284c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.libs/rpe.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.libs/short_term.o b/jni/libsndfile-1.0.25/src/GSM610/.libs/short_term.o
new file mode 100644
index 0000000..21c036c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.libs/short_term.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/.libs/table.o b/jni/libsndfile-1.0.25/src/GSM610/.libs/table.o
new file mode 100644
index 0000000..04cb449
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/.libs/table.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/COPYRIGHT b/jni/libsndfile-1.0.25/src/GSM610/COPYRIGHT
new file mode 100644
index 0000000..eba0e52
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/COPYRIGHT
@@ -0,0 +1,16 @@
+Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann,
+Technische Universitaet Berlin
+
+Any use of this software is permitted provided that this notice is not
+removed and that neither the authors nor the Technische Universitaet Berlin
+are deemed to have made any representations as to the suitability of this
+software for any purpose nor are held responsible for any defects of
+this software.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+
+As a matter of courtesy, the authors request to be informed about uses
+this software has found, about bugs in this software, and about any
+improvements that may be of general interest.
+
+Berlin, 28.11.1994
+Jutta Degener
+Carsten Bormann
diff --git a/jni/libsndfile-1.0.25/src/GSM610/ChangeLog b/jni/libsndfile-1.0.25/src/GSM610/ChangeLog
new file mode 100644
index 0000000..24f5248
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/ChangeLog
@@ -0,0 +1,56 @@
+2004-05-12  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * gsm610_priv.h
+    Replace ugly macros with inline functions.
+
+    * *.c
+    Remove temporary variables used by macros and other minor fixes required by
+    above change.
+
+2003-06-02  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * rpe.c
+	Renamed variables "exp" to "expon" to avoid shadowed parameter warnigns.
+
+2002-06-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * long_term.c
+	Changes tp removed compiler warnings about shadowed parameters.
+
+2002-06-08  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * private.h
+	Made declarations of gsm_A, gsm_B, gsm_MIC etc extern. This fixed a compile
+	problem on MacOSX.
+
+2002-05-10  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+	* *.[ch]
+	Removed all pre-ANSI prototype kludges. Removed proto.h and unproto.h. 
+	Started work on making GSM 6.10 files seekable. Currently they are not.
+
+    * code.c private.h
+	Function Gsm_Coder () used a statically defined array. This was obviously
+	not re-entrant so moved it to struct gsm_state.
+
+2001-09-16  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * code.c
+    Added #includes for string.h and stdlib.h.
+
+2000-10-27  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * 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 mega-nerd DOT com>
+
+    * private.h
+    Added #defines to emulate normal compile time options.
+
+2000-02-28  Erik de Castro Lopo  <erikd AT mega-nerd DOT com>
+
+    * everthing
+    Created this directory and copied files from libgsm.
+    http://kbs.cs.tu-berlin.de/~jutta/toast.html
diff --git a/jni/libsndfile-1.0.25/src/GSM610/README b/jni/libsndfile-1.0.25/src/GSM610/README
new file mode 100644
index 0000000..b57132b
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/README
@@ -0,0 +1,36 @@
+GSM 06.10 13 kbit/s RPE/LTP speech codec
+----------------------------------------
+
+All the file in this directory were written by Jutta Degener
+and Carsten Borman for The Communications and Operating Systems 
+Research Group (KBS) at the Technische Universitaet Berlin.
+
+Their work was released under the following license which is 
+assumed to be compatible with The GNU Lesser General Public License.
+
+----------------------------------------------------------------------------
+
+Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann,
+Technische Universitaet Berlin
+
+Any use of this software is permitted provided that this notice is not
+removed and that neither the authors nor the Technische Universitaet Berlin
+are deemed to have made any representations as to the suitability of this
+software for any purpose nor are held responsible for any defects of
+this software.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+
+As a matter of courtesy, the authors request to be informed about uses
+this software has found, about bugs in this software, and about any
+improvements that may be of general interest.
+
+Berlin, 28.11.1994
+Jutta Degener (jutta@cs.tu-berlin.de)
+Carsten Bormann (cabo@cs.tu-berlin.de)
+
+----------------------------------------------------------------------------
+
+Jutta Degener and Carsten Bormann's work can be found on their homepage
+at:
+
+    http://kbs.cs.tu-berlin.de/~jutta/toast.html
+	
diff --git a/jni/libsndfile-1.0.25/src/GSM610/add.c b/jni/libsndfile-1.0.25/src/GSM610/add.c
new file mode 100644
index 0000000..6f4eb5c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/add.c
@@ -0,0 +1,240 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*
+ *  See private.h for the more commonly used macro versions.
+ */
+
+#include	<stdio.h>
+#include	<assert.h>
+
+#include	"gsm610_priv.h"
+
+#define	saturate(x) 	\
+	((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x))
+
+word gsm_add ( word a, word b)
+{
+	longword sum = (longword)a + (longword)b;
+	return saturate(sum);
+}
+
+word gsm_sub ( word a, word b)
+{
+	longword diff = (longword)a - (longword)b;
+	return saturate(diff);
+}
+
+word gsm_mult ( word a, word b)
+{
+	if (a == MIN_WORD && b == MIN_WORD)
+		return MAX_WORD;
+	
+	return SASR_L( (longword)a * (longword)b, 15 );
+}
+
+word gsm_mult_r ( word a, word b)
+{
+	if (b == MIN_WORD && a == MIN_WORD) return MAX_WORD;
+	else {
+		longword prod = (longword)a * (longword)b + 16384;
+		prod >>= 15;
+		return prod & 0xFFFF;
+	}
+}
+
+word gsm_abs (word a)
+{
+	return a < 0 ? (a == MIN_WORD ? MAX_WORD : -a) : a;
+}
+
+longword gsm_L_mult (word a, word b)
+{
+	assert( a != MIN_WORD || b != MIN_WORD );
+	return ((longword)a * (longword)b) << 1;
+}
+
+longword gsm_L_add ( longword a, longword b)
+{
+	if (a < 0) {
+		if (b >= 0) return a + b;
+		else {
+			ulongword A = (ulongword)-(a + 1) + (ulongword)-(b + 1);
+			return A >= MAX_LONGWORD ? MIN_LONGWORD :-(longword)A-2;
+		}
+	}
+	else if (b <= 0) return a + b;
+	else {
+		ulongword A = (ulongword)a + (ulongword)b;
+		return A > MAX_LONGWORD ? MAX_LONGWORD : A;
+	}
+}
+
+longword gsm_L_sub ( longword a, longword b)
+{
+	if (a >= 0) {
+		if (b >= 0) return a - b;
+		else {
+			/* a>=0, b<0 */
+
+			ulongword A = (ulongword)a + -(b + 1);
+			return A >= MAX_LONGWORD ? MAX_LONGWORD : (A + 1);
+		}
+	}
+	else if (b <= 0) return a - b;
+	else {
+		/* a<0, b>0 */  
+
+		ulongword A = (ulongword)-(a + 1) + b;
+		return A >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)A - 1;
+	}
+}
+
+static unsigned char const bitoff[ 256 ] = {
+	 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
+	 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+	 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+	 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+	 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+word gsm_norm (longword a )
+/*
+ * the number of left shifts needed to normalize the 32 bit
+ * variable L_var1 for positive values on the interval
+ *
+ * with minimum of
+ * minimum of 1073741824  (01000000000000000000000000000000) and 
+ * maximum of 2147483647  (01111111111111111111111111111111)
+ *
+ *
+ * and for negative values on the interval with
+ * minimum of -2147483648 (-10000000000000000000000000000000) and
+ * maximum of -1073741824 ( -1000000000000000000000000000000).
+ *
+ * in order to normalize the result, the following
+ * operation must be done: L_norm_var1 = L_var1 << norm( L_var1 );
+ *
+ * (That's 'ffs', only from the left, not the right..)
+ */
+{
+	assert(a != 0);
+
+	if (a < 0) {
+		if (a <= -1073741824) return 0;
+		a = ~a;
+	}
+
+	return    a & 0xffff0000 
+		? ( a & 0xff000000
+		  ?  -1 + bitoff[ 0xFF & (a >> 24) ]
+		  :   7 + bitoff[ 0xFF & (a >> 16) ] )
+		: ( a & 0xff00
+		  ?  15 + bitoff[ 0xFF & (a >> 8) ]
+		  :  23 + bitoff[ 0xFF & a ] );
+}
+
+longword gsm_L_asl (longword a, int n)
+{
+	if (n >= 32) return 0;
+	if (n <= -32) return -(a < 0);
+	if (n < 0) return gsm_L_asr(a, -n);
+	return a << n;
+}
+
+word gsm_asr (word a, int n)
+{
+	if (n >= 16) return -(a < 0);
+	if (n <= -16) return 0;
+	if (n < 0) return a << -n;
+
+	return SASR_W (a, (word) n);
+}
+
+word gsm_asl (word a, int n)
+{
+	if (n >= 16) return 0;
+	if (n <= -16) return -(a < 0);
+	if (n < 0) return gsm_asr(a, -n);
+	return a << n;
+}
+
+longword gsm_L_asr (longword a, int n)
+{
+	if (n >= 32) return -(a < 0);
+	if (n <= -32) return 0;
+	if (n < 0) return a << -n;
+
+	return SASR_L (a, (word) n);
+}
+
+/*
+**	word gsm_asr (word a, int n)
+**	{
+**		if (n >= 16) return -(a < 0);
+**		if (n <= -16) return 0;
+**		if (n < 0) return a << -n;
+**	
+**	#	ifdef	SASR_W
+**			return a >> n;
+**	#	else
+**			if (a >= 0) return a >> n;
+**			else return -(word)( -(uword)a >> n );
+**	#	endif
+**	}
+**	
+*/
+/* 
+ *  (From p. 46, end of section 4.2.5)
+ *
+ *  NOTE: The following lines gives [sic] one correct implementation
+ *  	  of the div(num, denum) arithmetic operation.  Compute div
+ *        which is the integer division of num by denum: with denum
+ *	  >= num > 0
+ */
+
+word gsm_div (word num, word denum)
+{
+	longword	L_num   = num;
+	longword	L_denum = denum;
+	word		div 	= 0;
+	int		k 	= 15;
+
+	/* The parameter num sometimes becomes zero.
+	 * Although this is explicitly guarded against in 4.2.5,
+	 * we assume that the result should then be zero as well.
+	 */
+
+	/* assert(num != 0); */
+
+	assert(num >= 0 && denum >= num);
+	if (num == 0)
+	    return 0;
+
+	while (k--) {
+		div   <<= 1;
+		L_num <<= 1;
+
+		if (L_num >= L_denum) {
+			L_num -= L_denum;
+			div++;
+		}
+	}
+
+	return div;
+}
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/add.lo b/jni/libsndfile-1.0.25/src/GSM610/add.lo
new file mode 100644
index 0000000..42b042e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/add.lo
@@ -0,0 +1,12 @@
+# GSM610/add.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/add.o'
+
+# Name of the non-PIC object
+non_pic_object='add.o'
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/add.o b/jni/libsndfile-1.0.25/src/GSM610/add.o
new file mode 100644
index 0000000..b8536c3
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/add.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/code.c b/jni/libsndfile-1.0.25/src/GSM610/code.c
new file mode 100644
index 0000000..78cb853
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/code.c
@@ -0,0 +1,87 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+
+#include	<stdlib.h>
+#include	<string.h>
+
+#include	"gsm610_priv.h"
+
+/* 
+ *  4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER 
+ */
+
+void Gsm_Coder (
+
+	struct gsm_state	* State,
+
+	word	* s,	/* [0..159] samples		  	IN	*/
+
+/*
+ * The RPE-LTD coder works on a frame by frame basis.  The length of
+ * the frame is equal to 160 samples.  Some computations are done
+ * once per frame to produce at the output of the coder the
+ * LARc[1..8] parameters which are the coded LAR coefficients and 
+ * also to realize the inverse filtering operation for the entire
+ * frame (160 samples of signal d[0..159]).  These parts produce at
+ * the output of the coder:
+ */
+
+	word	* LARc,	/* [0..7] LAR coefficients		OUT	*/
+
+/*
+ * Procedure 4.2.11 to 4.2.18 are to be executed four times per
+ * frame.  That means once for each sub-segment RPE-LTP analysis of
+ * 40 samples.  These parts produce at the output of the coder:
+ */
+
+	word	* Nc,	/* [0..3] LTP lag			OUT 	*/
+	word	* bc,	/* [0..3] coded LTP gain		OUT 	*/
+	word	* Mc,	/* [0..3] RPE grid selection		OUT     */
+	word	* xmaxc,/* [0..3] Coded maximum amplitude	OUT	*/
+	word	* xMc	/* [13*4] normalized RPE samples	OUT	*/
+)
+{
+	int	k;
+	word	* dp  = State->dp0 + 120;	/* [ -120...-1 ] */
+	word	* dpp = dp;		/* [ 0...39 ]	 */
+
+	word	so[160];
+
+	Gsm_Preprocess			(State, s, so);
+	Gsm_LPC_Analysis		(State, so, LARc);
+	Gsm_Short_Term_Analysis_Filter	(State, LARc, so);
+
+	for (k = 0; k <= 3; k++, xMc += 13) {
+
+		Gsm_Long_Term_Predictor	( State,
+					 so+k*40, /* d      [0..39] IN	*/
+					 dp,	  /* dp  [-120..-1] IN	*/
+					State->e + 5,	  /* e      [0..39] OUT	*/
+					dpp,	  /* dpp    [0..39] OUT */
+					 Nc++,
+					 bc++);
+
+		Gsm_RPE_Encoding	( /*-S,-*/
+					State->e + 5,	/* e	  ][0..39][ IN/OUT */
+					  xmaxc++, Mc++, xMc );
+		/*
+		 * Gsm_Update_of_reconstructed_short_time_residual_signal
+		 *			( dpp, State->e + 5, dp );
+		 */
+
+		{ register int i;
+		  for (i = 0; i <= 39; i++)
+			dp[ i ] = GSM_ADD( State->e[5 + i], dpp[i] );
+		}
+		dp  += 40;
+		dpp += 40;
+
+	}
+	(void)memcpy( (char *)State->dp0, (char *)(State->dp0 + 160),
+		120 * sizeof(*State->dp0) );
+}
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/code.lo b/jni/libsndfile-1.0.25/src/GSM610/code.lo
new file mode 100644
index 0000000..735308c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/code.lo
@@ -0,0 +1,12 @@
+# GSM610/code.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/code.o'
+
+# Name of the non-PIC object
+non_pic_object='code.o'
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/code.o b/jni/libsndfile-1.0.25/src/GSM610/code.o
new file mode 100644
index 0000000..a8a626e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/code.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/config.h b/jni/libsndfile-1.0.25/src/GSM610/config.h
new file mode 100644
index 0000000..f3eeb82
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/config.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#ifndef	CONFIG_H
+#define	CONFIG_H
+
+#define	HAS_STDLIB_H	1		/* /usr/include/stdlib.h	*/
+#define	HAS_FCNTL_H	1		/* /usr/include/fcntl.h		*/
+
+#define	HAS_FSTAT 	1		/* fstat syscall		*/
+#define	HAS_FCHMOD 	1		/* fchmod syscall		*/
+#define	HAS_CHMOD 	1		/* chmod syscall		*/
+#define	HAS_FCHOWN 	1		/* fchown syscall		*/
+#define	HAS_CHOWN 	1		/* chown syscall		*/
+
+#define	HAS_STRING_H 	1		/* /usr/include/string.h 	*/
+
+#define	HAS_UNISTD_H	1		/* /usr/include/unistd.h	*/
+#define	HAS_UTIME	1		/* POSIX utime(path, times)	*/
+#define	HAS_UTIME_H	1		/* UTIME header file		*/
+
+#endif	/* CONFIG_H */
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/decode.c b/jni/libsndfile-1.0.25/src/GSM610/decode.c
new file mode 100644
index 0000000..350df12
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/decode.c
@@ -0,0 +1,59 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+
+#include	"gsm610_priv.h"
+
+/*
+ *  4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER
+ */
+
+static void Postprocessing (
+	struct gsm_state	* S,
+	register word 		* s)
+{
+	register int		k;
+	register word		msr = S->msr;
+	register word		tmp;
+
+	for (k = 160; k--; s++) {
+		tmp = GSM_MULT_R( msr, 28180 );
+		msr = GSM_ADD(*s, tmp);  	   /* Deemphasis 	     */
+		*s  = GSM_ADD(msr, msr) & 0xFFF8;  /* Truncation & Upscaling */
+	}
+	S->msr = msr;
+}
+
+void Gsm_Decoder (
+	struct gsm_state	* S,
+
+	word		* LARcr,	/* [0..7]		IN	*/
+
+	word		* Ncr,		/* [0..3] 		IN 	*/
+	word		* bcr,		/* [0..3]		IN	*/
+	word		* Mcr,		/* [0..3] 		IN 	*/
+	word		* xmaxcr,	/* [0..3]		IN 	*/
+	word		* xMcr,		/* [0..13*4]		IN	*/
+
+	word		* s)		/* [0..159]		OUT 	*/
+{
+	int		j, k;
+	word		erp[40], wt[160];
+	word		* drp = S->dp0 + 120;
+
+	for (j=0; j <= 3; j++, xmaxcr++, bcr++, Ncr++, Mcr++, xMcr += 13) {
+
+		Gsm_RPE_Decoding( /*-S,-*/ *xmaxcr, *Mcr, xMcr, erp );
+		Gsm_Long_Term_Synthesis_Filtering( S, *Ncr, *bcr, erp, drp );
+
+		for (k = 0; k <= 39; k++) wt[ j * 40 + k ] =  drp[ k ];
+	}
+
+	Gsm_Short_Term_Synthesis_Filter( S, LARcr, wt, s );
+	Postprocessing(S, s);
+}
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/decode.lo b/jni/libsndfile-1.0.25/src/GSM610/decode.lo
new file mode 100644
index 0000000..d2f1458
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/decode.lo
@@ -0,0 +1,12 @@
+# GSM610/decode.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/decode.o'
+
+# Name of the non-PIC object
+non_pic_object='decode.o'
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/decode.o b/jni/libsndfile-1.0.25/src/GSM610/decode.o
new file mode 100644
index 0000000..a51d445
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/decode.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/gsm.h b/jni/libsndfile-1.0.25/src/GSM610/gsm.h
new file mode 100644
index 0000000..48aecc7
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/gsm.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#ifndef	GSM_H
+#define	GSM_H
+
+#include	<stdio.h>		/* for FILE * 	*/
+
+/*
+ *	Interface
+ */
+
+typedef struct gsm_state * 	gsm;
+typedef short		   		gsm_signal;		/* signed 16 bit */
+typedef unsigned char		gsm_byte;
+typedef gsm_byte 			gsm_frame[33];		/* 33 * 8 bits	 */
+
+#define	GSM_MAGIC		0xD		  	/* 13 kbit/s RPE-LTP */
+
+#define	GSM_PATCHLEVEL		10
+#define	GSM_MINOR			0
+#define	GSM_MAJOR			1
+
+#define	GSM_OPT_VERBOSE		1
+#define	GSM_OPT_FAST		2
+#define	GSM_OPT_LTP_CUT		3
+#define	GSM_OPT_WAV49		4
+#define	GSM_OPT_FRAME_INDEX	5
+#define	GSM_OPT_FRAME_CHAIN	6
+
+gsm  gsm_create 	(void);
+
+/* Added for libsndfile : May 6, 2002 */
+void gsm_init (gsm);	
+
+void gsm_destroy (gsm);	
+
+int  gsm_print   (FILE *, gsm, gsm_byte  *);
+int  gsm_option  (gsm, int, int *);
+
+void gsm_encode  (gsm, gsm_signal *, gsm_byte  *);
+int  gsm_decode  (gsm, gsm_byte   *, gsm_signal *);
+
+int  gsm_explode (gsm, gsm_byte   *, gsm_signal *);
+void gsm_implode (gsm, gsm_signal *, gsm_byte   *);
+
+#endif	/* GSM_H */
+
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/gsm610_priv.h b/jni/libsndfile-1.0.25/src/GSM610/gsm610_priv.h
new file mode 100644
index 0000000..e121c1c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/gsm610_priv.h
@@ -0,0 +1,301 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#ifndef	PRIVATE_H
+#define	PRIVATE_H
+
+/* Added by Erik de Castro Lopo */
+#define	USE_FLOAT_MUL
+#define	FAST
+#define	WAV49
+
+#ifdef __cplusplus
+#error "This code is not designed to be compiled with a C++ compiler."
+#endif
+/* Added by Erik de Castro Lopo */
+
+
+
+typedef short				word;		/* 16 bit signed int	*/
+typedef int					longword;	/* 32 bit signed int	*/
+
+typedef unsigned short		uword;		/* unsigned word	*/
+typedef unsigned int		ulongword;	/* unsigned longword	*/
+
+struct gsm_state
+{	word			dp0[ 280 ] ;
+
+	word			z1;			/* preprocessing.c, Offset_com. */
+	longword		L_z2;		/*                  Offset_com. */
+	int				mp;			/*                  Preemphasis	*/
+
+	word			u[8] ;			/* short_term_aly_filter.c	*/
+	word			LARpp[2][8] ; 	/*                              */
+	word			j;				/*                              */
+
+	word	        ltp_cut;        /* long_term.c, LTP crosscorr.  */
+	word			nrp; 			/* 40 */	/* long_term.c, synthesis	*/
+	word			v[9] ;			/* short_term.c, synthesis	*/
+	word			msr;			/* decoder.c,	Postprocessing	*/
+
+	char			verbose;		/* only used if !NDEBUG		*/
+	char			fast;			/* only used if FAST		*/
+
+	char			wav_fmt;		/* only used if WAV49 defined	*/
+	unsigned char	frame_index;	/*            odd/even chaining	*/
+	unsigned char	frame_chain;	/*   half-byte to carry forward	*/
+
+	/* Moved here from code.c where it was defined as static */
+	word e[50] ;
+} ;
+
+typedef struct gsm_state GSM_STATE ;
+
+#define	MIN_WORD	(-32767 - 1)
+#define	MAX_WORD	  32767
+
+#define	MIN_LONGWORD	(-2147483647 - 1)
+#define	MAX_LONGWORD	  2147483647
+
+/* Signed arithmetic shift right. */
+static inline word
+SASR_W (word x, word by)
+{	return (x >> by) ;
+} /* SASR */
+
+static inline longword
+SASR_L (longword x, word by)
+{	return (x >> by) ;
+} /* SASR */
+
+/*
+ *	Prototypes from add.c
+ */
+word	gsm_mult 		(word a, word b) ;
+longword gsm_L_mult 	(word a, word b) ;
+word	gsm_mult_r		(word a, word b) ;
+
+word	gsm_div  		(word num, word denum) ;
+
+word	gsm_add 		(word a, word b ) ;
+longword gsm_L_add 	(longword a, longword b ) ;
+
+word	gsm_sub 		(word a, word b) ;
+longword gsm_L_sub 	(longword a, longword b) ;
+
+word	gsm_abs 		(word a) ;
+
+word	gsm_norm 		(longword a ) ;
+
+longword gsm_L_asl  	(longword a, int n) ;
+word	gsm_asl 		(word a, int n) ;
+
+longword gsm_L_asr  	(longword a, int n) ;
+word	gsm_asr  		(word a, int n) ;
+
+/*
+ *  Inlined functions from add.h
+ */
+
+static inline longword
+GSM_MULT_R (word a, word b)
+{	return (((longword) (a)) * ((longword) (b)) + 16384) >> 15 ;
+} /* GSM_MULT_R */
+
+static inline longword
+GSM_MULT (word a, word b)
+{	return (((longword) (a)) * ((longword) (b))) >> 15 ;
+} /* GSM_MULT */
+
+static inline longword
+GSM_L_MULT (word a, word b)
+{	return ((longword) (a)) * ((longword) (b)) << 1 ;
+} /* GSM_L_MULT */
+
+static inline longword
+GSM_L_ADD (longword a, longword b)
+{	ulongword utmp ;
+
+	if (a < 0 && b < 0)
+	{	utmp = (ulongword)-((a) + 1) + (ulongword)-((b) + 1) ;
+		return (utmp >= (ulongword) MAX_LONGWORD) ? MIN_LONGWORD : -(longword)utmp-2 ;
+		} ;
+
+	if (a > 0 && b > 0)
+	{	utmp = (ulongword) a + (ulongword) b ;
+		return (utmp >= (ulongword) MAX_LONGWORD) ? MAX_LONGWORD : utmp ;
+		} ;
+
+	return a + b ;
+} /* GSM_L_ADD */
+
+static inline longword
+GSM_ADD (word a, word b)
+{	longword ltmp ;
+
+	ltmp = ((longword) a) + ((longword) b) ;
+
+	if (ltmp >= MAX_WORD)
+		return MAX_WORD ;
+	if (ltmp <= MIN_WORD)
+		return MIN_WORD ;
+
+	return ltmp ;
+} /* GSM_ADD */
+
+static inline longword
+GSM_SUB (word a, word b)
+{	longword ltmp ;
+
+	ltmp = ((longword) a) - ((longword) b) ;
+
+	if (ltmp >= MAX_WORD)
+		ltmp = MAX_WORD ;
+	else if (ltmp <= MIN_WORD)
+		ltmp = MIN_WORD ;
+
+	return ltmp ;
+} /* GSM_SUB */
+
+static inline word
+GSM_ABS (word a)
+{
+	if (a > 0)
+		return a ;
+	if (a == MIN_WORD)
+		return MAX_WORD ;
+	return -a ;
+} /* GSM_ADD */
+
+
+/*
+ *  More prototypes from implementations..
+ */
+void Gsm_Coder (
+		struct gsm_state	* S,
+		word	* s,	/* [0..159] samples		IN	*/
+		word	* LARc,	/* [0..7] LAR coefficients	OUT	*/
+		word	* Nc,	/* [0..3] LTP lag		OUT 	*/
+		word	* bc,	/* [0..3] coded LTP gain	OUT 	*/
+		word	* Mc,	/* [0..3] RPE grid selection	OUT     */
+		word	* xmaxc,/* [0..3] Coded maximum amplitude OUT	*/
+		word	* xMc) ;/* [13*4] normalized RPE samples OUT	*/
+
+void Gsm_Long_Term_Predictor (		/* 4x for 160 samples */
+		struct gsm_state * S,
+		word	* d,	/* [0..39]   residual signal	IN	*/
+		word	* dp,	/* [-120..-1] d'		IN	*/
+		word	* e,	/* [0..40] 			OUT	*/
+		word	* dpp,	/* [0..40] 			OUT	*/
+		word	* Nc,	/* correlation lag		OUT	*/
+		word	* bc) ;	/* gain factor			OUT	*/
+
+void Gsm_LPC_Analysis (
+		struct gsm_state * S,
+		word * s,		/* 0..159 signals	IN/OUT	*/
+		word * LARc) ;   /* 0..7   LARc's	OUT	*/
+
+void Gsm_Preprocess (
+		struct gsm_state * S,
+		word * s, word * so) ;
+
+void Gsm_Encoding (
+		struct gsm_state * S,
+		word	* e,
+		word	* ep,
+		word	* xmaxc,
+		word	* Mc,
+		word	* xMc) ;
+
+void Gsm_Short_Term_Analysis_Filter (
+		struct gsm_state * S,
+		word	* LARc,	/* coded log area ratio [0..7]  IN	*/
+		word	* d) ;	/* st res. signal [0..159]	IN/OUT	*/
+
+void Gsm_Decoder (
+		struct gsm_state * S,
+		word	* LARcr,	/* [0..7]		IN	*/
+		word	* Ncr,		/* [0..3] 		IN 	*/
+		word	* bcr,		/* [0..3]		IN	*/
+		word	* Mcr,		/* [0..3] 		IN 	*/
+		word	* xmaxcr,	/* [0..3]		IN 	*/
+		word	* xMcr,		/* [0..13*4]		IN	*/
+		word	* s) ;		/* [0..159]		OUT 	*/
+
+void Gsm_Decoding (
+		struct gsm_state * S,
+		word 	xmaxcr,
+		word	Mcr,
+		word	* xMcr,  	/* [0..12]		IN	*/
+		word	* erp) ; 	/* [0..39]		OUT 	*/
+
+void Gsm_Long_Term_Synthesis_Filtering (
+		struct gsm_state* S,
+		word	Ncr,
+		word	bcr,
+		word	* erp,		/* [0..39]		  IN 	*/
+		word	* drp) ; 	/* [-120..-1] IN, [0..40] OUT 	*/
+
+void Gsm_RPE_Decoding (
+	/*-struct gsm_state *S,-*/
+		word xmaxcr,
+		word Mcr,
+		word * xMcr,  /* [0..12], 3 bits             IN      */
+		word * erp) ; /* [0..39]                     OUT     */
+
+void Gsm_RPE_Encoding (
+		/*-struct gsm_state * S,-*/
+		word    * e,            /* -5..-1][0..39][40..44     IN/OUT  */
+		word    * xmaxc,        /*                              OUT */
+		word    * Mc,           /*                              OUT */
+		word    * xMc) ;        /* [0..12]                      OUT */
+
+void Gsm_Short_Term_Synthesis_Filter (
+		struct gsm_state * S,
+		word	* LARcr, 	/* log area ratios [0..7]  IN	*/
+		word	* drp,		/* received d [0...39]	   IN	*/
+		word	* s) ;		/* signal   s [0..159]	  OUT	*/
+
+void Gsm_Update_of_reconstructed_short_time_residual_signal (
+		word	* dpp,		/* [0...39]	IN	*/
+		word	* ep,		/* [0...39]	IN	*/
+		word	* dp) ;		/* [-120...-1]  IN/OUT 	*/
+
+/*
+ *  Tables from table.c
+ */
+#ifndef	GSM_TABLE_C
+
+extern word gsm_A [8], gsm_B [8], gsm_MIC [8], gsm_MAC [8] ;
+extern word gsm_INVA [8] ;
+extern word gsm_DLB [4], gsm_QLB [4] ;
+extern word gsm_H [11] ;
+extern word gsm_NRFAC [8] ;
+extern word gsm_FAC [8] ;
+
+#endif	/* GSM_TABLE_C */
+
+/*
+ *  Debugging
+ */
+#ifdef NDEBUG
+
+#	define	gsm_debug_words(a, b, c, d)		/* nil */
+#	define	gsm_debug_longwords(a, b, c, d)		/* nil */
+#	define	gsm_debug_word(a, b)			/* nil */
+#	define	gsm_debug_longword(a, b)		/* nil */
+
+#else	/* !NDEBUG => DEBUG */
+
+	void  gsm_debug_words     (char * name, int, int, word *) ;
+	void  gsm_debug_longwords (char * name, int, int, longword *) ;
+	void  gsm_debug_longword  (char * name, longword) ;
+	void  gsm_debug_word      (char * name, word) ;
+
+#endif /* !NDEBUG */
+
+#endif	/* PRIVATE_H */
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/gsm_create.c b/jni/libsndfile-1.0.25/src/GSM610/gsm_create.c
new file mode 100644
index 0000000..2bb4307
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/gsm_create.c
@@ -0,0 +1,37 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include	"config.h"
+
+#include	<stdio.h>
+#include	<stdlib.h>
+#include	<string.h>
+
+
+
+#include "gsm.h"
+#include "gsm610_priv.h"
+
+gsm gsm_create (void)
+{
+	gsm  r;
+
+	r = malloc (sizeof(struct gsm_state));
+	if (!r) return r;
+	
+	memset((char *)r, 0, sizeof (struct gsm_state));
+	r->nrp = 40;
+
+	return r;
+}
+
+/* Added for libsndfile : May 6, 2002. Not sure if it works. */
+void gsm_init (gsm state)
+{
+	memset (state, 0, sizeof (struct gsm_state)) ;
+	state->nrp = 40 ;
+} 
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/gsm_create.lo b/jni/libsndfile-1.0.25/src/GSM610/gsm_create.lo
new file mode 100644
index 0000000..e68e080
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/gsm_create.lo
@@ -0,0 +1,12 @@
+# GSM610/gsm_create.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/gsm_create.o'
+
+# Name of the non-PIC object
+non_pic_object='gsm_create.o'
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/gsm_create.o b/jni/libsndfile-1.0.25/src/GSM610/gsm_create.o
new file mode 100644
index 0000000..c3885ee
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/gsm_create.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/gsm_decode.c b/jni/libsndfile-1.0.25/src/GSM610/gsm_decode.c
new file mode 100644
index 0000000..b13308a
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/gsm_decode.c
@@ -0,0 +1,359 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include "gsm610_priv.h"
+
+#include "gsm.h"
+
+int gsm_decode (gsm s, gsm_byte * c, gsm_signal * target)
+{
+	word  	LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
+
+#ifdef WAV49
+	if (s->wav_fmt) {
+
+		uword sr = 0;
+
+		s->frame_index = !s->frame_index;
+		if (s->frame_index) {
+
+			sr = *c++;
+			LARc[0] = sr & 0x3f;  sr >>= 6;
+			sr |= (uword)*c++ << 2;
+			LARc[1] = sr & 0x3f;  sr >>= 6;
+			sr |= (uword)*c++ << 4;
+			LARc[2] = sr & 0x1f;  sr >>= 5;
+			LARc[3] = sr & 0x1f;  sr >>= 5;
+			sr |= (uword)*c++ << 2;
+			LARc[4] = sr & 0xf;  sr >>= 4;
+			LARc[5] = sr & 0xf;  sr >>= 4;
+			sr |= (uword)*c++ << 2;			/* 5 */
+			LARc[6] = sr & 0x7;  sr >>= 3;
+			LARc[7] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 4;
+			Nc[0] = sr & 0x7f;  sr >>= 7;
+			bc[0] = sr & 0x3;  sr >>= 2;
+			Mc[0] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 1;
+			xmaxc[0] = sr & 0x3f;  sr >>= 6;
+			xmc[0] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[1] = sr & 0x7;  sr >>= 3;
+			xmc[2] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[3] = sr & 0x7;  sr >>= 3;
+			xmc[4] = sr & 0x7;  sr >>= 3;
+			xmc[5] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;			/* 10 */
+			xmc[6] = sr & 0x7;  sr >>= 3;
+			xmc[7] = sr & 0x7;  sr >>= 3;
+			xmc[8] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[9] = sr & 0x7;  sr >>= 3;
+			xmc[10] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[11] = sr & 0x7;  sr >>= 3;
+			xmc[12] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 4;
+			Nc[1] = sr & 0x7f;  sr >>= 7;
+			bc[1] = sr & 0x3;  sr >>= 2;
+			Mc[1] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 1;
+			xmaxc[1] = sr & 0x3f;  sr >>= 6;
+			xmc[13] = sr & 0x7;  sr >>= 3;
+			sr = *c++;				/* 15 */
+			xmc[14] = sr & 0x7;  sr >>= 3;
+			xmc[15] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[16] = sr & 0x7;  sr >>= 3;
+			xmc[17] = sr & 0x7;  sr >>= 3;
+			xmc[18] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[19] = sr & 0x7;  sr >>= 3;
+			xmc[20] = sr & 0x7;  sr >>= 3;
+			xmc[21] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[22] = sr & 0x7;  sr >>= 3;
+			xmc[23] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[24] = sr & 0x7;  sr >>= 3;
+			xmc[25] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 4;			/* 20 */
+			Nc[2] = sr & 0x7f;  sr >>= 7;
+			bc[2] = sr & 0x3;  sr >>= 2;
+			Mc[2] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 1;
+			xmaxc[2] = sr & 0x3f;  sr >>= 6;
+			xmc[26] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[27] = sr & 0x7;  sr >>= 3;
+			xmc[28] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[29] = sr & 0x7;  sr >>= 3;
+			xmc[30] = sr & 0x7;  sr >>= 3;
+			xmc[31] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[32] = sr & 0x7;  sr >>= 3;
+			xmc[33] = sr & 0x7;  sr >>= 3;
+			xmc[34] = sr & 0x7;  sr >>= 3;
+			sr = *c++;				/* 25 */
+			xmc[35] = sr & 0x7;  sr >>= 3;
+			xmc[36] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[37] = sr & 0x7;  sr >>= 3;
+			xmc[38] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 4;
+			Nc[3] = sr & 0x7f;  sr >>= 7;
+			bc[3] = sr & 0x3;  sr >>= 2;
+			Mc[3] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 1;
+			xmaxc[3] = sr & 0x3f;  sr >>= 6;
+			xmc[39] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[40] = sr & 0x7;  sr >>= 3;
+			xmc[41] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;			/* 30 */
+			xmc[42] = sr & 0x7;  sr >>= 3;
+			xmc[43] = sr & 0x7;  sr >>= 3;
+			xmc[44] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[45] = sr & 0x7;  sr >>= 3;
+			xmc[46] = sr & 0x7;  sr >>= 3;
+			xmc[47] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[48] = sr & 0x7;  sr >>= 3;
+			xmc[49] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[50] = sr & 0x7;  sr >>= 3;
+			xmc[51] = sr & 0x7;  sr >>= 3;
+
+			s->frame_chain = sr & 0xf;
+		}
+		else {
+			sr = s->frame_chain;
+			sr |= (uword)*c++ << 4;			/* 1 */
+			LARc[0] = sr & 0x3f;  sr >>= 6;
+			LARc[1] = sr & 0x3f;  sr >>= 6;
+			sr = *c++;
+			LARc[2] = sr & 0x1f;  sr >>= 5;
+			sr |= (uword)*c++ << 3;
+			LARc[3] = sr & 0x1f;  sr >>= 5;
+			LARc[4] = sr & 0xf;  sr >>= 4;
+			sr |= (uword)*c++ << 2;
+			LARc[5] = sr & 0xf;  sr >>= 4;
+			LARc[6] = sr & 0x7;  sr >>= 3;
+			LARc[7] = sr & 0x7;  sr >>= 3;
+			sr = *c++;				/* 5 */
+			Nc[0] = sr & 0x7f;  sr >>= 7;
+			sr |= (uword)*c++ << 1;
+			bc[0] = sr & 0x3;  sr >>= 2;
+			Mc[0] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 5;
+			xmaxc[0] = sr & 0x3f;  sr >>= 6;
+			xmc[0] = sr & 0x7;  sr >>= 3;
+			xmc[1] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[2] = sr & 0x7;  sr >>= 3;
+			xmc[3] = sr & 0x7;  sr >>= 3;
+			xmc[4] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[5] = sr & 0x7;  sr >>= 3;
+			xmc[6] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;			/* 10 */
+			xmc[7] = sr & 0x7;  sr >>= 3;
+			xmc[8] = sr & 0x7;  sr >>= 3;
+			xmc[9] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[10] = sr & 0x7;  sr >>= 3;
+			xmc[11] = sr & 0x7;  sr >>= 3;
+			xmc[12] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			Nc[1] = sr & 0x7f;  sr >>= 7;
+			sr |= (uword)*c++ << 1;
+			bc[1] = sr & 0x3;  sr >>= 2;
+			Mc[1] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 5;
+			xmaxc[1] = sr & 0x3f;  sr >>= 6;
+			xmc[13] = sr & 0x7;  sr >>= 3;
+			xmc[14] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;			/* 15 */
+			xmc[15] = sr & 0x7;  sr >>= 3;
+			xmc[16] = sr & 0x7;  sr >>= 3;
+			xmc[17] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[18] = sr & 0x7;  sr >>= 3;
+			xmc[19] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[20] = sr & 0x7;  sr >>= 3;
+			xmc[21] = sr & 0x7;  sr >>= 3;
+			xmc[22] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[23] = sr & 0x7;  sr >>= 3;
+			xmc[24] = sr & 0x7;  sr >>= 3;
+			xmc[25] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			Nc[2] = sr & 0x7f;  sr >>= 7;
+			sr |= (uword)*c++ << 1;			/* 20 */
+			bc[2] = sr & 0x3;  sr >>= 2;
+			Mc[2] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 5;
+			xmaxc[2] = sr & 0x3f;  sr >>= 6;
+			xmc[26] = sr & 0x7;  sr >>= 3;
+			xmc[27] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;	
+			xmc[28] = sr & 0x7;  sr >>= 3;
+			xmc[29] = sr & 0x7;  sr >>= 3;
+			xmc[30] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[31] = sr & 0x7;  sr >>= 3;
+			xmc[32] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[33] = sr & 0x7;  sr >>= 3;
+			xmc[34] = sr & 0x7;  sr >>= 3;
+			xmc[35] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;			/* 25 */
+			xmc[36] = sr & 0x7;  sr >>= 3;
+			xmc[37] = sr & 0x7;  sr >>= 3;
+			xmc[38] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			Nc[3] = sr & 0x7f;  sr >>= 7;
+			sr |= (uword)*c++ << 1;		
+			bc[3] = sr & 0x3;  sr >>= 2;
+			Mc[3] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 5;
+			xmaxc[3] = sr & 0x3f;  sr >>= 6;
+			xmc[39] = sr & 0x7;  sr >>= 3;
+			xmc[40] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[41] = sr & 0x7;  sr >>= 3;
+			xmc[42] = sr & 0x7;  sr >>= 3;
+			xmc[43] = sr & 0x7;  sr >>= 3;
+			sr = *c++;				/* 30 */
+			xmc[44] = sr & 0x7;  sr >>= 3;
+			xmc[45] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[46] = sr & 0x7;  sr >>= 3;
+			xmc[47] = sr & 0x7;  sr >>= 3;
+			xmc[48] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[49] = sr & 0x7;  sr >>= 3;
+			xmc[50] = sr & 0x7;  sr >>= 3;
+			xmc[51] = sr & 0x7;  sr >>= 3;
+		}
+	}
+	else
+#endif
+	{
+		/* GSM_MAGIC  = (*c >> 4) & 0xF; */
+
+		if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1;
+
+		LARc[0]  = (*c++ & 0xF) << 2;		/* 1 */
+		LARc[0] |= (*c >> 6) & 0x3;
+		LARc[1]  = *c++ & 0x3F;
+		LARc[2]  = (*c >> 3) & 0x1F;
+		LARc[3]  = (*c++ & 0x7) << 2;
+		LARc[3] |= (*c >> 6) & 0x3;
+		LARc[4]  = (*c >> 2) & 0xF;
+		LARc[5]  = (*c++ & 0x3) << 2;
+		LARc[5] |= (*c >> 6) & 0x3;
+		LARc[6]  = (*c >> 3) & 0x7;
+		LARc[7]  = *c++ & 0x7;
+		Nc[0]  = (*c >> 1) & 0x7F;
+		bc[0]  = (*c++ & 0x1) << 1;
+		bc[0] |= (*c >> 7) & 0x1;
+		Mc[0]  = (*c >> 5) & 0x3;
+		xmaxc[0]  = (*c++ & 0x1F) << 1;
+		xmaxc[0] |= (*c >> 7) & 0x1;
+		xmc[0]  = (*c >> 4) & 0x7;
+		xmc[1]  = (*c >> 1) & 0x7;
+		xmc[2]  = (*c++ & 0x1) << 2;
+		xmc[2] |= (*c >> 6) & 0x3;
+		xmc[3]  = (*c >> 3) & 0x7;
+		xmc[4]  = *c++ & 0x7;
+		xmc[5]  = (*c >> 5) & 0x7;
+		xmc[6]  = (*c >> 2) & 0x7;
+		xmc[7]  = (*c++ & 0x3) << 1;		/* 10 */
+		xmc[7] |= (*c >> 7) & 0x1;
+		xmc[8]  = (*c >> 4) & 0x7;
+		xmc[9]  = (*c >> 1) & 0x7;
+		xmc[10]  = (*c++ & 0x1) << 2;
+		xmc[10] |= (*c >> 6) & 0x3;
+		xmc[11]  = (*c >> 3) & 0x7;
+		xmc[12]  = *c++ & 0x7;
+		Nc[1]  = (*c >> 1) & 0x7F;
+		bc[1]  = (*c++ & 0x1) << 1;
+		bc[1] |= (*c >> 7) & 0x1;
+		Mc[1]  = (*c >> 5) & 0x3;
+		xmaxc[1]  = (*c++ & 0x1F) << 1;
+		xmaxc[1] |= (*c >> 7) & 0x1;
+		xmc[13]  = (*c >> 4) & 0x7;
+		xmc[14]  = (*c >> 1) & 0x7;
+		xmc[15]  = (*c++ & 0x1) << 2;
+		xmc[15] |= (*c >> 6) & 0x3;
+		xmc[16]  = (*c >> 3) & 0x7;
+		xmc[17]  = *c++ & 0x7;
+		xmc[18]  = (*c >> 5) & 0x7;
+		xmc[19]  = (*c >> 2) & 0x7;
+		xmc[20]  = (*c++ & 0x3) << 1;
+		xmc[20] |= (*c >> 7) & 0x1;
+		xmc[21]  = (*c >> 4) & 0x7;
+		xmc[22]  = (*c >> 1) & 0x7;
+		xmc[23]  = (*c++ & 0x1) << 2;
+		xmc[23] |= (*c >> 6) & 0x3;
+		xmc[24]  = (*c >> 3) & 0x7;
+		xmc[25]  = *c++ & 0x7;
+		Nc[2]  = (*c >> 1) & 0x7F;
+		bc[2]  = (*c++ & 0x1) << 1;		/* 20 */
+		bc[2] |= (*c >> 7) & 0x1;
+		Mc[2]  = (*c >> 5) & 0x3;
+		xmaxc[2]  = (*c++ & 0x1F) << 1;
+		xmaxc[2] |= (*c >> 7) & 0x1;
+		xmc[26]  = (*c >> 4) & 0x7;
+		xmc[27]  = (*c >> 1) & 0x7;
+		xmc[28]  = (*c++ & 0x1) << 2;
+		xmc[28] |= (*c >> 6) & 0x3;
+		xmc[29]  = (*c >> 3) & 0x7;
+		xmc[30]  = *c++ & 0x7;
+		xmc[31]  = (*c >> 5) & 0x7;
+		xmc[32]  = (*c >> 2) & 0x7;
+		xmc[33]  = (*c++ & 0x3) << 1;
+		xmc[33] |= (*c >> 7) & 0x1;
+		xmc[34]  = (*c >> 4) & 0x7;
+		xmc[35]  = (*c >> 1) & 0x7;
+		xmc[36]  = (*c++ & 0x1) << 2;
+		xmc[36] |= (*c >> 6) & 0x3;
+		xmc[37]  = (*c >> 3) & 0x7;
+		xmc[38]  = *c++ & 0x7;
+		Nc[3]  = (*c >> 1) & 0x7F;
+		bc[3]  = (*c++ & 0x1) << 1;
+		bc[3] |= (*c >> 7) & 0x1;
+		Mc[3]  = (*c >> 5) & 0x3;
+		xmaxc[3]  = (*c++ & 0x1F) << 1;
+		xmaxc[3] |= (*c >> 7) & 0x1;
+		xmc[39]  = (*c >> 4) & 0x7;
+		xmc[40]  = (*c >> 1) & 0x7;
+		xmc[41]  = (*c++ & 0x1) << 2;
+		xmc[41] |= (*c >> 6) & 0x3;
+		xmc[42]  = (*c >> 3) & 0x7;
+		xmc[43]  = *c++ & 0x7;			/* 30  */
+		xmc[44]  = (*c >> 5) & 0x7;
+		xmc[45]  = (*c >> 2) & 0x7;
+		xmc[46]  = (*c++ & 0x3) << 1;
+		xmc[46] |= (*c >> 7) & 0x1;
+		xmc[47]  = (*c >> 4) & 0x7;
+		xmc[48]  = (*c >> 1) & 0x7;
+		xmc[49]  = (*c++ & 0x1) << 2;
+		xmc[49] |= (*c >> 6) & 0x3;
+		xmc[50]  = (*c >> 3) & 0x7;
+		xmc[51]  = *c & 0x7;			/* 33 */
+	}
+
+	Gsm_Decoder(s, LARc, Nc, bc, Mc, xmaxc, xmc, target);
+
+	return 0;
+}
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/gsm_decode.lo b/jni/libsndfile-1.0.25/src/GSM610/gsm_decode.lo
new file mode 100644
index 0000000..da8a009
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/gsm_decode.lo
@@ -0,0 +1,12 @@
+# GSM610/gsm_decode.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/gsm_decode.o'
+
+# Name of the non-PIC object
+non_pic_object='gsm_decode.o'
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/gsm_decode.o b/jni/libsndfile-1.0.25/src/GSM610/gsm_decode.o
new file mode 100644
index 0000000..44ae5bc
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/gsm_decode.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/gsm_destroy.c b/jni/libsndfile-1.0.25/src/GSM610/gsm_destroy.c
new file mode 100644
index 0000000..9b41711
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/gsm_destroy.c
@@ -0,0 +1,24 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include "gsm.h"
+#include "config.h"
+
+#ifdef	HAS_STDLIB_H
+#	include	<stdlib.h>
+#else
+#	ifdef	HAS_MALLOC_H
+#		include 	<malloc.h>
+#	else
+		extern void free();
+#	endif
+#endif
+
+void gsm_destroy (gsm S)
+{
+	if (S) free((char *)S);
+}
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/gsm_destroy.lo b/jni/libsndfile-1.0.25/src/GSM610/gsm_destroy.lo
new file mode 100644
index 0000000..d3db32e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/gsm_destroy.lo
@@ -0,0 +1,12 @@
+# GSM610/gsm_destroy.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/gsm_destroy.o'
+
+# Name of the non-PIC object
+non_pic_object='gsm_destroy.o'
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/gsm_destroy.o b/jni/libsndfile-1.0.25/src/GSM610/gsm_destroy.o
new file mode 100644
index 0000000..aa06fa6
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/gsm_destroy.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/gsm_encode.c b/jni/libsndfile-1.0.25/src/GSM610/gsm_encode.c
new file mode 100644
index 0000000..5c9e1ab
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/gsm_encode.c
@@ -0,0 +1,449 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include "gsm610_priv.h"
+#include "gsm.h"
+
+void gsm_encode (gsm s, gsm_signal * source, gsm_byte * c)
+{
+	word	 	LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
+
+	Gsm_Coder(s, source, LARc, Nc, bc, Mc, xmaxc, xmc);
+
+
+	/*	variable	size
+
+		GSM_MAGIC	4
+
+		LARc[0]		6
+		LARc[1]		6
+		LARc[2]		5
+		LARc[3]		5
+		LARc[4]		4
+		LARc[5]		4
+		LARc[6]		3
+		LARc[7]		3
+
+		Nc[0]		7
+		bc[0]		2
+		Mc[0]		2
+		xmaxc[0]	6
+		xmc[0]		3
+		xmc[1]		3
+		xmc[2]		3
+		xmc[3]		3
+		xmc[4]		3
+		xmc[5]		3
+		xmc[6]		3
+		xmc[7]		3
+		xmc[8]		3
+		xmc[9]		3
+		xmc[10]		3
+		xmc[11]		3
+		xmc[12]		3
+
+		Nc[1]		7
+		bc[1]		2
+		Mc[1]		2
+		xmaxc[1]	6
+		xmc[13]		3
+		xmc[14]		3
+		xmc[15]		3
+		xmc[16]		3
+		xmc[17]		3
+		xmc[18]		3
+		xmc[19]		3
+		xmc[20]		3
+		xmc[21]		3
+		xmc[22]		3
+		xmc[23]		3
+		xmc[24]		3
+		xmc[25]		3
+
+		Nc[2]		7
+		bc[2]		2
+		Mc[2]		2
+		xmaxc[2]	6
+		xmc[26]		3
+		xmc[27]		3
+		xmc[28]		3
+		xmc[29]		3
+		xmc[30]		3
+		xmc[31]		3
+		xmc[32]		3
+		xmc[33]		3
+		xmc[34]		3
+		xmc[35]		3
+		xmc[36]		3
+		xmc[37]		3
+		xmc[38]		3
+
+		Nc[3]		7
+		bc[3]		2
+		Mc[3]		2
+		xmaxc[3]	6
+		xmc[39]		3
+		xmc[40]		3
+		xmc[41]		3
+		xmc[42]		3
+		xmc[43]		3
+		xmc[44]		3
+		xmc[45]		3
+		xmc[46]		3
+		xmc[47]		3
+		xmc[48]		3
+		xmc[49]		3
+		xmc[50]		3
+		xmc[51]		3
+	*/
+
+#ifdef WAV49
+
+	if (s->wav_fmt) {
+		s->frame_index = !s->frame_index;
+		if (s->frame_index) {
+
+			uword sr;
+
+			sr = 0;
+			sr = sr >> 6 | LARc[0] << 10;
+			sr = sr >> 6 | LARc[1] << 10;
+			*c++ = sr >> 4;
+			sr = sr >> 5 | LARc[2] << 11;
+			*c++ = sr >> 7;
+			sr = sr >> 5 | LARc[3] << 11;
+			sr = sr >> 4 | LARc[4] << 12;
+			*c++ = sr >> 6;
+			sr = sr >> 4 | LARc[5] << 12;
+			sr = sr >> 3 | LARc[6] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | LARc[7] << 13;
+			sr = sr >> 7 | Nc[0] << 9;
+			*c++ = sr >> 5;
+			sr = sr >> 2 | bc[0] << 14;
+			sr = sr >> 2 | Mc[0] << 14;
+			sr = sr >> 6 | xmaxc[0] << 10;
+			*c++ = sr >> 3;
+			sr = sr >> 3 | xmc[0] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[1] << 13;
+			sr = sr >> 3 | xmc[2] << 13;
+			sr = sr >> 3 | xmc[3] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[4] << 13;
+			sr = sr >> 3 | xmc[5] << 13;
+			sr = sr >> 3 | xmc[6] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[7] << 13;
+			sr = sr >> 3 | xmc[8] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[9] << 13;
+			sr = sr >> 3 | xmc[10] << 13;
+			sr = sr >> 3 | xmc[11] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[12] << 13;
+			sr = sr >> 7 | Nc[1] << 9;
+			*c++ = sr >> 5;
+			sr = sr >> 2 | bc[1] << 14;
+			sr = sr >> 2 | Mc[1] << 14;
+			sr = sr >> 6 | xmaxc[1] << 10;
+			*c++ = sr >> 3;
+			sr = sr >> 3 | xmc[13] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[14] << 13;
+			sr = sr >> 3 | xmc[15] << 13;
+			sr = sr >> 3 | xmc[16] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[17] << 13;
+			sr = sr >> 3 | xmc[18] << 13;
+			sr = sr >> 3 | xmc[19] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[20] << 13;
+			sr = sr >> 3 | xmc[21] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[22] << 13;
+			sr = sr >> 3 | xmc[23] << 13;
+			sr = sr >> 3 | xmc[24] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[25] << 13;
+			sr = sr >> 7 | Nc[2] << 9;
+			*c++ = sr >> 5;
+			sr = sr >> 2 | bc[2] << 14;
+			sr = sr >> 2 | Mc[2] << 14;
+			sr = sr >> 6 | xmaxc[2] << 10;
+			*c++ = sr >> 3;
+			sr = sr >> 3 | xmc[26] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[27] << 13;
+			sr = sr >> 3 | xmc[28] << 13;
+			sr = sr >> 3 | xmc[29] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[30] << 13;
+			sr = sr >> 3 | xmc[31] << 13;
+			sr = sr >> 3 | xmc[32] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[33] << 13;
+			sr = sr >> 3 | xmc[34] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[35] << 13;
+			sr = sr >> 3 | xmc[36] << 13;
+			sr = sr >> 3 | xmc[37] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[38] << 13;
+			sr = sr >> 7 | Nc[3] << 9;
+			*c++ = sr >> 5;
+			sr = sr >> 2 | bc[3] << 14;
+			sr = sr >> 2 | Mc[3] << 14;
+			sr = sr >> 6 | xmaxc[3] << 10;
+			*c++ = sr >> 3;
+			sr = sr >> 3 | xmc[39] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[40] << 13;
+			sr = sr >> 3 | xmc[41] << 13;
+			sr = sr >> 3 | xmc[42] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[43] << 13;
+			sr = sr >> 3 | xmc[44] << 13;
+			sr = sr >> 3 | xmc[45] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[46] << 13;
+			sr = sr >> 3 | xmc[47] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[48] << 13;
+			sr = sr >> 3 | xmc[49] << 13;
+			sr = sr >> 3 | xmc[50] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[51] << 13;
+			sr = sr >> 4;
+			*c = sr >> 8;
+			s->frame_chain = *c;
+		}
+		else {
+			uword sr;
+
+			sr = 0;
+			sr = sr >> 4 | s->frame_chain << 12;
+			sr = sr >> 6 | LARc[0] << 10;
+			*c++ = sr >> 6;
+			sr = sr >> 6 | LARc[1] << 10;
+			*c++ = sr >> 8;
+			sr = sr >> 5 | LARc[2] << 11;
+			sr = sr >> 5 | LARc[3] << 11;
+			*c++ = sr >> 6;
+			sr = sr >> 4 | LARc[4] << 12;
+			sr = sr >> 4 | LARc[5] << 12;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | LARc[6] << 13;
+			sr = sr >> 3 | LARc[7] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 7 | Nc[0] << 9;
+			sr = sr >> 2 | bc[0] << 14;
+			*c++ = sr >> 7;
+			sr = sr >> 2 | Mc[0] << 14;
+			sr = sr >> 6 | xmaxc[0] << 10;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[0] << 13;
+			sr = sr >> 3 | xmc[1] << 13;
+			sr = sr >> 3 | xmc[2] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[3] << 13;
+			sr = sr >> 3 | xmc[4] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[5] << 13;
+			sr = sr >> 3 | xmc[6] << 13;
+			sr = sr >> 3 | xmc[7] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[8] << 13;
+			sr = sr >> 3 | xmc[9] << 13;
+			sr = sr >> 3 | xmc[10] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[11] << 13;
+			sr = sr >> 3 | xmc[12] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 7 | Nc[1] << 9;
+			sr = sr >> 2 | bc[1] << 14;
+			*c++ = sr >> 7;
+			sr = sr >> 2 | Mc[1] << 14;
+			sr = sr >> 6 | xmaxc[1] << 10;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[13] << 13;
+			sr = sr >> 3 | xmc[14] << 13;
+			sr = sr >> 3 | xmc[15] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[16] << 13;
+			sr = sr >> 3 | xmc[17] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[18] << 13;
+			sr = sr >> 3 | xmc[19] << 13;
+			sr = sr >> 3 | xmc[20] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[21] << 13;
+			sr = sr >> 3 | xmc[22] << 13;
+			sr = sr >> 3 | xmc[23] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[24] << 13;
+			sr = sr >> 3 | xmc[25] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 7 | Nc[2] << 9;
+			sr = sr >> 2 | bc[2] << 14;
+			*c++ = sr >> 7;
+			sr = sr >> 2 | Mc[2] << 14;
+			sr = sr >> 6 | xmaxc[2] << 10;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[26] << 13;
+			sr = sr >> 3 | xmc[27] << 13;
+			sr = sr >> 3 | xmc[28] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[29] << 13;
+			sr = sr >> 3 | xmc[30] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[31] << 13;
+			sr = sr >> 3 | xmc[32] << 13;
+			sr = sr >> 3 | xmc[33] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[34] << 13;
+			sr = sr >> 3 | xmc[35] << 13;
+			sr = sr >> 3 | xmc[36] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[37] << 13;
+			sr = sr >> 3 | xmc[38] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 7 | Nc[3] << 9;
+			sr = sr >> 2 | bc[3] << 14;
+			*c++ = sr >> 7;
+			sr = sr >> 2 | Mc[3] << 14;
+			sr = sr >> 6 | xmaxc[3] << 10;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[39] << 13;
+			sr = sr >> 3 | xmc[40] << 13;
+			sr = sr >> 3 | xmc[41] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[42] << 13;
+			sr = sr >> 3 | xmc[43] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[44] << 13;
+			sr = sr >> 3 | xmc[45] << 13;
+			sr = sr >> 3 | xmc[46] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[47] << 13;
+			sr = sr >> 3 | xmc[48] << 13;
+			sr = sr >> 3 | xmc[49] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[50] << 13;
+			sr = sr >> 3 | xmc[51] << 13;
+			*c++ = sr >> 8;
+		}
+	}
+
+	else
+
+#endif	/* WAV49 */
+	{
+
+		*c++ =   ((GSM_MAGIC & 0xF) << 4)		/* 1 */
+		       | ((LARc[0] >> 2) & 0xF);
+		*c++ =   ((LARc[0] & 0x3) << 6)
+		       | (LARc[1] & 0x3F);
+		*c++ =   ((LARc[2] & 0x1F) << 3)
+		       | ((LARc[3] >> 2) & 0x7);
+		*c++ =   ((LARc[3] & 0x3) << 6)
+		       | ((LARc[4] & 0xF) << 2)
+		       | ((LARc[5] >> 2) & 0x3);
+		*c++ =   ((LARc[5] & 0x3) << 6)
+		       | ((LARc[6] & 0x7) << 3)
+		       | (LARc[7] & 0x7);
+		*c++ =   ((Nc[0] & 0x7F) << 1)
+		       | ((bc[0] >> 1) & 0x1);
+		*c++ =   ((bc[0] & 0x1) << 7)
+		       | ((Mc[0] & 0x3) << 5)
+		       | ((xmaxc[0] >> 1) & 0x1F);
+		*c++ =   ((xmaxc[0] & 0x1) << 7)
+		       | ((xmc[0] & 0x7) << 4)
+		       | ((xmc[1] & 0x7) << 1)
+		       | ((xmc[2] >> 2) & 0x1);
+		*c++ =   ((xmc[2] & 0x3) << 6)
+		       | ((xmc[3] & 0x7) << 3)
+		       | (xmc[4] & 0x7);
+		*c++ =   ((xmc[5] & 0x7) << 5)			/* 10 */
+		       | ((xmc[6] & 0x7) << 2)
+		       | ((xmc[7] >> 1) & 0x3);
+		*c++ =   ((xmc[7] & 0x1) << 7)
+		       | ((xmc[8] & 0x7) << 4)
+		       | ((xmc[9] & 0x7) << 1)
+		       | ((xmc[10] >> 2) & 0x1);
+		*c++ =   ((xmc[10] & 0x3) << 6)
+		       | ((xmc[11] & 0x7) << 3)
+		       | (xmc[12] & 0x7);
+		*c++ =   ((Nc[1] & 0x7F) << 1)
+		       | ((bc[1] >> 1) & 0x1);
+		*c++ =   ((bc[1] & 0x1) << 7)
+		       | ((Mc[1] & 0x3) << 5)
+		       | ((xmaxc[1] >> 1) & 0x1F);
+		*c++ =   ((xmaxc[1] & 0x1) << 7)
+		       | ((xmc[13] & 0x7) << 4)
+		       | ((xmc[14] & 0x7) << 1)
+		       | ((xmc[15] >> 2) & 0x1);
+		*c++ =   ((xmc[15] & 0x3) << 6)
+		       | ((xmc[16] & 0x7) << 3)
+		       | (xmc[17] & 0x7);
+		*c++ =   ((xmc[18] & 0x7) << 5)
+		       | ((xmc[19] & 0x7) << 2)
+		       | ((xmc[20] >> 1) & 0x3);
+		*c++ =   ((xmc[20] & 0x1) << 7)
+		       | ((xmc[21] & 0x7) << 4)
+		       | ((xmc[22] & 0x7) << 1)
+		       | ((xmc[23] >> 2) & 0x1);
+		*c++ =   ((xmc[23] & 0x3) << 6)
+		       | ((xmc[24] & 0x7) << 3)
+		       | (xmc[25] & 0x7);
+		*c++ =   ((Nc[2] & 0x7F) << 1)			/* 20 */
+		       | ((bc[2] >> 1) & 0x1);
+		*c++ =   ((bc[2] & 0x1) << 7)
+		       | ((Mc[2] & 0x3) << 5)
+		       | ((xmaxc[2] >> 1) & 0x1F);
+		*c++ =   ((xmaxc[2] & 0x1) << 7)
+		       | ((xmc[26] & 0x7) << 4)
+		       | ((xmc[27] & 0x7) << 1)
+		       | ((xmc[28] >> 2) & 0x1);
+		*c++ =   ((xmc[28] & 0x3) << 6)
+		       | ((xmc[29] & 0x7) << 3)
+		       | (xmc[30] & 0x7);
+		*c++ =   ((xmc[31] & 0x7) << 5)
+		       | ((xmc[32] & 0x7) << 2)
+		       | ((xmc[33] >> 1) & 0x3);
+		*c++ =   ((xmc[33] & 0x1) << 7)
+		       | ((xmc[34] & 0x7) << 4)
+		       | ((xmc[35] & 0x7) << 1)
+		       | ((xmc[36] >> 2) & 0x1);
+		*c++ =   ((xmc[36] & 0x3) << 6)
+		       | ((xmc[37] & 0x7) << 3)
+		       | (xmc[38] & 0x7);
+		*c++ =   ((Nc[3] & 0x7F) << 1)
+		       | ((bc[3] >> 1) & 0x1);
+		*c++ =   ((bc[3] & 0x1) << 7)
+		       | ((Mc[3] & 0x3) << 5)
+		       | ((xmaxc[3] >> 1) & 0x1F);
+		*c++ =   ((xmaxc[3] & 0x1) << 7)
+		       | ((xmc[39] & 0x7) << 4)
+		       | ((xmc[40] & 0x7) << 1)
+		       | ((xmc[41] >> 2) & 0x1);
+		*c++ =   ((xmc[41] & 0x3) << 6)			/* 30 */
+		       | ((xmc[42] & 0x7) << 3)
+		       | (xmc[43] & 0x7);
+		*c++ =   ((xmc[44] & 0x7) << 5)
+		       | ((xmc[45] & 0x7) << 2)
+		       | ((xmc[46] >> 1) & 0x3);
+		*c++ =   ((xmc[46] & 0x1) << 7)
+		       | ((xmc[47] & 0x7) << 4)
+		       | ((xmc[48] & 0x7) << 1)
+		       | ((xmc[49] >> 2) & 0x1);
+		*c++ =   ((xmc[49] & 0x3) << 6)
+		       | ((xmc[50] & 0x7) << 3)
+		       | (xmc[51] & 0x7);
+
+	}
+}
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/gsm_encode.lo b/jni/libsndfile-1.0.25/src/GSM610/gsm_encode.lo
new file mode 100644
index 0000000..9dbb129
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/gsm_encode.lo
@@ -0,0 +1,12 @@
+# GSM610/gsm_encode.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/gsm_encode.o'
+
+# Name of the non-PIC object
+non_pic_object='gsm_encode.o'
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/gsm_encode.o b/jni/libsndfile-1.0.25/src/GSM610/gsm_encode.o
new file mode 100644
index 0000000..0d5e0d2
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/gsm_encode.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/gsm_option.c b/jni/libsndfile-1.0.25/src/GSM610/gsm_option.c
new file mode 100644
index 0000000..0139c35
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/gsm_option.c
@@ -0,0 +1,66 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include "gsm610_priv.h"
+
+#include "gsm.h"
+
+int gsm_option (gsm r, int opt, int * val)
+{
+	int 	result = -1;
+
+	switch (opt) {
+	case GSM_OPT_LTP_CUT:
+#ifdef 	LTP_CUT
+		result = r->ltp_cut;
+		if (val) r->ltp_cut = *val;
+#endif
+		break;
+
+	case GSM_OPT_VERBOSE:
+#ifndef	NDEBUG
+		result = r->verbose;
+		if (val) r->verbose = *val;
+#endif
+		break;
+
+	case GSM_OPT_FAST:
+
+#if	defined(FAST) && defined(USE_FLOAT_MUL)
+		result = r->fast;
+		if (val) r->fast = !!*val;
+#endif
+		break;
+
+	case GSM_OPT_FRAME_CHAIN:
+
+#ifdef WAV49
+		result = r->frame_chain;
+		if (val) r->frame_chain = *val;
+#endif
+		break;
+
+	case GSM_OPT_FRAME_INDEX:
+
+#ifdef WAV49
+		result = r->frame_index;
+		if (val) r->frame_index = *val;
+#endif
+		break;
+
+	case GSM_OPT_WAV49:
+
+#ifdef WAV49 
+		result = r->wav_fmt;
+		if (val) r->wav_fmt = !!*val;
+#endif
+		break;
+
+	default:
+		break;
+	}
+	return result;
+}
diff --git a/jni/libsndfile-1.0.25/src/GSM610/gsm_option.lo b/jni/libsndfile-1.0.25/src/GSM610/gsm_option.lo
new file mode 100644
index 0000000..b86b9f8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/gsm_option.lo
@@ -0,0 +1,12 @@
+# GSM610/gsm_option.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/gsm_option.o'
+
+# Name of the non-PIC object
+non_pic_object='gsm_option.o'
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/gsm_option.o b/jni/libsndfile-1.0.25/src/GSM610/gsm_option.o
new file mode 100644
index 0000000..2c47e98
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/gsm_option.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/libgsm.la b/jni/libsndfile-1.0.25/src/GSM610/libgsm.la
new file mode 100644
index 0000000..697ba4d
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/libgsm.la
@@ -0,0 +1,41 @@
+# libgsm.la - a libtool library file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname=''
+
+# Names of this library.
+library_names=''
+
+# The name of the static archive.
+old_library='libgsm.a'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags=''
+
+# Libraries that this one depends upon.
+dependency_libs=' -lm'
+
+# Names of additional weak libraries provided by this library
+weak_library_names=''
+
+# Version information for libgsm.
+current=
+age=
+revision=
+
+# Is this an already installed library?
+installed=no
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=no
+
+# Files to dlopen/dlpreopen
+dlopen=''
+dlpreopen=''
+
+# Directory that this library needs to be installed in:
+libdir=''
diff --git a/jni/libsndfile-1.0.25/src/GSM610/long_term.c b/jni/libsndfile-1.0.25/src/GSM610/long_term.c
new file mode 100644
index 0000000..0d2cd0f
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/long_term.c
@@ -0,0 +1,959 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "gsm610_priv.h"
+
+/*
+ *  4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION
+ */
+
+
+/*
+ * This module computes the LTP gain (bc) and the LTP lag (Nc)
+ * for the long term analysis filter.   This is done by calculating a
+ * maximum of the cross-correlation function between the current
+ * sub-segment short term residual signal d[0..39] (output of
+ * the short term analysis filter; for simplification the index
+ * of this array begins at 0 and ends at 39 for each sub-segment of the
+ * RPE-LTP analysis) and the previous reconstructed short term
+ * residual signal dp[ -120 .. -1 ].  A dynamic scaling must be
+ * performed to avoid overflow.
+ */
+
+ /* The next procedure exists in six versions.  First two integer
+  * version (if USE_FLOAT_MUL is not defined); then four floating
+  * point versions, twice with proper scaling (USE_FLOAT_MUL defined),
+  * once without (USE_FLOAT_MUL and FAST defined, and fast run-time
+  * option used).  Every pair has first a Cut version (see the -C
+  * option to toast or the LTP_CUT option to gsm_option()), then the
+  * uncut one.  (For a detailed explanation of why this is altogether
+  * a bad idea, see Henry Spencer and Geoff Collyer, ``#ifdef Considered
+  * Harmful''.)
+  */
+
+#ifndef  USE_FLOAT_MUL
+
+#ifdef	LTP_CUT
+
+static void Cut_Calculation_of_the_LTP_parameters (
+
+	struct gsm_state * st,
+
+	register word	* d,		/* [0..39]	IN	*/
+	register word	* dp,		/* [-120..-1]	IN	*/
+	word		* bc_out,	/* 		OUT	*/
+	word		* Nc_out	/* 		OUT	*/
+)
+{
+	register int  	k, lambda;
+	word		Nc, bc;
+	word		wt[40];
+
+	longword	L_result;
+	longword	L_max, L_power;
+	word		R, S, dmax, scal, best_k;
+	word		ltp_cut;
+
+	register word	temp, wt_k;
+
+	/*  Search of the optimum scaling of d[0..39].
+	 */
+	dmax = 0;
+	for (k = 0; k <= 39; k++) {
+		temp = d[k];
+		temp = GSM_ABS( temp );
+		if (temp > dmax) {
+			dmax = temp;
+			best_k = k;
+		}
+	}
+	temp = 0;
+	if (dmax == 0) scal = 0;
+	else {
+		assert(dmax > 0);
+		temp = gsm_norm( (longword)dmax << 16 );
+	}
+	if (temp > 6) scal = 0;
+	else scal = 6 - temp;
+	assert(scal >= 0);
+
+	/* Search for the maximum cross-correlation and coding of the LTP lag
+	 */
+	L_max = 0;
+	Nc    = 40;	/* index for the maximum cross-correlation */
+	wt_k  = SASR_W(d[best_k], scal);
+
+	for (lambda = 40; lambda <= 120; lambda++) {
+		L_result = (longword)wt_k * dp[best_k - lambda];
+		if (L_result > L_max) {
+			Nc    = lambda;
+			L_max = L_result;
+		}
+	}
+	*Nc_out = Nc;
+	L_max <<= 1;
+
+	/*  Rescaling of L_max
+	 */
+	assert(scal <= 100 && scal >= -100);
+	L_max = L_max >> (6 - scal);	/* sub(6, scal) */
+
+	assert( Nc <= 120 && Nc >= 40);
+
+	/*   Compute the power of the reconstructed short term residual
+	 *   signal dp[..]
+	 */
+	L_power = 0;
+	for (k = 0; k <= 39; k++) {
+
+		register longword L_temp;
+
+		L_temp   = SASR_W( dp[k - Nc], 3 );
+		L_power += L_temp * L_temp;
+	}
+	L_power <<= 1;	/* from L_MULT */
+
+	/*  Normalization of L_max and L_power
+	 */
+
+	if (L_max <= 0)  {
+		*bc_out = 0;
+		return;
+	}
+	if (L_max >= L_power) {
+		*bc_out = 3;
+		return;
+	}
+
+	temp = gsm_norm( L_power );
+
+	R = SASR( L_max   << temp, 16 );
+	S = SASR( L_power << temp, 16 );
+
+	/*  Coding of the LTP gain
+	 */
+
+	/*  Table 4.3a must be used to obtain the level DLB[i] for the
+	 *  quantization of the LTP gain b to get the coded version bc.
+	 */
+	for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
+	*bc_out = bc;
+}
+
+#endif 	/* LTP_CUT */
+
+static void Calculation_of_the_LTP_parameters (
+	register word	* d,		/* [0..39]	IN	*/
+	register word	* dp,		/* [-120..-1]	IN	*/
+	word		* bc_out,	/* 		OUT	*/
+	word		* Nc_out	/* 		OUT	*/
+)
+{
+	register int  	k, lambda;
+	word		Nc, bc;
+	word		wt[40];
+
+	longword	L_max, L_power;
+	word		R, S, dmax, scal;
+	register word	temp;
+
+	/*  Search of the optimum scaling of d[0..39].
+	 */
+	dmax = 0;
+
+	for (k = 0; k <= 39; k++) {
+		temp = d[k];
+		temp = GSM_ABS( temp );
+		if (temp > dmax) dmax = temp;
+	}
+
+	temp = 0;
+	if (dmax == 0) scal = 0;
+	else {
+		assert(dmax > 0);
+		temp = gsm_norm( (longword)dmax << 16 );
+	}
+
+	if (temp > 6) scal = 0;
+	else scal = 6 - temp;
+
+	assert(scal >= 0);
+
+	/*  Initialization of a working array wt
+	 */
+
+	for (k = 0; k <= 39; k++) wt[k] = SASR_W( d[k], scal );
+
+	/* Search for the maximum cross-correlation and coding of the LTP lag
+	 */
+	L_max = 0;
+	Nc    = 40;	/* index for the maximum cross-correlation */
+
+	for (lambda = 40; lambda <= 120; lambda++) {
+
+# undef STEP
+#		define STEP(k) 	(longword)wt[k] * dp[k - lambda]
+
+		register longword L_result;
+
+		L_result  = STEP(0)  ; L_result += STEP(1) ;
+		L_result += STEP(2)  ; L_result += STEP(3) ;
+		L_result += STEP(4)  ; L_result += STEP(5)  ;
+		L_result += STEP(6)  ; L_result += STEP(7)  ;
+		L_result += STEP(8)  ; L_result += STEP(9)  ;
+		L_result += STEP(10) ; L_result += STEP(11) ;
+		L_result += STEP(12) ; L_result += STEP(13) ;
+		L_result += STEP(14) ; L_result += STEP(15) ;
+		L_result += STEP(16) ; L_result += STEP(17) ;
+		L_result += STEP(18) ; L_result += STEP(19) ;
+		L_result += STEP(20) ; L_result += STEP(21) ;
+		L_result += STEP(22) ; L_result += STEP(23) ;
+		L_result += STEP(24) ; L_result += STEP(25) ;
+		L_result += STEP(26) ; L_result += STEP(27) ;
+		L_result += STEP(28) ; L_result += STEP(29) ;
+		L_result += STEP(30) ; L_result += STEP(31) ;
+		L_result += STEP(32) ; L_result += STEP(33) ;
+		L_result += STEP(34) ; L_result += STEP(35) ;
+		L_result += STEP(36) ; L_result += STEP(37) ;
+		L_result += STEP(38) ; L_result += STEP(39) ;
+
+		if (L_result > L_max) {
+
+			Nc    = lambda;
+			L_max = L_result;
+		}
+	}
+
+	*Nc_out = Nc;
+
+	L_max <<= 1;
+
+	/*  Rescaling of L_max
+	 */
+	assert(scal <= 100 && scal >=  -100);
+	L_max = L_max >> (6 - scal);	/* sub(6, scal) */
+
+	assert( Nc <= 120 && Nc >= 40);
+
+	/*   Compute the power of the reconstructed short term residual
+	 *   signal dp[..]
+	 */
+	L_power = 0;
+	for (k = 0; k <= 39; k++) {
+
+		register longword L_temp;
+
+		L_temp   = SASR_W( dp[k - Nc], 3 );
+		L_power += L_temp * L_temp;
+	}
+	L_power <<= 1;	/* from L_MULT */
+
+	/*  Normalization of L_max and L_power
+	 */
+
+	if (L_max <= 0)  {
+		*bc_out = 0;
+		return;
+	}
+	if (L_max >= L_power) {
+		*bc_out = 3;
+		return;
+	}
+
+	temp = gsm_norm( L_power );
+
+	R = SASR_L( L_max   << temp, 16 );
+	S = SASR_L( L_power << temp, 16 );
+
+	/*  Coding of the LTP gain
+	 */
+
+	/*  Table 4.3a must be used to obtain the level DLB[i] for the
+	 *  quantization of the LTP gain b to get the coded version bc.
+	 */
+	for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
+	*bc_out = bc;
+}
+
+#else	/* USE_FLOAT_MUL */
+
+#ifdef	LTP_CUT
+
+static void Cut_Calculation_of_the_LTP_parameters (
+	struct gsm_state * st,		/*              IN 	*/
+	register word	* d,		/* [0..39]	IN	*/
+	register word	* dp,		/* [-120..-1]	IN	*/
+	word		* bc_out,	/* 		OUT	*/
+	word		* Nc_out	/* 		OUT	*/
+)
+{
+	register int  	k, lambda;
+	word		Nc, bc;
+	word		ltp_cut;
+
+	float		wt_float[40];
+	float		dp_float_base[120], * dp_float = dp_float_base + 120;
+
+	longword	L_max, L_power;
+	word		R, S, dmax, scal;
+	register word	temp;
+
+	/*  Search of the optimum scaling of d[0..39].
+	 */
+	dmax = 0;
+
+	for (k = 0; k <= 39; k++) {
+		temp = d[k];
+		temp = GSM_ABS( temp );
+		if (temp > dmax) dmax = temp;
+	}
+
+	temp = 0;
+	if (dmax == 0) scal = 0;
+	else {
+		assert(dmax > 0);
+		temp = gsm_norm( (longword)dmax << 16 );
+	}
+
+	if (temp > 6) scal = 0;
+	else scal = 6 - temp;
+
+	assert(scal >= 0);
+	ltp_cut = (longword)SASR_W(dmax, scal) * st->ltp_cut / 100; 
+
+
+	/*  Initialization of a working array wt
+	 */
+
+	for (k = 0; k < 40; k++) {
+		register word w = SASR_W( d[k], scal );
+		if (w < 0 ? w > -ltp_cut : w < ltp_cut) {
+			wt_float[k] = 0.0;
+		}
+		else {
+			wt_float[k] =  w;
+		}
+	}
+	for (k = -120; k <  0; k++) dp_float[k] =  dp[k];
+
+	/* Search for the maximum cross-correlation and coding of the LTP lag
+	 */
+	L_max = 0;
+	Nc    = 40;	/* index for the maximum cross-correlation */
+
+	for (lambda = 40; lambda <= 120; lambda += 9) {
+
+		/*  Calculate L_result for l = lambda .. lambda + 9.
+		 */
+		register float *lp = dp_float - lambda;
+
+		register float	W;
+		register float	a = lp[-8], b = lp[-7], c = lp[-6],
+				d = lp[-5], e = lp[-4], f = lp[-3],
+				g = lp[-2], h = lp[-1];
+		register float  E; 
+		register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
+				S5 = 0, S6 = 0, S7 = 0, S8 = 0;
+
+#		undef STEP
+#		define	STEP(K, a, b, c, d, e, f, g, h) \
+			if ((W = wt_float[K]) != 0.0) {	\
+			E = W * a; S8 += E;		\
+			E = W * b; S7 += E;		\
+			E = W * c; S6 += E;		\
+			E = W * d; S5 += E;		\
+			E = W * e; S4 += E;		\
+			E = W * f; S3 += E;		\
+			E = W * g; S2 += E;		\
+			E = W * h; S1 += E;		\
+			a  = lp[K];			\
+			E = W * a; S0 += E; } else (a = lp[K])
+
+#		define	STEP_A(K)	STEP(K, a, b, c, d, e, f, g, h)
+#		define	STEP_B(K)	STEP(K, b, c, d, e, f, g, h, a)
+#		define	STEP_C(K)	STEP(K, c, d, e, f, g, h, a, b)
+#		define	STEP_D(K)	STEP(K, d, e, f, g, h, a, b, c)
+#		define	STEP_E(K)	STEP(K, e, f, g, h, a, b, c, d)
+#		define	STEP_F(K)	STEP(K, f, g, h, a, b, c, d, e)
+#		define	STEP_G(K)	STEP(K, g, h, a, b, c, d, e, f)
+#		define	STEP_H(K)	STEP(K, h, a, b, c, d, e, f, g)
+
+		STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
+		STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
+
+		STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
+		STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
+
+		STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
+		STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
+
+		STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
+		STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
+
+		STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
+		STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
+
+#		undef STEP_A
+#		undef STEP_B
+#		undef STEP_C
+#		undef STEP_D
+#		undef STEP_E
+#		undef STEP_F
+#		undef STEP_G
+#		undef STEP_H
+
+		if (S0 > L_max) { L_max = S0; Nc = lambda;     }
+		if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
+		if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
+		if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
+		if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
+		if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
+		if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
+		if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
+		if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
+
+	}
+	*Nc_out = Nc;
+
+	L_max <<= 1;
+
+	/*  Rescaling of L_max
+	 */
+	assert(scal <= 100 && scal >=  -100);
+	L_max = L_max >> (6 - scal);	/* sub(6, scal) */
+
+	assert( Nc <= 120 && Nc >= 40);
+
+	/*   Compute the power of the reconstructed short term residual
+	 *   signal dp[..]
+	 */
+	L_power = 0;
+	for (k = 0; k <= 39; k++) {
+
+		register longword L_temp;
+
+		L_temp   = SASR_W( dp[k - Nc], 3 );
+		L_power += L_temp * L_temp;
+	}
+	L_power <<= 1;	/* from L_MULT */
+
+	/*  Normalization of L_max and L_power
+	 */
+
+	if (L_max <= 0)  {
+		*bc_out = 0;
+		return;
+	}
+	if (L_max >= L_power) {
+		*bc_out = 3;
+		return;
+	}
+
+	temp = gsm_norm( L_power );
+
+	R = SASR( L_max   << temp, 16 );
+	S = SASR( L_power << temp, 16 );
+
+	/*  Coding of the LTP gain
+	 */
+
+	/*  Table 4.3a must be used to obtain the level DLB[i] for the
+	 *  quantization of the LTP gain b to get the coded version bc.
+	 */
+	for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
+	*bc_out = bc;
+}
+
+#endif /* LTP_CUT */
+
+static void Calculation_of_the_LTP_parameters (
+	register word	* din,		/* [0..39]	IN	*/
+	register word	* dp,		/* [-120..-1]	IN	*/
+	word		* bc_out,	/* 		OUT	*/
+	word		* Nc_out	/* 		OUT	*/
+)
+{
+	register int  	k, lambda;
+	word		Nc, bc;
+
+	float		wt_float[40];
+	float		dp_float_base[120], * dp_float = dp_float_base + 120;
+
+	longword	L_max, L_power;
+	word		R, S, dmax, scal;
+	register word	temp;
+
+	/*  Search of the optimum scaling of d[0..39].
+	 */
+	dmax = 0;
+
+	for (k = 0; k <= 39; k++) {
+		temp = din [k] ;
+		temp = GSM_ABS (temp) ;
+		if (temp > dmax) dmax = temp;
+	}
+
+	temp = 0;
+	if (dmax == 0) scal = 0;
+	else {
+		assert(dmax > 0);
+		temp = gsm_norm( (longword)dmax << 16 );
+	}
+
+	if (temp > 6) scal = 0;
+	else scal = 6 - temp;
+
+	assert(scal >= 0);
+
+	/*  Initialization of a working array wt
+	 */
+
+	for (k =    0; k < 40; k++) wt_float[k] =  SASR_W (din [k], scal) ;
+	for (k = -120; k <  0; k++) dp_float[k] =  dp[k];
+
+	/* Search for the maximum cross-correlation and coding of the LTP lag
+	 */
+	L_max = 0;
+	Nc    = 40;	/* index for the maximum cross-correlation */
+
+	for (lambda = 40; lambda <= 120; lambda += 9) {
+
+		/*  Calculate L_result for l = lambda .. lambda + 9.
+		 */
+		register float *lp = dp_float - lambda;
+
+		register float	W;
+		register float	a = lp[-8], b = lp[-7], c = lp[-6],
+				d = lp[-5], e = lp[-4], f = lp[-3],
+				g = lp[-2], h = lp[-1];
+		register float  E; 
+		register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
+				S5 = 0, S6 = 0, S7 = 0, S8 = 0;
+
+#		undef STEP
+#		define	STEP(K, a, b, c, d, e, f, g, h) \
+			W = wt_float[K];		\
+			E = W * a; S8 += E;		\
+			E = W * b; S7 += E;		\
+			E = W * c; S6 += E;		\
+			E = W * d; S5 += E;		\
+			E = W * e; S4 += E;		\
+			E = W * f; S3 += E;		\
+			E = W * g; S2 += E;		\
+			E = W * h; S1 += E;		\
+			a  = lp[K];			\
+			E = W * a; S0 += E
+
+#		define	STEP_A(K)	STEP(K, a, b, c, d, e, f, g, h)
+#		define	STEP_B(K)	STEP(K, b, c, d, e, f, g, h, a)
+#		define	STEP_C(K)	STEP(K, c, d, e, f, g, h, a, b)
+#		define	STEP_D(K)	STEP(K, d, e, f, g, h, a, b, c)
+#		define	STEP_E(K)	STEP(K, e, f, g, h, a, b, c, d)
+#		define	STEP_F(K)	STEP(K, f, g, h, a, b, c, d, e)
+#		define	STEP_G(K)	STEP(K, g, h, a, b, c, d, e, f)
+#		define	STEP_H(K)	STEP(K, h, a, b, c, d, e, f, g)
+
+		STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
+		STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
+
+		STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
+		STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
+
+		STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
+		STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
+
+		STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
+		STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
+
+		STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
+		STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
+
+#		undef STEP_A
+#		undef STEP_B
+#		undef STEP_C
+#		undef STEP_D
+#		undef STEP_E
+#		undef STEP_F
+#		undef STEP_G
+#		undef STEP_H
+
+		if (S0 > L_max) { L_max = S0; Nc = lambda;     }
+		if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
+		if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
+		if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
+		if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
+		if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
+		if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
+		if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
+		if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
+	}
+	*Nc_out = Nc;
+
+	L_max <<= 1;
+
+	/*  Rescaling of L_max
+	 */
+	assert(scal <= 100 && scal >=  -100);
+	L_max = L_max >> (6 - scal);	/* sub(6, scal) */
+
+	assert( Nc <= 120 && Nc >= 40);
+
+	/*   Compute the power of the reconstructed short term residual
+	 *   signal dp[..]
+	 */
+	L_power = 0;
+	for (k = 0; k <= 39; k++) {
+
+		register longword L_temp;
+
+		L_temp   = SASR_W( dp[k - Nc], 3 );
+		L_power += L_temp * L_temp;
+	}
+	L_power <<= 1;	/* from L_MULT */
+
+	/*  Normalization of L_max and L_power
+	 */
+
+	if (L_max <= 0)  {
+		*bc_out = 0;
+		return;
+	}
+	if (L_max >= L_power) {
+		*bc_out = 3;
+		return;
+	}
+
+	temp = gsm_norm( L_power );
+
+	R = SASR_L ( L_max   << temp, 16 );
+	S = SASR_L ( L_power << temp, 16 );
+
+	/*  Coding of the LTP gain
+	 */
+
+	/*  Table 4.3a must be used to obtain the level DLB[i] for the
+	 *  quantization of the LTP gain b to get the coded version bc.
+	 */
+	for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
+	*bc_out = bc;
+}
+
+#ifdef	FAST
+#ifdef	LTP_CUT
+
+static void Cut_Fast_Calculation_of_the_LTP_parameters (
+	struct gsm_state * st,		/*              IN	*/
+	register word	* d,		/* [0..39]	IN	*/
+	register word	* dp,		/* [-120..-1]	IN	*/
+	word		* bc_out,	/* 		OUT	*/
+	word		* Nc_out	/* 		OUT	*/
+)
+{
+	register int  	k, lambda;
+	register float	wt_float;
+	word		Nc, bc;
+	word		wt_max, best_k, ltp_cut;
+
+	float		dp_float_base[120], * dp_float = dp_float_base + 120;
+
+	register float	L_result, L_max, L_power;
+
+	wt_max = 0;
+
+	for (k = 0; k < 40; ++k) {
+		if      ( d[k] > wt_max) wt_max =  d[best_k = k];
+		else if (-d[k] > wt_max) wt_max = -d[best_k = k];
+	}
+
+	assert(wt_max >= 0);
+	wt_float = (float)wt_max;
+
+	for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k];
+
+	/* Search for the maximum cross-correlation and coding of the LTP lag
+	 */
+	L_max = 0;
+	Nc    = 40;	/* index for the maximum cross-correlation */
+
+	for (lambda = 40; lambda <= 120; lambda++) {
+		L_result = wt_float * dp_float[best_k - lambda];
+		if (L_result > L_max) {
+			Nc    = lambda;
+			L_max = L_result;
+		}
+	}
+
+	*Nc_out = Nc;
+	if (L_max <= 0.)  {
+		*bc_out = 0;
+		return;
+	}
+
+	/*  Compute the power of the reconstructed short term residual
+	 *  signal dp[..]
+	 */
+	dp_float -= Nc;
+	L_power = 0;
+	for (k = 0; k < 40; ++k) {
+		register float f = dp_float[k];
+		L_power += f * f;
+	}
+
+	if (L_max >= L_power) {
+		*bc_out = 3;
+		return;
+	}
+
+	/*  Coding of the LTP gain
+	 *  Table 4.3a must be used to obtain the level DLB[i] for the
+	 *  quantization of the LTP gain b to get the coded version bc.
+	 */
+	lambda = L_max / L_power * 32768.;
+	for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break;
+	*bc_out = bc;
+}
+
+#endif /* LTP_CUT */
+
+static void Fast_Calculation_of_the_LTP_parameters (
+	register word	* din,		/* [0..39]	IN	*/
+	register word	* dp,		/* [-120..-1]	IN	*/
+	word		* bc_out,	/* 		OUT	*/
+	word		* Nc_out	/* 		OUT	*/
+)
+{
+	register int  	k, lambda;
+	word		Nc, bc;
+
+	float		wt_float[40];
+	float		dp_float_base[120], * dp_float = dp_float_base + 120;
+
+	register float	L_max, L_power;
+
+	for (k = 0; k < 40; ++k) wt_float[k] = (float) din [k] ;
+	for (k = -120; k < 0; ++k) dp_float[k] = (float) dp [k] ;
+
+	/* Search for the maximum cross-correlation and coding of the LTP lag
+	 */
+	L_max = 0;
+	Nc    = 40;	/* index for the maximum cross-correlation */
+
+	for (lambda = 40; lambda <= 120; lambda += 9) {
+
+		/*  Calculate L_result for l = lambda .. lambda + 9.
+		 */
+		register float *lp = dp_float - lambda;
+
+		register float	W;
+		register float	a = lp[-8], b = lp[-7], c = lp[-6],
+				d = lp[-5], e = lp[-4], f = lp[-3],
+				g = lp[-2], h = lp[-1];
+		register float  E; 
+		register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
+				S5 = 0, S6 = 0, S7 = 0, S8 = 0;
+
+#		undef STEP
+#		define	STEP(K, a, b, c, d, e, f, g, h) \
+			W = wt_float[K];		\
+			E = W * a; S8 += E;		\
+			E = W * b; S7 += E;		\
+			E = W * c; S6 += E;		\
+			E = W * d; S5 += E;		\
+			E = W * e; S4 += E;		\
+			E = W * f; S3 += E;		\
+			E = W * g; S2 += E;		\
+			E = W * h; S1 += E;		\
+			a  = lp[K];			\
+			E = W * a; S0 += E
+
+#		define	STEP_A(K)	STEP(K, a, b, c, d, e, f, g, h)
+#		define	STEP_B(K)	STEP(K, b, c, d, e, f, g, h, a)
+#		define	STEP_C(K)	STEP(K, c, d, e, f, g, h, a, b)
+#		define	STEP_D(K)	STEP(K, d, e, f, g, h, a, b, c)
+#		define	STEP_E(K)	STEP(K, e, f, g, h, a, b, c, d)
+#		define	STEP_F(K)	STEP(K, f, g, h, a, b, c, d, e)
+#		define	STEP_G(K)	STEP(K, g, h, a, b, c, d, e, f)
+#		define	STEP_H(K)	STEP(K, h, a, b, c, d, e, f, g)
+
+		STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
+		STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
+
+		STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
+		STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
+
+		STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
+		STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
+
+		STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
+		STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
+
+		STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
+		STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
+
+		if (S0 > L_max) { L_max = S0; Nc = lambda;     }
+		if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
+		if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
+		if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
+		if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
+		if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
+		if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
+		if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
+		if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
+	}
+	*Nc_out = Nc;
+
+	if (L_max <= 0.)  {
+		*bc_out = 0;
+		return;
+	}
+
+	/*  Compute the power of the reconstructed short term residual
+	 *  signal dp[..]
+	 */
+	dp_float -= Nc;
+	L_power = 0;
+	for (k = 0; k < 40; ++k) {
+		register float f = dp_float[k];
+		L_power += f * f;
+	}
+
+	if (L_max >= L_power) {
+		*bc_out = 3;
+		return;
+	}
+
+	/*  Coding of the LTP gain
+	 *  Table 4.3a must be used to obtain the level DLB[i] for the
+	 *  quantization of the LTP gain b to get the coded version bc.
+	 */
+	lambda = L_max / L_power * 32768.;
+	for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break;
+	*bc_out = bc;
+}
+
+#endif	/* FAST 	 */
+#endif	/* USE_FLOAT_MUL */
+
+
+/* 4.2.12 */
+
+static void Long_term_analysis_filtering (
+	word		bc,	/* 					IN  */
+	word		Nc,	/* 					IN  */
+	register word	* dp,	/* previous d	[-120..-1]		IN  */
+	register word	* d,	/* d		[0..39]			IN  */
+	register word	* dpp,	/* estimate	[0..39]			OUT */
+	register word	* e	/* long term res. signal [0..39]	OUT */
+)
+/*
+ *  In this part, we have to decode the bc parameter to compute
+ *  the samples of the estimate dpp[0..39].  The decoding of bc needs the
+ *  use of table 4.3b.  The long term residual signal e[0..39]
+ *  is then calculated to be fed to the RPE encoding section.
+ */
+{
+	register int      k;
+
+#	undef STEP
+#	define STEP(BP)					\
+	for (k = 0; k <= 39; k++) {			\
+		dpp[k]  = GSM_MULT_R( BP, dp[k - Nc]);	\
+		e[k]	= GSM_SUB( d[k], dpp[k] );	\
+	}
+
+	switch (bc) {
+	case 0:	STEP(  3277 ); break;
+	case 1:	STEP( 11469 ); break;
+	case 2: STEP( 21299 ); break;
+	case 3: STEP( 32767 ); break; 
+	}
+}
+
+void Gsm_Long_Term_Predictor (	/* 4x for 160 samples */
+
+	struct gsm_state	* S,
+
+	word	* d,	/* [0..39]   residual signal	IN	*/
+	word	* dp,	/* [-120..-1] d'		IN	*/
+
+	word	* e,	/* [0..39] 			OUT	*/
+	word	* dpp,	/* [0..39] 			OUT	*/
+	word	* Nc,	/* correlation lag		OUT	*/
+	word	* bc	/* gain factor			OUT	*/
+)
+{
+	assert( d  ); assert( dp ); assert( e  );
+	assert( dpp); assert( Nc ); assert( bc );
+
+#if defined(FAST) && defined(USE_FLOAT_MUL)
+	if (S->fast) 
+#if   defined (LTP_CUT)
+		if (S->ltp_cut)
+			Cut_Fast_Calculation_of_the_LTP_parameters(S,
+				d, dp, bc, Nc);
+		else
+#endif /* LTP_CUT */
+			Fast_Calculation_of_the_LTP_parameters(d, dp, bc, Nc );
+	else 
+#endif /* FAST & USE_FLOAT_MUL */
+#ifdef LTP_CUT
+		if (S->ltp_cut)
+			Cut_Calculation_of_the_LTP_parameters(S, d, dp, bc, Nc);
+		else
+#endif
+			Calculation_of_the_LTP_parameters(d, dp, bc, Nc);
+
+	Long_term_analysis_filtering( *bc, *Nc, dp, d, dpp, e );
+}
+
+/* 4.3.2 */
+void Gsm_Long_Term_Synthesis_Filtering (
+	struct gsm_state	* S,
+
+	word			Ncr,
+	word			bcr,
+	register word		* erp,	   /* [0..39]		  	 IN */
+	register word		* drp	   /* [-120..-1] IN, [-120..40] OUT */
+)
+/*
+ *  This procedure uses the bcr and Ncr parameter to realize the
+ *  long term synthesis filtering.  The decoding of bcr needs
+ *  table 4.3b.
+ */
+{
+	register int 		k;
+	word			brp, drpp, Nr;
+
+	/*  Check the limits of Nr.
+	 */
+	Nr = Ncr < 40 || Ncr > 120 ? S->nrp : Ncr;
+	S->nrp = Nr;
+	assert(Nr >= 40 && Nr <= 120);
+
+	/*  Decoding of the LTP gain bcr
+	 */
+	brp = gsm_QLB[ bcr ];
+
+	/*  Computation of the reconstructed short term residual 
+	 *  signal drp[0..39]
+	 */
+	assert(brp != MIN_WORD);
+
+	for (k = 0; k <= 39; k++) {
+		drpp   = GSM_MULT_R( brp, drp[ k - Nr ] );
+		drp[k] = GSM_ADD( erp[k], drpp );
+	}
+
+	/*
+	 *  Update of the reconstructed short term residual signal
+	 *  drp[ -1..-120 ]
+	 */
+
+	for (k = 0; k <= 119; k++) drp[ -120 + k ] = drp[ -80 + k ];
+}
diff --git a/jni/libsndfile-1.0.25/src/GSM610/long_term.lo b/jni/libsndfile-1.0.25/src/GSM610/long_term.lo
new file mode 100644
index 0000000..197867a
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/long_term.lo
@@ -0,0 +1,12 @@
+# GSM610/long_term.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/long_term.o'
+
+# Name of the non-PIC object
+non_pic_object='long_term.o'
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/long_term.o b/jni/libsndfile-1.0.25/src/GSM610/long_term.o
new file mode 100644
index 0000000..885c89d
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/long_term.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/lpc.c b/jni/libsndfile-1.0.25/src/GSM610/lpc.c
new file mode 100644
index 0000000..0e776e3
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/lpc.c
@@ -0,0 +1,331 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "gsm610_priv.h"
+
+/*
+ *  4.2.4 .. 4.2.7 LPC ANALYSIS SECTION
+ */
+
+/* 4.2.4 */
+
+
+static void Autocorrelation (
+	word     * s,		/* [0..159]	IN/OUT  */
+ 	longword * L_ACF)	/* [0..8]	OUT     */
+/*
+ *  The goal is to compute the array L_ACF[k].  The signal s[i] must
+ *  be scaled in order to avoid an overflow situation.
+ */
+{
+	register int	k, i;
+
+	word		temp, smax, scalauto;
+
+#ifdef	USE_FLOAT_MUL
+	float		float_s[160];
+#endif
+
+	/*  Dynamic scaling of the array  s[0..159]
+	 */
+
+	/*  Search for the maximum.
+	 */
+	smax = 0;
+	for (k = 0; k <= 159; k++) {
+		temp = GSM_ABS( s[k] );
+		if (temp > smax) smax = temp;
+	}
+
+	/*  Computation of the scaling factor.
+	 */
+	if (smax == 0) scalauto = 0;
+	else {
+		assert(smax > 0);
+		scalauto = 4 - gsm_norm( (longword)smax << 16 );/* sub(4,..) */
+	}
+
+	/*  Scaling of the array s[0...159]
+	 */
+
+	if (scalauto > 0) {
+
+# ifdef USE_FLOAT_MUL
+#   define SCALE(n)	\
+	case n: for (k = 0; k <= 159; k++) \
+			float_s[k] = (float)	\
+				(s[k] = GSM_MULT_R(s[k], 16384 >> (n-1)));\
+		break;
+# else 
+#   define SCALE(n)	\
+	case n: for (k = 0; k <= 159; k++) \
+			s[k] = GSM_MULT_R( s[k], 16384 >> (n-1) );\
+		break;
+# endif /* USE_FLOAT_MUL */
+
+		switch (scalauto) {
+		SCALE(1)
+		SCALE(2)
+		SCALE(3)
+		SCALE(4)
+		}
+# undef	SCALE
+	}
+# ifdef	USE_FLOAT_MUL
+	else for (k = 0; k <= 159; k++) float_s[k] = (float) s[k];
+# endif
+
+	/*  Compute the L_ACF[..].
+	 */
+	{
+# ifdef	USE_FLOAT_MUL
+		register float * sp = float_s;
+		register float   sl = *sp;
+
+#		define STEP(k)	 L_ACF[k] += (longword)(sl * sp[ -(k) ]);
+# else
+		word  * sp = s;
+		word    sl = *sp;
+
+#		define STEP(k)	 L_ACF[k] += ((longword)sl * sp[ -(k) ]);
+# endif
+
+#	define NEXTI	 sl = *++sp
+
+
+	for (k = 9; k--; L_ACF[k] = 0) ;
+
+	STEP (0);
+	NEXTI;
+	STEP(0); STEP(1);
+	NEXTI;
+	STEP(0); STEP(1); STEP(2);
+	NEXTI;
+	STEP(0); STEP(1); STEP(2); STEP(3);
+	NEXTI;
+	STEP(0); STEP(1); STEP(2); STEP(3); STEP(4);
+	NEXTI;
+	STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5);
+	NEXTI;
+	STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6);
+	NEXTI;
+	STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); STEP(7);
+
+	for (i = 8; i <= 159; i++) {
+
+		NEXTI;
+
+		STEP(0);
+		STEP(1); STEP(2); STEP(3); STEP(4);
+		STEP(5); STEP(6); STEP(7); STEP(8);
+	}
+
+	for (k = 9; k--; L_ACF[k] <<= 1) ; 
+
+	}
+	/*   Rescaling of the array s[0..159]
+	 */
+	if (scalauto > 0) {
+		assert(scalauto <= 4); 
+		for (k = 160; k--; *s++ <<= scalauto) ;
+	}
+}
+
+#if defined(USE_FLOAT_MUL) && defined(FAST)
+
+static void Fast_Autocorrelation (
+	word * s,		/* [0..159]	IN/OUT  */
+ 	longword * L_ACF)	/* [0..8]	OUT     */
+{
+	register int	k, i;
+	float f_L_ACF[9];
+	float scale;
+
+	float          s_f[160];
+	register float *sf = s_f;
+
+	for (i = 0; i < 160; ++i) sf[i] = s[i];
+	for (k = 0; k <= 8; k++) {
+		register float L_temp2 = 0;
+		register float *sfl = sf - k;
+		for (i = k; i < 160; ++i) L_temp2 += sf[i] * sfl[i];
+		f_L_ACF[k] = L_temp2;
+	}
+	scale = MAX_LONGWORD / f_L_ACF[0];
+
+	for (k = 0; k <= 8; k++) {
+		L_ACF[k] = f_L_ACF[k] * scale;
+	}
+}
+#endif	/* defined (USE_FLOAT_MUL) && defined (FAST) */
+
+/* 4.2.5 */
+
+static void Reflection_coefficients (
+	longword	* L_ACF,		/* 0...8	IN	*/
+	register word	* r			/* 0...7	OUT 	*/
+)
+{
+	register int	i, m, n;
+	register word	temp;
+	word		ACF[9];	/* 0..8 */
+	word		P[  9];	/* 0..8 */
+	word		K[  9]; /* 2..8 */
+
+	/*  Schur recursion with 16 bits arithmetic.
+	 */
+
+	if (L_ACF[0] == 0) {
+		for (i = 8; i--; *r++ = 0) ;
+		return;
+	}
+
+	assert( L_ACF[0] != 0 );
+	temp = gsm_norm( L_ACF[0] );
+
+	assert(temp >= 0 && temp < 32);
+
+	/* ? overflow ? */
+	for (i = 0; i <= 8; i++) ACF[i] = SASR_L( L_ACF[i] << temp, 16 );
+
+	/*   Initialize array P[..] and K[..] for the recursion.
+	 */
+
+	for (i = 1; i <= 7; i++) K[ i ] = ACF[ i ];
+	for (i = 0; i <= 8; i++) P[ i ] = ACF[ i ];
+
+	/*   Compute reflection coefficients
+	 */
+	for (n = 1; n <= 8; n++, r++) {
+
+		temp = P[1];
+		temp = GSM_ABS(temp);
+		if (P[0] < temp) {
+			for (i = n; i <= 8; i++) *r++ = 0;
+			return;
+		}
+
+		*r = gsm_div( temp, P[0] );
+
+		assert(*r >= 0);
+		if (P[1] > 0) *r = -*r;		/* r[n] = sub(0, r[n]) */
+		assert (*r != MIN_WORD);
+		if (n == 8) return; 
+
+		/*  Schur recursion
+		 */
+		temp = GSM_MULT_R( P[1], *r );
+		P[0] = GSM_ADD( P[0], temp );
+
+		for (m = 1; m <= 8 - n; m++) {
+			temp     = GSM_MULT_R( K[ m   ],    *r );
+			P[m]     = GSM_ADD(    P[ m+1 ],  temp );
+
+			temp     = GSM_MULT_R( P[ m+1 ],    *r );
+			K[m]     = GSM_ADD(    K[ m   ],  temp );
+		}
+	}
+}
+
+/* 4.2.6 */
+
+static void Transformation_to_Log_Area_Ratios (
+	register word	* r 			/* 0..7	   IN/OUT */
+)
+/*
+ *  The following scaling for r[..] and LAR[..] has been used:
+ *
+ *  r[..]   = integer( real_r[..]*32768. ); -1 <= real_r < 1.
+ *  LAR[..] = integer( real_LAR[..] * 16384 );
+ *  with -1.625 <= real_LAR <= 1.625
+ */
+{
+	register word	temp;
+	register int	i;
+
+
+	/* Computation of the LAR[0..7] from the r[0..7]
+	 */
+	for (i = 1; i <= 8; i++, r++) {
+
+		temp = *r;
+		temp = GSM_ABS(temp);
+		assert(temp >= 0);
+
+		if (temp < 22118) {
+			temp >>= 1;
+		} else if (temp < 31130) {
+			assert( temp >= 11059 );
+			temp -= 11059;
+		} else {
+			assert( temp >= 26112 );
+			temp -= 26112;
+			temp <<= 2;
+		}
+
+		*r = *r < 0 ? -temp : temp;
+		assert( *r != MIN_WORD );
+	}
+}
+
+/* 4.2.7 */
+
+static void Quantization_and_coding (
+	register word * LAR    	/* [0..7]	IN/OUT	*/
+)
+{
+	register word	temp;
+
+	/*  This procedure needs four tables; the following equations
+	 *  give the optimum scaling for the constants:
+	 *  
+	 *  A[0..7] = integer( real_A[0..7] * 1024 )
+	 *  B[0..7] = integer( real_B[0..7] *  512 )
+	 *  MAC[0..7] = maximum of the LARc[0..7]
+	 *  MIC[0..7] = minimum of the LARc[0..7]
+	 */
+
+#	undef STEP
+#	define	STEP( A, B, MAC, MIC )		\
+		temp = GSM_MULT( A,   *LAR );	\
+		temp = GSM_ADD(  temp,   B );	\
+		temp = GSM_ADD(  temp, 256 );	\
+		temp = SASR_W(     temp,   9 );	\
+		*LAR  =  temp>MAC ? MAC - MIC : (temp<MIC ? 0 : temp - MIC); \
+		LAR++;
+
+	STEP(  20480,     0,  31, -32 );
+	STEP(  20480,     0,  31, -32 );
+	STEP(  20480,  2048,  15, -16 );
+	STEP(  20480, -2560,  15, -16 );
+
+	STEP(  13964,    94,   7,  -8 );
+	STEP(  15360, -1792,   7,  -8 );
+	STEP(   8534,  -341,   3,  -4 );
+	STEP(   9036, -1144,   3,  -4 );
+
+#	undef	STEP
+}
+
+void Gsm_LPC_Analysis (
+	struct gsm_state *S,
+	word 		 * s,		/* 0..159 signals	IN/OUT	*/
+        word 		 * LARc)	/* 0..7   LARc's	OUT	*/
+{
+	longword	L_ACF[9];
+
+#if defined(USE_FLOAT_MUL) && defined(FAST)
+	if (S->fast) Fast_Autocorrelation (s,	  L_ACF );
+	else
+#endif
+	Autocorrelation			  (s,	  L_ACF	);
+	Reflection_coefficients		  (L_ACF, LARc	);
+	Transformation_to_Log_Area_Ratios (LARc);
+	Quantization_and_coding		  (LARc);
+}
diff --git a/jni/libsndfile-1.0.25/src/GSM610/lpc.lo b/jni/libsndfile-1.0.25/src/GSM610/lpc.lo
new file mode 100644
index 0000000..7de0681
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/lpc.lo
@@ -0,0 +1,12 @@
+# GSM610/lpc.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/lpc.o'
+
+# Name of the non-PIC object
+non_pic_object='lpc.o'
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/lpc.o b/jni/libsndfile-1.0.25/src/GSM610/lpc.o
new file mode 100644
index 0000000..fe4f0d8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/lpc.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/preprocess.c b/jni/libsndfile-1.0.25/src/GSM610/preprocess.c
new file mode 100644
index 0000000..723e226
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/preprocess.c
@@ -0,0 +1,105 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include	<stdio.h>
+#include	<assert.h>
+
+#include "gsm610_priv.h"
+
+/*	4.2.0 .. 4.2.3	PREPROCESSING SECTION
+ *  
+ *  	After A-law to linear conversion (or directly from the
+ *   	Ato D converter) the following scaling is assumed for
+ * 	input to the RPE-LTP algorithm:
+ *
+ *      in:  0.1.....................12
+ *	     S.v.v.v.v.v.v.v.v.v.v.v.v.*.*.*
+ *
+ *	Where S is the sign bit, v a valid bit, and * a "don't care" bit.
+ * 	The original signal is called sop[..]
+ *
+ *      out:   0.1................... 12 
+ *	     S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0
+ */
+
+
+void Gsm_Preprocess (
+	struct gsm_state * S,
+	word		 * s,
+	word 		 * so )		/* [0..159] 	IN/OUT	*/
+{
+
+	word       z1 = S->z1;
+	longword L_z2 = S->L_z2;
+	word 	   mp = S->mp;
+
+	word 	   	s1;
+	longword      L_s2;
+
+	longword      L_temp;
+
+	word		msp, lsp;
+	word		SO;
+
+	register int		k = 160;
+
+	while (k--) {
+
+	/*  4.2.1   Downscaling of the input signal
+	 */
+		SO = SASR_W( *s, 3 ) << 2;
+		s++;
+
+		assert (SO >= -0x4000);	/* downscaled by     */
+		assert (SO <=  0x3FFC);	/* previous routine. */
+
+
+	/*  4.2.2   Offset compensation
+	 * 
+	 *  This part implements a high-pass filter and requires extended
+	 *  arithmetic precision for the recursive part of this filter.
+	 *  The input of this procedure is the array so[0...159] and the
+	 *  output the array sof[ 0...159 ].
+	 */
+		/*   Compute the non-recursive part
+		 */
+
+		s1 = SO - z1;			/* s1 = gsm_sub( *so, z1 ); */
+		z1 = SO;
+
+		assert(s1 != MIN_WORD);
+
+		/*   Compute the recursive part
+		 */
+		L_s2 = s1;
+		L_s2 <<= 15;
+
+		/*   Execution of a 31 bv 16 bits multiplication
+		 */
+
+		msp = SASR_L( L_z2, 15 );
+		lsp = L_z2-((longword)msp<<15); /* gsm_L_sub(L_z2,(msp<<15)); */
+
+		L_s2  += GSM_MULT_R( lsp, 32735 );
+		L_temp = (longword)msp * 32735; /* GSM_L_MULT(msp,32735) >> 1;*/
+		L_z2   = GSM_L_ADD( L_temp, L_s2 );
+
+		/*    Compute sof[k] with rounding
+		 */
+		L_temp = GSM_L_ADD( L_z2, 16384 );
+
+	/*   4.2.3  Preemphasis
+	 */
+
+		msp   = GSM_MULT_R( mp, -28180 );
+		mp    = SASR_L( L_temp, 15 );
+		*so++ = GSM_ADD( mp, msp );
+	}
+
+	S->z1   = z1;
+	S->L_z2 = L_z2;
+	S->mp   = mp;
+}
diff --git a/jni/libsndfile-1.0.25/src/GSM610/preprocess.lo b/jni/libsndfile-1.0.25/src/GSM610/preprocess.lo
new file mode 100644
index 0000000..0470ed9
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/preprocess.lo
@@ -0,0 +1,12 @@
+# GSM610/preprocess.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/preprocess.o'
+
+# Name of the non-PIC object
+non_pic_object='preprocess.o'
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/preprocess.o b/jni/libsndfile-1.0.25/src/GSM610/preprocess.o
new file mode 100644
index 0000000..d00d22a
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/preprocess.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/rpe.c b/jni/libsndfile-1.0.25/src/GSM610/rpe.c
new file mode 100644
index 0000000..d8f931e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/rpe.c
@@ -0,0 +1,480 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "gsm610_priv.h"
+
+/*  4.2.13 .. 4.2.17  RPE ENCODING SECTION
+ */
+
+/* 4.2.13 */
+
+static void Weighting_filter (
+	register word	* e,		/* signal [-5..0.39.44]	IN  */
+	word		* x		/* signal [0..39]	OUT */
+)
+/*
+ *  The coefficients of the weighting filter are stored in a table
+ *  (see table 4.4).  The following scaling is used:
+ *
+ *	H[0..10] = integer( real_H[ 0..10] * 8192 ); 
+ */
+{
+	/* word			wt[ 50 ]; */
+
+	register longword	L_result;
+	register int		k /* , i */ ;
+
+	/*  Initialization of a temporary working array wt[0...49]
+	 */
+
+	/* for (k =  0; k <=  4; k++) wt[k] = 0;
+	 * for (k =  5; k <= 44; k++) wt[k] = *e++;
+	 * for (k = 45; k <= 49; k++) wt[k] = 0;
+	 *
+	 *  (e[-5..-1] and e[40..44] are allocated by the caller,
+	 *  are initially zero and are not written anywhere.)
+	 */
+	e -= 5;
+
+	/*  Compute the signal x[0..39]
+	 */ 
+	for (k = 0; k <= 39; k++) {
+
+		L_result = 8192 >> 1;
+
+		/* for (i = 0; i <= 10; i++) {
+		 *	L_temp   = GSM_L_MULT( wt[k+i], gsm_H[i] );
+		 *	L_result = GSM_L_ADD( L_result, L_temp );
+		 * }
+		 */
+
+#undef	STEP
+#define	STEP( i, H )	(e[ k + i ] * (longword)H)
+
+		/*  Every one of these multiplications is done twice --
+		 *  but I don't see an elegant way to optimize this. 
+		 *  Do you?
+		 */
+
+#ifdef	STUPID_COMPILER
+		L_result += STEP(	0, 	-134 ) ;
+		L_result += STEP(	1, 	-374 )  ;
+	               /* + STEP(	2, 	0    )  */
+		L_result += STEP(	3, 	2054 ) ;
+		L_result += STEP(	4, 	5741 ) ;
+		L_result += STEP(	5, 	8192 ) ;
+		L_result += STEP(	6, 	5741 ) ;
+		L_result += STEP(	7, 	2054 ) ;
+	 	       /* + STEP(	8, 	0    )  */
+		L_result += STEP(	9, 	-374 ) ;
+		L_result += STEP(	10, 	-134 ) ;
+#else
+		L_result +=
+		  STEP(	0, 	-134 ) 
+		+ STEP(	1, 	-374 ) 
+	     /* + STEP(	2, 	0    )  */
+		+ STEP(	3, 	2054 ) 
+		+ STEP(	4, 	5741 ) 
+		+ STEP(	5, 	8192 ) 
+		+ STEP(	6, 	5741 ) 
+		+ STEP(	7, 	2054 ) 
+	     /* + STEP(	8, 	0    )  */
+		+ STEP(	9, 	-374 ) 
+		+ STEP(10, 	-134 )
+		;
+#endif
+
+		/* L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x2) *)
+		 * L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x4) *)
+		 *
+		 * x[k] = SASR( L_result, 16 );
+		 */
+
+		/* 2 adds vs. >>16 => 14, minus one shift to compensate for
+		 * those we lost when replacing L_MULT by '*'.
+		 */
+
+		L_result = SASR_L( L_result, 13 );
+		x[k] =  (  L_result < MIN_WORD ? MIN_WORD
+			: (L_result > MAX_WORD ? MAX_WORD : L_result ));
+	}
+}
+
+/* 4.2.14 */
+
+static void RPE_grid_selection (
+	word		* x,		/* [0..39]		IN  */ 
+	word		* xM,		/* [0..12]		OUT */
+	word		* Mc_out	/*			OUT */
+)
+/*
+ *  The signal x[0..39] is used to select the RPE grid which is
+ *  represented by Mc.
+ */
+{
+	/* register word	temp1;	*/
+	register int		/* m, */  i;
+	register longword	L_result, L_temp;
+	longword		EM;	/* xxx should be L_EM? */
+	word			Mc;
+
+	longword		L_common_0_3;
+
+	EM = 0;
+	Mc = 0;
+
+	/* for (m = 0; m <= 3; m++) {
+	 *	L_result = 0;
+	 *
+	 *
+	 *	for (i = 0; i <= 12; i++) {
+	 *
+	 *		temp1    = SASR_W( x[m + 3*i], 2 );
+	 *
+	 *		assert(temp1 != MIN_WORD);
+	 *
+	 *		L_temp   = GSM_L_MULT( temp1, temp1 );
+	 *		L_result = GSM_L_ADD( L_temp, L_result );
+	 *	}
+	 * 
+	 *	if (L_result > EM) {
+	 *		Mc = m;
+	 *		EM = L_result;
+	 *	}
+	 * }
+	 */
+
+#undef	STEP
+#define	STEP( m, i )		L_temp = SASR_W( x[m + 3 * i], 2 );	\
+				L_result += L_temp * L_temp;
+
+	/* common part of 0 and 3 */
+
+	L_result = 0;
+	STEP( 0, 1 ); STEP( 0, 2 ); STEP( 0, 3 ); STEP( 0, 4 );
+	STEP( 0, 5 ); STEP( 0, 6 ); STEP( 0, 7 ); STEP( 0, 8 );
+	STEP( 0, 9 ); STEP( 0, 10); STEP( 0, 11); STEP( 0, 12);
+	L_common_0_3 = L_result;
+
+	/* i = 0 */
+
+	STEP( 0, 0 );
+	L_result <<= 1;	/* implicit in L_MULT */
+	EM = L_result;
+
+	/* i = 1 */
+
+	L_result = 0;
+	STEP( 1, 0 );
+	STEP( 1, 1 ); STEP( 1, 2 ); STEP( 1, 3 ); STEP( 1, 4 );
+	STEP( 1, 5 ); STEP( 1, 6 ); STEP( 1, 7 ); STEP( 1, 8 );
+	STEP( 1, 9 ); STEP( 1, 10); STEP( 1, 11); STEP( 1, 12);
+	L_result <<= 1;
+	if (L_result > EM) {
+		Mc = 1;
+	 	EM = L_result;
+	}
+
+	/* i = 2 */
+
+	L_result = 0;
+	STEP( 2, 0 );
+	STEP( 2, 1 ); STEP( 2, 2 ); STEP( 2, 3 ); STEP( 2, 4 );
+	STEP( 2, 5 ); STEP( 2, 6 ); STEP( 2, 7 ); STEP( 2, 8 );
+	STEP( 2, 9 ); STEP( 2, 10); STEP( 2, 11); STEP( 2, 12);
+	L_result <<= 1;
+	if (L_result > EM) {
+		Mc = 2;
+	 	EM = L_result;
+	}
+
+	/* i = 3 */
+
+	L_result = L_common_0_3;
+	STEP( 3, 12 );
+	L_result <<= 1;
+	if (L_result > EM) {
+		Mc = 3;
+	 	EM = L_result;
+	}
+
+	/**/
+
+	/*  Down-sampling by a factor 3 to get the selected xM[0..12]
+	 *  RPE sequence.
+	 */
+	for (i = 0; i <= 12; i ++) xM[i] = x[Mc + 3*i];
+	*Mc_out = Mc;
+}
+
+/* 4.12.15 */
+
+static void APCM_quantization_xmaxc_to_exp_mant (
+	word		xmaxc,		/* IN 	*/
+	word		* expon_out,	/* OUT	*/
+	word		* mant_out )	/* OUT  */
+{
+	word	expon, mant;
+
+	/* Compute expononent and mantissa of the decoded version of xmaxc
+	 */
+
+	expon = 0;
+	if (xmaxc > 15) expon = SASR_W(xmaxc, 3) - 1;
+	mant = xmaxc - (expon << 3);
+
+	if (mant == 0) {
+		expon  = -4;
+		mant = 7;
+	}
+	else {
+		while (mant <= 7) {
+			mant = mant << 1 | 1;
+			expon--;
+		}
+		mant -= 8;
+	}
+
+	assert( expon  >= -4 && expon <= 6 );
+	assert( mant >= 0 && mant <= 7 );
+
+	*expon_out  = expon;
+	*mant_out = mant;
+}
+
+static void APCM_quantization (
+	word		* xM,		/* [0..12]		IN	*/
+	word		* xMc,		/* [0..12]		OUT	*/
+	word		* mant_out,	/* 			OUT	*/
+	word		* expon_out,	/*			OUT	*/
+	word		* xmaxc_out	/*			OUT	*/
+)
+{
+	int	i, itest;
+
+	word	xmax, xmaxc, temp, temp1, temp2;
+	word	expon, mant;
+
+
+	/*  Find the maximum absolute value xmax of xM[0..12].
+	 */
+
+	xmax = 0;
+	for (i = 0; i <= 12; i++) {
+		temp = xM[i];
+		temp = GSM_ABS(temp);
+		if (temp > xmax) xmax = temp;
+	}
+
+	/*  Qantizing and coding of xmax to get xmaxc.
+	 */
+
+	expon   = 0;
+	temp  = SASR_W( xmax, 9 );
+	itest = 0;
+
+	for (i = 0; i <= 5; i++) {
+
+		itest |= (temp <= 0);
+		temp = SASR_W( temp, 1 );
+
+		assert(expon <= 5);
+		if (itest == 0) expon++;		/* expon = add (expon, 1) */
+	}
+
+	assert(expon <= 6 && expon >= 0);
+	temp = expon + 5;
+
+	assert(temp <= 11 && temp >= 0);
+	xmaxc = gsm_add( SASR_W(xmax, temp), (word) (expon << 3) );
+
+	/*   Quantizing and coding of the xM[0..12] RPE sequence
+	 *   to get the xMc[0..12]
+	 */
+
+	APCM_quantization_xmaxc_to_exp_mant( xmaxc, &expon, &mant );
+
+	/*  This computation uses the fact that the decoded version of xmaxc
+	 *  can be calculated by using the expononent and the mantissa part of
+	 *  xmaxc (logarithmic table).
+	 *  So, this method avoids any division and uses only a scaling
+	 *  of the RPE samples by a function of the expononent.  A direct 
+	 *  multiplication by the inverse of the mantissa (NRFAC[0..7]
+	 *  found in table 4.5) gives the 3 bit coded version xMc[0..12]
+	 *  of the RPE samples.
+	 */
+
+
+	/* Direct computation of xMc[0..12] using table 4.5
+	 */
+
+	assert( expon <= 4096 && expon >= -4096);
+	assert( mant >= 0 && mant <= 7 ); 
+
+	temp1 = 6 - expon;		/* normalization by the expononent */
+	temp2 = gsm_NRFAC[ mant ];  	/* inverse mantissa 		 */
+
+	for (i = 0; i <= 12; i++) {
+
+		assert(temp1 >= 0 && temp1 < 16);
+
+		temp = xM[i] << temp1;
+		temp = GSM_MULT( temp, temp2 );
+		temp = SASR_W(temp, 12);
+		xMc[i] = temp + 4;		/* see note below */
+	}
+
+	/*  NOTE: This equation is used to make all the xMc[i] positive.
+	 */
+
+	*mant_out  = mant;
+	*expon_out   = expon;
+	*xmaxc_out = xmaxc;
+}
+
+/* 4.2.16 */
+
+static void APCM_inverse_quantization (
+	register word	* xMc,	/* [0..12]			IN 	*/
+	word		mant,
+	word		expon,
+	register word	* xMp)	/* [0..12]			OUT 	*/
+/* 
+ *  This part is for decoding the RPE sequence of coded xMc[0..12]
+ *  samples to obtain the xMp[0..12] array.  Table 4.6 is used to get
+ *  the mantissa of xmaxc (FAC[0..7]).
+ */
+{
+	int	i;
+	word	temp, temp1, temp2, temp3;
+
+	assert( mant >= 0 && mant <= 7 ); 
+
+	temp1 = gsm_FAC[ mant ];	/* see 4.2-15 for mant */
+	temp2 = gsm_sub( 6, expon );	/* see 4.2-15 for exp  */
+	temp3 = gsm_asl( 1, gsm_sub( temp2, 1 ));
+
+	for (i = 13; i--;) {
+
+		assert( *xMc <= 7 && *xMc >= 0 ); 	/* 3 bit unsigned */
+
+		/* temp = gsm_sub( *xMc++ << 1, 7 ); */
+		temp = (*xMc++ << 1) - 7;	        /* restore sign   */
+		assert( temp <= 7 && temp >= -7 ); 	/* 4 bit signed   */
+
+		temp <<= 12;				/* 16 bit signed  */
+		temp = GSM_MULT_R( temp1, temp );
+		temp = GSM_ADD( temp, temp3 );
+		*xMp++ = gsm_asr( temp, temp2 );
+	}
+}
+
+/* 4.2.17 */
+
+static void RPE_grid_positioning (
+	word		Mc,		/* grid position	IN	*/
+	register word	* xMp,		/* [0..12]		IN	*/
+	register word	* ep		/* [0..39]		OUT	*/
+)
+/*
+ *  This procedure computes the reconstructed long term residual signal
+ *  ep[0..39] for the LTP analysis filter.  The inputs are the Mc
+ *  which is the grid position selection and the xMp[0..12] decoded
+ *  RPE samples which are upsampled by a factor of 3 by inserting zero
+ *  values.
+ */
+{
+	int	i = 13;
+
+	assert(0 <= Mc && Mc <= 3);
+
+        switch (Mc) {
+                case 3: *ep++ = 0;
+                case 2:  do {
+                                *ep++ = 0;
+                case 1:         *ep++ = 0;
+                case 0:         *ep++ = *xMp++;
+                         } while (--i);
+        }
+        while (++Mc < 4) *ep++ = 0;
+
+	/*
+
+	int i, k;
+	for (k = 0; k <= 39; k++) ep[k] = 0;
+	for (i = 0; i <= 12; i++) {
+		ep[ Mc + (3*i) ] = xMp[i];
+	}
+	*/
+}
+
+/* 4.2.18 */
+
+/*  This procedure adds the reconstructed long term residual signal
+ *  ep[0..39] to the estimated signal dpp[0..39] from the long term
+ *  analysis filter to compute the reconstructed short term residual
+ *  signal dp[-40..-1]; also the reconstructed short term residual
+ *  array dp[-120..-41] is updated.
+ */
+
+#if 0	/* Has been inlined in code.c */
+void Gsm_Update_of_reconstructed_short_time_residual_signal (
+	word	* dpp,		/* [0...39]	IN	*/
+	word	* ep,		/* [0...39]	IN	*/
+	word	* dp)		/* [-120...-1]  IN/OUT 	*/
+{
+	int 		k;
+
+	for (k = 0; k <= 79; k++) 
+		dp[ -120 + k ] = dp[ -80 + k ];
+
+	for (k = 0; k <= 39; k++)
+		dp[ -40 + k ] = gsm_add( ep[k], dpp[k] );
+}
+#endif	/* Has been inlined in code.c */
+
+void Gsm_RPE_Encoding (
+	/*-struct gsm_state * S,-*/
+
+	word	* e,		/* -5..-1][0..39][40..44	IN/OUT  */
+	word	* xmaxc,	/* 				OUT */
+	word	* Mc,		/* 			  	OUT */
+	word	* xMc)		/* [0..12]			OUT */
+{
+	word	x[40];
+	word	xM[13], xMp[13];
+	word	mant, expon;
+
+	Weighting_filter(e, x);
+	RPE_grid_selection(x, xM, Mc);
+
+	APCM_quantization(	xM, xMc, &mant, &expon, xmaxc);
+	APCM_inverse_quantization(  xMc,  mant,  expon, xMp);
+
+	RPE_grid_positioning( *Mc, xMp, e );
+
+}
+
+void Gsm_RPE_Decoding (
+	/*-struct gsm_state	* S,-*/
+
+	word 		xmaxcr,
+	word		Mcr,
+	word		* xMcr,  /* [0..12], 3 bits 		IN	*/
+	word		* erp	 /* [0..39]			OUT 	*/
+)
+{
+	word	expon, mant;
+	word	xMp[ 13 ];
+
+	APCM_quantization_xmaxc_to_exp_mant( xmaxcr, &expon, &mant );
+	APCM_inverse_quantization( xMcr, mant, expon, xMp );
+	RPE_grid_positioning( Mcr, xMp, erp );
+
+}
diff --git a/jni/libsndfile-1.0.25/src/GSM610/rpe.lo b/jni/libsndfile-1.0.25/src/GSM610/rpe.lo
new file mode 100644
index 0000000..d7664d9
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/rpe.lo
@@ -0,0 +1,12 @@
+# GSM610/rpe.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/rpe.o'
+
+# Name of the non-PIC object
+non_pic_object='rpe.o'
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/rpe.o b/jni/libsndfile-1.0.25/src/GSM610/rpe.o
new file mode 100644
index 0000000..16efa23
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/rpe.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/short_term.c b/jni/libsndfile-1.0.25/src/GSM610/short_term.c
new file mode 100644
index 0000000..9048563
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/short_term.c
@@ -0,0 +1,417 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "gsm610_priv.h"
+
+/*
+ *  SHORT TERM ANALYSIS FILTERING SECTION
+ */
+
+/* 4.2.8 */
+
+static void Decoding_of_the_coded_Log_Area_Ratios (
+	word 	* LARc,		/* coded log area ratio	[0..7] 	IN	*/
+	word	* LARpp)	/* out: decoded ..			*/
+{
+	register word	temp1 /* , temp2 */;
+
+	/*  This procedure requires for efficient implementation
+	 *  two tables.
+ 	 *
+	 *  INVA[1..8] = integer( (32768 * 8) / real_A[1..8])
+	 *  MIC[1..8]  = minimum value of the LARc[1..8]
+	 */
+
+	/*  Compute the LARpp[1..8]
+	 */
+
+	/* 	for (i = 1; i <= 8; i++, B++, MIC++, INVA++, LARc++, LARpp++) {
+	 *
+	 *		temp1  = GSM_ADD( *LARc, *MIC ) << 10;
+	 *		temp2  = *B << 1;
+	 *		temp1  = GSM_SUB( temp1, temp2 );
+	 *
+	 *		assert(*INVA != MIN_WORD);
+	 *
+	 *		temp1  = GSM_MULT_R( *INVA, temp1 );
+	 *		*LARpp = GSM_ADD( temp1, temp1 );
+	 *	}
+	 */
+
+#undef	STEP
+#define	STEP( B, MIC, INVA )	\
+		temp1    = GSM_ADD( *LARc++, MIC ) << 10;	\
+		temp1    = GSM_SUB( temp1, B << 1 );		\
+		temp1    = GSM_MULT_R( INVA, temp1 );		\
+		*LARpp++ = GSM_ADD( temp1, temp1 );
+
+	STEP(      0,  -32,  13107 );
+	STEP(      0,  -32,  13107 );
+	STEP(   2048,  -16,  13107 );
+	STEP(  -2560,  -16,  13107 );
+
+	STEP(     94,   -8,  19223 );
+	STEP(  -1792,   -8,  17476 );
+	STEP(   -341,   -4,  31454 );
+	STEP(  -1144,   -4,  29708 );
+
+	/* NOTE: the addition of *MIC is used to restore
+	 * 	 the sign of *LARc.
+	 */
+}
+
+/* 4.2.9 */
+/* Computation of the quantized reflection coefficients 
+ */
+
+/* 4.2.9.1  Interpolation of the LARpp[1..8] to get the LARp[1..8]
+ */
+
+/*
+ *  Within each frame of 160 analyzed speech samples the short term
+ *  analysis and synthesis filters operate with four different sets of
+ *  coefficients, derived from the previous set of decoded LARs(LARpp(j-1))
+ *  and the actual set of decoded LARs (LARpp(j))
+ *
+ * (Initial value: LARpp(j-1)[1..8] = 0.)
+ */
+
+static void Coefficients_0_12 (
+	register word * LARpp_j_1,
+	register word * LARpp_j,
+	register word * LARp)
+{
+	register int 	i;
+
+	for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) {
+		*LARp = GSM_ADD( SASR_W( *LARpp_j_1, 2 ), SASR_W( *LARpp_j, 2 ));
+		*LARp = GSM_ADD( *LARp,  SASR_W( *LARpp_j_1, 1));
+	}
+}
+
+static void Coefficients_13_26 (
+	register word * LARpp_j_1,
+	register word * LARpp_j,
+	register word * LARp)
+{
+	register int i;
+	for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {
+		*LARp = GSM_ADD( SASR_W( *LARpp_j_1, 1), SASR_W( *LARpp_j, 1 ));
+	}
+}
+
+static void Coefficients_27_39 (
+	register word * LARpp_j_1,
+	register word * LARpp_j,
+	register word * LARp)
+{
+	register int i;
+
+	for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {
+		*LARp = GSM_ADD( SASR_W( *LARpp_j_1, 2 ), SASR_W( *LARpp_j, 2 ));
+		*LARp = GSM_ADD( *LARp, SASR_W( *LARpp_j, 1 ));
+	}
+}
+
+
+static void Coefficients_40_159 (
+	register word * LARpp_j,
+	register word * LARp)
+{
+	register int i;
+
+	for (i = 1; i <= 8; i++, LARp++, LARpp_j++)
+		*LARp = *LARpp_j;
+}
+
+/* 4.2.9.2 */
+
+static void LARp_to_rp (
+	register word * LARp)	/* [0..7] IN/OUT  */
+/*
+ *  The input of this procedure is the interpolated LARp[0..7] array.
+ *  The reflection coefficients, rp[i], are used in the analysis
+ *  filter and in the synthesis filter.
+ */
+{
+	register int 		i;
+	register word		temp;
+
+	for (i = 1; i <= 8; i++, LARp++) {
+
+		/* temp = GSM_ABS( *LARp );
+	         *
+		 * if (temp < 11059) temp <<= 1;
+		 * else if (temp < 20070) temp += 11059;
+		 * else temp = GSM_ADD( temp >> 2, 26112 );
+		 *
+		 * *LARp = *LARp < 0 ? -temp : temp;
+		 */
+
+		if (*LARp < 0) {
+			temp = *LARp == MIN_WORD ? MAX_WORD : -(*LARp);
+			*LARp = - ((temp < 11059) ? temp << 1
+				: ((temp < 20070) ? temp + 11059
+				:  GSM_ADD( (word) (temp >> 2), (word) 26112 )));
+		} else {
+			temp  = *LARp;
+			*LARp =    (temp < 11059) ? temp << 1
+				: ((temp < 20070) ? temp + 11059
+				:  GSM_ADD( (word) (temp >> 2), (word) 26112 ));
+		}
+	}
+}
+
+
+/* 4.2.10 */
+static void Short_term_analysis_filtering (
+	struct gsm_state * S,
+	register word	* rp,	/* [0..7]	IN	*/
+	register int 	k_n, 	/*   k_end - k_start	*/
+	register word	* s	/* [0..n-1]	IN/OUT	*/
+)
+/*
+ *  This procedure computes the short term residual signal d[..] to be fed
+ *  to the RPE-LTP loop from the s[..] signal and from the local rp[..]
+ *  array (quantized reflection coefficients).  As the call of this
+ *  procedure can be done in many ways (see the interpolation of the LAR
+ *  coefficient), it is assumed that the computation begins with index
+ *  k_start (for arrays d[..] and s[..]) and stops with index k_end
+ *  (k_start and k_end are defined in 4.2.9.1).  This procedure also
+ *  needs to keep the array u[0..7] in memory for each call.
+ */
+{
+	register word		* u = S->u;
+	register int		i;
+	register word		di, zzz, ui, sav, rpi;
+
+	for (; k_n--; s++) {
+
+		di = sav = *s;
+
+		for (i = 0; i < 8; i++) {		/* YYY */
+
+			ui    = u[i];
+			rpi   = rp[i];
+			u[i]  = sav;
+
+			zzz   = GSM_MULT_R(rpi, di);
+			sav   = GSM_ADD(   ui,  zzz);
+
+			zzz   = GSM_MULT_R(rpi, ui);
+			di    = GSM_ADD(   di,  zzz );
+		}
+
+		*s = di;
+	}
+}
+
+#if defined(USE_FLOAT_MUL) && defined(FAST)
+
+static void Fast_Short_term_analysis_filtering (
+	struct gsm_state * S,
+	register word	* rp,	/* [0..7]	IN	*/
+	register int 	k_n, 	/*   k_end - k_start	*/
+	register word	* s	/* [0..n-1]	IN/OUT	*/
+)
+{
+	register word		* u = S->u;
+	register int		i;
+
+	float 	  uf[8],
+		 rpf[8];
+
+	register float scalef = 3.0517578125e-5;
+	register float		sav, di, temp;
+
+	for (i = 0; i < 8; ++i) {
+		uf[i]  = u[i];
+		rpf[i] = rp[i] * scalef;
+	}
+	for (; k_n--; s++) {
+		sav = di = *s;
+		for (i = 0; i < 8; ++i) {
+			register float rpfi = rpf[i];
+			register float ufi  = uf[i];
+
+			uf[i] = sav;
+			temp  = rpfi * di + ufi;
+			di   += rpfi * ufi;
+			sav   = temp;
+		}
+		*s = di;
+	}
+	for (i = 0; i < 8; ++i) u[i] = uf[i];
+}
+#endif /* ! (defined (USE_FLOAT_MUL) && defined (FAST)) */
+
+static void Short_term_synthesis_filtering (
+	struct gsm_state * S,
+	register word	* rrp,	/* [0..7]	IN	*/
+	register int	k,	/* k_end - k_start	*/
+	register word	* wt,	/* [0..k-1]	IN	*/
+	register word	* sr	/* [0..k-1]	OUT	*/
+)
+{
+	register word		* v = S->v;
+	register int		i;
+	register word		sri, tmp1, tmp2;
+
+	while (k--) {
+		sri = *wt++;
+		for (i = 8; i--;) {
+
+			/* sri = GSM_SUB( sri, gsm_mult_r( rrp[i], v[i] ) );
+			 */
+			tmp1 = rrp[i];
+			tmp2 = v[i];
+			tmp2 =  ( tmp1 == MIN_WORD && tmp2 == MIN_WORD
+				? MAX_WORD
+				: 0x0FFFF & (( (longword)tmp1 * (longword)tmp2
+					     + 16384) >> 15)) ;
+
+			sri  = GSM_SUB( sri, tmp2 );
+
+			/* v[i+1] = GSM_ADD( v[i], gsm_mult_r( rrp[i], sri ) );
+			 */
+			tmp1  = ( tmp1 == MIN_WORD && sri == MIN_WORD
+				? MAX_WORD
+				: 0x0FFFF & (( (longword)tmp1 * (longword)sri
+					     + 16384) >> 15)) ;
+
+			v[i+1] = GSM_ADD( v[i], tmp1);
+		}
+		*sr++ = v[0] = sri;
+	}
+}
+
+
+#if defined(FAST) && defined(USE_FLOAT_MUL)
+
+static void Fast_Short_term_synthesis_filtering (
+	struct gsm_state * S,
+	register word	* rrp,	/* [0..7]	IN	*/
+	register int	k,	/* k_end - k_start	*/
+	register word	* wt,	/* [0..k-1]	IN	*/
+	register word	* sr	/* [0..k-1]	OUT	*/
+)
+{
+	register word		* v = S->v;
+	register int		i;
+
+	float va[9], rrpa[8];
+	register float scalef = 3.0517578125e-5, temp;
+
+	for (i = 0; i < 8; ++i) {
+		va[i]   = v[i];
+		rrpa[i] = (float)rrp[i] * scalef;
+	}
+	while (k--) {
+		register float sri = *wt++;
+		for (i = 8; i--;) {
+			sri -= rrpa[i] * va[i];
+			if     (sri < -32768.) sri = -32768.;
+			else if (sri > 32767.) sri =  32767.;
+
+			temp = va[i] + rrpa[i] * sri;
+			if     (temp < -32768.) temp = -32768.;
+			else if (temp > 32767.) temp =  32767.;
+			va[i+1] = temp;
+		}
+		*sr++ = va[0] = sri;
+	}
+	for (i = 0; i < 9; ++i) v[i] = va[i];
+}
+
+#endif /* defined(FAST) && defined(USE_FLOAT_MUL) */
+
+void Gsm_Short_Term_Analysis_Filter (
+
+	struct gsm_state * S,
+
+	word	* LARc,		/* coded log area ratio [0..7]  IN	*/
+	word	* s		/* signal [0..159]		IN/OUT	*/
+)
+{
+	word		* LARpp_j	= S->LARpp[ S->j      ];
+	word		* LARpp_j_1	= S->LARpp[ S->j ^= 1 ];
+
+	word		LARp[8];
+
+#undef	FILTER
+#if 	defined(FAST) && defined(USE_FLOAT_MUL)
+# 	define	FILTER 	(* (S->fast			\
+			   ? Fast_Short_term_analysis_filtering	\
+		    	   : Short_term_analysis_filtering	))
+
+#else
+# 	define	FILTER	Short_term_analysis_filtering
+#endif
+
+	Decoding_of_the_coded_Log_Area_Ratios( LARc, LARpp_j );
+
+	Coefficients_0_12(  LARpp_j_1, LARpp_j, LARp );
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 13, s);
+
+	Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 14, s + 13);
+
+	Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 13, s + 27);
+
+	Coefficients_40_159( LARpp_j, LARp);
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 120, s + 40);
+}
+
+void Gsm_Short_Term_Synthesis_Filter (
+	struct gsm_state * S,
+
+	word	* LARcr,	/* received log area ratios [0..7] IN  */
+	word	* wt,		/* received d [0..159]		   IN  */
+
+	word	* s		/* signal   s [0..159]		  OUT  */
+)
+{
+	word		* LARpp_j	= S->LARpp[ S->j     ];
+	word		* LARpp_j_1	= S->LARpp[ S->j ^=1 ];
+
+	word		LARp[8];
+
+#undef	FILTER
+#if 	defined(FAST) && defined(USE_FLOAT_MUL)
+
+# 	define	FILTER 	(* (S->fast			\
+			   ? Fast_Short_term_synthesis_filtering	\
+		    	   : Short_term_synthesis_filtering	))
+#else
+#	define	FILTER	Short_term_synthesis_filtering
+#endif
+
+	Decoding_of_the_coded_Log_Area_Ratios( LARcr, LARpp_j );
+
+	Coefficients_0_12( LARpp_j_1, LARpp_j, LARp );
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 13, wt, s );
+
+	Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 14, wt + 13, s + 13 );
+
+	Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 13, wt + 27, s + 27 );
+
+	Coefficients_40_159( LARpp_j, LARp );
+	LARp_to_rp( LARp );
+	FILTER(S, LARp, 120, wt + 40, s + 40);
+}
diff --git a/jni/libsndfile-1.0.25/src/GSM610/short_term.lo b/jni/libsndfile-1.0.25/src/GSM610/short_term.lo
new file mode 100644
index 0000000..08418a1
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/short_term.lo
@@ -0,0 +1,12 @@
+# GSM610/short_term.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/short_term.o'
+
+# Name of the non-PIC object
+non_pic_object='short_term.o'
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/short_term.o b/jni/libsndfile-1.0.25/src/GSM610/short_term.o
new file mode 100644
index 0000000..53fcee3
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/short_term.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/GSM610/table.c b/jni/libsndfile-1.0.25/src/GSM610/table.c
new file mode 100644
index 0000000..8b83f78
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/table.c
@@ -0,0 +1,60 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*  Most of these tables are inlined at their point of use.
+ */
+
+/*  4.4 TABLES USED IN THE FIXED POINT IMPLEMENTATION OF THE RPE-LTP
+ *      CODER AND DECODER
+ *
+ *	(Most of them inlined, so watch out.)
+ */
+
+#define	GSM_TABLE_C
+#include "gsm610_priv.h"
+
+/*  Table 4.1  Quantization of the Log.-Area Ratios
+ */
+/* i 		     1      2      3        4      5      6        7       8 */
+word gsm_A[8]   = {20480, 20480, 20480,  20480,  13964,  15360,   8534,  9036};
+word gsm_B[8]   = {    0,     0,  2048,  -2560,     94,  -1792,   -341, -1144};
+word gsm_MIC[8] = { -32,   -32,   -16,    -16,     -8,     -8,     -4,    -4 };
+word gsm_MAC[8] = {  31,    31,    15,     15,      7,      7,      3,     3 };
+
+
+/*  Table 4.2  Tabulation  of 1/A[1..8]
+ */
+word gsm_INVA[8]={ 13107, 13107,  13107, 13107,  19223, 17476,  31454, 29708 };
+
+
+/*   Table 4.3a  Decision level of the LTP gain quantizer
+ */
+/*  bc		      0	        1	  2	     3			*/
+word gsm_DLB[4] = {  6554,    16384,	26214,	   32767	};
+
+
+/*   Table 4.3b   Quantization levels of the LTP gain quantizer
+ */
+/* bc		      0          1        2          3			*/
+word gsm_QLB[4] = {  3277,    11469,	21299,	   32767	};
+
+
+/*   Table 4.4	 Coefficients of the weighting filter
+ */
+/* i		    0      1   2    3   4      5      6     7   8   9    10  */
+word gsm_H[11] = {-134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134 };
+
+
+/*   Table 4.5 	 Normalized inverse mantissa used to compute xM/xmax 
+ */
+/* i		 	0        1    2      3      4      5     6      7   */
+word gsm_NRFAC[8] = { 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 };
+
+
+/*   Table 4.6	 Normalized direct mantissa used to compute xM/xmax
+ */
+/* i                  0      1       2      3      4      5      6      7   */
+word gsm_FAC[8]	= { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 };
diff --git a/jni/libsndfile-1.0.25/src/GSM610/table.lo b/jni/libsndfile-1.0.25/src/GSM610/table.lo
new file mode 100644
index 0000000..1ac74cb
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/table.lo
@@ -0,0 +1,12 @@
+# GSM610/table.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/table.o'
+
+# Name of the non-PIC object
+non_pic_object='table.o'
+
diff --git a/jni/libsndfile-1.0.25/src/GSM610/table.o b/jni/libsndfile-1.0.25/src/GSM610/table.o
new file mode 100644
index 0000000..00f8165
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/GSM610/table.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/Makefile b/jni/libsndfile-1.0.25/src/Makefile
new file mode 100644
index 0000000..4d151ce
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/Makefile
@@ -0,0 +1,1048 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# src/Makefile.  Generated from Makefile.in by configure.
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  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.
+
+
+
+
+
+pkgdatadir = $(datadir)/libsndfile
+pkgincludedir = $(includedir)/libsndfile
+pkglibdir = $(libdir)/libsndfile
+pkglibexecdir = $(libexecdir)/libsndfile
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = x86_64-unknown-linux-gnu
+host_triplet = x86_64-unknown-linux-gnu
+target_triplet = x86_64-unknown-linux-gnu
+check_PROGRAMS = test_main$(EXEEXT) G72x/g72x_test$(EXEEXT)
+subdir = src
+DIST_COMMON = $(include_HEADERS) $(noinst_HEADERS) \
+	$(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/config.h.in $(srcdir)/sndfile.h.in \
+	$(srcdir)/version-metadata.rc.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/M4/add_cflags.m4 \
+	$(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clip_mode.m4 \
+	$(top_srcdir)/M4/endian.m4 $(top_srcdir)/M4/extra_largefile.m4 \
+	$(top_srcdir)/M4/extra_pkg.m4 \
+	$(top_srcdir)/M4/flexible_array.m4 \
+	$(top_srcdir)/M4/gcc_version.m4 $(top_srcdir)/M4/libtool.m4 \
+	$(top_srcdir)/M4/lrint.m4 $(top_srcdir)/M4/lrintf.m4 \
+	$(top_srcdir)/M4/ltoptions.m4 $(top_srcdir)/M4/ltsugar.m4 \
+	$(top_srcdir)/M4/ltversion.m4 $(top_srcdir)/M4/lt~obsolete.m4 \
+	$(top_srcdir)/M4/mkoctfile_version.m4 \
+	$(top_srcdir)/M4/octave.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = version-metadata.rc sndfile.h
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" \
+	"$(DESTDIR)$(includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES)
+G72x_libg72x_la_LIBADD =
+am__dirstamp = $(am__leading_dot)dirstamp
+am_G72x_libg72x_la_OBJECTS = G72x/g721.lo G72x/g723_16.lo \
+	G72x/g723_24.lo G72x/g723_40.lo G72x/g72x.lo
+G72x_libg72x_la_OBJECTS = $(am_G72x_libg72x_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+GSM610_libgsm_la_LIBADD =
+am_GSM610_libgsm_la_OBJECTS = GSM610/add.lo GSM610/code.lo \
+	GSM610/decode.lo GSM610/gsm_create.lo GSM610/gsm_decode.lo \
+	GSM610/gsm_destroy.lo GSM610/gsm_encode.lo \
+	GSM610/gsm_option.lo GSM610/long_term.lo GSM610/lpc.lo \
+	GSM610/preprocess.lo GSM610/rpe.lo GSM610/short_term.lo \
+	GSM610/table.lo
+GSM610_libgsm_la_OBJECTS = $(am_GSM610_libgsm_la_OBJECTS)
+libcommon_la_LIBADD =
+am__libcommon_la_SOURCES_DIST = common.c file_io.c command.c pcm.c \
+	ulaw.c alaw.c float32.c double64.c ima_adpcm.c ms_adpcm.c \
+	gsm610.c dwvw.c vox_adpcm.c interleave.c strings.c dither.c \
+	broadcast.c audio_detect.c ima_oki_adpcm.c ima_oki_adpcm.h \
+	chunk.c ogg.c chanmap.c windows.c id3.c version-metadata.rc
+#am__objects_1 = version-metadata.lo
+am__objects_2 = common.lo file_io.lo command.lo pcm.lo ulaw.lo alaw.lo \
+	float32.lo double64.lo ima_adpcm.lo ms_adpcm.lo gsm610.lo \
+	dwvw.lo vox_adpcm.lo interleave.lo strings.lo dither.lo \
+	broadcast.lo audio_detect.lo ima_oki_adpcm.lo chunk.lo ogg.lo \
+	chanmap.lo windows.lo id3.lo $(am__objects_1)
+am_libcommon_la_OBJECTS = $(am__objects_2)
+libcommon_la_OBJECTS = $(am_libcommon_la_OBJECTS)
+libsndfile_la_DEPENDENCIES = libcommon.la GSM610/libgsm.la \
+	G72x/libg72x.la
+am__objects_3 = sndfile.lo aiff.lo au.lo avr.lo caf.lo dwd.lo flac.lo \
+	g72x.lo htk.lo ircam.lo macbinary3.lo macos.lo mat4.lo mat5.lo \
+	nist.lo paf.lo pvf.lo raw.lo rx2.lo sd2.lo sds.lo svx.lo \
+	txw.lo voc.lo wve.lo w64.lo wav_w64.lo wav.lo xi.lo mpc2k.lo \
+	rf64.lo ogg_vorbis.lo ogg_speex.lo ogg_pcm.lo
+am__objects_4 =
+am_libsndfile_la_OBJECTS = $(am__objects_3) $(am__objects_4)
+nodist_libsndfile_la_OBJECTS = $(am__objects_4)
+libsndfile_la_OBJECTS = $(am_libsndfile_la_OBJECTS) \
+	$(nodist_libsndfile_la_OBJECTS)
+libsndfile_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(libsndfile_la_LDFLAGS) $(LDFLAGS) -o $@
+am_G72x_g72x_test_OBJECTS = G72x/g72x_test.$(OBJEXT)
+G72x_g72x_test_OBJECTS = $(am_G72x_g72x_test_OBJECTS)
+G72x_g72x_test_DEPENDENCIES = G72x/libg72x.la
+am_test_main_OBJECTS = test_main.$(OBJEXT) test_conversions.$(OBJEXT) \
+	test_float.$(OBJEXT) test_endswap.$(OBJEXT) \
+	test_audio_detect.$(OBJEXT) test_log_printf.$(OBJEXT) \
+	test_file_io.$(OBJEXT) test_ima_oki_adpcm.$(OBJEXT) \
+	test_strncpy_crlf.$(OBJEXT) test_broadcast_var.$(OBJEXT)
+test_main_OBJECTS = $(am_test_main_OBJECTS)
+test_main_DEPENDENCIES = libcommon.la
+DEFAULT_INCLUDES = -I.
+depcomp = $(SHELL) $(top_srcdir)/Cfg/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo "  CC    " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo "  CCLD  " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo "  GEN   " $@;
+SOURCES = $(G72x_libg72x_la_SOURCES) $(GSM610_libgsm_la_SOURCES) \
+	$(libcommon_la_SOURCES) $(libsndfile_la_SOURCES) \
+	$(nodist_libsndfile_la_SOURCES) $(G72x_g72x_test_SOURCES) \
+	$(test_main_SOURCES)
+DIST_SOURCES = $(G72x_libg72x_la_SOURCES) $(GSM610_libgsm_la_SOURCES) \
+	$(am__libcommon_la_SOURCES_DIST) $(libsndfile_la_SOURCES) \
+	$(G72x_g72x_test_SOURCES) $(test_main_SOURCES)
+HEADERS = $(include_HEADERS) $(nodist_include_HEADERS) \
+	$(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = ${SHELL} /home/lisional/git/sflphone-android/jni/libsndfile-1.0.25/Cfg/missing --run aclocal-1.11
+ACLOCAL_AMFLAGS = -I M4
+ALSA_LIBS = 
+AMTAR = ${SHELL} /home/lisional/git/sflphone-android/jni/libsndfile-1.0.25/Cfg/missing --run tar
+AM_DEFAULT_VERBOSITY = 0
+AR = ar
+AUTOCONF = ${SHELL} /home/lisional/git/sflphone-android/jni/libsndfile-1.0.25/Cfg/missing --run autoconf
+
+#======================================================================
+# Disable autoheader.
+AUTOHEADER = echo
+AUTOMAKE = ${SHELL} /home/lisional/git/sflphone-android/jni/libsndfile-1.0.25/Cfg/missing --run automake-1.11
+AWK = gawk
+CC = gcc
+CCDEPMODE = depmode=gcc3
+CFLAGS = -g -O2 -std=gnu99 -Wall -Wextra -Wdeclaration-after-statement -Wpointer-arith -funsigned-char -Wstrict-prototypes -Wmissing-prototypes -Waggregate-return -Wcast-align -Wcast-qual -Wnested-externs -Wshadow -Wbad-function-cast -Wwrite-strings -Wundef  -pipe 
+CLEAN_VERSION = 1.0.25
+CPP = gcc -E
+CPPFLAGS = 
+CXX = g++
+CXXCPP = g++ -E
+CXXDEPMODE = depmode=gcc3
+CXXFLAGS = -g -O2 -Wall -Wextra -Wcast-align -Wcast-qual -Wshadow -Wwrite-strings -Wctor-dtor-privacy -Wnon-virtual-dtor -Woverloaded-virtual -Wreorder -Wsign-promo -Wundef 
+CYGPATH_W = echo
+DEFS = -DHAVE_CONFIG_H
+DEPDIR = .deps
+DLLTOOL = false
+DSYMUTIL = 
+DUMPBIN = 
+ECHO_C = 
+ECHO_N = -n
+ECHO_T = 
+EGREP = /usr/bin/grep -E
+EXEEXT = 
+EXTERNAL_CFLAGS = 
+EXTERNAL_LIBS = 
+FGREP = /usr/bin/grep -F
+FLAC_CFLAGS = 
+FLAC_LIBS = 
+GCC_MAJOR_VERSION = 4
+GCC_MINOR_VERSION = 7
+GCC_VERSION = 4.7.2
+GETCONF = 
+GREP = /usr/bin/grep
+HAVE_AUTOGEN = no
+HAVE_MKOCTFILE = no
+HAVE_OCTAVE = no
+HAVE_OCTAVE_CONFIG = no
+HAVE_WINE = no
+HOST_TRIPLET = x86_64-unknown-linux-gnu
+HTML_BGCOLOUR = black
+HTML_FGCOLOUR = white
+INSTALL = /usr/bin/install -c
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_SCRIPT = ${INSTALL}
+INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
+LD = /usr/bin/ld -m elf_x86_64
+LDFLAGS = 
+LIBOBJS = 
+LIBS = -lm 
+LIBTOOL = $(SHELL) $(top_builddir)/libtool
+LIBTOOL_DEPS = Cfg/ltmain.sh
+LIPO = 
+LN_S = ln -s
+LTLIBOBJS = 
+MAKEINFO = ${SHELL} /home/lisional/git/sflphone-android/jni/libsndfile-1.0.25/Cfg/missing --run makeinfo
+MANIFEST_TOOL = :
+MKDIR_P = /usr/bin/mkdir -p
+MKOCTFILE = 
+MKOCTFILE_VERSION = 
+NM = /usr/bin/nm -B
+NMEDIT = 
+OBJDUMP = objdump
+OBJEXT = o
+OCTAVE = 
+OCTAVE_CONFIG = 
+OCTAVE_CONFIG_VERSION = 
+OCTAVE_DEST_MDIR = 
+OCTAVE_DEST_ODIR = 
+OCTAVE_VERSION = 
+OGG_CFLAGS = 
+OGG_LIBS = 
+OS_SPECIFIC_CFLAGS = 
+OS_SPECIFIC_LINKS = 
+OTOOL = 
+OTOOL64 = 
+PACKAGE = libsndfile
+PACKAGE_BUGREPORT = sndfile@mega-nerd.com
+PACKAGE_NAME = libsndfile
+PACKAGE_STRING = libsndfile 1.0.25
+PACKAGE_TARNAME = libsndfile
+PACKAGE_URL = http://www.mega-nerd.com/libsndfile/
+PACKAGE_VERSION = 1.0.25
+PATH_SEPARATOR = :
+PKG_CONFIG = /usr/bin/pkg-config
+PKG_CONFIG_LIBDIR = 
+PKG_CONFIG_PATH = 
+RANLIB = ranlib
+RC = 
+SED = /usr/bin/sed
+SET_MAKE = 
+SF_COUNT_MAX = 0x7FFFFFFFFFFFFFFFLL
+SHARED_VERSION_INFO = 1:25:0
+SHELL = /bin/sh
+SHLIB_VERSION_ARG = -Wl,--version-script=$(srcdir)/Symbols.gnu-binutils
+SIZEOF_SF_COUNT_T = 8
+SNDIO_LIBS = 
+SPEEX_CFLAGS = 
+SPEEX_LIBS = 
+SQLITE3_CFLAGS =  
+SQLITE3_LIBS = -lsqlite3  
+STRIP = strip
+TYPEOF_SF_COUNT_T = int64_t
+VERSION = 1.0.25
+VORBISENC_CFLAGS = 
+VORBISENC_LIBS = 
+VORBIS_CFLAGS = 
+VORBIS_LIBS = 
+WIN_RC_VERSION = 1,0,25
+abs_builddir = /home/lisional/git/sflphone-android/jni/libsndfile-1.0.25/src
+abs_srcdir = /home/lisional/git/sflphone-android/jni/libsndfile-1.0.25/src
+abs_top_builddir = /home/lisional/git/sflphone-android/jni/libsndfile-1.0.25
+abs_top_srcdir = /home/lisional/git/sflphone-android/jni/libsndfile-1.0.25
+ac_ct_AR = ar
+ac_ct_CC = gcc
+ac_ct_CXX = g++
+ac_ct_DUMPBIN = 
+am__include = include
+am__leading_dot = .
+am__quote = 
+am__tar = ${AMTAR} chof - "$$tardir"
+am__untar = ${AMTAR} xf -
+bindir = ${exec_prefix}/bin
+build = x86_64-unknown-linux-gnu
+build_alias = 
+build_cpu = x86_64
+build_os = linux-gnu
+build_vendor = unknown
+builddir = .
+datadir = ${datarootdir}
+datarootdir = ${prefix}/share
+docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
+dvidir = ${docdir}
+exec_prefix = ${prefix}
+host = x86_64-unknown-linux-gnu
+host_alias = 
+host_cpu = x86_64
+host_os = linux-gnu
+host_vendor = unknown
+htmldir = ${docdir}
+htmldocdir = /usr/local/share/doc/libsndfile1-dev/html
+includedir = ${prefix}/include
+infodir = ${datarootdir}/info
+install_sh = ${SHELL} /home/lisional/git/sflphone-android/jni/libsndfile-1.0.25/Cfg/install-sh
+libdir = ${exec_prefix}/lib
+libexecdir = ${exec_prefix}/libexec
+localedir = ${datarootdir}/locale
+localstatedir = ${prefix}/var
+mandir = ${datarootdir}/man
+mkdir_p = /usr/bin/mkdir -p
+oldincludedir = /usr/include
+pdfdir = ${docdir}
+prefix = /usr/local
+program_transform_name = s,x,x,
+psdir = ${docdir}
+sbindir = ${exec_prefix}/sbin
+sharedstatedir = ${prefix}/com
+srcdir = .
+sysconfdir = ${prefix}/etc
+target = x86_64-unknown-linux-gnu
+target_alias = 
+target_cpu = x86_64
+target_os = linux-gnu
+target_vendor = unknown
+top_build_prefix = ../
+top_builddir = ..
+top_srcdir = ..
+AUTOMAKE_OPTIONS = subdir-objects
+INCLUDES = 
+lib_LTLIBRARIES = libsndfile.la
+include_HEADERS = sndfile.hh
+nodist_include_HEADERS = sndfile.h
+noinst_LTLIBRARIES = GSM610/libgsm.la G72x/libg72x.la libcommon.la
+SYMBOL_FILES = Symbols.gnu-binutils Symbols.darwin libsndfile-1.def Symbols.os2 Symbols.static
+EXTRA_DIST = sndfile.h.in config.h.in test_endswap.tpl test_endswap.def \
+			$(SYMBOL_FILES) create_symbols_file.py binheader_writef_check.py \
+			GSM610/README GSM610/COPYRIGHT GSM610/ChangeLog \
+			G72x/README G72x/README.original G72x/ChangeLog \
+			make-static-lib-hidden-privates.sh
+
+noinst_HEADERS = common.h sfconfig.h sfendian.h wav_w64.h sf_unistd.h ogg.h chanmap.h
+COMMON = common.c file_io.c command.c pcm.c ulaw.c alaw.c float32.c \
+		double64.c ima_adpcm.c ms_adpcm.c gsm610.c dwvw.c vox_adpcm.c \
+		interleave.c strings.c dither.c broadcast.c audio_detect.c \
+ 		ima_oki_adpcm.c ima_oki_adpcm.h chunk.c ogg.c chanmap.c \
+		windows.c id3.c $(WIN_VERSION_FILE)
+
+FILESPECIFIC = sndfile.c aiff.c au.c avr.c caf.c dwd.c flac.c g72x.c htk.c ircam.c \
+		macbinary3.c macos.c mat4.c mat5.c nist.c paf.c pvf.c raw.c rx2.c sd2.c \
+		sds.c svx.c txw.c voc.c wve.c w64.c wav_w64.c wav.c xi.c mpc2k.c rf64.c \
+		ogg_vorbis.c ogg_speex.c ogg_pcm.c
+
+CLEANFILES = *~
+WIN_VERSION_FILE = 
+#WIN_VERSION_FILE = version-metadata.rc
+
+#===============================================================================
+# MinGW requires -no-undefined if a DLL is to be built.
+libsndfile_la_LDFLAGS = -no-undefined -version-info 1:25:0 -Wl,--version-script=$(srcdir)/Symbols.gnu-binutils
+libsndfile_la_SOURCES = $(FILESPECIFIC) $(noinst_HEADERS)
+nodist_libsndfile_la_SOURCES = $(nodist_include_HEADERS)
+libsndfile_la_LIBADD = libcommon.la GSM610/libgsm.la G72x/libg72x.la \
+		 -lm
+
+libcommon_la_SOURCES = $(COMMON)
+
+#======================================================================
+# Subdir libraries.
+GSM610_libgsm_la_SOURCES = GSM610/config.h GSM610/gsm.h GSM610/gsm610_priv.h \
+		GSM610/add.c GSM610/code.c GSM610/decode.c GSM610/gsm_create.c \
+		GSM610/gsm_decode.c GSM610/gsm_destroy.c GSM610/gsm_encode.c \
+		GSM610/gsm_option.c GSM610/long_term.c GSM610/lpc.c GSM610/preprocess.c \
+		GSM610/rpe.c GSM610/short_term.c GSM610/table.c
+
+G72x_libg72x_la_SOURCES = $(COMMON)G72x/g72x.h G72x/g72x_priv.h \
+		G72x/g721.c G72x/g723_16.c G72x/g723_24.c G72x/g723_40.c G72x/g72x.c
+
+
+#======================================================================
+# Test programs.
+test_main_SOURCES = test_main.c test_main.h test_conversions.c test_float.c test_endswap.c \
+					test_audio_detect.c test_log_printf.c test_file_io.c test_ima_oki_adpcm.c \
+					test_strncpy_crlf.c test_broadcast_var.c
+
+test_main_LDADD = libcommon.la
+G72x_g72x_test_SOURCES = G72x/g72x_test.c
+G72x_g72x_test_LDADD = G72x/libg72x.la
+all: config.h
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj .rc
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu src/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+config.h: stamp-h1
+	@if test ! -f $@; then \
+	  rm -f stamp-h1; \
+	  $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
+	else :; fi
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+	@rm -f stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status src/config.h
+$(srcdir)/config.h.in:  $(am__configure_deps) 
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+	rm -f stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f config.h stamp-h1
+version-metadata.rc: $(top_builddir)/config.status $(srcdir)/version-metadata.rc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+sndfile.h: $(top_builddir)/config.status $(srcdir)/sndfile.h.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+	}
+
+uninstall-libLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+	done
+
+clean-libLTLIBRARIES:
+	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+	@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+G72x/$(am__dirstamp):
+	@$(MKDIR_P) G72x
+	@: > G72x/$(am__dirstamp)
+G72x/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) G72x/$(DEPDIR)
+	@: > G72x/$(DEPDIR)/$(am__dirstamp)
+G72x/g721.lo: G72x/$(am__dirstamp) G72x/$(DEPDIR)/$(am__dirstamp)
+G72x/g723_16.lo: G72x/$(am__dirstamp) G72x/$(DEPDIR)/$(am__dirstamp)
+G72x/g723_24.lo: G72x/$(am__dirstamp) G72x/$(DEPDIR)/$(am__dirstamp)
+G72x/g723_40.lo: G72x/$(am__dirstamp) G72x/$(DEPDIR)/$(am__dirstamp)
+G72x/g72x.lo: G72x/$(am__dirstamp) G72x/$(DEPDIR)/$(am__dirstamp)
+G72x/libg72x.la: $(G72x_libg72x_la_OBJECTS) $(G72x_libg72x_la_DEPENDENCIES) G72x/$(am__dirstamp)
+	$(AM_V_CCLD)$(LINK)  $(G72x_libg72x_la_OBJECTS) $(G72x_libg72x_la_LIBADD) $(LIBS)
+GSM610/$(am__dirstamp):
+	@$(MKDIR_P) GSM610
+	@: > GSM610/$(am__dirstamp)
+GSM610/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) GSM610/$(DEPDIR)
+	@: > GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/add.lo: GSM610/$(am__dirstamp) GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/code.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/decode.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/gsm_create.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/gsm_decode.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/gsm_destroy.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/gsm_encode.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/gsm_option.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/long_term.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/lpc.lo: GSM610/$(am__dirstamp) GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/preprocess.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/rpe.lo: GSM610/$(am__dirstamp) GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/short_term.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/table.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/libgsm.la: $(GSM610_libgsm_la_OBJECTS) $(GSM610_libgsm_la_DEPENDENCIES) GSM610/$(am__dirstamp)
+	$(AM_V_CCLD)$(LINK)  $(GSM610_libgsm_la_OBJECTS) $(GSM610_libgsm_la_LIBADD) $(LIBS)
+libcommon.la: $(libcommon_la_OBJECTS) $(libcommon_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK)  $(libcommon_la_OBJECTS) $(libcommon_la_LIBADD) $(LIBS)
+libsndfile.la: $(libsndfile_la_OBJECTS) $(libsndfile_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(libsndfile_la_LINK) -rpath $(libdir) $(libsndfile_la_OBJECTS) $(libsndfile_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+G72x/g72x_test.$(OBJEXT): G72x/$(am__dirstamp) \
+	G72x/$(DEPDIR)/$(am__dirstamp)
+G72x/g72x_test$(EXEEXT): $(G72x_g72x_test_OBJECTS) $(G72x_g72x_test_DEPENDENCIES) G72x/$(am__dirstamp)
+	@rm -f G72x/g72x_test$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(G72x_g72x_test_OBJECTS) $(G72x_g72x_test_LDADD) $(LIBS)
+test_main$(EXEEXT): $(test_main_OBJECTS) $(test_main_DEPENDENCIES) 
+	@rm -f test_main$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(test_main_OBJECTS) $(test_main_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+	-rm -f G72x/g721.$(OBJEXT)
+	-rm -f G72x/g721.lo
+	-rm -f G72x/g723_16.$(OBJEXT)
+	-rm -f G72x/g723_16.lo
+	-rm -f G72x/g723_24.$(OBJEXT)
+	-rm -f G72x/g723_24.lo
+	-rm -f G72x/g723_40.$(OBJEXT)
+	-rm -f G72x/g723_40.lo
+	-rm -f G72x/g72x.$(OBJEXT)
+	-rm -f G72x/g72x.lo
+	-rm -f G72x/g72x_test.$(OBJEXT)
+	-rm -f GSM610/add.$(OBJEXT)
+	-rm -f GSM610/add.lo
+	-rm -f GSM610/code.$(OBJEXT)
+	-rm -f GSM610/code.lo
+	-rm -f GSM610/decode.$(OBJEXT)
+	-rm -f GSM610/decode.lo
+	-rm -f GSM610/gsm_create.$(OBJEXT)
+	-rm -f GSM610/gsm_create.lo
+	-rm -f GSM610/gsm_decode.$(OBJEXT)
+	-rm -f GSM610/gsm_decode.lo
+	-rm -f GSM610/gsm_destroy.$(OBJEXT)
+	-rm -f GSM610/gsm_destroy.lo
+	-rm -f GSM610/gsm_encode.$(OBJEXT)
+	-rm -f GSM610/gsm_encode.lo
+	-rm -f GSM610/gsm_option.$(OBJEXT)
+	-rm -f GSM610/gsm_option.lo
+	-rm -f GSM610/long_term.$(OBJEXT)
+	-rm -f GSM610/long_term.lo
+	-rm -f GSM610/lpc.$(OBJEXT)
+	-rm -f GSM610/lpc.lo
+	-rm -f GSM610/preprocess.$(OBJEXT)
+	-rm -f GSM610/preprocess.lo
+	-rm -f GSM610/rpe.$(OBJEXT)
+	-rm -f GSM610/rpe.lo
+	-rm -f GSM610/short_term.$(OBJEXT)
+	-rm -f GSM610/short_term.lo
+	-rm -f GSM610/table.$(OBJEXT)
+	-rm -f GSM610/table.lo
+
+distclean-compile:
+	-rm -f *.tab.c
+
+include ./$(DEPDIR)/aiff.Plo
+include ./$(DEPDIR)/alaw.Plo
+include ./$(DEPDIR)/au.Plo
+include ./$(DEPDIR)/audio_detect.Plo
+include ./$(DEPDIR)/avr.Plo
+include ./$(DEPDIR)/broadcast.Plo
+include ./$(DEPDIR)/caf.Plo
+include ./$(DEPDIR)/chanmap.Plo
+include ./$(DEPDIR)/chunk.Plo
+include ./$(DEPDIR)/command.Plo
+include ./$(DEPDIR)/common.Plo
+include ./$(DEPDIR)/dither.Plo
+include ./$(DEPDIR)/double64.Plo
+include ./$(DEPDIR)/dwd.Plo
+include ./$(DEPDIR)/dwvw.Plo
+include ./$(DEPDIR)/file_io.Plo
+include ./$(DEPDIR)/flac.Plo
+include ./$(DEPDIR)/float32.Plo
+include ./$(DEPDIR)/g72x.Plo
+include ./$(DEPDIR)/gsm610.Plo
+include ./$(DEPDIR)/htk.Plo
+include ./$(DEPDIR)/id3.Plo
+include ./$(DEPDIR)/ima_adpcm.Plo
+include ./$(DEPDIR)/ima_oki_adpcm.Plo
+include ./$(DEPDIR)/interleave.Plo
+include ./$(DEPDIR)/ircam.Plo
+include ./$(DEPDIR)/macbinary3.Plo
+include ./$(DEPDIR)/macos.Plo
+include ./$(DEPDIR)/mat4.Plo
+include ./$(DEPDIR)/mat5.Plo
+include ./$(DEPDIR)/mpc2k.Plo
+include ./$(DEPDIR)/ms_adpcm.Plo
+include ./$(DEPDIR)/nist.Plo
+include ./$(DEPDIR)/ogg.Plo
+include ./$(DEPDIR)/ogg_pcm.Plo
+include ./$(DEPDIR)/ogg_speex.Plo
+include ./$(DEPDIR)/ogg_vorbis.Plo
+include ./$(DEPDIR)/paf.Plo
+include ./$(DEPDIR)/pcm.Plo
+include ./$(DEPDIR)/pvf.Plo
+include ./$(DEPDIR)/raw.Plo
+include ./$(DEPDIR)/rf64.Plo
+include ./$(DEPDIR)/rx2.Plo
+include ./$(DEPDIR)/sd2.Plo
+include ./$(DEPDIR)/sds.Plo
+include ./$(DEPDIR)/sndfile.Plo
+include ./$(DEPDIR)/strings.Plo
+include ./$(DEPDIR)/svx.Plo
+include ./$(DEPDIR)/test_audio_detect.Po
+include ./$(DEPDIR)/test_broadcast_var.Po
+include ./$(DEPDIR)/test_conversions.Po
+include ./$(DEPDIR)/test_endswap.Po
+include ./$(DEPDIR)/test_file_io.Po
+include ./$(DEPDIR)/test_float.Po
+include ./$(DEPDIR)/test_ima_oki_adpcm.Po
+include ./$(DEPDIR)/test_log_printf.Po
+include ./$(DEPDIR)/test_main.Po
+include ./$(DEPDIR)/test_strncpy_crlf.Po
+include ./$(DEPDIR)/txw.Plo
+include ./$(DEPDIR)/ulaw.Plo
+include ./$(DEPDIR)/voc.Plo
+include ./$(DEPDIR)/vox_adpcm.Plo
+include ./$(DEPDIR)/w64.Plo
+include ./$(DEPDIR)/wav.Plo
+include ./$(DEPDIR)/wav_w64.Plo
+include ./$(DEPDIR)/windows.Plo
+include ./$(DEPDIR)/wve.Plo
+include ./$(DEPDIR)/xi.Plo
+include G72x/$(DEPDIR)/g721.Plo
+include G72x/$(DEPDIR)/g723_16.Plo
+include G72x/$(DEPDIR)/g723_24.Plo
+include G72x/$(DEPDIR)/g723_40.Plo
+include G72x/$(DEPDIR)/g72x.Plo
+include G72x/$(DEPDIR)/g72x_test.Po
+include GSM610/$(DEPDIR)/add.Plo
+include GSM610/$(DEPDIR)/code.Plo
+include GSM610/$(DEPDIR)/decode.Plo
+include GSM610/$(DEPDIR)/gsm_create.Plo
+include GSM610/$(DEPDIR)/gsm_decode.Plo
+include GSM610/$(DEPDIR)/gsm_destroy.Plo
+include GSM610/$(DEPDIR)/gsm_encode.Plo
+include GSM610/$(DEPDIR)/gsm_option.Plo
+include GSM610/$(DEPDIR)/long_term.Plo
+include GSM610/$(DEPDIR)/lpc.Plo
+include GSM610/$(DEPDIR)/preprocess.Plo
+include GSM610/$(DEPDIR)/rpe.Plo
+include GSM610/$(DEPDIR)/short_term.Plo
+include GSM610/$(DEPDIR)/table.Plo
+
+.c.o:
+	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+	$(am__mv) $$depbase.Tpo $$depbase.Po
+#	$(AM_V_CC) \
+#	source='$<' object='$@' libtool=no \
+#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
+#	$(COMPILE) -c -o $@ $<
+
+.c.obj:
+	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+	$(am__mv) $$depbase.Tpo $$depbase.Po
+#	$(AM_V_CC) \
+#	source='$<' object='$@' libtool=no \
+#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
+#	$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+	$(am__mv) $$depbase.Tpo $$depbase.Plo
+#	$(AM_V_CC) \
+#	source='$<' object='$@' libtool=yes \
+#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
+#	$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+	-rm -rf G72x/.libs G72x/_libs
+	-rm -rf GSM610/.libs GSM610/_libs
+install-includeHEADERS: $(include_HEADERS)
+	@$(NORMAL_INSTALL)
+	test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
+	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
+	done
+
+uninstall-includeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	test -n "$$files" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(includedir)" && rm -f $$files
+install-nodist_includeHEADERS: $(nodist_include_HEADERS)
+	@$(NORMAL_INSTALL)
+	test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
+	@list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
+	done
+
+uninstall-nodist_includeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	test -n "$$files" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(includedir)" && rm -f $$files
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	set x; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS) config.h
+installdirs:
+	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-rm -f G72x/$(DEPDIR)/$(am__dirstamp)
+	-rm -f G72x/$(am__dirstamp)
+	-rm -f GSM610/$(DEPDIR)/$(am__dirstamp)
+	-rm -f GSM610/$(am__dirstamp)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \
+	clean-libtool clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR) G72x/$(DEPDIR) GSM610/$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-hdr distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-includeHEADERS install-nodist_includeHEADERS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR) G72x/$(DEPDIR) GSM610/$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES \
+	uninstall-nodist_includeHEADERS
+
+.MAKE: all check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \
+	clean-libtool clean-noinstLTLIBRARIES ctags distclean \
+	distclean-compile distclean-generic distclean-hdr \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am \
+	install-includeHEADERS install-info install-info-am \
+	install-libLTLIBRARIES install-man \
+	install-nodist_includeHEADERS install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-includeHEADERS \
+	uninstall-libLTLIBRARIES uninstall-nodist_includeHEADERS
+
+
+test_endswap.c: test_endswap.def test_endswap.tpl
+	autogen --writable test_endswap.def
+
+genfiles : test_endswap.c $(SYMBOL_FILES)
+
+check :
+	@if [ -x /usr/bin/python ]; then $(srcdir)/binheader_writef_check.py $(srcdir)/*.c ; fi
+	G72x/g72x_test$(EXEEXT) all
+	./test_main$(EXEEXT)
+
+# Need this target to force building of test programs.
+checkprograms : $(check_PROGRAMS)
+
+#======================================================================
+# Generate an OS specific Symbols files. This is done when the author
+# builds the distribution tarball. There should be not need for the
+# end user to create these files.
+
+Symbols.gnu-binutils: create_symbols_file.py
+	./create_symbols_file.py linux $(VERSION) > $@
+
+Symbols.darwin: create_symbols_file.py
+	./create_symbols_file.py darwin $(VERSION) > $@
+
+libsndfile-1.def: create_symbols_file.py
+	./create_symbols_file.py win32 $(VERSION) > $@
+
+Symbols.os2: create_symbols_file.py
+	./create_symbols_file.py os2 $(VERSION) > $@
+
+Symbols.static: create_symbols_file.py
+	./create_symbols_file.py static $(VERSION) > $@
+
+# Fake dependancy to force the creation of these files.
+sndfile.o : $(SYMBOL_FILES)
+
+#======================================================================
+# Building windows resource files (if needed).
+
+.rc.lo:
+	$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --tag=RC --mode=compile $(RC) $(RCFLAGS) $< -o $@
+
+# 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:
diff --git a/jni/libsndfile-1.0.25/src/Makefile.am b/jni/libsndfile-1.0.25/src/Makefile.am
new file mode 100644
index 0000000..7834e28
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/Makefile.am
@@ -0,0 +1,127 @@
+## Process this file with automake to produce Makefile.in
+
+AUTOMAKE_OPTIONS = subdir-objects
+
+INCLUDES = @EXTERNAL_CFLAGS@
+
+lib_LTLIBRARIES = libsndfile.la
+include_HEADERS = sndfile.hh
+nodist_include_HEADERS = sndfile.h
+
+noinst_LTLIBRARIES =  GSM610/libgsm.la G72x/libg72x.la libcommon.la
+
+OS_SPECIFIC_CFLAGS = @OS_SPECIFIC_CFLAGS@
+OS_SPECIFIC_LINKS = @OS_SPECIFIC_LINKS@
+
+SYMBOL_FILES = Symbols.gnu-binutils Symbols.darwin libsndfile-1.def Symbols.os2 Symbols.static
+
+EXTRA_DIST = sndfile.h.in config.h.in test_endswap.tpl test_endswap.def \
+			$(SYMBOL_FILES) create_symbols_file.py binheader_writef_check.py \
+			GSM610/README GSM610/COPYRIGHT GSM610/ChangeLog \
+			G72x/README G72x/README.original G72x/ChangeLog \
+			make-static-lib-hidden-privates.sh
+
+noinst_HEADERS = common.h sfconfig.h sfendian.h wav_w64.h sf_unistd.h ogg.h chanmap.h
+
+check_PROGRAMS = test_main G72x/g72x_test
+
+COMMON = common.c file_io.c command.c pcm.c ulaw.c alaw.c float32.c \
+		double64.c ima_adpcm.c ms_adpcm.c gsm610.c dwvw.c vox_adpcm.c \
+		interleave.c strings.c dither.c broadcast.c audio_detect.c \
+ 		ima_oki_adpcm.c ima_oki_adpcm.h chunk.c ogg.c chanmap.c \
+		windows.c id3.c $(WIN_VERSION_FILE)
+
+FILESPECIFIC = sndfile.c aiff.c au.c avr.c caf.c dwd.c flac.c g72x.c htk.c ircam.c \
+		macbinary3.c macos.c mat4.c mat5.c nist.c paf.c pvf.c raw.c rx2.c sd2.c \
+		sds.c svx.c txw.c voc.c wve.c w64.c wav_w64.c wav.c xi.c mpc2k.c rf64.c \
+		ogg_vorbis.c ogg_speex.c ogg_pcm.c
+
+CLEANFILES = *~
+
+if USE_WIN_VERSION_FILE
+WIN_VERSION_FILE = version-metadata.rc
+else
+WIN_VERSION_FILE =
+endif
+
+#===============================================================================
+# MinGW requires -no-undefined if a DLL is to be built.
+libsndfile_la_LDFLAGS = -no-undefined -version-info @SHARED_VERSION_INFO@ @SHLIB_VERSION_ARG@
+libsndfile_la_SOURCES = $(FILESPECIFIC) $(noinst_HEADERS)
+nodist_libsndfile_la_SOURCES = $(nodist_include_HEADERS)
+libsndfile_la_LIBADD = libcommon.la GSM610/libgsm.la G72x/libg72x.la \
+		@EXTERNAL_LIBS@ -lm
+
+libcommon_la_SOURCES = $(COMMON)
+
+#======================================================================
+# Subdir libraries.
+
+GSM610_libgsm_la_SOURCES = GSM610/config.h GSM610/gsm.h GSM610/gsm610_priv.h \
+		GSM610/add.c GSM610/code.c GSM610/decode.c GSM610/gsm_create.c \
+		GSM610/gsm_decode.c GSM610/gsm_destroy.c GSM610/gsm_encode.c \
+		GSM610/gsm_option.c GSM610/long_term.c GSM610/lpc.c GSM610/preprocess.c \
+		GSM610/rpe.c GSM610/short_term.c GSM610/table.c
+
+G72x_libg72x_la_SOURCES = $(COMMON)G72x/g72x.h G72x/g72x_priv.h \
+		G72x/g721.c G72x/g723_16.c G72x/g723_24.c G72x/g723_40.c G72x/g72x.c
+
+#======================================================================
+# Test programs.
+
+test_main_SOURCES = test_main.c test_main.h test_conversions.c test_float.c test_endswap.c \
+					test_audio_detect.c test_log_printf.c test_file_io.c test_ima_oki_adpcm.c \
+					test_strncpy_crlf.c test_broadcast_var.c
+test_main_LDADD = libcommon.la
+
+G72x_g72x_test_SOURCES = G72x/g72x_test.c
+G72x_g72x_test_LDADD = G72x/libg72x.la
+
+test_endswap.c: test_endswap.def test_endswap.tpl
+	autogen --writable test_endswap.def
+
+genfiles : test_endswap.c $(SYMBOL_FILES)
+
+check :
+	@if [ -x /usr/bin/python ]; then $(srcdir)/binheader_writef_check.py $(srcdir)/*.c ; fi
+	G72x/g72x_test$(EXEEXT) all
+	./test_main$(EXEEXT)
+
+# Need this target to force building of test programs.
+checkprograms : $(check_PROGRAMS)
+
+#======================================================================
+# Generate an OS specific Symbols files. This is done when the author
+# builds the distribution tarball. There should be not need for the
+# end user to create these files.
+
+Symbols.gnu-binutils: create_symbols_file.py
+	./create_symbols_file.py linux $(VERSION) > $@
+
+Symbols.darwin: create_symbols_file.py
+	./create_symbols_file.py darwin $(VERSION) > $@
+
+libsndfile-1.def: create_symbols_file.py
+	./create_symbols_file.py win32 $(VERSION) > $@
+
+Symbols.os2: create_symbols_file.py
+	./create_symbols_file.py os2 $(VERSION) > $@
+
+Symbols.static: create_symbols_file.py
+	./create_symbols_file.py static $(VERSION) > $@
+
+# Fake dependancy to force the creation of these files.
+sndfile.o : $(SYMBOL_FILES)
+
+#======================================================================
+# Building windows resource files (if needed).
+
+.rc.lo:
+	$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --tag=RC --mode=compile $(RC) $(RCFLAGS) $< -o $@
+
+#======================================================================
+# Disable autoheader.
+AUTOHEADER=echo
+
+
+
diff --git a/jni/libsndfile-1.0.25/src/Makefile.in b/jni/libsndfile-1.0.25/src/Makefile.in
new file mode 100644
index 0000000..c2fdc4d
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/Makefile.in
@@ -0,0 +1,1048 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
+# 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.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+check_PROGRAMS = test_main$(EXEEXT) G72x/g72x_test$(EXEEXT)
+subdir = src
+DIST_COMMON = $(include_HEADERS) $(noinst_HEADERS) \
+	$(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/config.h.in $(srcdir)/sndfile.h.in \
+	$(srcdir)/version-metadata.rc.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/M4/add_cflags.m4 \
+	$(top_srcdir)/M4/add_cxxflags.m4 $(top_srcdir)/M4/clip_mode.m4 \
+	$(top_srcdir)/M4/endian.m4 $(top_srcdir)/M4/extra_largefile.m4 \
+	$(top_srcdir)/M4/extra_pkg.m4 \
+	$(top_srcdir)/M4/flexible_array.m4 \
+	$(top_srcdir)/M4/gcc_version.m4 $(top_srcdir)/M4/libtool.m4 \
+	$(top_srcdir)/M4/lrint.m4 $(top_srcdir)/M4/lrintf.m4 \
+	$(top_srcdir)/M4/ltoptions.m4 $(top_srcdir)/M4/ltsugar.m4 \
+	$(top_srcdir)/M4/ltversion.m4 $(top_srcdir)/M4/lt~obsolete.m4 \
+	$(top_srcdir)/M4/mkoctfile_version.m4 \
+	$(top_srcdir)/M4/octave.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = version-metadata.rc sndfile.h
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" \
+	"$(DESTDIR)$(includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES)
+G72x_libg72x_la_LIBADD =
+am__dirstamp = $(am__leading_dot)dirstamp
+am_G72x_libg72x_la_OBJECTS = G72x/g721.lo G72x/g723_16.lo \
+	G72x/g723_24.lo G72x/g723_40.lo G72x/g72x.lo
+G72x_libg72x_la_OBJECTS = $(am_G72x_libg72x_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+GSM610_libgsm_la_LIBADD =
+am_GSM610_libgsm_la_OBJECTS = GSM610/add.lo GSM610/code.lo \
+	GSM610/decode.lo GSM610/gsm_create.lo GSM610/gsm_decode.lo \
+	GSM610/gsm_destroy.lo GSM610/gsm_encode.lo \
+	GSM610/gsm_option.lo GSM610/long_term.lo GSM610/lpc.lo \
+	GSM610/preprocess.lo GSM610/rpe.lo GSM610/short_term.lo \
+	GSM610/table.lo
+GSM610_libgsm_la_OBJECTS = $(am_GSM610_libgsm_la_OBJECTS)
+libcommon_la_LIBADD =
+am__libcommon_la_SOURCES_DIST = common.c file_io.c command.c pcm.c \
+	ulaw.c alaw.c float32.c double64.c ima_adpcm.c ms_adpcm.c \
+	gsm610.c dwvw.c vox_adpcm.c interleave.c strings.c dither.c \
+	broadcast.c audio_detect.c ima_oki_adpcm.c ima_oki_adpcm.h \
+	chunk.c ogg.c chanmap.c windows.c id3.c version-metadata.rc
+@USE_WIN_VERSION_FILE_TRUE@am__objects_1 = version-metadata.lo
+am__objects_2 = common.lo file_io.lo command.lo pcm.lo ulaw.lo alaw.lo \
+	float32.lo double64.lo ima_adpcm.lo ms_adpcm.lo gsm610.lo \
+	dwvw.lo vox_adpcm.lo interleave.lo strings.lo dither.lo \
+	broadcast.lo audio_detect.lo ima_oki_adpcm.lo chunk.lo ogg.lo \
+	chanmap.lo windows.lo id3.lo $(am__objects_1)
+am_libcommon_la_OBJECTS = $(am__objects_2)
+libcommon_la_OBJECTS = $(am_libcommon_la_OBJECTS)
+libsndfile_la_DEPENDENCIES = libcommon.la GSM610/libgsm.la \
+	G72x/libg72x.la
+am__objects_3 = sndfile.lo aiff.lo au.lo avr.lo caf.lo dwd.lo flac.lo \
+	g72x.lo htk.lo ircam.lo macbinary3.lo macos.lo mat4.lo mat5.lo \
+	nist.lo paf.lo pvf.lo raw.lo rx2.lo sd2.lo sds.lo svx.lo \
+	txw.lo voc.lo wve.lo w64.lo wav_w64.lo wav.lo xi.lo mpc2k.lo \
+	rf64.lo ogg_vorbis.lo ogg_speex.lo ogg_pcm.lo
+am__objects_4 =
+am_libsndfile_la_OBJECTS = $(am__objects_3) $(am__objects_4)
+nodist_libsndfile_la_OBJECTS = $(am__objects_4)
+libsndfile_la_OBJECTS = $(am_libsndfile_la_OBJECTS) \
+	$(nodist_libsndfile_la_OBJECTS)
+libsndfile_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(libsndfile_la_LDFLAGS) $(LDFLAGS) -o $@
+am_G72x_g72x_test_OBJECTS = G72x/g72x_test.$(OBJEXT)
+G72x_g72x_test_OBJECTS = $(am_G72x_g72x_test_OBJECTS)
+G72x_g72x_test_DEPENDENCIES = G72x/libg72x.la
+am_test_main_OBJECTS = test_main.$(OBJEXT) test_conversions.$(OBJEXT) \
+	test_float.$(OBJEXT) test_endswap.$(OBJEXT) \
+	test_audio_detect.$(OBJEXT) test_log_printf.$(OBJEXT) \
+	test_file_io.$(OBJEXT) test_ima_oki_adpcm.$(OBJEXT) \
+	test_strncpy_crlf.$(OBJEXT) test_broadcast_var.$(OBJEXT)
+test_main_OBJECTS = $(am_test_main_OBJECTS)
+test_main_DEPENDENCIES = libcommon.la
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/Cfg/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo "  CC    " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo "  CCLD  " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo "  GEN   " $@;
+SOURCES = $(G72x_libg72x_la_SOURCES) $(GSM610_libgsm_la_SOURCES) \
+	$(libcommon_la_SOURCES) $(libsndfile_la_SOURCES) \
+	$(nodist_libsndfile_la_SOURCES) $(G72x_g72x_test_SOURCES) \
+	$(test_main_SOURCES)
+DIST_SOURCES = $(G72x_libg72x_la_SOURCES) $(GSM610_libgsm_la_SOURCES) \
+	$(am__libcommon_la_SOURCES_DIST) $(libsndfile_la_SOURCES) \
+	$(G72x_g72x_test_SOURCES) $(test_main_SOURCES)
+HEADERS = $(include_HEADERS) $(nodist_include_HEADERS) \
+	$(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+
+#======================================================================
+# Disable autoheader.
+AUTOHEADER = echo
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CLEAN_VERSION = @CLEAN_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXTERNAL_CFLAGS = @EXTERNAL_CFLAGS@
+EXTERNAL_LIBS = @EXTERNAL_LIBS@
+FGREP = @FGREP@
+FLAC_CFLAGS = @FLAC_CFLAGS@
+FLAC_LIBS = @FLAC_LIBS@
+GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
+GCC_MINOR_VERSION = @GCC_MINOR_VERSION@
+GCC_VERSION = @GCC_VERSION@
+GETCONF = @GETCONF@
+GREP = @GREP@
+HAVE_AUTOGEN = @HAVE_AUTOGEN@
+HAVE_MKOCTFILE = @HAVE_MKOCTFILE@
+HAVE_OCTAVE = @HAVE_OCTAVE@
+HAVE_OCTAVE_CONFIG = @HAVE_OCTAVE_CONFIG@
+HAVE_WINE = @HAVE_WINE@
+HOST_TRIPLET = @HOST_TRIPLET@
+HTML_BGCOLOUR = @HTML_BGCOLOUR@
+HTML_FGCOLOUR = @HTML_FGCOLOUR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBTOOL_DEPS = @LIBTOOL_DEPS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MKOCTFILE = @MKOCTFILE@
+MKOCTFILE_VERSION = @MKOCTFILE_VERSION@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCTAVE = @OCTAVE@
+OCTAVE_CONFIG = @OCTAVE_CONFIG@
+OCTAVE_CONFIG_VERSION = @OCTAVE_CONFIG_VERSION@
+OCTAVE_DEST_MDIR = @OCTAVE_DEST_MDIR@
+OCTAVE_DEST_ODIR = @OCTAVE_DEST_ODIR@
+OCTAVE_VERSION = @OCTAVE_VERSION@
+OGG_CFLAGS = @OGG_CFLAGS@
+OGG_LIBS = @OGG_LIBS@
+OS_SPECIFIC_CFLAGS = @OS_SPECIFIC_CFLAGS@
+OS_SPECIFIC_LINKS = @OS_SPECIFIC_LINKS@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+RANLIB = @RANLIB@
+RC = @RC@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SF_COUNT_MAX = @SF_COUNT_MAX@
+SHARED_VERSION_INFO = @SHARED_VERSION_INFO@
+SHELL = @SHELL@
+SHLIB_VERSION_ARG = @SHLIB_VERSION_ARG@
+SIZEOF_SF_COUNT_T = @SIZEOF_SF_COUNT_T@
+SNDIO_LIBS = @SNDIO_LIBS@
+SPEEX_CFLAGS = @SPEEX_CFLAGS@
+SPEEX_LIBS = @SPEEX_LIBS@
+SQLITE3_CFLAGS = @SQLITE3_CFLAGS@
+SQLITE3_LIBS = @SQLITE3_LIBS@
+STRIP = @STRIP@
+TYPEOF_SF_COUNT_T = @TYPEOF_SF_COUNT_T@
+VERSION = @VERSION@
+VORBISENC_CFLAGS = @VORBISENC_CFLAGS@
+VORBISENC_LIBS = @VORBISENC_LIBS@
+VORBIS_CFLAGS = @VORBIS_CFLAGS@
+VORBIS_LIBS = @VORBIS_LIBS@
+WIN_RC_VERSION = @WIN_RC_VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+htmldocdir = @htmldocdir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = subdir-objects
+INCLUDES = @EXTERNAL_CFLAGS@
+lib_LTLIBRARIES = libsndfile.la
+include_HEADERS = sndfile.hh
+nodist_include_HEADERS = sndfile.h
+noinst_LTLIBRARIES = GSM610/libgsm.la G72x/libg72x.la libcommon.la
+SYMBOL_FILES = Symbols.gnu-binutils Symbols.darwin libsndfile-1.def Symbols.os2 Symbols.static
+EXTRA_DIST = sndfile.h.in config.h.in test_endswap.tpl test_endswap.def \
+			$(SYMBOL_FILES) create_symbols_file.py binheader_writef_check.py \
+			GSM610/README GSM610/COPYRIGHT GSM610/ChangeLog \
+			G72x/README G72x/README.original G72x/ChangeLog \
+			make-static-lib-hidden-privates.sh
+
+noinst_HEADERS = common.h sfconfig.h sfendian.h wav_w64.h sf_unistd.h ogg.h chanmap.h
+COMMON = common.c file_io.c command.c pcm.c ulaw.c alaw.c float32.c \
+		double64.c ima_adpcm.c ms_adpcm.c gsm610.c dwvw.c vox_adpcm.c \
+		interleave.c strings.c dither.c broadcast.c audio_detect.c \
+ 		ima_oki_adpcm.c ima_oki_adpcm.h chunk.c ogg.c chanmap.c \
+		windows.c id3.c $(WIN_VERSION_FILE)
+
+FILESPECIFIC = sndfile.c aiff.c au.c avr.c caf.c dwd.c flac.c g72x.c htk.c ircam.c \
+		macbinary3.c macos.c mat4.c mat5.c nist.c paf.c pvf.c raw.c rx2.c sd2.c \
+		sds.c svx.c txw.c voc.c wve.c w64.c wav_w64.c wav.c xi.c mpc2k.c rf64.c \
+		ogg_vorbis.c ogg_speex.c ogg_pcm.c
+
+CLEANFILES = *~
+@USE_WIN_VERSION_FILE_FALSE@WIN_VERSION_FILE = 
+@USE_WIN_VERSION_FILE_TRUE@WIN_VERSION_FILE = version-metadata.rc
+
+#===============================================================================
+# MinGW requires -no-undefined if a DLL is to be built.
+libsndfile_la_LDFLAGS = -no-undefined -version-info @SHARED_VERSION_INFO@ @SHLIB_VERSION_ARG@
+libsndfile_la_SOURCES = $(FILESPECIFIC) $(noinst_HEADERS)
+nodist_libsndfile_la_SOURCES = $(nodist_include_HEADERS)
+libsndfile_la_LIBADD = libcommon.la GSM610/libgsm.la G72x/libg72x.la \
+		@EXTERNAL_LIBS@ -lm
+
+libcommon_la_SOURCES = $(COMMON)
+
+#======================================================================
+# Subdir libraries.
+GSM610_libgsm_la_SOURCES = GSM610/config.h GSM610/gsm.h GSM610/gsm610_priv.h \
+		GSM610/add.c GSM610/code.c GSM610/decode.c GSM610/gsm_create.c \
+		GSM610/gsm_decode.c GSM610/gsm_destroy.c GSM610/gsm_encode.c \
+		GSM610/gsm_option.c GSM610/long_term.c GSM610/lpc.c GSM610/preprocess.c \
+		GSM610/rpe.c GSM610/short_term.c GSM610/table.c
+
+G72x_libg72x_la_SOURCES = $(COMMON)G72x/g72x.h G72x/g72x_priv.h \
+		G72x/g721.c G72x/g723_16.c G72x/g723_24.c G72x/g723_40.c G72x/g72x.c
+
+
+#======================================================================
+# Test programs.
+test_main_SOURCES = test_main.c test_main.h test_conversions.c test_float.c test_endswap.c \
+					test_audio_detect.c test_log_printf.c test_file_io.c test_ima_oki_adpcm.c \
+					test_strncpy_crlf.c test_broadcast_var.c
+
+test_main_LDADD = libcommon.la
+G72x_g72x_test_SOURCES = G72x/g72x_test.c
+G72x_g72x_test_LDADD = G72x/libg72x.la
+all: config.h
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj .rc
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu src/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+config.h: stamp-h1
+	@if test ! -f $@; then \
+	  rm -f stamp-h1; \
+	  $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
+	else :; fi
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+	@rm -f stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status src/config.h
+$(srcdir)/config.h.in:  $(am__configure_deps) 
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+	rm -f stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f config.h stamp-h1
+version-metadata.rc: $(top_builddir)/config.status $(srcdir)/version-metadata.rc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+sndfile.h: $(top_builddir)/config.status $(srcdir)/sndfile.h.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+	}
+
+uninstall-libLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+	done
+
+clean-libLTLIBRARIES:
+	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+	@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+G72x/$(am__dirstamp):
+	@$(MKDIR_P) G72x
+	@: > G72x/$(am__dirstamp)
+G72x/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) G72x/$(DEPDIR)
+	@: > G72x/$(DEPDIR)/$(am__dirstamp)
+G72x/g721.lo: G72x/$(am__dirstamp) G72x/$(DEPDIR)/$(am__dirstamp)
+G72x/g723_16.lo: G72x/$(am__dirstamp) G72x/$(DEPDIR)/$(am__dirstamp)
+G72x/g723_24.lo: G72x/$(am__dirstamp) G72x/$(DEPDIR)/$(am__dirstamp)
+G72x/g723_40.lo: G72x/$(am__dirstamp) G72x/$(DEPDIR)/$(am__dirstamp)
+G72x/g72x.lo: G72x/$(am__dirstamp) G72x/$(DEPDIR)/$(am__dirstamp)
+G72x/libg72x.la: $(G72x_libg72x_la_OBJECTS) $(G72x_libg72x_la_DEPENDENCIES) G72x/$(am__dirstamp)
+	$(AM_V_CCLD)$(LINK)  $(G72x_libg72x_la_OBJECTS) $(G72x_libg72x_la_LIBADD) $(LIBS)
+GSM610/$(am__dirstamp):
+	@$(MKDIR_P) GSM610
+	@: > GSM610/$(am__dirstamp)
+GSM610/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) GSM610/$(DEPDIR)
+	@: > GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/add.lo: GSM610/$(am__dirstamp) GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/code.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/decode.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/gsm_create.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/gsm_decode.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/gsm_destroy.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/gsm_encode.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/gsm_option.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/long_term.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/lpc.lo: GSM610/$(am__dirstamp) GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/preprocess.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/rpe.lo: GSM610/$(am__dirstamp) GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/short_term.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/table.lo: GSM610/$(am__dirstamp) \
+	GSM610/$(DEPDIR)/$(am__dirstamp)
+GSM610/libgsm.la: $(GSM610_libgsm_la_OBJECTS) $(GSM610_libgsm_la_DEPENDENCIES) GSM610/$(am__dirstamp)
+	$(AM_V_CCLD)$(LINK)  $(GSM610_libgsm_la_OBJECTS) $(GSM610_libgsm_la_LIBADD) $(LIBS)
+libcommon.la: $(libcommon_la_OBJECTS) $(libcommon_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK)  $(libcommon_la_OBJECTS) $(libcommon_la_LIBADD) $(LIBS)
+libsndfile.la: $(libsndfile_la_OBJECTS) $(libsndfile_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(libsndfile_la_LINK) -rpath $(libdir) $(libsndfile_la_OBJECTS) $(libsndfile_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+G72x/g72x_test.$(OBJEXT): G72x/$(am__dirstamp) \
+	G72x/$(DEPDIR)/$(am__dirstamp)
+G72x/g72x_test$(EXEEXT): $(G72x_g72x_test_OBJECTS) $(G72x_g72x_test_DEPENDENCIES) G72x/$(am__dirstamp)
+	@rm -f G72x/g72x_test$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(G72x_g72x_test_OBJECTS) $(G72x_g72x_test_LDADD) $(LIBS)
+test_main$(EXEEXT): $(test_main_OBJECTS) $(test_main_DEPENDENCIES) 
+	@rm -f test_main$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(test_main_OBJECTS) $(test_main_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+	-rm -f G72x/g721.$(OBJEXT)
+	-rm -f G72x/g721.lo
+	-rm -f G72x/g723_16.$(OBJEXT)
+	-rm -f G72x/g723_16.lo
+	-rm -f G72x/g723_24.$(OBJEXT)
+	-rm -f G72x/g723_24.lo
+	-rm -f G72x/g723_40.$(OBJEXT)
+	-rm -f G72x/g723_40.lo
+	-rm -f G72x/g72x.$(OBJEXT)
+	-rm -f G72x/g72x.lo
+	-rm -f G72x/g72x_test.$(OBJEXT)
+	-rm -f GSM610/add.$(OBJEXT)
+	-rm -f GSM610/add.lo
+	-rm -f GSM610/code.$(OBJEXT)
+	-rm -f GSM610/code.lo
+	-rm -f GSM610/decode.$(OBJEXT)
+	-rm -f GSM610/decode.lo
+	-rm -f GSM610/gsm_create.$(OBJEXT)
+	-rm -f GSM610/gsm_create.lo
+	-rm -f GSM610/gsm_decode.$(OBJEXT)
+	-rm -f GSM610/gsm_decode.lo
+	-rm -f GSM610/gsm_destroy.$(OBJEXT)
+	-rm -f GSM610/gsm_destroy.lo
+	-rm -f GSM610/gsm_encode.$(OBJEXT)
+	-rm -f GSM610/gsm_encode.lo
+	-rm -f GSM610/gsm_option.$(OBJEXT)
+	-rm -f GSM610/gsm_option.lo
+	-rm -f GSM610/long_term.$(OBJEXT)
+	-rm -f GSM610/long_term.lo
+	-rm -f GSM610/lpc.$(OBJEXT)
+	-rm -f GSM610/lpc.lo
+	-rm -f GSM610/preprocess.$(OBJEXT)
+	-rm -f GSM610/preprocess.lo
+	-rm -f GSM610/rpe.$(OBJEXT)
+	-rm -f GSM610/rpe.lo
+	-rm -f GSM610/short_term.$(OBJEXT)
+	-rm -f GSM610/short_term.lo
+	-rm -f GSM610/table.$(OBJEXT)
+	-rm -f GSM610/table.lo
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aiff.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alaw.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/au.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audio_detect.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avr.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/broadcast.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/caf.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chanmap.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chunk.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/command.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dither.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/double64.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwd.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwvw.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file_io.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flac.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/float32.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g72x.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsm610.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/htk.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/id3.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ima_adpcm.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ima_oki_adpcm.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interleave.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ircam.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/macbinary3.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/macos.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mat4.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mat5.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpc2k.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ms_adpcm.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nist.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ogg.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ogg_pcm.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ogg_speex.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ogg_vorbis.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paf.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcm.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pvf.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/raw.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rf64.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rx2.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sd2.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sds.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sndfile.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strings.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/svx.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_audio_detect.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_broadcast_var.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_conversions.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_endswap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_file_io.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_float.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ima_oki_adpcm.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_log_printf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_strncpy_crlf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/txw.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ulaw.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/voc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vox_adpcm.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/w64.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wav.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wav_w64.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/windows.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wve.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@G72x/$(DEPDIR)/g721.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@G72x/$(DEPDIR)/g723_16.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@G72x/$(DEPDIR)/g723_24.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@G72x/$(DEPDIR)/g723_40.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@G72x/$(DEPDIR)/g72x.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@G72x/$(DEPDIR)/g72x_test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@GSM610/$(DEPDIR)/add.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@GSM610/$(DEPDIR)/code.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@GSM610/$(DEPDIR)/decode.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@GSM610/$(DEPDIR)/gsm_create.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@GSM610/$(DEPDIR)/gsm_decode.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@GSM610/$(DEPDIR)/gsm_destroy.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@GSM610/$(DEPDIR)/gsm_encode.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@GSM610/$(DEPDIR)/gsm_option.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@GSM610/$(DEPDIR)/long_term.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@GSM610/$(DEPDIR)/lpc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@GSM610/$(DEPDIR)/preprocess.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@GSM610/$(DEPDIR)/rpe.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@GSM610/$(DEPDIR)/short_term.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@GSM610/$(DEPDIR)/table.Plo@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+	-rm -rf G72x/.libs G72x/_libs
+	-rm -rf GSM610/.libs GSM610/_libs
+install-includeHEADERS: $(include_HEADERS)
+	@$(NORMAL_INSTALL)
+	test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
+	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
+	done
+
+uninstall-includeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	test -n "$$files" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(includedir)" && rm -f $$files
+install-nodist_includeHEADERS: $(nodist_include_HEADERS)
+	@$(NORMAL_INSTALL)
+	test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
+	@list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
+	done
+
+uninstall-nodist_includeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	test -n "$$files" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(includedir)" && rm -f $$files
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	set x; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS) config.h
+installdirs:
+	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-rm -f G72x/$(DEPDIR)/$(am__dirstamp)
+	-rm -f G72x/$(am__dirstamp)
+	-rm -f GSM610/$(DEPDIR)/$(am__dirstamp)
+	-rm -f GSM610/$(am__dirstamp)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \
+	clean-libtool clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR) G72x/$(DEPDIR) GSM610/$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-hdr distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-includeHEADERS install-nodist_includeHEADERS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR) G72x/$(DEPDIR) GSM610/$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES \
+	uninstall-nodist_includeHEADERS
+
+.MAKE: all check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \
+	clean-libtool clean-noinstLTLIBRARIES ctags distclean \
+	distclean-compile distclean-generic distclean-hdr \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am \
+	install-includeHEADERS install-info install-info-am \
+	install-libLTLIBRARIES install-man \
+	install-nodist_includeHEADERS install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-includeHEADERS \
+	uninstall-libLTLIBRARIES uninstall-nodist_includeHEADERS
+
+
+test_endswap.c: test_endswap.def test_endswap.tpl
+	autogen --writable test_endswap.def
+
+genfiles : test_endswap.c $(SYMBOL_FILES)
+
+check :
+	@if [ -x /usr/bin/python ]; then $(srcdir)/binheader_writef_check.py $(srcdir)/*.c ; fi
+	G72x/g72x_test$(EXEEXT) all
+	./test_main$(EXEEXT)
+
+# Need this target to force building of test programs.
+checkprograms : $(check_PROGRAMS)
+
+#======================================================================
+# Generate an OS specific Symbols files. This is done when the author
+# builds the distribution tarball. There should be not need for the
+# end user to create these files.
+
+Symbols.gnu-binutils: create_symbols_file.py
+	./create_symbols_file.py linux $(VERSION) > $@
+
+Symbols.darwin: create_symbols_file.py
+	./create_symbols_file.py darwin $(VERSION) > $@
+
+libsndfile-1.def: create_symbols_file.py
+	./create_symbols_file.py win32 $(VERSION) > $@
+
+Symbols.os2: create_symbols_file.py
+	./create_symbols_file.py os2 $(VERSION) > $@
+
+Symbols.static: create_symbols_file.py
+	./create_symbols_file.py static $(VERSION) > $@
+
+# Fake dependancy to force the creation of these files.
+sndfile.o : $(SYMBOL_FILES)
+
+#======================================================================
+# Building windows resource files (if needed).
+
+.rc.lo:
+	$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --tag=RC --mode=compile $(RC) $(RCFLAGS) $< -o $@
+
+# 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:
diff --git a/jni/libsndfile-1.0.25/src/Symbols.darwin b/jni/libsndfile-1.0.25/src/Symbols.darwin
new file mode 100644
index 0000000..a671460
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/Symbols.darwin
@@ -0,0 +1,37 @@
+# Auto-generated by create_symbols_file.py
+
+_sf_command
+_sf_open
+_sf_close
+_sf_seek
+_sf_error
+_sf_perror
+_sf_error_str
+_sf_error_number
+_sf_format_check
+_sf_read_raw
+_sf_readf_short
+_sf_readf_int
+_sf_readf_float
+_sf_readf_double
+_sf_read_short
+_sf_read_int
+_sf_read_float
+_sf_read_double
+_sf_write_raw
+_sf_writef_short
+_sf_writef_int
+_sf_writef_float
+_sf_writef_double
+_sf_write_short
+_sf_write_int
+_sf_write_float
+_sf_write_double
+_sf_strerror
+_sf_get_string
+_sf_set_string
+_sf_version_string
+_sf_open_fd
+_sf_open_virtual
+_sf_write_sync
+
diff --git a/jni/libsndfile-1.0.25/src/Symbols.gnu-binutils b/jni/libsndfile-1.0.25/src/Symbols.gnu-binutils
new file mode 100644
index 0000000..93da6d6
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/Symbols.gnu-binutils
@@ -0,0 +1,43 @@
+# Auto-generated by create_symbols_file.py
+
+libsndfile.so.1.0
+{
+  global:
+    sf_command ;
+    sf_open ;
+    sf_close ;
+    sf_seek ;
+    sf_error ;
+    sf_perror ;
+    sf_error_str ;
+    sf_error_number ;
+    sf_format_check ;
+    sf_read_raw ;
+    sf_readf_short ;
+    sf_readf_int ;
+    sf_readf_float ;
+    sf_readf_double ;
+    sf_read_short ;
+    sf_read_int ;
+    sf_read_float ;
+    sf_read_double ;
+    sf_write_raw ;
+    sf_writef_short ;
+    sf_writef_int ;
+    sf_writef_float ;
+    sf_writef_double ;
+    sf_write_short ;
+    sf_write_int ;
+    sf_write_float ;
+    sf_write_double ;
+    sf_strerror ;
+    sf_get_string ;
+    sf_set_string ;
+    sf_version_string ;
+    sf_open_fd ;
+    sf_open_virtual ;
+    sf_write_sync ;
+  local:
+    * ;
+} ;
+
diff --git a/jni/libsndfile-1.0.25/src/Symbols.os2 b/jni/libsndfile-1.0.25/src/Symbols.os2
new file mode 100644
index 0000000..118ceba
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/Symbols.os2
@@ -0,0 +1,43 @@
+; Auto-generated by create_symbols_file.py
+
+LIBRARY sndfile1
+INITINSTANCE TERMINSTANCE
+CODE PRELOAD MOVEABLE DISCARDABLE
+DATA PRELOAD MOVEABLE MULTIPLE NONSHARED
+EXPORTS
+
+_sf_command           @1
+_sf_open              @2
+_sf_close             @3
+_sf_seek              @4
+_sf_error             @7
+_sf_perror            @8
+_sf_error_str         @9
+_sf_error_number      @10
+_sf_format_check      @11
+_sf_read_raw          @16
+_sf_readf_short       @17
+_sf_readf_int         @18
+_sf_readf_float       @19
+_sf_readf_double      @20
+_sf_read_short        @21
+_sf_read_int          @22
+_sf_read_float        @23
+_sf_read_double       @24
+_sf_write_raw         @32
+_sf_writef_short      @33
+_sf_writef_int        @34
+_sf_writef_float      @35
+_sf_writef_double     @36
+_sf_write_short       @37
+_sf_write_int         @38
+_sf_write_float       @39
+_sf_write_double      @40
+_sf_strerror          @50
+_sf_get_string        @60
+_sf_set_string        @61
+_sf_version_string    @68
+_sf_open_fd           @70
+_sf_open_virtual      @80
+_sf_write_sync        @90
+
diff --git a/jni/libsndfile-1.0.25/src/Symbols.static b/jni/libsndfile-1.0.25/src/Symbols.static
new file mode 100644
index 0000000..a0e8d62
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/Symbols.static
@@ -0,0 +1,35 @@
+sf_command
+sf_open
+sf_close
+sf_seek
+sf_error
+sf_perror
+sf_error_str
+sf_error_number
+sf_format_check
+sf_read_raw
+sf_readf_short
+sf_readf_int
+sf_readf_float
+sf_readf_double
+sf_read_short
+sf_read_int
+sf_read_float
+sf_read_double
+sf_write_raw
+sf_writef_short
+sf_writef_int
+sf_writef_float
+sf_writef_double
+sf_write_short
+sf_write_int
+sf_write_float
+sf_write_double
+sf_strerror
+sf_get_string
+sf_set_string
+sf_version_string
+sf_open_fd
+sf_wchar_open
+sf_open_virtual
+sf_write_sync
diff --git a/jni/libsndfile-1.0.25/src/aiff.c b/jni/libsndfile-1.0.25/src/aiff.c
new file mode 100644
index 0000000..0113ba6
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/aiff.c
@@ -0,0 +1,1738 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2005 David Viens <davidv@plogue.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <ctype.h>
+#include <inttypes.h>
+
+#include "sndfile.h"
+#include "sfendian.h"
+#include "common.h"
+#include "chanmap.h"
+
+/*------------------------------------------------------------------------------
+ * Macros to handle big/little endian issues.
+ */
+
+#define FORM_MARKER		(MAKE_MARKER ('F', 'O', 'R', 'M'))
+#define AIFF_MARKER		(MAKE_MARKER ('A', 'I', 'F', 'F'))
+#define AIFC_MARKER		(MAKE_MARKER ('A', 'I', 'F', 'C'))
+#define COMM_MARKER		(MAKE_MARKER ('C', 'O', 'M', 'M'))
+#define SSND_MARKER		(MAKE_MARKER ('S', 'S', 'N', 'D'))
+#define MARK_MARKER		(MAKE_MARKER ('M', 'A', 'R', 'K'))
+#define INST_MARKER		(MAKE_MARKER ('I', 'N', 'S', 'T'))
+#define APPL_MARKER		(MAKE_MARKER ('A', 'P', 'P', 'L'))
+#define CHAN_MARKER		(MAKE_MARKER ('C', 'H', 'A', 'N'))
+
+#define c_MARKER		(MAKE_MARKER ('(', 'c', ')', ' '))
+#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'))
+#define basc_MARKER		(MAKE_MARKER ('b', 'a', 's', 'c'))
+
+/* 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 raw_MARKER		(MAKE_MARKER ('r', 'a', 'w', ' '))
+#define in24_MARKER		(MAKE_MARKER ('i', 'n', '2', '4'))
+#define ni24_MARKER		(MAKE_MARKER ('4', '2', 'n', '1'))
+#define in32_MARKER		(MAKE_MARKER ('i', 'n', '3', '2'))
+#define ni32_MARKER		(MAKE_MARKER ('2', '3', 'n', 'i'))
+
+#define fl32_MARKER		(MAKE_MARKER ('f', 'l', '3', '2'))
+#define FL32_MARKER		(MAKE_MARKER ('F', 'L', '3', '2'))
+#define fl64_MARKER		(MAKE_MARKER ('f', 'l', '6', '4'))
+#define FL64_MARKER		(MAKE_MARKER ('F', 'L', '6', '4'))
+
+#define ulaw_MARKER		(MAKE_MARKER ('u', 'l', 'a', 'w'))
+#define ULAW_MARKER		(MAKE_MARKER ('U', 'L', 'A', 'W'))
+#define alaw_MARKER		(MAKE_MARKER ('a', 'l', 'a', 'w'))
+#define ALAW_MARKER		(MAKE_MARKER ('A', 'L', 'A', 'W'))
+
+#define DWVW_MARKER		(MAKE_MARKER ('D', 'W', 'V', 'W'))
+#define GSM_MARKER		(MAKE_MARKER ('G', 'S', 'M', ' '))
+#define ima4_MARKER		(MAKE_MARKER ('i', 'm', 'a', '4'))
+
+/*
+**	This value is officially assigned to Mega Nerd Pty Ltd by Apple
+**	Corportation as the Application marker for libsndfile.
+**
+**	See : http://developer.apple.com/faq/datatype.html
+*/
+#define m3ga_MARKER		(MAKE_MARKER ('m', '3', 'g', 'a'))
+
+/* Unsupported AIFC encodings.*/
+
+#define MAC3_MARKER		(MAKE_MARKER ('M', 'A', 'C', '3'))
+#define MAC6_MARKER		(MAKE_MARKER ('M', 'A', 'C', '6'))
+#define ADP4_MARKER		(MAKE_MARKER ('A', 'D', 'P', '4'))
+
+/* Predfined chunk sizes. */
+#define SIZEOF_AIFF_COMM		18
+#define SIZEOF_AIFC_COMM_MIN	22
+#define SIZEOF_AIFC_COMM		24
+#define SIZEOF_SSND_CHUNK		8
+#define SIZEOF_INST_CHUNK		20
+
+/* Is it constant? */
+
+/* AIFC/IMA4 defines. */
+#define AIFC_IMA4_BLOCK_LEN				34
+#define AIFC_IMA4_SAMPLES_PER_BLOCK		64
+
+#define AIFF_PEAK_CHUNK_SIZE(ch)	(2 * sizeof (int) + ch * (sizeof (float) + sizeof (int)))
+
+/*------------------------------------------------------------------------------
+ * Typedefs for file chunks.
+ */
+
+enum
+{	HAVE_FORM		= 0x01,
+	HAVE_AIFF		= 0x02,
+	HAVE_AIFC		= 0x04,
+	HAVE_FVER		= 0x08,
+	HAVE_COMM		= 0x10,
+	HAVE_SSND		= 0x20
+} ;
+
+typedef struct
+{	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
+{	unsigned int	offset ;
+	unsigned int	blocksize ;
+} SSND_CHUNK ;
+
+typedef struct
+{	short			playMode ;
+	unsigned short	beginLoop ;
+	unsigned short	endLoop ;
+} INST_LOOP ;
+
+typedef struct
+{	char		baseNote ;		/* all notes are MIDI note numbers */
+	char		detune ;		/* cents off, only -50 to +50 are significant */
+	char		lowNote ;
+	char		highNote ;
+	char		lowVelocity ;	/* 1 to 127 */
+	char		highVelocity ;	/* 1 to 127 */
+	short		gain ;			/* in dB, 0 is normal */
+	INST_LOOP	sustain_loop ;
+	INST_LOOP	release_loop ;
+} INST_CHUNK ;
+
+
+enum
+{	basc_SCALE_MINOR = 1,
+	basc_SCALE_MAJOR,
+	basc_SCALE_NEITHER,
+	basc_SCALE_BOTH
+} ;
+
+enum
+{	basc_TYPE_LOOP = 0,
+	basc_TYPE_ONE_SHOT
+} ;
+
+
+typedef struct
+{	unsigned int	version ;
+	unsigned int	numBeats ;
+	unsigned short	rootNote ;
+	unsigned short	scaleType ;
+	unsigned short	sigNumerator ;
+	unsigned short	sigDenominator ;
+	unsigned short	loopType ;
+} basc_CHUNK ;
+
+typedef struct
+{	unsigned short	markerID ;
+	unsigned int	position ;
+} MARK_ID_POS ;
+
+typedef struct
+{	PRIV_CHUNK4 chunk4 ;
+
+	sf_count_t	comm_offset ;
+	sf_count_t	ssnd_offset ;
+
+	int chanmap_tag ;
+
+	MARK_ID_POS *markstr ;
+} AIFF_PRIVATE ;
+
+/*------------------------------------------------------------------------------
+ * Private static functions.
+ */
+
+static int	aiff_close (SF_PRIVATE *psf) ;
+
+static int	tenbytefloat2int (unsigned char *bytes) ;
+static void uint2tenbytefloat (unsigned int num, unsigned char *bytes) ;
+
+static int	aiff_read_comm_chunk (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt) ;
+
+static int	aiff_read_header (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt) ;
+
+static int	aiff_write_header (SF_PRIVATE *psf, int calc_length) ;
+static int	aiff_write_tailer (SF_PRIVATE *psf) ;
+static void	aiff_write_strings (SF_PRIVATE *psf, int location) ;
+
+static int	aiff_command (SF_PRIVATE *psf, int command, void *data, int datasize) ;
+
+static const char *get_loop_mode_str (short mode) ;
+
+static short get_loop_mode (short mode) ;
+
+static int aiff_read_basc_chunk (SF_PRIVATE * psf, int) ;
+
+static int aiff_read_chanmap (SF_PRIVATE * psf, unsigned dword) ;
+
+static unsigned int marker_to_position (const MARK_ID_POS *m, unsigned short n, int marksize) ;
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+aiff_open (SF_PRIVATE *psf)
+{	COMM_CHUNK comm_fmt ;
+	int error, subformat ;
+
+	memset (&comm_fmt, 0, sizeof (comm_fmt)) ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+
+	if ((psf->container_data = calloc (1, sizeof (AIFF_PRIVATE))) == NULL)
+		return SFE_MALLOC_FAILED ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = aiff_read_header (psf, &comm_fmt)))
+			return error ;
+		psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+		} ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	if (psf->is_pipe)
+			return SFE_NO_PIPE_WRITE ;
+
+		if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_AIFF)
+			return SFE_BAD_OPEN_FORMAT ;
+
+		if (psf->file.mode == SFM_WRITE && (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE))
+		{	if ((psf->peak_info = peak_info_calloc (psf->sf.channels)) == NULL)
+				return SFE_MALLOC_FAILED ;
+			psf->peak_info->peak_loc = SF_PEAK_START ;
+			} ;
+
+		if (psf->file.mode != SFM_RDWR || psf->filelength < 40)
+		{	psf->filelength = 0 ;
+			psf->datalength = 0 ;
+			psf->dataoffset = 0 ;
+			psf->sf.frames = 0 ;
+			} ;
+
+		psf->str_flags = SF_STR_ALLOW_START | SF_STR_ALLOW_END ;
+
+		if ((error = aiff_write_header (psf, SF_FALSE)))
+			return error ;
+
+		psf->write_header = aiff_write_header ;
+		} ;
+
+	psf->container_close = aiff_close ;
+	psf->command = aiff_command ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_U8 :
+				error = pcm_init (psf) ;
+				break ;
+
+		case SF_FORMAT_PCM_S8 :
+				error = pcm_init (psf) ;
+				break ;
+
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_24 :
+		case SF_FORMAT_PCM_32 :
+				error = pcm_init (psf) ;
+				break ;
+
+		case SF_FORMAT_ULAW :
+				error = ulaw_init (psf) ;
+				break ;
+
+		case SF_FORMAT_ALAW :
+				error = alaw_init (psf) ;
+				break ;
+
+		/* Lite remove start */
+		case SF_FORMAT_FLOAT :
+				error = float32_init (psf) ;
+				break ;
+
+		case SF_FORMAT_DOUBLE :
+				error = double64_init (psf) ;
+				break ;
+
+		case SF_FORMAT_DWVW_12 :
+				error = dwvw_init (psf, 12) ;
+				break ;
+
+		case SF_FORMAT_DWVW_16 :
+				error = dwvw_init (psf, 16) ;
+				break ;
+
+		case SF_FORMAT_DWVW_24 :
+				error = dwvw_init (psf, 24) ;
+				break ;
+
+		case SF_FORMAT_DWVW_N :
+				if (psf->file.mode != SFM_READ)
+				{	error = SFE_DWVW_BAD_BITWIDTH ;
+					break ;
+					} ;
+				if (comm_fmt.sampleSize >= 8 && comm_fmt.sampleSize < 24)
+				{	error = dwvw_init (psf, comm_fmt.sampleSize) ;
+					psf->sf.frames = comm_fmt.numSampleFrames ;
+					break ;
+					} ;
+				psf_log_printf (psf, "AIFC/DWVW : Bad bitwidth %d\n", comm_fmt.sampleSize) ;
+				error = SFE_DWVW_BAD_BITWIDTH ;
+				break ;
+
+		case SF_FORMAT_IMA_ADPCM :
+				/*
+				**	IMA ADPCM encoded AIFF files always have a block length
+				**	of 34 which decodes to 64 samples.
+				*/
+				error = aiff_ima_init (psf, AIFC_IMA4_BLOCK_LEN, AIFC_IMA4_SAMPLES_PER_BLOCK) ;
+				break ;
+		/* Lite remove end */
+
+		case SF_FORMAT_GSM610 :
+				error = gsm610_init (psf) ;
+				break ;
+
+		default : return SFE_UNIMPLEMENTED ;
+		} ;
+
+
+	return error ;
+} /* aiff_open */
+
+/*==========================================================================================
+** Private functions.
+*/
+
+/* This function ought to check size */
+static unsigned int
+marker_to_position (const MARK_ID_POS *m, unsigned short n, int marksize)
+{	int i ;
+
+    for (i = 0 ; i < marksize ; i++)
+		if (m [i].markerID == n)
+			return m [i].position ;
+    return 0 ;
+} /* marker_to_position */
+
+static int
+aiff_read_header (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
+{	SSND_CHUNK	ssnd_fmt ;
+	AIFF_PRIVATE *paiff ;
+	unsigned	marker, dword, FORMsize, SSNDsize, bytesread ;
+	int			k, found_chunk = 0, done = 0, error = 0 ;
+	char		*cptr ;
+	int			instr_found = 0, mark_found = 0, mark_count = 0 ;
+
+	if (psf->filelength > SF_PLATFORM_S64 (0xffffffff))
+		psf_log_printf (psf, "Warning : filelength > 0xffffffff. This is bad!!!!\n") ;
+
+	if ((paiff = psf->container_data) == NULL)
+		return SFE_INTERNAL ;
+
+	paiff->comm_offset = 0 ;
+	paiff->ssnd_offset = 0 ;
+
+	/* Set position to start of file to begin reading header. */
+	psf_binheader_readf (psf, "p", 0) ;
+
+	memset (comm_fmt, 0, sizeof (COMM_CHUNK)) ;
+
+	/* 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 have a FORM chunk. Approach here is to read all the chunks one by
+	**	one and then check for the mandatory chunks at the end.
+	*/
+	while (! done)
+	{	psf_binheader_readf (psf, "m", &marker) ;
+
+		if (psf->file.mode == SFM_RDWR && (found_chunk & HAVE_SSND))
+			return SFE_AIFF_RW_SSND_NOT_LAST ;
+
+		switch (marker)
+		{	case FORM_MARKER :
+					if (found_chunk)
+						return SFE_AIFF_NO_FORM ;
+
+					psf_binheader_readf (psf, "E4", &FORMsize) ;
+					pchk4_store (&paiff->chunk4, marker, psf->headindex - 8, FORMsize) ;
+
+					if (psf->fileoffset > 0 && psf->filelength > FORMsize + 8)
+					{	/* Set file length. */
+						psf->filelength = FORMsize + 8 ;
+						psf_log_printf (psf, "FORM : %u\n", FORMsize) ;
+						}
+					else if (FORMsize != psf->filelength - 2 * SIGNED_SIZEOF (dword))
+					{	dword = psf->filelength - 2 * sizeof (dword) ;
+						psf_log_printf (psf, "FORM : %u (should be %u)\n", FORMsize, dword) ;
+						FORMsize = dword ;
+						}
+					else
+						psf_log_printf (psf, "FORM : %u\n", FORMsize) ;
+					found_chunk |= HAVE_FORM ;
+					break ;
+
+			case AIFC_MARKER :
+			case AIFF_MARKER :
+					if ((found_chunk & HAVE_FORM) == 0)
+						return SFE_AIFF_AIFF_NO_FORM ;
+					psf_log_printf (psf, " %M\n", marker) ;
+					found_chunk |= (marker == AIFC_MARKER) ? (HAVE_AIFC | HAVE_AIFF) : HAVE_AIFF ;
+					break ;
+
+			case COMM_MARKER :
+					paiff->comm_offset = psf_ftell (psf) - 4 ;
+					error = aiff_read_comm_chunk (psf, comm_fmt) ;
+					pchk4_store (&paiff->chunk4, marker, paiff->comm_offset, comm_fmt->size) ;
+
+
+					psf->sf.samplerate = tenbytefloat2int (comm_fmt->sampleRate) ;
+					psf->sf.frames = comm_fmt->numSampleFrames ;
+					psf->sf.channels = comm_fmt->numChannels ;
+					psf->bytewidth = BITWIDTH2BYTES (comm_fmt->sampleSize) ;
+
+					if (error)
+						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, "E4", &dword) ;
+					pchk4_store (&paiff->chunk4, marker, psf->headindex - 8, dword) ;
+
+					psf_log_printf (psf, "%M : %d\n", marker, dword) ;
+					if (dword != AIFF_PEAK_CHUNK_SIZE (psf->sf.channels))
+					{	psf_binheader_readf (psf, "j", dword) ;
+						psf_log_printf (psf, "*** File PEAK chunk too big.\n") ;
+						return SFE_WAV_BAD_PEAK ;
+						} ;
+
+					if ((psf->peak_info = peak_info_calloc (psf->sf.channels)) == NULL)
+						return SFE_MALLOC_FAILED ;
+
+					/* read in rest of PEAK chunk. */
+					psf_binheader_readf (psf, "E44", &(psf->peak_info->version), &(psf->peak_info->timestamp)) ;
+
+					if (psf->peak_info->version != 1)
+						psf_log_printf (psf, "  version    : %d *** (should be version 1)\n", psf->peak_info->version) ;
+					else
+						psf_log_printf (psf, "  version    : %d\n", psf->peak_info->version) ;
+
+					psf_log_printf (psf, "  time stamp : %d\n", psf->peak_info->timestamp) ;
+					psf_log_printf (psf, "    Ch   Position       Value\n") ;
+
+					cptr = psf->u.cbuf ;
+					for (dword = 0 ; dword < (unsigned) psf->sf.channels ; dword++)
+					{	float value ;
+						unsigned int position ;
+
+						psf_binheader_readf (psf, "Ef4", &value, &position) ;
+						psf->peak_info->peaks [dword].value = value ;
+						psf->peak_info->peaks [dword].position = position ;
+
+						snprintf (cptr, sizeof (psf->u.scbuf), "    %2d   %-12" PRId64 "   %g\n",
+								dword, psf->peak_info->peaks [dword].position, psf->peak_info->peaks [dword].value) ;
+						cptr [sizeof (psf->u.scbuf) - 1] = 0 ;
+						psf_log_printf (psf, "%s", cptr) ;
+						} ;
+
+					psf->peak_info->peak_loc = ((found_chunk & HAVE_SSND) == 0) ? SF_PEAK_START : SF_PEAK_END ;
+					break ;
+
+			case SSND_MARKER :
+					if ((found_chunk & HAVE_AIFC) && (found_chunk & HAVE_FVER) == 0)
+						psf_log_printf (psf, "*** Valid AIFC files should have an FVER chunk.\n") ;
+
+					paiff->ssnd_offset = psf_ftell (psf) - 4 ;
+					psf_binheader_readf (psf, "E444", &SSNDsize, &(ssnd_fmt.offset), &(ssnd_fmt.blocksize)) ;
+					pchk4_store (&paiff->chunk4, marker, paiff->ssnd_offset, SSNDsize) ;
+
+					psf->datalength = SSNDsize - sizeof (ssnd_fmt) ;
+					psf->dataoffset = psf_ftell (psf) ;
+
+					if (psf->datalength > psf->filelength - psf->dataoffset || psf->datalength < 0)
+					{	psf_log_printf (psf, " SSND : %u (should be %D)\n", SSNDsize, psf->filelength - psf->dataoffset + sizeof (SSND_CHUNK)) ;
+						psf->datalength = psf->filelength - psf->dataoffset ;
+						}
+					else
+						psf_log_printf (psf, " SSND : %u\n", SSNDsize) ;
+
+					if (ssnd_fmt.offset == 0 || psf->dataoffset + ssnd_fmt.offset == ssnd_fmt.blocksize)
+					{	psf_log_printf (psf, "  Offset     : %u\n", ssnd_fmt.offset) ;
+						psf_log_printf (psf, "  Block Size : %u\n", ssnd_fmt.blocksize) ;
+
+						psf->dataoffset += ssnd_fmt.offset ;
+						psf->datalength -= ssnd_fmt.offset ;
+						}
+					else
+					{	psf_log_printf (psf, "  Offset     : %u\n", ssnd_fmt.offset) ;
+						psf_log_printf (psf, "  Block Size : %u ???\n", ssnd_fmt.blocksize) ;
+						psf->dataoffset += ssnd_fmt.offset ;
+						psf->datalength -= ssnd_fmt.offset ;
+						} ;
+
+					/* Only set dataend if there really is data at the end. */
+					if (psf->datalength + psf->dataoffset < psf->filelength)
+						psf->dataend = psf->datalength + psf->dataoffset ;
+
+					found_chunk |= HAVE_SSND ;
+
+					if (! psf->sf.seekable)
+						break ;
+
+					/* Seek to end of SSND chunk. */
+					psf_fseek (psf, psf->dataoffset + psf->datalength + (SSNDsize & 1), SEEK_SET) ;
+					break ;
+
+			case c_MARKER :
+					psf_binheader_readf (psf, "E4", &dword) ;
+					pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
+					if (dword == 0)
+						break ;
+					if (dword >= SIGNED_SIZEOF (psf->u.scbuf))
+					{	psf_log_printf (psf, " %M : %d (too big)\n", marker, dword) ;
+						return SFE_INTERNAL ;
+						} ;
+
+					cptr = psf->u.cbuf ;
+					psf_binheader_readf (psf, "b", cptr, dword + (dword & 1)) ;
+					cptr [dword] = 0 ;
+
+					psf_sanitize_string (cptr, dword) ;
+
+					psf_log_printf (psf, " %M : %s\n", marker, cptr) ;
+					psf_store_string (psf, SF_STR_COPYRIGHT, cptr) ;
+					break ;
+
+			case AUTH_MARKER :
+					psf_binheader_readf (psf, "E4", &dword) ;
+					pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
+					if (dword == 0)
+						break ;
+					if (dword >= SIGNED_SIZEOF (psf->u.scbuf) - 1)
+					{	psf_log_printf (psf, " %M : %d (too big)\n", marker, dword) ;
+						return SFE_INTERNAL ;
+						} ;
+
+					cptr = psf->u.cbuf ;
+					psf_binheader_readf (psf, "b", cptr, dword + (dword & 1)) ;
+					cptr [dword] = 0 ;
+					psf_log_printf (psf, " %M : %s\n", marker, cptr) ;
+					psf_store_string (psf, SF_STR_ARTIST, cptr) ;
+					break ;
+
+			case COMT_MARKER :
+				{	unsigned short count, id, len ;
+					unsigned int timestamp ;
+
+					psf_binheader_readf (psf, "E42", &dword, &count) ;
+					pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
+					psf_log_printf (psf, " %M : %d\n  count  : %d\n", marker, dword, count) ;
+					dword += (dword & 1) ;
+					if (dword == 0)
+						break ;
+					dword -= 2 ;
+
+					for (k = 0 ; k < count ; k++)
+					{	dword -= psf_binheader_readf (psf, "E422", &timestamp, &id, &len) ;
+						psf_log_printf (psf, "   time   : 0x%x\n   marker : %x\n   length : %d\n", timestamp, id, len) ;
+
+						if (len + 1 > SIGNED_SIZEOF (psf->u.scbuf))
+						{	psf_log_printf (psf, "\nError : string length (%d) too big.\n", len) ;
+							return SFE_INTERNAL ;
+							} ;
+
+						cptr = psf->u.cbuf ;
+						dword -= psf_binheader_readf (psf, "b", cptr, len) ;
+						cptr [len] = 0 ;
+						psf_log_printf (psf, "   string : %s\n", cptr) ;
+						} ;
+
+					if (dword > 0)
+						psf_binheader_readf (psf, "j", dword) ;
+					} ;
+					break ;
+
+			case APPL_MARKER :
+				{	unsigned appl_marker ;
+
+					psf_binheader_readf (psf, "E4", &dword) ;
+					pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
+					if (dword == 0)
+						break ;
+					if (dword >= SIGNED_SIZEOF (psf->u.scbuf) - 1)
+					{	psf_log_printf (psf, " %M : %d (too big, skipping)\n", marker, dword) ;
+						psf_binheader_readf (psf, "j", dword + (dword & 1)) ;
+						break ;
+						} ;
+
+					if (dword < 4)
+					{	psf_log_printf (psf, " %M : %d (too small, skipping)\n", marker, dword) ;
+						psf_binheader_readf (psf, "j", dword + (dword & 1)) ;
+						break ;
+						} ;
+
+					cptr = psf->u.cbuf ;
+					psf_binheader_readf (psf, "mb", &appl_marker, cptr, dword + (dword & 1) - 4) ;
+					cptr [dword] = 0 ;
+
+					for (k = 0 ; k < (int) dword ; k++)
+						if (! psf_isprint (cptr [k]))
+						{	cptr [k] = 0 ;
+							break ;
+							} ;
+
+					psf_log_printf (psf, " %M : %d\n  AppSig : %M\n  Name   : %s\n", marker, dword, appl_marker, cptr) ;
+					psf_store_string (psf, SF_STR_SOFTWARE, cptr) ;
+					} ;
+					break ;
+
+			case NAME_MARKER :
+					psf_binheader_readf (psf, "E4", &dword) ;
+					pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
+					if (dword == 0)
+						break ;
+					if (dword >= SIGNED_SIZEOF (psf->u.scbuf) - 2)
+					{	psf_log_printf (psf, " %M : %d (too big)\n", marker, dword) ;
+						return SFE_INTERNAL ;
+						} ;
+
+					cptr = psf->u.cbuf ;
+					psf_binheader_readf (psf, "b", cptr, dword + (dword & 1)) ;
+					cptr [dword] = 0 ;
+					psf_log_printf (psf, " %M : %s\n", marker, cptr) ;
+					psf_store_string (psf, SF_STR_TITLE, cptr) ;
+					break ;
+
+			case ANNO_MARKER :
+					psf_binheader_readf (psf, "E4", &dword) ;
+					pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
+					if (dword == 0)
+						break ;
+					if (dword >= SIGNED_SIZEOF (psf->u.scbuf) - 2)
+					{	psf_log_printf (psf, " %M : %d (too big)\n", marker, dword) ;
+						return SFE_INTERNAL ;
+						} ;
+
+					cptr = psf->u.cbuf ;
+					psf_binheader_readf (psf, "b", cptr, dword + (dword & 1)) ;
+					cptr [dword] = 0 ;
+					psf_log_printf (psf, " %M : %s\n", marker, cptr) ;
+					psf_store_string (psf, SF_STR_COMMENT, cptr) ;
+					break ;
+
+			case INST_MARKER :
+					psf_binheader_readf (psf, "E4", &dword) ;
+					pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
+					if (dword != SIZEOF_INST_CHUNK)
+					{	psf_log_printf (psf, " %M : %d (should be %d)\n", marker, dword, SIZEOF_INST_CHUNK) ;
+						psf_binheader_readf (psf, "j", dword) ;
+						break ;
+						} ;
+					psf_log_printf (psf, " %M : %d\n", marker, dword) ;
+					{	unsigned char bytes [6] ;
+						short gain ;
+
+						if (psf->instrument == NULL && (psf->instrument = psf_instrument_alloc ()) == NULL)
+							return SFE_MALLOC_FAILED ;
+
+						psf_binheader_readf (psf, "b", bytes, 6) ;
+						psf_log_printf (psf, "  Base Note : %u\n  Detune    : %u\n"
+											"  Low  Note : %u\n  High Note : %u\n"
+											"  Low  Vel. : %u\n  High Vel. : %u\n",
+											bytes [0], bytes [1], bytes [2], bytes [3], bytes [4], bytes [5]) ;
+						psf->instrument->basenote = bytes [0] ;
+						psf->instrument->detune = bytes [1] ;
+						psf->instrument->key_lo = bytes [2] ;
+						psf->instrument->key_hi = bytes [3] ;
+						psf->instrument->velocity_lo = bytes [4] ;
+						psf->instrument->velocity_hi = bytes [5] ;
+						psf_binheader_readf (psf, "E2", &gain) ;
+						psf->instrument->gain = gain ;
+						psf_log_printf (psf, "  Gain (dB) : %d\n", gain) ;
+						} ;
+					{	short	mode ; /* 0 - no loop, 1 - forward looping, 2 - backward looping */
+						const char	*loop_mode ;
+						unsigned short begin, end ;
+
+						psf_binheader_readf (psf, "E222", &mode, &begin, &end) ;
+						loop_mode = get_loop_mode_str (mode) ;
+						mode = get_loop_mode (mode) ;
+						if (mode == SF_LOOP_NONE)
+						{	psf->instrument->loop_count = 0 ;
+							psf->instrument->loops [0].mode = SF_LOOP_NONE ;
+							}
+						else
+						{	psf->instrument->loop_count = 1 ;
+							psf->instrument->loops [0].mode = SF_LOOP_FORWARD ;
+							psf->instrument->loops [0].start = begin ;
+							psf->instrument->loops [0].end = end ;
+							psf->instrument->loops [0].count = 0 ;
+							} ;
+						psf_log_printf (psf, "  Sustain\n   mode  : %d => %s\n   begin : %u\n   end   : %u\n",
+											mode, loop_mode, begin, end) ;
+						psf_binheader_readf (psf, "E222", &mode, &begin, &end) ;
+						loop_mode = get_loop_mode_str (mode) ;
+						mode = get_loop_mode (mode) ;
+						if (mode == SF_LOOP_NONE)
+							psf->instrument->loops [1].mode = SF_LOOP_NONE ;
+						else
+						{	psf->instrument->loop_count += 1 ;
+							psf->instrument->loops [1].mode = SF_LOOP_FORWARD ;
+							psf->instrument->loops [1].start = begin ;
+							psf->instrument->loops [1].end = end ;
+							psf->instrument->loops [1].count = 0 ;
+							} ;
+						psf_log_printf (psf, "  Release\n   mode  : %d => %s\n   begin : %u\n   end   : %u\n",
+										mode, loop_mode, begin, end) ;
+						} ;
+					instr_found++ ;
+					break ;
+
+			case basc_MARKER :
+					psf_binheader_readf (psf, "E4", &dword) ;
+					pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
+					psf_log_printf (psf, " basc : %u\n", dword) ;
+
+					if ((error = aiff_read_basc_chunk (psf, dword)))
+						return error ;
+					break ;
+
+			case MARK_MARKER :
+					psf_binheader_readf (psf, "E4", &dword) ;
+					pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
+					psf_log_printf (psf, " %M : %d\n", marker, dword) ;
+					{	unsigned short mark_id, n = 0 ;
+						unsigned int position ;
+
+						bytesread = psf_binheader_readf (psf, "E2", &n) ;
+						mark_count = n ;
+						psf_log_printf (psf, "  Count : %d\n", mark_count) ;
+						if (paiff->markstr != NULL)
+						{	psf_log_printf (psf, "*** Second MARK chunk found. Throwing away the first.\n") ;
+							free (paiff->markstr) ;
+							} ;
+						paiff->markstr = calloc (mark_count, sizeof (MARK_ID_POS)) ;
+						if (paiff->markstr == NULL)
+							return SFE_MALLOC_FAILED ;
+
+						for (n = 0 ; n < mark_count && bytesread < dword ; n++)
+						{	unsigned int pstr_len ;
+							unsigned char ch ;
+
+							bytesread += psf_binheader_readf (psf, "E241", &mark_id, &position, &ch) ;
+							psf_log_printf (psf, "   Mark ID  : %u\n   Position : %u\n", mark_id, position) ;
+
+							pstr_len = (ch & 1) ? ch : ch + 1 ;
+
+							if (pstr_len < sizeof (psf->u.scbuf) - 1)
+							{	bytesread += psf_binheader_readf (psf, "b", psf->u.scbuf, pstr_len) ;
+								psf->u.scbuf [pstr_len] = 0 ;
+								}
+							else
+							{	unsigned int read_len = pstr_len - (sizeof (psf->u.scbuf) - 1) ;
+								bytesread += psf_binheader_readf (psf, "bj", psf->u.scbuf, read_len, pstr_len - read_len) ;
+								psf->u.scbuf [sizeof (psf->u.scbuf) - 1] = 0 ;
+								}
+
+							psf_log_printf (psf, "   Name     : %s\n", psf->u.scbuf) ;
+
+							paiff->markstr [n].markerID = mark_id ;
+							paiff->markstr [n].position = position ;
+							/*
+							**	TODO if psf->u.scbuf is equal to
+							**	either Beg_loop, Beg loop or beg loop and spam
+							**	if (psf->instrument == NULL && (psf->instrument = psf_instrument_alloc ()) == NULL)
+							**		return SFE_MALLOC_FAILED ;
+							*/
+							} ;
+						} ;
+					mark_found++ ;
+					psf_binheader_readf (psf, "j", dword - bytesread) ;
+					break ;
+
+			case FVER_MARKER :
+					found_chunk |= HAVE_FVER ;
+					/* Fall through to next case. */
+
+			case SFX_MARKER :
+					psf_binheader_readf (psf, "E4", &dword) ;
+					pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
+					psf_log_printf (psf, " %M : %d\n", marker, dword) ;
+
+					psf_binheader_readf (psf, "j", dword) ;
+					break ;
+
+			case NONE_MARKER :
+					/* Fix for broken AIFC files with incorrect COMM chunk length. */
+					{	unsigned char byte ;
+						psf_binheader_readf (psf, "1", &byte) ;
+						dword = byte ;
+						psf_binheader_readf (psf, "j", dword) ;
+					}
+					break ;
+
+			case CHAN_MARKER :
+					psf_binheader_readf (psf, "E4", &dword) ;
+					pchk4_store (&paiff->chunk4, marker, psf_ftell (psf) - 8, dword) ;
+
+					if (dword < 12)
+					{	psf_log_printf (psf, " %M : %d (should be >= 12)\n", marker, dword) ;
+						psf_binheader_readf (psf, "j", dword) ;
+						break ;
+						}
+
+					psf_log_printf (psf, " %M : %d\n", marker, dword) ;
+
+					if ((error = aiff_read_chanmap (psf, dword)))
+						return error ;
+					break ;
+
+			default :
+					if (psf_isprint ((marker >> 24) & 0xFF) && psf_isprint ((marker >> 16) & 0xFF)
+						&& psf_isprint ((marker >> 8) & 0xFF) && psf_isprint (marker & 0xFF))
+					{	psf_binheader_readf (psf, "E4", &dword) ;
+						psf_log_printf (psf, " %M : %d (unknown marker)\n", marker, dword) ;
+
+						psf_binheader_readf (psf, "j", dword) ;
+						break ;
+						} ;
+					if ((dword = psf_ftell (psf)) & 0x03)
+					{	psf_log_printf (psf, "  Unknown chunk marker %X at position %d. Resyncing.\n", marker, dword - 4) ;
+
+						psf_binheader_readf (psf, "j", -3) ;
+						break ;
+						} ;
+					psf_log_printf (psf, "*** Unknown chunk marker %X at position %D. Exiting parser.\n", marker, psf_ftell (psf)) ;
+					done = 1 ;
+					break ;
+			} ;	/* switch (marker) */
+
+		if ((! psf->sf.seekable) && (found_chunk & HAVE_SSND))
+			break ;
+
+		if (psf_ftell (psf) >= psf->filelength - (2 * SIGNED_SIZEOF (dword)))
+			break ;
+		} ; /* while (1) */
+
+	if (instr_found && mark_found)
+	{	int j ;
+
+		for (j = 0 ; j<psf->instrument->loop_count ; j ++)
+		{	if (j < ARRAY_LEN (psf->instrument->loops))
+			{	psf->instrument->loops [j].start = marker_to_position (paiff->markstr, psf->instrument->loops [j].start, mark_count) ;
+				psf->instrument->loops [j].end = marker_to_position (paiff->markstr, psf->instrument->loops [j].end, mark_count) ;
+				psf->instrument->loops [j].mode = SF_LOOP_FORWARD ;
+				} ;
+  			} ;
+		} ;
+
+	if (! (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 ;
+
+	return 0 ;
+} /* aiff_read_header */
+
+static int
+aiff_close (SF_PRIVATE *psf)
+{	AIFF_PRIVATE *paiff = psf->container_data ;
+
+	if (paiff != NULL && paiff->markstr != NULL)
+	{	free (paiff->markstr) ;
+		paiff->markstr = NULL ;
+		} ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	aiff_write_tailer (psf) ;
+		aiff_write_header (psf, SF_TRUE) ;
+		} ;
+
+	return 0 ;
+} /* aiff_close */
+
+static int
+aiff_read_comm_chunk (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
+{	int error = 0, bytesread, subformat ;
+
+	psf->u.scbuf [0] = 0 ;
+
+	bytesread = psf_binheader_readf (psf, "E4", &(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.
+	*/
+	comm_fmt->size += comm_fmt->size & 1 ;
+
+	bytesread +=
+	psf_binheader_readf (psf, "E242b", &(comm_fmt->numChannels), &(comm_fmt->numSampleFrames),
+			&(comm_fmt->sampleSize), &(comm_fmt->sampleRate), SIGNED_SIZEOF (comm_fmt->sampleRate)) ;
+
+	if (comm_fmt->size > 0x10000 && (comm_fmt->size & 0xffff) == 0)
+	{	psf_log_printf (psf, " COMM : %d (0x%x) *** should be ", comm_fmt->size, comm_fmt->size) ;
+		comm_fmt->size = ENDSWAP_INT (comm_fmt->size) ;
+		psf_log_printf (psf, "%d (0x%x)\n", comm_fmt->size, comm_fmt->size) ;
+		}
+	else
+		psf_log_printf (psf, " COMM : %d\n", comm_fmt->size) ;
+
+	if (comm_fmt->size == SIZEOF_AIFF_COMM)
+		comm_fmt->encoding = NONE_MARKER ;
+	else if (comm_fmt->size == SIZEOF_AIFC_COMM_MIN)
+		bytesread += psf_binheader_readf (psf, "Em", &(comm_fmt->encoding)) ;
+	else if (comm_fmt->size >= SIZEOF_AIFC_COMM)
+	{	unsigned char encoding_len ;
+		unsigned read_len ;
+
+		bytesread += psf_binheader_readf (psf, "Em1", &(comm_fmt->encoding), &encoding_len) ;
+
+		comm_fmt->size = SF_MIN (sizeof (psf->u.scbuf), make_size_t (comm_fmt->size)) ;
+		memset (psf->u.scbuf, 0, comm_fmt->size) ;
+		read_len = comm_fmt->size - SIZEOF_AIFC_COMM + 1 ;
+		bytesread += psf_binheader_readf (psf, "b", psf->u.scbuf, read_len) ;
+		psf->u.scbuf [read_len + 1] = 0 ;
+		} ;
+
+	psf_log_printf (psf, "  Sample Rate : %d\n", tenbytefloat2int (comm_fmt->sampleRate)) ;
+	psf_log_printf (psf, "  Frames      : %u%s\n", comm_fmt->numSampleFrames, (comm_fmt->numSampleFrames == 0 && psf->filelength > 104) ? " (Should not be 0)" : "") ;
+	psf_log_printf (psf, "  Channels    : %d\n", comm_fmt->numChannels) ;
+
+	/* 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 if ((comm_fmt->encoding == fl64_MARKER || comm_fmt->encoding == FL64_MARKER) && comm_fmt->sampleSize != 64)
+	{	psf_log_printf (psf, "  Sample Size : %d (should be 64)\n", comm_fmt->sampleSize) ;
+		comm_fmt->sampleSize = 64 ;
+		}
+	else
+		psf_log_printf (psf, "  Sample Size : %d\n", comm_fmt->sampleSize) ;
+
+	subformat = s_bitwidth_to_subformat (comm_fmt->sampleSize) ;
+
+	psf->endian = SF_ENDIAN_BIG ;
+
+	switch (comm_fmt->encoding)
+	{	case NONE_MARKER :
+				psf->sf.format = (SF_FORMAT_AIFF | subformat) ;
+				break ;
+
+		case twos_MARKER :
+		case in24_MARKER :
+		case in32_MARKER :
+				psf->sf.format = (SF_ENDIAN_BIG | SF_FORMAT_AIFF | subformat) ;
+				break ;
+
+		case sowt_MARKER :
+		case ni24_MARKER :
+		case ni32_MARKER :
+				psf->endian = SF_ENDIAN_LITTLE ;
+				psf->sf.format = (SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | subformat) ;
+				break ;
+
+		case fl32_MARKER :
+		case FL32_MARKER :
+				psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_FLOAT) ;
+				break ;
+
+		case ulaw_MARKER :
+		case ULAW_MARKER :
+				psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_ULAW) ;
+				break ;
+
+		case alaw_MARKER :
+		case ALAW_MARKER :
+				psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_ALAW) ;
+				break ;
+
+		case fl64_MARKER :
+		case FL64_MARKER :
+				psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_DOUBLE) ;
+				break ;
+
+		case raw_MARKER :
+				psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_PCM_U8) ;
+				break ;
+
+		case DWVW_MARKER :
+				psf->sf.format = SF_FORMAT_AIFF ;
+				switch (comm_fmt->sampleSize)
+				{	case 12 :
+						psf->sf.format |= SF_FORMAT_DWVW_12 ;
+						break ;
+					case 16 :
+						psf->sf.format |= SF_FORMAT_DWVW_16 ;
+						break ;
+					case 24 :
+						psf->sf.format |= SF_FORMAT_DWVW_24 ;
+						break ;
+
+					default :
+						psf->sf.format |= SF_FORMAT_DWVW_N ;
+						break ;
+					} ;
+				break ;
+
+		case GSM_MARKER :
+				psf->sf.format = SF_FORMAT_AIFF ;
+				psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_GSM610) ;
+				break ;
+
+
+		case ima4_MARKER :
+				psf->endian = SF_ENDIAN_BIG ;
+				psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_IMA_ADPCM) ;
+				break ;
+
+		default :
+			psf_log_printf (psf, "AIFC : Unimplemented format : %M\n", comm_fmt->encoding) ;
+			error = SFE_UNIMPLEMENTED ;
+		} ;
+
+	if (! psf->u.scbuf [0])
+		psf_log_printf (psf, "  Encoding    : %M\n", comm_fmt->encoding) ;
+	else
+		psf_log_printf (psf, "  Encoding    : %M => %s\n", comm_fmt->encoding, psf->u.scbuf) ;
+
+	return error ;
+} /* aiff_read_comm_chunk */
+
+
+/*==========================================================================================
+*/
+
+static int
+aiff_rewrite_header (SF_PRIVATE *psf, AIFF_PRIVATE * paiff)
+{
+	/* Assuming here that the header has already been written and just
+	** needs to be corrected for new data length. That means that we
+	** only change the length fields of the FORM and SSND chunks ;
+	** everything else can be skipped over.
+	*/
+	int k, ch ;
+	int comm_size, comm_frames ;
+
+	psf_fseek (psf, 0, SEEK_SET) ;
+	psf_fread (psf->header, psf->dataoffset, 1, psf) ;
+
+	psf->headindex = 0 ;
+
+	for (k = 0 ; k < paiff->chunk4.count ; k++)
+	{	switch (paiff->chunk4.l [k].chunk)
+		{	case FORM_MARKER :
+				psf_binheader_writef (psf, "Etm8", FORM_MARKER, psf->filelength - 8) ;
+				break ;
+
+			case COMM_MARKER :
+				psf->headindex = paiff->chunk4.l [k].offset ;
+				comm_frames = psf->sf.frames ;
+				comm_size = paiff->chunk4.l [k].len ;
+				psf_binheader_writef (psf, "Em42t4", COMM_MARKER, comm_size, psf->sf.channels, comm_frames) ;
+				break ;
+
+			case SSND_MARKER :
+				psf->headindex = paiff->chunk4.l [k].offset ;
+				psf_binheader_writef (psf, "Etm8", SSND_MARKER, psf->datalength + SIZEOF_SSND_CHUNK) ;
+				break ;
+
+			case PEAK_MARKER :
+				psf->headindex = paiff->chunk4.l [k].offset ;
+				psf_binheader_writef (psf, "Em4", PEAK_MARKER, AIFF_PEAK_CHUNK_SIZE (psf->sf.channels)) ;
+				psf_binheader_writef (psf, "E44", 1, time (NULL)) ;
+				for (ch = 0 ; ch < psf->sf.channels ; ch++)
+					psf_binheader_writef (psf, "Eft8", (float) psf->peak_info->peaks [ch].value, psf->peak_info->peaks [ch].position) ;
+				break ;
+
+			default :
+				/* There are a whole bunch of chunks we should just ignore. */
+				break ;
+			} ;
+		} ;
+
+	/* Header mangling complete so write it out. */
+	psf_fseek (psf, 0, SEEK_SET) ;
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+
+	return 0 ;
+} /* aiff_rewrite_header */
+
+static int
+aiff_write_header (SF_PRIVATE *psf, int calc_length)
+{	sf_count_t		current ;
+	AIFF_PRIVATE	*paiff ;
+	unsigned char	comm_sample_rate [10], comm_zero_bytes [2] = { 0, 0 } ;
+	unsigned int	comm_type, comm_size, comm_encoding, comm_frames = 0 ;
+	int				k, endian, has_data = SF_FALSE ;
+	short			bit_width ;
+
+	if ((paiff = psf->container_data) == NULL)
+		return SFE_INTERNAL ;
+
+	current = psf_ftell (psf) ;
+
+	if (current > psf->dataoffset)
+		has_data = SF_TRUE ;
+
+	if (calc_length)
+	{	psf->filelength = psf_get_filelen (psf) ;
+
+		psf->datalength = psf->filelength - psf->dataoffset ;
+		if (psf->dataend)
+			psf->datalength -= psf->filelength - psf->dataend ;
+
+		if (psf->bytewidth > 0)
+			psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+		} ;
+
+	if (psf->file.mode == SFM_RDWR && psf->dataoffset > 0 && paiff->chunk4.count > 0)
+	{	int err = aiff_rewrite_header (psf, paiff) ;
+		if (current > 0)
+			psf_fseek (psf, current, SEEK_SET) ;
+		return err ;
+		} ;
+
+	endian = SF_ENDIAN (psf->sf.format) ;
+	if (CPU_IS_LITTLE_ENDIAN && endian == SF_ENDIAN_CPU)
+		endian = SF_ENDIAN_LITTLE ;
+
+	/* Standard value here. */
+	bit_width = psf->bytewidth * 8 ;
+	comm_frames = (psf->sf.frames > 0xFFFFFFFF) ? 0xFFFFFFFF : psf->sf.frames ;
+
+	switch (SF_CODEC (psf->sf.format) | endian)
+	{	case SF_FORMAT_PCM_S8 | SF_ENDIAN_BIG :
+			psf->endian = SF_ENDIAN_BIG ;
+			comm_type = AIFC_MARKER ;
+			comm_size = SIZEOF_AIFC_COMM ;
+			comm_encoding = twos_MARKER ;
+			break ;
+
+		case SF_FORMAT_PCM_S8 | SF_ENDIAN_LITTLE :
+			psf->endian = SF_ENDIAN_LITTLE ;
+			comm_type = AIFC_MARKER ;
+			comm_size = SIZEOF_AIFC_COMM ;
+			comm_encoding = sowt_MARKER ;
+			break ;
+
+		case SF_FORMAT_PCM_16 | SF_ENDIAN_BIG :
+			psf->endian = SF_ENDIAN_BIG ;
+			comm_type = AIFC_MARKER ;
+			comm_size = SIZEOF_AIFC_COMM ;
+			comm_encoding = twos_MARKER ;
+			break ;
+
+		case SF_FORMAT_PCM_16 | SF_ENDIAN_LITTLE :
+			psf->endian = SF_ENDIAN_LITTLE ;
+			comm_type = AIFC_MARKER ;
+			comm_size = SIZEOF_AIFC_COMM ;
+			comm_encoding = sowt_MARKER ;
+			break ;
+
+		case SF_FORMAT_PCM_24 | SF_ENDIAN_BIG :
+			psf->endian = SF_ENDIAN_BIG ;
+			comm_type = AIFC_MARKER ;
+			comm_size = SIZEOF_AIFC_COMM ;
+			comm_encoding = in24_MARKER ;
+			break ;
+
+		case SF_FORMAT_PCM_24 | SF_ENDIAN_LITTLE :
+			psf->endian = SF_ENDIAN_LITTLE ;
+			comm_type = AIFC_MARKER ;
+			comm_size = SIZEOF_AIFC_COMM ;
+			comm_encoding = ni24_MARKER ;
+			break ;
+
+		case SF_FORMAT_PCM_32 | SF_ENDIAN_BIG :
+			psf->endian = SF_ENDIAN_BIG ;
+			comm_type = AIFC_MARKER ;
+			comm_size = SIZEOF_AIFC_COMM ;
+			comm_encoding = in32_MARKER ;
+			break ;
+
+		case SF_FORMAT_PCM_32 | SF_ENDIAN_LITTLE :
+			psf->endian = SF_ENDIAN_LITTLE ;
+			comm_type = AIFC_MARKER ;
+			comm_size = SIZEOF_AIFC_COMM ;
+			comm_encoding = ni32_MARKER ;
+			break ;
+
+		case SF_FORMAT_PCM_S8 :			/* SF_ENDIAN_FILE */
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_24 :
+		case SF_FORMAT_PCM_32 :
+			psf->endian = SF_ENDIAN_BIG ;
+			comm_type = AIFF_MARKER ;
+			comm_size = SIZEOF_AIFF_COMM ;
+			comm_encoding = 0 ;
+			break ;
+
+		case SF_FORMAT_FLOAT :					/* Big endian floating point. */
+				psf->endian = SF_ENDIAN_BIG ;
+				comm_type = AIFC_MARKER ;
+				comm_size = SIZEOF_AIFC_COMM ;
+				comm_encoding = FL32_MARKER ;	/* Use 'FL32' because its easier to read. */
+				break ;
+
+		case SF_FORMAT_DOUBLE :					/* Big endian double precision floating point. */
+				psf->endian = SF_ENDIAN_BIG ;
+				comm_type = AIFC_MARKER ;
+				comm_size = SIZEOF_AIFC_COMM ;
+				comm_encoding = FL64_MARKER ;	/* Use 'FL64' because its easier to read. */
+				break ;
+
+		case SF_FORMAT_ULAW :
+				psf->endian = SF_ENDIAN_BIG ;
+				comm_type = AIFC_MARKER ;
+				comm_size = SIZEOF_AIFC_COMM ;
+				comm_encoding = ulaw_MARKER ;
+				break ;
+
+		case SF_FORMAT_ALAW :
+				psf->endian = SF_ENDIAN_BIG ;
+				comm_type = AIFC_MARKER ;
+				comm_size = SIZEOF_AIFC_COMM ;
+				comm_encoding = alaw_MARKER ;
+				break ;
+
+		case SF_FORMAT_PCM_U8 :
+				psf->endian = SF_ENDIAN_BIG ;
+				comm_type = AIFC_MARKER ;
+				comm_size = SIZEOF_AIFC_COMM ;
+				comm_encoding = raw_MARKER ;
+				break ;
+
+		case SF_FORMAT_DWVW_12 :
+				psf->endian = SF_ENDIAN_BIG ;
+				comm_type = AIFC_MARKER ;
+				comm_size = SIZEOF_AIFC_COMM ;
+				comm_encoding = DWVW_MARKER ;
+
+				/* Override standard value here.*/
+				bit_width = 12 ;
+				break ;
+
+		case SF_FORMAT_DWVW_16 :
+				psf->endian = SF_ENDIAN_BIG ;
+				comm_type = AIFC_MARKER ;
+				comm_size = SIZEOF_AIFC_COMM ;
+				comm_encoding = DWVW_MARKER ;
+
+				/* Override standard value here.*/
+				bit_width = 16 ;
+				break ;
+
+		case SF_FORMAT_DWVW_24 :
+				psf->endian = SF_ENDIAN_BIG ;
+				comm_type = AIFC_MARKER ;
+				comm_size = SIZEOF_AIFC_COMM ;
+				comm_encoding = DWVW_MARKER ;
+
+				/* Override standard value here.*/
+				bit_width = 24 ;
+				break ;
+
+		case SF_FORMAT_GSM610 :
+				psf->endian = SF_ENDIAN_BIG ;
+				comm_type = AIFC_MARKER ;
+				comm_size = SIZEOF_AIFC_COMM ;
+				comm_encoding = GSM_MARKER ;
+
+				/* Override standard value here.*/
+				bit_width = 16 ;
+				break ;
+
+		case SF_FORMAT_IMA_ADPCM :
+				psf->endian = SF_ENDIAN_BIG ;
+				comm_type = AIFC_MARKER ;
+				comm_size = SIZEOF_AIFC_COMM ;
+				comm_encoding = ima4_MARKER ;
+
+				/* Override standard value here.*/
+				bit_width = 16 ;
+				comm_frames = psf->sf.frames / AIFC_IMA4_SAMPLES_PER_BLOCK ;
+				break ;
+
+		default : return SFE_BAD_OPEN_FORMAT ;
+		} ;
+
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	psf_fseek (psf, 0, SEEK_SET) ;
+
+	psf_binheader_writef (psf, "Etm8", FORM_MARKER, psf->filelength - 8) ;
+
+	/* Write AIFF/AIFC marker and COM chunk. */
+	if (comm_type == AIFC_MARKER)
+		/* AIFC must have an FVER chunk. */
+		psf_binheader_writef (psf, "Emm44", comm_type, FVER_MARKER, 4, 0xA2805140) ;
+	else
+		psf_binheader_writef (psf, "Em", comm_type) ;
+
+	paiff->comm_offset = psf->headindex - 8 ;
+
+	memset (comm_sample_rate, 0, sizeof (comm_sample_rate)) ;
+	uint2tenbytefloat (psf->sf.samplerate, comm_sample_rate) ;
+
+	psf_binheader_writef (psf, "Em42t42", COMM_MARKER, comm_size, psf->sf.channels, comm_frames, bit_width) ;
+	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->channel_map && paiff->chanmap_tag)
+		psf_binheader_writef (psf, "Em4444", CHAN_MARKER, 12, paiff->chanmap_tag, 0, 0) ;
+
+	if (psf->instrument != NULL)
+	{	MARK_ID_POS	m [4] ;
+		INST_CHUNK ch ;
+		unsigned short ct = 0 ;
+
+		memset (m, 0, sizeof (m)) ;
+		memset (&ch, 0, sizeof (ch)) ;
+
+		ch.baseNote = psf->instrument->basenote ;
+		ch.detune = psf->instrument->detune ;
+		ch.lowNote = psf->instrument->key_lo ;
+		ch.highNote = psf->instrument->key_hi ;
+		ch.lowVelocity = psf->instrument->velocity_lo ;
+		ch.highVelocity = psf->instrument->velocity_hi ;
+		ch.gain = psf->instrument->gain ;
+		if (psf->instrument->loops [0].mode != SF_LOOP_NONE)
+		{	ch.sustain_loop.playMode = 1 ;
+			ch.sustain_loop.beginLoop = ct ;
+			m [0].markerID = ct++ ;
+			m [0].position = psf->instrument->loops [0].start ;
+			ch.sustain_loop.endLoop = ct ;
+			m [1].markerID = ct++ ;
+			m [1].position = psf->instrument->loops [0].end ;
+			} ;
+		if (psf->instrument->loops [1].mode != SF_LOOP_NONE)
+		{	ch.release_loop.playMode = 1 ;
+			ch.release_loop.beginLoop = ct ;
+			m [2].markerID = ct++ ;
+			m [2].position = psf->instrument->loops [1].start ;
+			ch.release_loop.endLoop = ct ;
+			m [3].markerID = ct++ ;
+			m [3].position = psf->instrument->loops [1].end ;
+			}
+		else
+		{	ch.release_loop.playMode = 0 ;
+			ch.release_loop.beginLoop = 0 ;
+			ch.release_loop.endLoop = 0 ;
+			} ;
+
+		psf_binheader_writef (psf, "Em4111111", INST_MARKER, SIZEOF_INST_CHUNK, ch.baseNote, ch.detune,
+						ch.lowNote, ch.highNote, ch.lowVelocity, ch.highVelocity) ;
+		psf_binheader_writef (psf, "2222222", ch.gain, ch.sustain_loop.playMode,
+						ch.sustain_loop.beginLoop, ch.sustain_loop.endLoop, ch.release_loop.playMode,
+						ch.release_loop.beginLoop, ch.release_loop.endLoop) ;
+
+		if (ct == 2)
+			psf_binheader_writef (psf, "Em42241b241b",
+					MARK_MARKER, 2 + 2 * (2 + 4 + 1 + 9), 2,
+					m [0].markerID, m [0].position, 8, "beg loop", make_size_t (9),
+					m [1].markerID, m [1].position, 8, "end loop", make_size_t (9)) ;
+		else if (ct == 4)
+			psf_binheader_writef (psf, "Em42 241b 241b 241b 241b",
+					MARK_MARKER, 2 + 4 * (2 + 4 + 1 + 9), 4,
+					m [0].markerID, m [0].position, 8, "beg loop", make_size_t (9),
+					m [1].markerID, m [1].position, 8, "end loop", make_size_t (9),
+					m [2].markerID, m [2].position, 8, "beg loop", make_size_t (9),
+					m [3].markerID, m [3].position, 8, "end loop", make_size_t (9)) ;
+		} ;
+
+	if (psf->str_flags & SF_STR_LOCATE_START)
+		aiff_write_strings (psf, SF_STR_LOCATE_START) ;
+
+	if (psf->peak_info != NULL && psf->peak_info->peak_loc == SF_PEAK_START)
+	{	psf_binheader_writef (psf, "Em4", PEAK_MARKER, AIFF_PEAK_CHUNK_SIZE (psf->sf.channels)) ;
+		psf_binheader_writef (psf, "E44", 1, time (NULL)) ;
+		for (k = 0 ; k < psf->sf.channels ; k++)
+			psf_binheader_writef (psf, "Eft8", (float) psf->peak_info->peaks [k].value, psf->peak_info->peaks [k].position) ;
+		} ;
+
+	/* Write SSND chunk. */
+	paiff->ssnd_offset = psf->headindex ;
+	psf_binheader_writef (psf, "Etm844", SSND_MARKER, psf->datalength + SIZEOF_SSND_CHUNK, 0, 0) ;
+
+	/* Header construction complete so write it out. */
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+
+	if (psf->error)
+		return psf->error ;
+
+	if (has_data && psf->dataoffset != psf->headindex)
+		return psf->error = SFE_INTERNAL ;
+
+	psf->dataoffset = psf->headindex ;
+
+	if (! has_data)
+		psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+	else if (current > 0)
+		psf_fseek (psf, current, SEEK_SET) ;
+
+	return psf->error ;
+} /* 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 ;
+
+	psf->dataend = psf_fseek (psf, 0, SEEK_END) ;
+
+	/* Make sure tailer data starts at even byte offset. Pad if necessary. */
+	if (psf->dataend % 2 == 1)
+	{	psf_fwrite (psf->header, 1, 1, psf) ;
+		psf->dataend ++ ;
+		} ;
+
+	if (psf->peak_info != NULL && psf->peak_info->peak_loc == SF_PEAK_END)
+	{	psf_binheader_writef (psf, "Em4", PEAK_MARKER, AIFF_PEAK_CHUNK_SIZE (psf->sf.channels)) ;
+		psf_binheader_writef (psf, "E44", 1, time (NULL)) ;
+		for (k = 0 ; k < psf->sf.channels ; k++)
+			psf_binheader_writef (psf, "Eft8", (float) psf->peak_info->peaks [k].value, psf->peak_info->peaks [k].position) ;
+		} ;
+
+	if (psf->str_flags & SF_STR_LOCATE_END)
+		aiff_write_strings (psf, SF_STR_LOCATE_END) ;
+
+	/* Write the tailer. */
+	if (psf->headindex > 0)
+		psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+
+	return 0 ;
+} /* aiff_write_tailer */
+
+static void
+aiff_write_strings (SF_PRIVATE *psf, int location)
+{	int	k, slen ;
+
+	for (k = 0 ; k < SF_MAX_STRINGS ; k++)
+	{	if (psf->strings [k].type == 0)
+			break ;
+
+		if (psf->strings [k].flags != location)
+			continue ;
+
+		switch (psf->strings [k].type)
+		{	case SF_STR_SOFTWARE :
+				slen = strlen (psf->strings [k].str) ;
+				psf_binheader_writef (psf, "Em4mb", APPL_MARKER, slen + 4, m3ga_MARKER, psf->strings [k].str, make_size_t (slen + (slen & 1))) ;
+				break ;
+
+			case SF_STR_TITLE :
+				psf_binheader_writef (psf, "EmS", NAME_MARKER, psf->strings [k].str) ;
+				break ;
+
+			case SF_STR_COPYRIGHT :
+				psf_binheader_writef (psf, "EmS", c_MARKER, psf->strings [k].str) ;
+				break ;
+
+			case SF_STR_ARTIST :
+				psf_binheader_writef (psf, "EmS", AUTH_MARKER, psf->strings [k].str) ;
+				break ;
+
+			case SF_STR_COMMENT :
+				psf_binheader_writef (psf, "EmS", ANNO_MARKER, psf->strings [k].str) ;
+				break ;
+
+			/*
+			case SF_STR_DATE :
+				psf_binheader_writef (psf, "Ems", ICRD_MARKER, psf->strings [k].str) ;
+				break ;
+			*/
+			} ;
+		} ;
+
+	return ;
+} /* aiff_write_strings */
+
+static int
+aiff_command (SF_PRIVATE * psf, int command, void * UNUSED (data), int UNUSED (datasize))
+{	AIFF_PRIVATE	*paiff ;
+
+	if ((paiff = psf->container_data) == NULL)
+		return SFE_INTERNAL ;
+
+	switch (command)
+	{	case SFC_SET_CHANNEL_MAP_INFO :
+			paiff->chanmap_tag = aiff_caf_find_channel_layout_tag (psf->channel_map, psf->sf.channels) ;
+			return (paiff->chanmap_tag != 0) ;
+
+		default :
+			break ;
+	} ;
+
+
+
+	return 0 ;
+} /* aiff_command */
+
+static const char*
+get_loop_mode_str (short mode)
+{	switch (mode)
+	{	case 0 : return "none" ;
+		case 1 : return "forward" ;
+		case 2 : return "backward" ;
+		} ;
+
+	return "*** unknown" ;
+} /* get_loop_mode_str */
+
+static short
+get_loop_mode (short mode)
+{	switch (mode)
+	{	case 0 : return SF_LOOP_NONE ;
+		case 1 : return SF_LOOP_FORWARD ;
+		case 2 : return SF_LOOP_BACKWARD ;
+		} ;
+
+	return SF_LOOP_NONE ;
+} /* get_loop_mode */
+
+/*==========================================================================================
+**	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
+**	should be OK as other sound file formats use a 32 bit integer to store sample
+**	rate.
+**	There is another (probably better) version in the source code to the SoX but it
+**	has a copyright which probably prevents it from being allowable as GPL/LGPL.
+*/
+
+static int
+tenbytefloat2int (unsigned char *bytes)
+{	int val = 3 ;
+
+	if (bytes [0] & 0x80)	/* Negative number. */
+		return 0 ;
+
+	if (bytes [0] <= 0x3F)	/* Less than 1. */
+		return 1 ;
+
+	if (bytes [0] > 0x40)	/* Way too big. */
+		return 0x4000000 ;
+
+	if (bytes [0] == 0x40 && bytes [1] > 0x1C) /* Too big. */
+		return 800000000 ;
+
+	/* Ok, can handle it. */
+
+	val = (bytes [2] << 23) | (bytes [3] << 15) | (bytes [4] << 7) | (bytes [5] >> 1) ;
+
+	val >>= (29 - bytes [1]) ;
+
+	return val ;
+} /* tenbytefloat2int */
+
+static void
+uint2tenbytefloat (unsigned int num, unsigned char *bytes)
+{	unsigned int mask = 0x40000000 ;
+	int	count ;
+
+	if (num <= 1)
+	{	bytes [0] = 0x3F ;
+		bytes [1] = 0xFF ;
+		bytes [2] = 0x80 ;
+		return ;
+		} ;
+
+	bytes [0] = 0x40 ;
+
+	if (num >= mask)
+	{	bytes [1] = 0x1D ;
+		return ;
+		} ;
+
+	for (count = 0 ; count <= 32 ; count ++)
+	{	if (num & mask)
+			break ;
+		mask >>= 1 ;
+		} ;
+
+	num <<= count + 1 ;
+	bytes [1] = 29 - count ;
+	bytes [2] = (num >> 24) & 0xFF ;
+	bytes [3] = (num >> 16) & 0xFF ;
+	bytes [4] = (num >> 8) & 0xFF ;
+	bytes [5] = num & 0xFF ;
+
+} /* uint2tenbytefloat */
+
+static int
+aiff_read_basc_chunk (SF_PRIVATE * psf, int datasize)
+{	const char * type_str ;
+	basc_CHUNK bc ;
+	int count ;
+
+	count = psf_binheader_readf (psf, "E442", &bc.version, &bc.numBeats, &bc.rootNote) ;
+	count += psf_binheader_readf (psf, "E222", &bc.scaleType, &bc.sigNumerator, &bc.sigDenominator) ;
+	count += psf_binheader_readf (psf, "E2j", &bc.loopType, datasize - sizeof (bc)) ;
+
+	psf_log_printf (psf, "  Version ? : %u\n  Num Beats : %u\n  Root Note : 0x%x\n",
+						bc.version, bc.numBeats, bc.rootNote) ;
+
+	switch (bc.scaleType)
+	{	case basc_SCALE_MINOR :
+				type_str = "MINOR" ;
+				break ;
+		case basc_SCALE_MAJOR :
+				type_str = "MAJOR" ;
+				break ;
+		case basc_SCALE_NEITHER :
+				type_str = "NEITHER" ;
+				break ;
+		case basc_SCALE_BOTH :
+				type_str = "BOTH" ;
+				break ;
+		default :
+				type_str = "!!WRONG!!" ;
+				break ;
+		} ;
+
+	psf_log_printf (psf, "  ScaleType : 0x%x (%s)\n", bc.scaleType, type_str) ;
+	psf_log_printf (psf, "  Time Sig  : %d/%d\n", bc.sigNumerator, bc.sigDenominator) ;
+
+	switch (bc.loopType)
+	{	case basc_TYPE_ONE_SHOT :
+				type_str = "One Shot" ;
+				break ;
+		case basc_TYPE_LOOP :
+				type_str = "Loop" ;
+				break ;
+		default:
+				type_str = "!!WRONG!!" ;
+				break ;
+		} ;
+
+	psf_log_printf (psf, "  Loop Type : 0x%x (%s)\n", bc.loopType, type_str) ;
+
+	if ((psf->loop_info = calloc (1, sizeof (SF_LOOP_INFO))) == NULL)
+		return SFE_MALLOC_FAILED ;
+
+	psf->loop_info->time_sig_num	= bc.sigNumerator ;
+	psf->loop_info->time_sig_den	= bc.sigDenominator ;
+	psf->loop_info->loop_mode		= (bc.loopType == basc_TYPE_ONE_SHOT) ? SF_LOOP_NONE : SF_LOOP_FORWARD ;
+	psf->loop_info->num_beats		= bc.numBeats ;
+
+	/* Can always be recalculated from other known fields. */
+	psf->loop_info->bpm = (1.0 / psf->sf.frames) * psf->sf.samplerate
+							* ((bc.numBeats * 4.0) / bc.sigDenominator) * 60.0 ;
+	psf->loop_info->root_key = bc.rootNote ;
+
+	if (count < datasize)
+		psf_binheader_readf (psf, "j", datasize - count) ;
+
+	return 0 ;
+} /* aiff_read_basc_chunk */
+
+
+static int
+aiff_read_chanmap (SF_PRIVATE * psf, unsigned dword)
+{	const AIFF_CAF_CHANNEL_MAP * map_info ;
+	unsigned channel_bitmap, channel_decriptions, bytesread ;
+	int layout_tag ;
+
+	bytesread = psf_binheader_readf (psf, "444", &layout_tag, &channel_bitmap, &channel_decriptions) ;
+
+	if ((map_info = aiff_caf_of_channel_layout_tag (layout_tag)) == NULL)
+		return 0 ;
+
+	psf_log_printf (psf, "  Tag    : %x\n", layout_tag) ;
+	if (map_info)
+		psf_log_printf (psf, "  Layout : %s\n", map_info->name) ;
+
+	if (bytesread < dword)
+		psf_binheader_readf (psf, "j", dword - bytesread) ;
+
+	if (map_info->channel_map != NULL)
+	{	size_t chanmap_size = psf->sf.channels * sizeof (psf->channel_map [0]) ;
+
+		free (psf->channel_map) ;
+
+		if ((psf->channel_map = malloc (chanmap_size)) == NULL)
+			return SFE_MALLOC_FAILED ;
+
+		memcpy (psf->channel_map, map_info->channel_map, chanmap_size) ;
+		} ;
+
+	return 0 ;
+} /* aiff_read_chanmap */
+
diff --git a/jni/libsndfile-1.0.25/src/aiff.lo b/jni/libsndfile-1.0.25/src/aiff.lo
new file mode 100644
index 0000000..c362680
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/aiff.lo
@@ -0,0 +1,12 @@
+# aiff.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/aiff.o'
+
+# Name of the non-PIC object
+non_pic_object='aiff.o'
+
diff --git a/jni/libsndfile-1.0.25/src/aiff.o b/jni/libsndfile-1.0.25/src/aiff.o
new file mode 100644
index 0000000..55f16ec
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/aiff.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/alaw.c b/jni/libsndfile-1.0.25/src/alaw.c
new file mode 100644
index 0000000..6d06b4b
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/alaw.c
@@ -0,0 +1,540 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<math.h>
+
+#include	"sndfile.h"
+#include	"common.h"
+
+static sf_count_t alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t alaw_read_alaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t alaw_write_s2alaw (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t alaw_write_i2alaw (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t alaw_write_f2alaw (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t alaw_write_d2alaw (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+static void alaw2s_array (unsigned char *buffer, int count, short *ptr) ;
+static void alaw2i_array (unsigned char *buffer, int count, int *ptr) ;
+static void alaw2f_array (unsigned char *buffer, int count, float *ptr, float normfact) ;
+static void alaw2d_array (unsigned char *buffer, int count, double *ptr, double normfact) ;
+
+static void s2alaw_array (const short *buffer, int count, unsigned char *ptr) ;
+static void i2alaw_array (const int *buffer, int count, unsigned char *ptr) ;
+static void f2alaw_array (const float *buffer, int count, unsigned char *ptr, float normfact) ;
+static void d2alaw_array (const double *buffer, int count, unsigned char *ptr, double normfact) ;
+
+
+int
+alaw_init (SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR)
+	{	psf->read_short		= alaw_read_alaw2s ;
+		psf->read_int		= alaw_read_alaw2i ;
+		psf->read_float		= alaw_read_alaw2f ;
+		psf->read_double	= alaw_read_alaw2d ;
+		} ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	psf->write_short	= alaw_write_s2alaw ;
+		psf->write_int		= alaw_write_i2alaw ;
+		psf->write_float	= alaw_write_f2alaw ;
+		psf->write_double	= alaw_write_d2alaw ;
+		} ;
+
+	psf->bytewidth = 1 ;
+	psf->blockwidth = psf->sf.channels ;
+
+	if (psf->filelength > psf->dataoffset)
+		psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : psf->filelength - psf->dataoffset ;
+	else
+		psf->datalength = 0 ;
+
+	psf->sf.frames = psf->blockwidth > 0 ? psf->datalength / psf->blockwidth : 0 ;
+
+	return 0 ;
+} /* alaw_init */
+
+/*==============================================================================
+ *	Private static functions and data.
+ */
+
+static
+short alaw_decode [256] =
+{	-5504,	-5248,	-6016,	-5760,	-4480,	-4224,	-4992,	-4736,
+	-7552,	-7296,	-8064,	-7808,	-6528,	-6272,	-7040,	-6784,
+	-2752,	-2624,	-3008,	-2880,	-2240,	-2112,	-2496,	-2368,
+	-3776,	-3648,	-4032,	-3904,	-3264,	-3136,	-3520,	-3392,
+	-22016,	-20992,	-24064,	-23040,	-17920,	-16896,	-19968,	-18944,
+	-30208,	-29184,	-32256,	-31232,	-26112,	-25088,	-28160,	-27136,
+	-11008,	-10496,	-12032,	-11520,	-8960,	-8448,	-9984,	-9472,
+	-15104,	-14592,	-16128,	-15616,	-13056,	-12544,	-14080,	-13568,
+	-344,	-328,	-376,	-360,	-280,	-264,	-312,	-296,
+	-472,	-456,	-504,	-488,	-408,	-392,	-440,	-424,
+	-88,	-72,	-120,	-104,	-24,	-8,		-56,	-40,
+	-216,	-200,	-248,	-232,	-152,	-136,	-184,	-168,
+	-1376,	-1312,	-1504,	-1440,	-1120,	-1056,	-1248,	-1184,
+	-1888,	-1824,	-2016,	-1952,	-1632,	-1568,	-1760,	-1696,
+	-688,	-656,	-752,	-720,	-560,	-528,	-624,	-592,
+	-944,	-912,	-1008,	-976,	-816,	-784,	-880,	-848,
+	5504,	5248,	6016,	5760,	4480,	4224,	4992,	4736,
+	7552,	7296,	8064,	7808,	6528,	6272,	7040,	6784,
+	2752,	2624,	3008,	2880,	2240,	2112,	2496,	2368,
+	3776,	3648,	4032,	3904,	3264,	3136,	3520,	3392,
+	22016,	20992,	24064,	23040,	17920,	16896,	19968,	18944,
+	30208,	29184,	32256,	31232,	26112,	25088,	28160,	27136,
+	11008,	10496,	12032,	11520,	8960,	8448,	9984,	9472,
+	15104,	14592,	16128,	15616,	13056,	12544,	14080,	13568,
+	344,	328,	376,	360,	280,	264,	312,	296,
+	472,	456,	504,	488,	408,	392,	440,	424,
+	88,		72,		120,	104,	24,		8,		56,		40,
+	216,	200,	248,	232,	152,	136,	184,	168,
+	1376,	1312,	1504,	1440,	1120,	1056,	1248,	1184,
+	1888,	1824,	2016,	1952,	1632,	1568,	1760,	1696,
+	688,	656,	752,	720,	560,	528,	624,	592,
+	944,	912,	1008,	976,	816,	784,	880,	848
+} ; /* alaw_decode */
+
+static
+unsigned char alaw_encode [2048 + 1] =
+{	0xd5, 0xd4, 0xd7, 0xd6, 0xd1, 0xd0, 0xd3, 0xd2, 0xdd, 0xdc, 0xdf, 0xde,
+	0xd9, 0xd8, 0xdb, 0xda, 0xc5, 0xc4, 0xc7, 0xc6, 0xc1, 0xc0, 0xc3, 0xc2,
+	0xcd, 0xcc, 0xcf, 0xce, 0xc9, 0xc8, 0xcb, 0xca, 0xf5, 0xf5, 0xf4, 0xf4,
+	0xf7, 0xf7, 0xf6, 0xf6, 0xf1, 0xf1, 0xf0, 0xf0, 0xf3, 0xf3, 0xf2, 0xf2,
+	0xfd, 0xfd, 0xfc, 0xfc, 0xff, 0xff, 0xfe, 0xfe, 0xf9, 0xf9, 0xf8, 0xf8,
+	0xfb, 0xfb, 0xfa, 0xfa, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4,
+	0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe1, 0xe1, 0xe1, 0xe1,
+	0xe0, 0xe0, 0xe0, 0xe0, 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2,
+	0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xef, 0xef, 0xef, 0xef,
+	0xee, 0xee, 0xee, 0xee, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8,
+	0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0x95, 0x95, 0x95, 0x95,
+	0x95, 0x95, 0x95, 0x95, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94,
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96, 0x96, 0x96, 0x96,
+	0x96, 0x96, 0x96, 0x96, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x93, 0x93, 0x93, 0x93,
+	0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
+	0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9c, 0x9c, 0x9c, 0x9c,
+	0x9c, 0x9c, 0x9c, 0x9c, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f,
+	0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x99, 0x99, 0x99, 0x99,
+	0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
+	0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x9a,
+	0x9a, 0x9a, 0x9a, 0x9a, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0xb5, 0xb5, 0xb5, 0xb5,
+	0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5,
+	0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5,
+	0xb5, 0xb5, 0xb5, 0xb5, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4,
+	0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4,
+	0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4,
+	0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7,
+	0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7,
+	0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb6,
+	0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6,
+	0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6,
+	0xb6, 0xb6, 0xb6, 0xb6, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1,
+	0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1,
+	0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1,
+	0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0,
+	0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0,
+	0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb3, 0xb3, 0xb3, 0xb3,
+	0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3,
+	0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3,
+	0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2,
+	0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2,
+	0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2,
+	0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd,
+	0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd,
+	0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc,
+	0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc,
+	0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc,
+	0xbc, 0xbc, 0xbc, 0xbc, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf,
+	0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf,
+	0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf,
+	0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe,
+	0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe,
+	0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xb9, 0xb9, 0xb9, 0xb9,
+	0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9,
+	0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9,
+	0xb9, 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8,
+	0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8,
+	0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8,
+	0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+	0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+	0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba,
+	0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+	0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+	0xba, 0xba, 0xba, 0xba, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
+	0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
+	0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
+	0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
+	0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
+	0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, 0xa4,
+	0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
+	0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
+	0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
+	0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
+	0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
+	0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7,
+	0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7,
+	0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7,
+	0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7,
+	0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7,
+	0xa7, 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
+	0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
+	0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
+	0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
+	0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
+	0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa1, 0xa1, 0xa1, 0xa1,
+	0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
+	0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
+	0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
+	0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
+	0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
+	0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0,
+	0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0,
+	0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0,
+	0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0,
+	0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0,
+	0xa0, 0xa0, 0xa0, 0xa0, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
+	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
+	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
+	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
+	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
+	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa2,
+	0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2,
+	0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2,
+	0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2,
+	0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2,
+	0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2,
+	0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad,
+	0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad,
+	0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad,
+	0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad,
+	0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad,
+	0xad, 0xad, 0xad, 0xad, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
+	0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
+	0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
+	0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
+	0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
+	0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xaf, 0xaf, 0xaf, 0xaf,
+	0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
+	0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
+	0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
+	0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
+	0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
+	0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
+	0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
+	0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
+	0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
+	0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
+	0xae, 0xae, 0xae, 0xae, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
+	0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
+	0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
+	0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
+	0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
+	0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, 0xa8, 0xa8,
+	0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
+	0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
+	0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
+	0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
+	0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
+	0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
+	0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
+	0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
+	0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
+	0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
+	0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x2a
+} ; /* alaw_encode */
+
+static inline void
+alaw2s_array (unsigned char *buffer, int count, short *ptr)
+{	while (--count >= 0)
+		ptr [count] = alaw_decode [(int) buffer [count]] ;
+} /* alaw2s_array */
+
+static inline void
+alaw2i_array (unsigned char *buffer, int count, int *ptr)
+{	while (--count >= 0)
+		ptr [count] = alaw_decode [(int) buffer [count]] << 16 ;
+} /* alaw2i_array */
+
+static inline void
+alaw2f_array (unsigned char *buffer, int count, float *ptr, float normfact)
+{	while (--count >= 0)
+		ptr [count] = normfact * alaw_decode [(int) buffer [count]] ;
+} /* alaw2f_array */
+
+static inline void
+alaw2d_array (unsigned char *buffer, int count, double *ptr, double normfact)
+{	while (--count >= 0)
+		ptr [count] = normfact * alaw_decode [(int) buffer [count]] ;
+} /* alaw2d_array */
+
+static inline void
+s2alaw_array (const short *ptr, int count, unsigned char *buffer)
+{	while (--count >= 0)
+	{	if (ptr [count] >= 0)
+			buffer [count] = alaw_encode [ptr [count] / 16] ;
+		else
+			buffer [count] = 0x7F & alaw_encode [ptr [count] / -16] ;
+		} ;
+} /* s2alaw_array */
+
+static inline void
+i2alaw_array (const int *ptr, int count, unsigned char *buffer)
+{	while (--count >= 0)
+	{	if (ptr [count] >= 0)
+			buffer [count] = alaw_encode [ptr [count] >> (16 + 4)] ;
+		else
+			buffer [count] = 0x7F & alaw_encode [- ptr [count] >> (16 + 4)] ;
+		} ;
+} /* i2alaw_array */
+
+static inline void
+f2alaw_array (const float *ptr, int count, unsigned char *buffer, float normfact)
+{	while (--count >= 0)
+	{	if (ptr [count] >= 0)
+			buffer [count] = alaw_encode [lrintf (normfact * ptr [count])] ;
+		else
+			buffer [count] = 0x7F & alaw_encode [- lrintf (normfact * ptr [count])] ;
+		} ;
+} /* f2alaw_array */
+
+static inline void
+d2alaw_array (const double *ptr, int count, unsigned char *buffer, double normfact)
+{	while (--count >= 0)
+	{	if (ptr [count] >= 0)
+			buffer [count] = alaw_encode [lrint (normfact * ptr [count])] ;
+		else
+			buffer [count] = 0x7F & alaw_encode [- lrint (normfact * ptr [count])] ;
+		} ;
+} /* d2alaw_array */
+
+/*==============================================================================
+*/
+
+static sf_count_t
+alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ucbuf, 1, bufferlen, psf) ;
+		alaw2s_array (psf->u.ucbuf, readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* alaw_read_alaw2s */
+
+static sf_count_t
+alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ucbuf, 1, bufferlen, psf) ;
+		alaw2i_array (psf->u.ucbuf, readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* alaw_read_alaw2i */
+
+static sf_count_t
+alaw_read_alaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ucbuf, 1, bufferlen, psf) ;
+		alaw2f_array (psf->u.ucbuf, readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* alaw_read_alaw2f */
+
+static sf_count_t
+alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	double	normfact ;
+
+	normfact = (psf->norm_double) ? 1.0 / ((double) 0x8000) : 1.0 ;
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ucbuf, 1, bufferlen, psf) ;
+		alaw2d_array (psf->u.ucbuf, readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* alaw_read_alaw2d */
+
+/*=============================================================================================
+*/
+
+static sf_count_t
+alaw_write_s2alaw	(SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		s2alaw_array (ptr + total, bufferlen, psf->u.ucbuf) ;
+		writecount = psf_fwrite (psf->u.ucbuf, 1, bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* alaw_write_s2alaw */
+
+static sf_count_t
+alaw_write_i2alaw	(SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		i2alaw_array (ptr + total, bufferlen, psf->u.ucbuf) ;
+		writecount = psf_fwrite (psf->u.ucbuf, 1, bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* alaw_write_i2alaw */
+
+static sf_count_t
+alaw_write_f2alaw	(SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) / 16.0 : 1.0 / 16 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		f2alaw_array (ptr + total, bufferlen, psf->u.ucbuf, normfact) ;
+		writecount = psf_fwrite (psf->u.ucbuf, 1, bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* alaw_write_f2alaw */
+
+static sf_count_t
+alaw_write_d2alaw	(SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+	double	normfact ;
+
+	normfact = (psf->norm_double) ? (1.0 * 0x7FFF) / 16.0 : 1.0 / 16.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		d2alaw_array (ptr + total, bufferlen, psf->u.ucbuf, normfact) ;
+		writecount = psf_fwrite (psf->u.ucbuf, 1, bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* alaw_write_d2alaw */
+
diff --git a/jni/libsndfile-1.0.25/src/alaw.lo b/jni/libsndfile-1.0.25/src/alaw.lo
new file mode 100644
index 0000000..420272d
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/alaw.lo
@@ -0,0 +1,12 @@
+# alaw.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/alaw.o'
+
+# Name of the non-PIC object
+non_pic_object='alaw.o'
+
diff --git a/jni/libsndfile-1.0.25/src/alaw.o b/jni/libsndfile-1.0.25/src/alaw.o
new file mode 100644
index 0000000..8659679
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/alaw.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/au.c b/jni/libsndfile-1.0.25/src/au.c
new file mode 100644
index 0000000..0ac3bf3
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/au.c
@@ -0,0 +1,452 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+/*------------------------------------------------------------------------------
+** Macros to handle big/little endian issues.
+*/
+
+#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.
+*/
+
+enum
+{	AU_ENCODING_ULAW_8					= 1,	/* 8-bit u-law samples */
+	AU_ENCODING_PCM_8					= 2,	/* 8-bit linear samples */
+	AU_ENCODING_PCM_16					= 3,	/* 16-bit linear samples */
+	AU_ENCODING_PCM_24					= 4,	/* 24-bit linear samples */
+	AU_ENCODING_PCM_32					= 5,	/* 32-bit linear samples */
+
+	AU_ENCODING_FLOAT					= 6,	/* floating-point samples */
+	AU_ENCODING_DOUBLE					= 7,	/* double-precision float samples */
+	AU_ENCODING_INDIRECT				= 8,	/* fragmented sampled data */
+	AU_ENCODING_NESTED					= 9,	/* ? */
+	AU_ENCODING_DSP_CORE				= 10,	/* DSP program */
+	AU_ENCODING_DSP_DATA_8				= 11,	/* 8-bit fixed-point samples */
+	AU_ENCODING_DSP_DATA_16				= 12,	/* 16-bit fixed-point samples */
+	AU_ENCODING_DSP_DATA_24				= 13,	/* 24-bit fixed-point samples */
+	AU_ENCODING_DSP_DATA_32				= 14,	/* 32-bit fixed-point samples */
+
+	AU_ENCODING_DISPLAY					= 16,	/* non-audio display data */
+	AU_ENCODING_MULAW_SQUELCH			= 17,	/* ? */
+	AU_ENCODING_EMPHASIZED				= 18,	/* 16-bit linear with emphasis */
+	AU_ENCODING_NEXT					= 19,	/* 16-bit linear with compression (NEXT) */
+	AU_ENCODING_COMPRESSED_EMPHASIZED	= 20,	/* A combination of the two above */
+	AU_ENCODING_DSP_COMMANDS			= 21,	/* Music Kit DSP commands */
+	AU_ENCODING_DSP_COMMANDS_SAMPLES	= 22,	/* ? */
+
+	AU_ENCODING_ADPCM_G721_32			= 23,	/* G721 32 kbs ADPCM - 4 bits per sample. */
+	AU_ENCODING_ADPCM_G722				= 24,	/* G722 64 kbs ADPCM */
+	AU_ENCODING_ADPCM_G723_24			= 25,	/* G723 24 kbs ADPCM - 3 bits per sample. */
+	AU_ENCODING_ADPCM_G723_40			= 26,	/* G723 40 kbs ADPCM - 5 bits per sample. */
+
+	AU_ENCODING_ALAW_8					= 27
+} ;
+
+/*------------------------------------------------------------------------------
+** Typedefs.
+*/
+
+typedef	struct
+{	int		dataoffset ;
+	int		datasize ;
+	int		encoding ;
+    int		samplerate ;
+    int		channels ;
+} AU_FMT ;
+
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static	int		au_close		(SF_PRIVATE *psf) ;
+
+static	int 	au_format_to_encoding	(int format) ;
+
+static int		au_write_header (SF_PRIVATE *psf, int calc_length) ;
+static int		au_read_header (SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+au_open	(SF_PRIVATE *psf)
+{	int		subformat ;
+	int		error = 0 ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = au_read_header (psf)))
+			return error ;
+		} ;
+
+	if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_AU)
+		return	SFE_BAD_OPEN_FORMAT ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	psf->endian = SF_ENDIAN (psf->sf.format) ;
+		if (CPU_IS_LITTLE_ENDIAN && psf->endian == SF_ENDIAN_CPU)
+			psf->endian = SF_ENDIAN_LITTLE ;
+		else if (psf->endian != SF_ENDIAN_LITTLE)
+			psf->endian = SF_ENDIAN_BIG ;
+
+		if (au_write_header (psf, SF_FALSE))
+			return psf->error ;
+
+		psf->write_header = au_write_header ;
+		} ;
+
+	psf->container_close = au_close ;
+
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+	switch (subformat)
+	{	case SF_FORMAT_ULAW :	/* 8-bit Ulaw encoding. */
+				ulaw_init (psf) ;
+				break ;
+
+		case SF_FORMAT_PCM_S8 :	/* 8-bit linear PCM. */
+				error = pcm_init (psf) ;
+				break ;
+
+		case SF_FORMAT_PCM_16 :	/* 16-bit linear PCM. */
+		case SF_FORMAT_PCM_24 :	/* 24-bit linear PCM */
+		case SF_FORMAT_PCM_32 :	/* 32-bit linear PCM. */
+				error = pcm_init (psf) ;
+				break ;
+
+		case SF_FORMAT_ALAW :	/* 8-bit Alaw encoding. */
+				alaw_init (psf) ;
+				break ;
+
+		/* Lite remove start */
+		case SF_FORMAT_FLOAT :	/* 32-bit floats. */
+				error = float32_init (psf) ;
+				break ;
+
+		case SF_FORMAT_DOUBLE :	/* 64-bit double precision floats. */
+				error = double64_init (psf) ;
+				break ;
+
+		case SF_FORMAT_G721_32 :
+				error = g72x_init (psf) ;
+				psf->sf.seekable = SF_FALSE ;
+				break ;
+
+		case SF_FORMAT_G723_24 :
+				error = g72x_init (psf) ;
+				psf->sf.seekable = SF_FALSE ;
+				break ;
+
+		case SF_FORMAT_G723_40 :
+				error = g72x_init (psf) ;
+				psf->sf.seekable = SF_FALSE ;
+				break ;
+		/* Lite remove end */
+
+		default :	break ;
+		} ;
+
+	return error ;
+} /* au_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+au_close	(SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+		au_write_header (psf, SF_TRUE) ;
+
+	return 0 ;
+} /* au_close */
+
+static int
+au_write_header (SF_PRIVATE *psf, int calc_length)
+{	sf_count_t	current ;
+	int			encoding, datalength ;
+
+	if (psf->pipeoffset > 0)
+		return 0 ;
+
+	current = psf_ftell (psf) ;
+
+	if (calc_length)
+	{	psf->filelength = psf_get_filelen (psf) ;
+
+		psf->datalength = psf->filelength - psf->dataoffset ;
+		if (psf->dataend)
+			psf->datalength -= psf->filelength - psf->dataend ;
+
+		psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+		} ;
+
+	encoding = au_format_to_encoding (SF_CODEC (psf->sf.format)) ;
+	if (! encoding)
+		return (psf->error = SFE_BAD_OPEN_FORMAT) ;
+
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+
+	/*
+	** Only attempt to seek if we are not writng to a pipe. If we are
+	** writing to a pipe we shouldn't be here anyway.
+	*/
+	if (psf->is_pipe == SF_FALSE)
+		psf_fseek (psf, 0, SEEK_SET) ;
+
+	/*
+	**	AU format files allow a datalength value of -1 if the datalength
+	**	is not know at the time the header is written.
+	**	Also use this value of -1 if the datalength > 2 gigabytes.
+	*/
+	if (psf->datalength	< 0 || psf->datalength > 0x7FFFFFFF)
+		datalength = -1 ;
+	else
+		datalength = (int) (psf->datalength & 0x7FFFFFFF) ;
+
+	if (psf->endian == SF_ENDIAN_BIG)
+	{	psf_binheader_writef (psf, "Em4", DOTSND_MARKER, AU_DATA_OFFSET) ;
+		psf_binheader_writef (psf, "E4444", datalength, encoding, psf->sf.samplerate, psf->sf.channels) ;
+		}
+	else if (psf->endian == SF_ENDIAN_LITTLE)
+	{	psf_binheader_writef (psf, "em4", DNSDOT_MARKER, AU_DATA_OFFSET) ;
+		psf_binheader_writef (psf, "e4444", datalength, encoding, psf->sf.samplerate, psf->sf.channels) ;
+		}
+	else
+		return (psf->error = SFE_BAD_OPEN_FORMAT) ;
+
+	/* Header construction complete so write it out. */
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+
+	if (psf->error)
+		return psf->error ;
+
+	psf->dataoffset = psf->headindex ;
+
+	if (current > 0)
+		psf_fseek (psf, current, SEEK_SET) ;
+
+	return psf->error ;
+} /* au_write_header */
+
+static int
+au_format_to_encoding (int format)
+{
+	switch (format)
+	{	case SF_FORMAT_PCM_S8 : 	return AU_ENCODING_PCM_8 ;
+		case SF_FORMAT_PCM_16 :		return AU_ENCODING_PCM_16 ;
+		case SF_FORMAT_PCM_24 : 	return AU_ENCODING_PCM_24 ;
+		case SF_FORMAT_PCM_32 : 	return AU_ENCODING_PCM_32 ;
+
+		case SF_FORMAT_FLOAT :		return AU_ENCODING_FLOAT ;
+		case SF_FORMAT_DOUBLE :		return AU_ENCODING_DOUBLE ;
+
+		case SF_FORMAT_ULAW :		return AU_ENCODING_ULAW_8 ;
+		case SF_FORMAT_ALAW :		return AU_ENCODING_ALAW_8 ;
+
+		case SF_FORMAT_G721_32 : 	return AU_ENCODING_ADPCM_G721_32 ;
+		case SF_FORMAT_G723_24 :	return AU_ENCODING_ADPCM_G723_24 ;
+		case SF_FORMAT_G723_40 :	return AU_ENCODING_ADPCM_G723_40 ;
+
+		default : break ;
+		} ;
+	return 0 ;
+} /* au_format_to_encoding */
+
+static int
+au_read_header (SF_PRIVATE *psf)
+{	AU_FMT	au_fmt ;
+	int		marker, dword ;
+
+	memset (&au_fmt, 0, sizeof (au_fmt)) ;
+	psf_binheader_readf (psf, "pm", 0, &marker) ;
+	psf_log_printf (psf, "%M\n", marker) ;
+
+	if (marker == DOTSND_MARKER)
+	{	psf->endian = SF_ENDIAN_BIG ;
+
+		psf_binheader_readf (psf, "E44444", &(au_fmt.dataoffset), &(au_fmt.datasize),
+					&(au_fmt.encoding), &(au_fmt.samplerate), &(au_fmt.channels)) ;
+		}
+	else if (marker == DNSDOT_MARKER)
+	{	psf->endian = SF_ENDIAN_LITTLE ;
+		psf_binheader_readf (psf, "e44444", &(au_fmt.dataoffset), &(au_fmt.datasize),
+					&(au_fmt.encoding), &(au_fmt.samplerate), &(au_fmt.channels)) ;
+		}
+	else
+		return SFE_AU_NO_DOTSND ;
+
+	psf_log_printf (psf, "  Data Offset : %d\n", au_fmt.dataoffset) ;
+
+	if (psf->fileoffset > 0 && au_fmt.datasize == -1)
+	{	psf_log_printf (psf, "  Data Size   : -1\n") ;
+		return SFE_AU_EMBED_BAD_LEN ;
+		} ;
+
+	if (psf->fileoffset > 0)
+	{	psf->filelength = au_fmt.dataoffset + au_fmt.datasize ;
+		psf_log_printf (psf, "  Data Size   : %d\n", au_fmt.datasize) ;
+		}
+	else if (au_fmt.datasize == -1 || 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.datasize ;
+		psf_log_printf (psf, "  Data Size   : %d\n", au_fmt.datasize) ;
+		}
+	else
+	{	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 ;
+
+	if (psf_ftell (psf) < psf->dataoffset)
+		psf_binheader_readf (psf, "j", psf->dataoffset - psf_ftell (psf)) ;
+
+	psf->sf.samplerate	= au_fmt.samplerate ;
+	psf->sf.channels 	= au_fmt.channels ;
+
+	/* Only fill in type major. */
+	if (psf->endian == SF_ENDIAN_BIG)
+		psf->sf.format = SF_FORMAT_AU ;
+	else if (psf->endian == SF_ENDIAN_LITTLE)
+		psf->sf.format = SF_ENDIAN_LITTLE | SF_FORMAT_AU ;
+
+	psf_log_printf (psf, "  Encoding    : %d => ", au_fmt.encoding) ;
+
+	psf->sf.format = SF_ENDIAN (psf->sf.format) ;
+
+	switch (au_fmt.encoding)
+	{	case AU_ENCODING_ULAW_8 :
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_ULAW ;
+				psf->bytewidth = 1 ;	/* Before decoding */
+				psf_log_printf (psf, "8-bit ISDN u-law\n") ;
+				break ;
+
+		case AU_ENCODING_PCM_8 :
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_PCM_S8 ;
+				psf->bytewidth = 1 ;
+				psf_log_printf (psf, "8-bit linear PCM\n") ;
+				break ;
+
+		case AU_ENCODING_PCM_16 :
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_PCM_16 ;
+				psf->bytewidth = 2 ;
+				psf_log_printf (psf, "16-bit linear PCM\n") ;
+				break ;
+
+		case AU_ENCODING_PCM_24 :
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_PCM_24 ;
+				psf->bytewidth = 3 ;
+				psf_log_printf (psf, "24-bit linear PCM\n") ;
+				break ;
+
+		case AU_ENCODING_PCM_32 :
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_PCM_32 ;
+				psf->bytewidth = 4 ;
+				psf_log_printf (psf, "32-bit linear PCM\n") ;
+				break ;
+
+		case AU_ENCODING_FLOAT :
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_FLOAT ;
+				psf->bytewidth = 4 ;
+				psf_log_printf (psf, "32-bit float\n") ;
+				break ;
+
+		case AU_ENCODING_DOUBLE :
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_DOUBLE ;
+				psf->bytewidth = 8 ;
+				psf_log_printf (psf, "64-bit double precision float\n") ;
+				break ;
+
+		case AU_ENCODING_ALAW_8 :
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_ALAW ;
+				psf->bytewidth = 1 ;	/* Before decoding */
+				psf_log_printf (psf, "8-bit ISDN A-law\n") ;
+				break ;
+
+		case AU_ENCODING_ADPCM_G721_32 :
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_G721_32 ;
+				psf->bytewidth = 0 ;
+				psf_log_printf (psf, "G721 32kbs ADPCM\n") ;
+				break ;
+
+		case AU_ENCODING_ADPCM_G723_24 :
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_G723_24 ;
+				psf->bytewidth = 0 ;
+				psf_log_printf (psf, "G723 24kbs ADPCM\n") ;
+				break ;
+
+		case AU_ENCODING_ADPCM_G723_40 :
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_G723_40 ;
+				psf->bytewidth = 0 ;
+				psf_log_printf (psf, "G723 40kbs ADPCM\n") ;
+				break ;
+
+		case AU_ENCODING_ADPCM_G722 :
+				psf_log_printf (psf, "G722 64 kbs ADPCM (unsupported)\n") ;
+				break ;
+
+		case AU_ENCODING_NEXT :
+				psf_log_printf (psf, "Weird NeXT encoding format (unsupported)\n") ;
+				break ;
+
+		default :
+				psf_log_printf (psf, "Unknown!!\n") ;
+				break ;
+		} ;
+
+	psf_log_printf (psf, "  Sample Rate : %d\n", au_fmt.samplerate) ;
+	if (au_fmt.channels < 1)
+	{	psf_log_printf (psf, "  Channels    : %d  **** should be >= 1\n", au_fmt.channels) ;
+		return SFE_CHANNEL_COUNT_ZERO ;
+		}
+	else
+		psf_log_printf (psf, "  Channels    : %d\n", au_fmt.channels) ;
+
+	psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+
+	if (! psf->sf.frames && psf->blockwidth)
+		psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ;
+
+	return 0 ;
+} /* au_read_header */
+
diff --git a/jni/libsndfile-1.0.25/src/au.lo b/jni/libsndfile-1.0.25/src/au.lo
new file mode 100644
index 0000000..e22b18c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/au.lo
@@ -0,0 +1,12 @@
+# au.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/au.o'
+
+# Name of the non-PIC object
+non_pic_object='au.o'
+
diff --git a/jni/libsndfile-1.0.25/src/au.o b/jni/libsndfile-1.0.25/src/au.o
new file mode 100644
index 0000000..5343fef
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/au.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/audio_detect.c b/jni/libsndfile-1.0.25/src/audio_detect.c
new file mode 100644
index 0000000..775077e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/audio_detect.c
@@ -0,0 +1,105 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <string.h>
+#include <errno.h>
+
+#include "common.h"
+
+typedef struct
+{	int le_float ;
+	int be_float ;
+	int le_int_24_32 ;
+	int be_int_24_32 ;
+} VOTE ;
+
+
+static void vote_for_format (VOTE * vote, const unsigned char * data, int datalen) ;
+
+int
+audio_detect (SF_PRIVATE * psf, AUDIO_DETECT *ad, const unsigned char * data, int datalen)
+{	VOTE vote ;
+
+	if (psf == NULL)
+		return 0 ;
+
+	if (ad == NULL || datalen < 256)
+		return 0 ;
+
+	vote_for_format (&vote, data, datalen) ;
+
+	psf_log_printf (psf, "audio_detect :\n"
+			"    le_float     : %d\n"
+			"    be_float     : %d\n"
+			"    le_int_24_32 : %d\n"
+			"    be_int_24_32 : %d\n",
+			vote.le_float, vote.be_float, vote.le_int_24_32, vote.be_int_24_32) ;
+
+	if (0) puts (psf->logbuffer) ;
+
+	if (ad->endianness == SF_ENDIAN_LITTLE && vote.le_float > (3 * datalen) / 4)
+	{	/* Almost certainly 32 bit floats. */
+		return SF_FORMAT_FLOAT ;
+		} ;
+
+	if (ad->endianness == SF_ENDIAN_LITTLE && vote.le_int_24_32 > (3 * datalen) / 4)
+	{	/* Almost certainly 24 bit data stored in 32 bit ints. */
+		return SF_FORMAT_PCM_32 ;
+		} ;
+
+	return 0 ;
+} /* data_detect */
+
+static void
+vote_for_format (VOTE * vote, const unsigned char * data, int datalen)
+{
+	int k ;
+
+	memset (vote, 0, sizeof (VOTE)) ;
+
+	datalen -= datalen % 4 ;
+
+	for (k = 0 ; k < datalen ; k ++)
+	{	if ((k % 4) == 0)
+		{	if (data [k] == 0 && data [k + 1] != 0)
+				vote->le_int_24_32 += 4 ;
+
+			if (data [2] != 0 && data [3] == 0)
+				vote->le_int_24_32 += 4 ;
+
+			if (data [0] != 0 && data [3] > 0x43 && data [3] < 0x4B)
+				vote->le_float += 4 ;
+
+			if (data [3] != 0 && data [0] > 0x43 && data [0] < 0x4B)
+				vote->be_float += 4 ;
+			} ;
+		} ;
+
+	return ;
+} /* vote_for_format */
+
diff --git a/jni/libsndfile-1.0.25/src/audio_detect.lo b/jni/libsndfile-1.0.25/src/audio_detect.lo
new file mode 100644
index 0000000..6b38124
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/audio_detect.lo
@@ -0,0 +1,12 @@
+# audio_detect.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/audio_detect.o'
+
+# Name of the non-PIC object
+non_pic_object='audio_detect.o'
+
diff --git a/jni/libsndfile-1.0.25/src/audio_detect.o b/jni/libsndfile-1.0.25/src/audio_detect.o
new file mode 100644
index 0000000..8c5a207
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/audio_detect.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/avr.c b/jni/libsndfile-1.0.25/src/avr.c
new file mode 100644
index 0000000..dd09b46
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/avr.c
@@ -0,0 +1,247 @@
+/*
+** Copyright (C) 2004-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include "sndfile.h"
+#include "sfendian.h"
+#include "common.h"
+
+#define TWOBIT_MARKER	(MAKE_MARKER ('2', 'B', 'I', 'T'))
+#define	AVR_HDR_SIZE	128
+
+#define	SFE_AVR_X	666
+
+/*
+** From: hyc@hanauma.Jpl.Nasa.Gov (Howard Chu)
+**
+** A lot of PD software exists to play Mac .snd files on the ST. One other
+** format that seems pretty popular (used by a number of commercial packages)
+** is the AVR format (from Audio Visual Research). This format has a 128 byte
+** header that looks like this (its actually packed, but thats not portable):
+*/
+
+typedef struct
+{	int		marker ;	/* 2BIT */
+	char	name [8] ;	/* null-padded sample name */
+	short	mono ;		/* 0 = mono, 0xffff = stereo */
+	short	rez ;		/* 8 = 8 bit, 16 = 16 bit */
+	short	sign ;		/* 0 = unsigned, 0xffff = signed */
+
+	short	loop ;		/* 0 = no loop, 0xffff = looping sample */
+	short	midi ;		/* 0xffff = no MIDI note assigned,  */
+						/*	0xffXX = single key note assignment */
+						/*	0xLLHH = key split, low/hi note */
+	int		srate ;		/* sample frequency in hertz */
+	int		frames ;	/* sample length in bytes or words (see rez) */
+	int		lbeg ;		/* offset to start of loop in bytes or words. */
+						/* set to zero if unused */
+	int		lend ;		/* offset to end of loop in bytes or words. */
+						/* set to sample length if unused */
+	short	res1 ;		/* Reserved, MIDI keyboard split */
+	short	res2 ;		/* Reserved, sample compression */
+	short	res3 ;		/* Reserved */
+	char	ext [20] ;	/* Additional filename space, used if (name[7] != 0) */
+	char	user [64] ; /* User defined. Typically ASCII message */
+} AVR_HEADER ;
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static int		avr_close (SF_PRIVATE *psf) ;
+
+static int		avr_read_header (SF_PRIVATE *psf) ;
+static int		avr_write_header (SF_PRIVATE *psf, int calc_length) ;
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+avr_open	(SF_PRIVATE *psf)
+{	int		error = 0 ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = avr_read_header (psf)))
+			return error ;
+		} ;
+
+	if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_AVR)
+		return	SFE_BAD_OPEN_FORMAT ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	psf->endian = SF_ENDIAN (psf->sf.format) ;
+		psf->endian = SF_ENDIAN_BIG ;
+
+		if (avr_write_header (psf, SF_FALSE))
+			return psf->error ;
+
+		psf->write_header = avr_write_header ;
+		} ;
+
+	psf->container_close = avr_close ;
+
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+	error = pcm_init (psf) ;
+
+	return error ;
+} /* avr_open */
+
+static int
+avr_read_header (SF_PRIVATE *psf)
+{	AVR_HEADER	hdr ;
+
+	memset (&hdr, 0, sizeof (hdr)) ;
+
+	psf_binheader_readf (psf, "pmb", 0, &hdr.marker, &hdr.name, sizeof (hdr.name)) ;
+	psf_log_printf (psf, "%M\n", hdr.marker) ;
+
+	if (hdr.marker != TWOBIT_MARKER)
+		return SFE_AVR_X ;
+
+	psf_log_printf (psf, "  Name        : %s\n", hdr.name) ;
+
+	psf_binheader_readf (psf, "E22222", &hdr.mono, &hdr.rez, &hdr.sign, &hdr.loop, &hdr.midi) ;
+
+	psf->sf.channels = (hdr.mono & 1) + 1 ;
+
+	psf_log_printf (psf, "  Channels    : %d\n  Bit width   : %d\n  Signed      : %s\n",
+			(hdr.mono & 1) + 1, hdr.rez, hdr.sign ? "yes" : "no") ;
+
+	switch ((hdr.rez << 16) + (hdr.sign & 1))
+	{	case ((8 << 16) + 0) :
+			psf->sf.format = SF_FORMAT_AVR | SF_FORMAT_PCM_U8 ;
+			psf->bytewidth = 1 ;
+			break ;
+
+		case ((8 << 16) + 1) :
+			psf->sf.format = SF_FORMAT_AVR | SF_FORMAT_PCM_S8 ;
+			psf->bytewidth = 1 ;
+			break ;
+
+		case ((16 << 16) + 1) :
+			psf->sf.format = SF_FORMAT_AVR | SF_FORMAT_PCM_16 ;
+			psf->bytewidth = 2 ;
+			break ;
+
+		default :
+			psf_log_printf (psf, "Error : bad rez/sign combination.\n") ;
+			return SFE_AVR_X ;
+		} ;
+
+	psf_binheader_readf (psf, "E4444", &hdr.srate, &hdr.frames, &hdr.lbeg, &hdr.lend) ;
+
+	psf->sf.frames = hdr.frames ;
+	psf->sf.samplerate = hdr.srate ;
+
+	psf_log_printf (psf, "  Frames      : %D\n", psf->sf.frames) ;
+	psf_log_printf (psf, "  Sample rate : %d\n", psf->sf.samplerate) ;
+
+	psf_binheader_readf (psf, "E222", &hdr.res1, &hdr.res2, &hdr.res3) ;
+	psf_binheader_readf (psf, "bb", hdr.ext, sizeof (hdr.ext), hdr.user, sizeof (hdr.user)) ;
+
+	psf_log_printf (psf, "  Ext         : %s\n  User        : %s\n", hdr.ext, hdr.user) ;
+
+	psf->endian = SF_ENDIAN_BIG ;
+
+ 	psf->dataoffset = AVR_HDR_SIZE ;
+	psf->datalength = hdr.frames * (hdr.rez / 8) ;
+
+	if (psf->fileoffset > 0)
+		psf->filelength = AVR_HDR_SIZE + psf->datalength ;
+
+	if (psf_ftell (psf) != psf->dataoffset)
+		psf_binheader_readf (psf, "j", psf->dataoffset - psf_ftell (psf)) ;
+
+	psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+
+	if (psf->sf.frames == 0 && psf->blockwidth)
+		psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ;
+
+	return 0 ;
+} /* avr_read_header */
+
+static int
+avr_write_header (SF_PRIVATE *psf, int calc_length)
+{	sf_count_t	current ;
+	int			sign ;
+
+	if (psf->pipeoffset > 0)
+		return 0 ;
+
+	current = psf_ftell (psf) ;
+
+	if (calc_length)
+	{	psf->filelength = psf_get_filelen (psf) ;
+
+		psf->datalength = psf->filelength - psf->dataoffset ;
+		if (psf->dataend)
+			psf->datalength -= psf->filelength - psf->dataend ;
+
+		psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+		} ;
+
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+
+	/*
+	** Only attempt to seek if we are not writng to a pipe. If we are
+	** writing to a pipe we shouldn't be here anyway.
+	*/
+	if (psf->is_pipe == SF_FALSE)
+		psf_fseek (psf, 0, SEEK_SET) ;
+
+	psf_binheader_writef (psf, "Emz22", TWOBIT_MARKER, make_size_t (8),
+			psf->sf.channels == 2 ? 0xFFFF : 0, psf->bytewidth * 8) ;
+
+	sign = ((SF_CODEC (psf->sf.format)) == SF_FORMAT_PCM_U8) ? 0 : 0xFFFF ;
+
+	psf_binheader_writef (psf, "E222", sign, 0, 0xFFFF) ;
+	psf_binheader_writef (psf, "E4444", psf->sf.samplerate, psf->sf.frames, 0, 0) ;
+
+	psf_binheader_writef (psf, "E222zz", 0, 0, 0, make_size_t (20), make_size_t (64)) ;
+
+	/* Header construction complete so write it out. */
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+
+	if (psf->error)
+		return psf->error ;
+
+	psf->dataoffset = psf->headindex ;
+
+	if (current > 0)
+		psf_fseek (psf, current, SEEK_SET) ;
+
+	return psf->error ;
+} /* avr_write_header */
+
+static int
+avr_close (SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+		avr_write_header (psf, SF_TRUE) ;
+
+	return 0 ;
+} /* avr_close */
+
diff --git a/jni/libsndfile-1.0.25/src/avr.lo b/jni/libsndfile-1.0.25/src/avr.lo
new file mode 100644
index 0000000..8a5336a
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/avr.lo
@@ -0,0 +1,12 @@
+# avr.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/avr.o'
+
+# Name of the non-PIC object
+non_pic_object='avr.o'
+
diff --git a/jni/libsndfile-1.0.25/src/avr.o b/jni/libsndfile-1.0.25/src/avr.o
new file mode 100644
index 0000000..54809a4
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/avr.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/binheader_writef_check.py b/jni/libsndfile-1.0.25/src/binheader_writef_check.py
new file mode 100755
index 0000000..adfc5f9
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/binheader_writef_check.py
@@ -0,0 +1,116 @@
+#!/usr/bin/python
+
+# Copyright (C) 2006-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the author nor the names of any contributors may be used
+#       to endorse or promote products derived from this software without
+#       specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+# This parses C code using regexes (yes, thats horrible) and makes sure
+# that calling conventions to the function psf_binheader_writef are
+# correct.
+
+
+
+import re, string, sys
+
+_whitespace_re = re.compile ("\s+", re.MULTILINE)
+
+def find_binheader_writefs (data):
+	lst = re.findall ('psf_binheader_writef\s*\(\s*[a-zA-Z_]+\s*,\s*\"[^;]+;', data, re.MULTILINE)
+	return [_whitespace_re.sub (" ", x) for x in lst]
+
+def find_format_string (s):
+	fmt = re.search ('"([^"]+)"', s)
+	if not fmt:
+		print "Bad format in :\n\n\t%s\n\n" % s
+		sys.exit (1)
+	fmt = fmt.groups ()
+	if len (fmt) != 1:
+		print "Bad format in :\n\n\t%s\n\n" % s
+		sys.exit (1)
+	return _whitespace_re.sub ("", fmt [0])
+
+def get_param_list (data):
+	dlist = re.search ("\((.+)\)\s*;", data)
+	dlist = dlist.groups ()[0]
+	dlist = string.split (dlist, ",")
+	dlist = [string.strip (x) for x in dlist]
+	return dlist [2:]
+
+def handle_file (fname):
+	errors = 0
+	data = open (fname, "r").read ()
+
+	writefs = find_binheader_writefs (data)
+	for item in writefs:
+		fmt = find_format_string (item)
+		params = get_param_list (item)
+		param_index = 0
+
+		# print item
+
+		for ch in fmt:
+			if ch in 'Eet ':
+				continue
+
+			# print "    param [%d] %c : %s" % (param_index, ch, params [param_index])
+
+			if ch != 'b':
+				param_index += 1
+				continue
+
+			# print item
+			# print "    param [%d] %c : %s <-> %s" % (param_index, ch, params [param_index], params [param_index + 1])
+
+			if string.find (params [param_index + 1], "sizeof") < 0 \
+						and string.find (params [param_index + 1], "make_size_t") < 0 \
+						and string.find (params [param_index + 1], "strlen") < 0:
+				if errors == 0: print
+				print "\n%s :" % fname
+				print "    param [%d] %c : %s <-> %s" % (param_index, ch, params [param_index], params [param_index + 1])
+				print "    %s" % item
+				errors += 1
+			param_index += 2
+
+	return errors
+
+#===============================================================================
+
+if len (sys.argv) > 1:
+	print "\n    binheader_writef_check                   :",
+	sys.stdout.flush ()
+	errors = 0
+	for fname in sys.argv [1:]:
+		errors += handle_file (fname)
+	if errors > 0:
+		print "\nErrors : %d\n" % errors
+		sys.exit (1)
+
+print "ok\n"
+
diff --git a/jni/libsndfile-1.0.25/src/broadcast.c b/jni/libsndfile-1.0.25/src/broadcast.c
new file mode 100644
index 0000000..975ee84
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/broadcast.c
@@ -0,0 +1,190 @@
+/*
+** Copyright (C) 2006-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2006 Paul Davis <paul@linuxaudiosystems.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stddef.h>
+#include <string.h>
+
+#include "common.h"
+
+
+static int gen_coding_history (char * added_history, int added_history_max, const SF_INFO * psfinfo) ;
+
+static inline size_t
+bc_min_size (const SF_BROADCAST_INFO* info)
+{	if (info == NULL)
+		return 0 ;
+
+	return offsetof (SF_BROADCAST_INFO, coding_history) + info->coding_history_size ;
+} /* bc_min_size */
+
+SF_BROADCAST_INFO_16K*
+broadcast_var_alloc (void)
+{	return calloc (1, sizeof (SF_BROADCAST_INFO_16K)) ;
+} /* broadcast_var_alloc */
+
+int
+broadcast_var_set (SF_PRIVATE *psf, const SF_BROADCAST_INFO * info, size_t datasize)
+{	size_t len ;
+
+	if (info == NULL)
+		return SF_FALSE ;
+
+	if (bc_min_size (info) > datasize)
+	{	psf->error = SFE_BAD_BROADCAST_INFO_SIZE ;
+		return SF_FALSE ;
+		} ;
+
+	if (datasize >= sizeof (SF_BROADCAST_INFO_16K))
+	{	psf->error = SFE_BAD_BROADCAST_INFO_TOO_BIG ;
+		return SF_FALSE ;
+		} ;
+
+	if (psf->broadcast_16k == NULL)
+	{	if ((psf->broadcast_16k = broadcast_var_alloc ()) == NULL)
+		{	psf->error = SFE_MALLOC_FAILED	 ;
+			return SF_FALSE ;
+			} ;
+		} ;
+
+	memcpy (psf->broadcast_16k, info, offsetof (SF_BROADCAST_INFO, coding_history)) ;
+
+	psf_strlcpy_crlf (psf->broadcast_16k->coding_history, info->coding_history, sizeof (psf->broadcast_16k->coding_history), datasize - offsetof (SF_BROADCAST_INFO, coding_history)) ;
+	len = strlen (psf->broadcast_16k->coding_history) ;
+
+	if (len > 0 && psf->broadcast_16k->coding_history [len - 1] != '\n')
+		psf_strlcat (psf->broadcast_16k->coding_history, sizeof (psf->broadcast_16k->coding_history), "\r\n") ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	char added_history [256] ;
+
+		gen_coding_history (added_history, sizeof (added_history), &(psf->sf)) ;
+		psf_strlcat (psf->broadcast_16k->coding_history, sizeof (psf->broadcast_16k->coding_history), added_history) ;
+		} ;
+
+	/* Force coding_history_size to be even. */
+	len = strlen (psf->broadcast_16k->coding_history) ;
+	len += (len & 1) ? 1 : 2 ;
+	psf->broadcast_16k->coding_history_size = len ;
+
+	/* Currently writing this version. */
+	psf->broadcast_16k->version = 1 ;
+
+	return SF_TRUE ;
+} /* broadcast_var_set */
+
+
+int
+broadcast_var_get (SF_PRIVATE *psf, SF_BROADCAST_INFO * data, size_t datasize)
+{	size_t size ;
+
+	if (psf->broadcast_16k == NULL)
+		return SF_FALSE ;
+
+	size = SF_MIN (datasize, bc_min_size ((const SF_BROADCAST_INFO *) psf->broadcast_16k)) ;
+
+	memcpy (data, psf->broadcast_16k, size) ;
+
+	return SF_TRUE ;
+} /* broadcast_var_get */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+gen_coding_history (char * added_history, int added_history_max, const SF_INFO * psfinfo)
+{	char chnstr [16] ;
+	int count, width ;
+
+	/*
+	**	From : http://www.sr.se/utveckling/tu/bwf/docs/codhist2.htm
+	**
+	**	Parameter            Variable string <allowed option>                 Unit
+	**	==========================================================================================
+	**	Coding Algorithm     A=<ANALOGUE, PCM, MPEG1L1, MPEG1L2, MPEG1L3,
+	**	                     MPEG2L1, MPEG2L2, MPEG2L3>
+	**	Sampling frequency   F=<11000,22050,24000,32000,44100,48000>          [Hz]
+	**	Bit-rate             B=<any bit-rate allowed in MPEG 2 (ISO/IEC       [kbit/s per channel]
+	**	                     13818-3)>
+	**	Word Length          W=<8, 12, 14, 16, 18, 20, 22, 24>                [bits]
+	**	Mode                 M=<mono, stereo, dual-mono, joint-stereo>
+	**	Text, free string    T=<a free ASCII-text string for in house use.
+	**	                     This string should contain no commas (ASCII
+	**	                     2Chex). Examples of the contents: ID-No; codec
+	**	                     type; A/D type>
+	*/
+
+	switch (psfinfo->channels)
+	{	case 0 :
+			return SF_FALSE ;
+
+		case 1 :
+			psf_strlcpy (chnstr, sizeof (chnstr), "mono") ;
+			break ;
+
+		case 2 :
+			psf_strlcpy (chnstr, sizeof (chnstr), "stereo") ;
+			break ;
+
+		default :
+			snprintf (chnstr, sizeof (chnstr), "%uchn", psfinfo->channels) ;
+			break ;
+		} ;
+
+	switch (SF_CODEC (psfinfo->format))
+	{	case SF_FORMAT_PCM_U8 :
+		case SF_FORMAT_PCM_S8 :
+			width = 8 ;
+			break ;
+		case SF_FORMAT_PCM_16 :
+			width = 16 ;
+			break ;
+		case SF_FORMAT_PCM_24 :
+			width = 24 ;
+			break ;
+		case SF_FORMAT_PCM_32 :
+			width = 32 ;
+			break ;
+		case SF_FORMAT_FLOAT :
+			width = 24 ; /* Bits in the mantissa + 1 */
+			break ;
+		case SF_FORMAT_DOUBLE :
+			width = 53 ; /* Bits in the mantissa + 1 */
+			break ;
+		case SF_FORMAT_ULAW :
+		case SF_FORMAT_ALAW :
+			width = 12 ;
+			break ;
+		default :
+			width = 42 ;
+			break ;
+		} ;
+
+	count = snprintf (added_history, added_history_max,
+							"A=PCM,F=%u,W=%hu,M=%s,T=%s-%s\r\n",
+							psfinfo->samplerate, width, chnstr, PACKAGE, VERSION) ;
+
+	if (count >= added_history_max)
+		return 0 ;
+
+	return count ;
+} /* gen_coding_history */
+
diff --git a/jni/libsndfile-1.0.25/src/broadcast.lo b/jni/libsndfile-1.0.25/src/broadcast.lo
new file mode 100644
index 0000000..b4961b2
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/broadcast.lo
@@ -0,0 +1,12 @@
+# broadcast.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/broadcast.o'
+
+# Name of the non-PIC object
+non_pic_object='broadcast.o'
+
diff --git a/jni/libsndfile-1.0.25/src/broadcast.o b/jni/libsndfile-1.0.25/src/broadcast.o
new file mode 100644
index 0000000..7ba82f6
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/broadcast.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/caf.c b/jni/libsndfile-1.0.25/src/caf.c
new file mode 100644
index 0000000..99e9117
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/caf.c
@@ -0,0 +1,620 @@
+/*
+** Copyright (C) 2005-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<stdlib.h>
+#include	<string.h>
+#include	<ctype.h>
+#include	<math.h>
+#include	<inttypes.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+#include	"chanmap.h"
+
+/*------------------------------------------------------------------------------
+** Macros to handle big/little endian issues.
+*/
+
+#define aac_MARKER		MAKE_MARKER ('a', 'a', 'c', ' ')
+#define alac_MARKER		MAKE_MARKER ('a', 'l', 'a', 'c')
+#define alaw_MARKER		MAKE_MARKER ('a', 'l', 'a', 'w')
+#define caff_MARKER		MAKE_MARKER ('c', 'a', 'f', 'f')
+#define chan_MARKER		MAKE_MARKER ('c', 'h', 'a', 'n')
+#define data_MARKER		MAKE_MARKER ('d', 'a', 't', 'a')
+#define desc_MARKER		MAKE_MARKER ('d', 'e', 's', 'c')
+#define edct_MARKER		MAKE_MARKER ('e', 'd', 'c', 't')
+#define free_MARKER		MAKE_MARKER ('f', 'r', 'e', 'e')
+#define ima4_MARKER		MAKE_MARKER ('i', 'm', 'a', '4')
+#define info_MARKER		MAKE_MARKER ('i', 'n', 'f', 'o')
+#define inst_MARKER		MAKE_MARKER ('i', 'n', 's', 't')
+#define kuki_MARKER		MAKE_MARKER ('k', 'u', 'k', 'i')
+#define lpcm_MARKER		MAKE_MARKER ('l', 'p', 'c', 'm')
+#define mark_MARKER		MAKE_MARKER ('m', 'a', 'r', 'k')
+#define midi_MARKER		MAKE_MARKER ('m', 'i', 'd', 'i')
+#define mp1_MARKER		MAKE_MARKER ('.', 'm', 'p', '1')
+#define mp2_MARKER		MAKE_MARKER ('.', 'm', 'p', '2')
+#define mp3_MARKER		MAKE_MARKER ('.', 'm', 'p', '3')
+#define ovvw_MARKER		MAKE_MARKER ('o', 'v', 'v', 'w')
+#define pakt_MARKER		MAKE_MARKER ('p', 'a', 'k', 't')
+#define peak_MARKER		MAKE_MARKER ('p', 'e', 'a', 'k')
+#define regn_MARKER		MAKE_MARKER ('r', 'e', 'g', 'n')
+#define strg_MARKER		MAKE_MARKER ('s', 't', 'r', 'g')
+#define umid_MARKER		MAKE_MARKER ('u', 'm', 'i', 'd')
+#define uuid_MARKER		MAKE_MARKER ('u', 'u', 'i', 'd')
+#define ulaw_MARKER		MAKE_MARKER ('u', 'l', 'a', 'w')
+#define MAC3_MARKER		MAKE_MARKER ('M', 'A', 'C', '3')
+#define MAC6_MARKER		MAKE_MARKER ('M', 'A', 'C', '6')
+
+#define CAF_PEAK_CHUNK_SIZE(ch) 	((int) (sizeof (int) + ch * (sizeof (float) + 8)))
+
+#define SFE_CAF_NOT_CAF	666
+#define SFE_CAF_NO_DESC	667
+#define SFE_CAF_BAD_PEAK 668
+
+/*------------------------------------------------------------------------------
+** Typedefs.
+*/
+
+typedef struct
+{	unsigned char srate [8] ;
+	unsigned int fmt_id ;
+	unsigned int fmt_flags ;
+	unsigned int pkt_bytes ;
+	unsigned int pkt_frames ;
+	unsigned int channels_per_frame ;
+	unsigned int bits_per_chan ;
+} DESC_CHUNK ;
+
+typedef struct
+{	int chanmap_tag ;
+} CAF_PRIVATE ;
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static int	caf_close (SF_PRIVATE *psf) ;
+static int	caf_read_header (SF_PRIVATE *psf) ;
+static int	caf_write_header (SF_PRIVATE *psf, int calc_length) ;
+static int	caf_command (SF_PRIVATE *psf, int command, void *data, int datasize) ;
+static int	caf_read_chanmap (SF_PRIVATE * psf, sf_count_t chunk_size) ;
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+caf_open (SF_PRIVATE *psf)
+{	int	subformat, format, error = 0 ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = caf_read_header (psf)))
+			return error ;
+		} ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+
+	if ((psf->container_data = calloc (1, sizeof (CAF_PRIVATE))) == NULL)
+		return SFE_MALLOC_FAILED ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	if (psf->is_pipe)
+			return SFE_NO_PIPE_WRITE ;
+
+		format = SF_CONTAINER (psf->sf.format) ;
+		if (format != SF_FORMAT_CAF)
+			return	SFE_BAD_OPEN_FORMAT ;
+
+		psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+		if (psf->file.mode != SFM_RDWR || psf->filelength < 44)
+		{	psf->filelength = 0 ;
+			psf->datalength = 0 ;
+			psf->dataoffset = 0 ;
+			psf->sf.frames = 0 ;
+			} ;
+
+		psf->str_flags = SF_STR_ALLOW_START ;
+
+		/*
+		**	By default, add the peak chunk to floating point files. Default behaviour
+		**	can be switched off using sf_command (SFC_SET_PEAK_CHUNK, SF_FALSE).
+		*/
+		if (psf->file.mode == SFM_WRITE && (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE))
+		{	if ((psf->peak_info = peak_info_calloc (psf->sf.channels)) == NULL)
+				return SFE_MALLOC_FAILED ;
+			psf->peak_info->peak_loc = SF_PEAK_START ;
+			} ;
+
+		if ((error = caf_write_header (psf, SF_FALSE)) != 0)
+			return error ;
+
+		psf->write_header = caf_write_header ;
+		} ;
+
+	psf->container_close = caf_close ;
+	psf->command = caf_command ;
+
+	switch (subformat)
+	{	case SF_FORMAT_PCM_S8 :
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_24 :
+		case SF_FORMAT_PCM_32 :
+					error = pcm_init (psf) ;
+					break ;
+
+		case SF_FORMAT_ULAW :
+					error = ulaw_init (psf) ;
+					break ;
+
+		case SF_FORMAT_ALAW :
+					error = alaw_init (psf) ;
+					break ;
+
+		/* Lite remove start */
+		case SF_FORMAT_FLOAT :
+					error = float32_init (psf) ;
+					break ;
+
+		case SF_FORMAT_DOUBLE :
+					error = double64_init (psf) ;
+					break ;
+		/* Lite remove end */
+
+		default :
+			return SFE_UNSUPPORTED_ENCODING ;
+		} ;
+
+	return error ;
+} /* caf_open */
+
+static int
+caf_close (SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+		caf_write_header (psf, SF_TRUE) ;
+
+	return 0 ;
+} /* caf_close */
+
+static int
+caf_command (SF_PRIVATE * psf, int command, void * UNUSED (data), int UNUSED (datasize))
+{	CAF_PRIVATE	*pcaf ;
+
+	if ((pcaf = psf->container_data) == NULL)
+		return SFE_INTERNAL ;
+
+	switch (command)
+	{	case SFC_SET_CHANNEL_MAP_INFO :
+			pcaf->chanmap_tag = aiff_caf_find_channel_layout_tag (psf->channel_map, psf->sf.channels) ;
+			return (pcaf->chanmap_tag != 0) ;
+
+		default :
+			break ;
+	} ;
+
+	return 0 ;
+} /* caf_command */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+decode_desc_chunk (SF_PRIVATE *psf, const DESC_CHUNK *desc)
+{	int format ;
+
+	psf->sf.channels = desc->channels_per_frame ;
+
+	format = SF_FORMAT_CAF | (psf->endian == SF_ENDIAN_LITTLE ? SF_ENDIAN_LITTLE : 0) ;
+
+	if (desc->fmt_id == lpcm_MARKER && desc->fmt_flags & 1)
+	{	/* Floating point data. */
+		if (desc->bits_per_chan == 32 && desc->pkt_bytes == 4 * desc->channels_per_frame)
+		{	psf->bytewidth = 4 ;
+			return format | SF_FORMAT_FLOAT ;
+			} ;
+		if (desc->bits_per_chan == 64 && desc->pkt_bytes == 8 * desc->channels_per_frame)
+		{	psf->bytewidth = 8 ;
+			return format | SF_FORMAT_DOUBLE ;
+			} ;
+		} ;
+
+	if ((desc->fmt_flags & 1) != 0)
+	{	psf_log_printf (psf, "**** Ooops, 'desc' chunk suggests float data, but other info invalid.\n") ;
+		return 0 ;
+		} ;
+
+	if (desc->fmt_id == lpcm_MARKER)
+	{	/* Integer data. */
+		if (desc->bits_per_chan == 32 && desc->pkt_bytes == 4 * desc->channels_per_frame)
+		{	psf->bytewidth = 4 ;
+			return format | SF_FORMAT_PCM_32 ;
+			} ;
+		if (desc->bits_per_chan == 24 && desc->pkt_bytes == 3 * desc->channels_per_frame)
+		{	psf->bytewidth = 3 ;
+			return format | SF_FORMAT_PCM_24 ;
+			} ;
+		if (desc->bits_per_chan == 16 && desc->pkt_bytes == 2 * desc->channels_per_frame)
+		{	psf->bytewidth = 2 ;
+			return format | SF_FORMAT_PCM_16 ;
+			} ;
+		if (desc->bits_per_chan == 8 && desc->pkt_bytes == 1 * desc->channels_per_frame)
+		{	psf->bytewidth = 1 ;
+			return format | SF_FORMAT_PCM_S8 ;
+			} ;
+		} ;
+
+	if (desc->fmt_id == alaw_MARKER && desc->bits_per_chan == 8)
+	{	psf->bytewidth = 1 ;
+		return format | SF_FORMAT_ALAW ;
+		} ;
+
+	if (desc->fmt_id == ulaw_MARKER && desc->bits_per_chan == 8)
+	{	psf->bytewidth = 1 ;
+		return format | SF_FORMAT_ULAW ;
+		} ;
+
+	return 0 ;
+} /* decode_desc_chunk */
+
+static int
+caf_read_header (SF_PRIVATE *psf)
+{	DESC_CHUNK desc ;
+	sf_count_t chunk_size ;
+	double srate ;
+	short version, flags ;
+	int marker, k, have_data = 0, error ;
+
+	memset (&desc, 0, sizeof (desc)) ;
+
+	/* Set position to start of file to begin reading header. */
+	psf_binheader_readf (psf, "pmE2E2", 0, &marker, &version, &flags) ;
+	psf_log_printf (psf, "%M\n  Version : %d\n  Flags   : %x\n", marker, version, flags) ;
+	if (marker != caff_MARKER)
+		return SFE_CAF_NOT_CAF ;
+
+	psf_binheader_readf (psf, "mE8b", &marker, &chunk_size, psf->u.ucbuf, 8) ;
+	srate = double64_be_read (psf->u.ucbuf) ;
+	snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), "%5.3f", srate) ;
+	psf_log_printf (psf, "%M : %D\n  Sample rate  : %s\n", marker, chunk_size, psf->u.cbuf) ;
+	if (marker != desc_MARKER)
+		return SFE_CAF_NO_DESC ;
+
+	if (chunk_size < SIGNED_SIZEOF (DESC_CHUNK))
+	{	psf_log_printf (psf, "**** Chunk size too small. Should be > 32 bytes.\n") ;
+		return SFE_MALFORMED_FILE ;
+		} ;
+
+	psf->sf.samplerate = lrint (srate) ;
+
+	psf_binheader_readf (psf, "mE44444", &desc.fmt_id, &desc.fmt_flags, &desc.pkt_bytes, &desc.pkt_frames,
+			&desc.channels_per_frame, &desc.bits_per_chan) ;
+	psf_log_printf (psf, "  Format id    : %M\n  Format flags : %x\n  Bytes / packet   : %u\n"
+			"  Frames / packet  : %u\n  Channels / frame : %u\n  Bits / channel   : %u\n",
+			desc.fmt_id, desc.fmt_flags, desc.pkt_bytes, desc.pkt_frames, desc.channels_per_frame, desc.bits_per_chan) ;
+
+	if (desc.channels_per_frame > SF_MAX_CHANNELS)
+	{	psf_log_printf (psf, "**** Bad channels per frame value %u.\n", desc.channels_per_frame) ;
+		return SFE_MALFORMED_FILE ;
+		} ;
+
+	if (chunk_size > SIGNED_SIZEOF (DESC_CHUNK))
+		psf_binheader_readf (psf, "j", (int) (chunk_size - sizeof (DESC_CHUNK))) ;
+
+	psf->sf.channels = desc.channels_per_frame ;
+
+	while (have_data == 0 && psf_ftell (psf) < psf->filelength - SIGNED_SIZEOF (marker))
+	{	psf_binheader_readf (psf, "mE8", &marker, &chunk_size) ;
+
+		switch (marker)
+		{	case peak_MARKER :
+				psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ;
+				if (chunk_size != CAF_PEAK_CHUNK_SIZE (psf->sf.channels))
+				{	psf_binheader_readf (psf, "j", (int) chunk_size) ;
+					psf_log_printf (psf, "*** File PEAK chunk %D should be %d.\n", chunk_size, CAF_PEAK_CHUNK_SIZE (psf->sf.channels)) ;
+					return SFE_CAF_BAD_PEAK ;
+					} ;
+
+				if ((psf->peak_info = peak_info_calloc (psf->sf.channels)) == NULL)
+					return SFE_MALLOC_FAILED ;
+
+				/* read in rest of PEAK chunk. */
+				psf_binheader_readf (psf, "E4", & (psf->peak_info->edit_number)) ;
+				psf_log_printf (psf, "  edit count : %d\n", psf->peak_info->edit_number) ;
+
+				psf_log_printf (psf, "     Ch   Position       Value\n") ;
+				for (k = 0 ; k < psf->sf.channels ; k++)
+				{	sf_count_t position ;
+					float value ;
+
+					psf_binheader_readf (psf, "Ef8", &value, &position) ;
+					psf->peak_info->peaks [k].value = value ;
+					psf->peak_info->peaks [k].position = position ;
+
+					snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), "    %2d   %-12" PRId64 "   %g\n", k, position, value) ;
+					psf_log_printf (psf, psf->u.cbuf) ;
+					} ;
+
+				psf->peak_info->peak_loc = SF_PEAK_START ;
+				break ;
+
+			case chan_MARKER :
+				if (chunk_size < 12)
+				{	psf_log_printf (psf, "%M : %D (should be >= 12)\n", marker, chunk_size) ;
+					psf_binheader_readf (psf, "j", (int) chunk_size) ;
+					break ;
+					}
+
+				psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ;
+
+				if ((error = caf_read_chanmap (psf, chunk_size)))
+					return error ;
+				break ;
+
+			case free_MARKER :
+				psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ;
+				psf_binheader_readf (psf, "j", (int) chunk_size) ;
+				break ;
+
+			case data_MARKER :
+				if (psf->filelength > 0 && chunk_size + psf->headindex != psf->filelength)
+					psf_log_printf (psf, "%M : %D (should be %D)\n", marker, chunk_size, chunk_size + 4) ;
+				else
+					psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ;
+				psf_binheader_readf (psf, "E4", &k) ;
+				psf_log_printf (psf, "  edit : %u\n", k) ;
+				have_data = 1 ;
+				break ;
+
+			default :
+				psf_log_printf (psf, " %M : %D (skipped)\n", marker, chunk_size) ;
+				psf_binheader_readf (psf, "j", (int) chunk_size) ;
+				break ;
+			} ;
+		} ;
+
+	if (have_data == 0)
+	{	psf_log_printf (psf, "**** Error, could not find 'data' chunk.\n") ;
+		return SFE_MALFORMED_FILE ;
+		} ;
+
+	psf_log_printf (psf, "End\n") ;
+
+	psf->dataoffset = psf_ftell (psf) ;
+	psf->datalength = psf->filelength - psf->dataoffset ;
+	psf->endian = (desc.fmt_flags & 2) ? SF_ENDIAN_LITTLE : SF_ENDIAN_BIG ;
+
+	if ((psf->sf.format = decode_desc_chunk (psf, &desc)) == 0)
+		return SFE_UNSUPPORTED_ENCODING ;
+
+	if (psf->bytewidth > 0)
+		psf->sf.frames = psf->datalength / psf->bytewidth ;
+
+	return 0 ;
+} /* caf_read_header */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+caf_write_header (SF_PRIVATE *psf, int calc_length)
+{	CAF_PRIVATE	*pcaf ;
+	DESC_CHUNK desc ;
+	sf_count_t current, free_len ;
+	int subformat ;
+
+	if ((pcaf = psf->container_data) == NULL)
+		return SFE_INTERNAL ;
+
+	memset (&desc, 0, sizeof (desc)) ;
+
+	current = psf_ftell (psf) ;
+
+	if (calc_length)
+	{	psf->filelength = psf_get_filelen (psf) ;
+
+		psf->datalength = psf->filelength - psf->dataoffset ;
+
+		if (psf->dataend)
+			psf->datalength -= psf->filelength - psf->dataend ;
+
+		if (psf->bytewidth > 0)
+			psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+		} ;
+
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	psf_fseek (psf, 0, SEEK_SET) ;
+
+	/* 'caff' marker, version and flags. */
+	psf_binheader_writef (psf, "Em22", caff_MARKER, 1, 0) ;
+
+	/* 'desc' marker and chunk size. */
+	psf_binheader_writef (psf, "Em8", desc_MARKER, (sf_count_t) (sizeof (DESC_CHUNK))) ;
+
+ 	double64_be_write (1.0 * psf->sf.samplerate, psf->u.ucbuf) ;
+	psf_binheader_writef (psf, "b", psf->u.ucbuf, make_size_t (8)) ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+
+	psf->endian = SF_ENDIAN (psf->sf.format) ;
+
+	if (CPU_IS_BIG_ENDIAN && (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU))
+		psf->endian = SF_ENDIAN_BIG ;
+	else if (CPU_IS_LITTLE_ENDIAN && (psf->endian == SF_ENDIAN_LITTLE || psf->endian == SF_ENDIAN_CPU))
+		psf->endian = SF_ENDIAN_LITTLE ;
+
+	if (psf->endian == SF_ENDIAN_LITTLE)
+		desc.fmt_flags = 2 ;
+	else
+		psf->endian = SF_ENDIAN_BIG ;
+
+	/* initial section (same for all, it appears) */
+	switch (subformat)
+	{	case SF_FORMAT_PCM_S8 :
+			desc.fmt_id = lpcm_MARKER ;
+			psf->bytewidth = 1 ;
+			desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
+			desc.pkt_frames = 1 ;
+			desc.channels_per_frame = psf->sf.channels ;
+			desc.bits_per_chan = 8 ;
+			break ;
+
+		case SF_FORMAT_PCM_16 :
+			desc.fmt_id = lpcm_MARKER ;
+			psf->bytewidth = 2 ;
+			desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
+			desc.pkt_frames = 1 ;
+			desc.channels_per_frame = psf->sf.channels ;
+			desc.bits_per_chan = 16 ;
+			break ;
+
+		case SF_FORMAT_PCM_24 :
+			psf->bytewidth = 3 ;
+			desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
+			desc.pkt_frames = 1 ;
+			desc.channels_per_frame = psf->sf.channels ;
+			desc.bits_per_chan = 24 ;
+			desc.fmt_id = lpcm_MARKER ;
+			break ;
+
+		case SF_FORMAT_PCM_32 :
+			desc.fmt_id = lpcm_MARKER ;
+			psf->bytewidth = 4 ;
+			desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
+			desc.pkt_frames = 1 ;
+			desc.channels_per_frame = psf->sf.channels ;
+			desc.bits_per_chan = 32 ;
+			break ;
+
+		case SF_FORMAT_FLOAT :
+			desc.fmt_id = lpcm_MARKER ;
+			desc.fmt_flags |= 1 ;
+			psf->bytewidth = 4 ;
+			desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
+			desc.pkt_frames = 1 ;
+			desc.channels_per_frame = psf->sf.channels ;
+			desc.bits_per_chan = 32 ;
+			break ;
+
+		case SF_FORMAT_DOUBLE :
+			desc.fmt_id = lpcm_MARKER ;
+			desc.fmt_flags |= 1 ;
+			psf->bytewidth = 8 ;
+			desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
+			desc.pkt_frames = 1 ;
+			desc.channels_per_frame = psf->sf.channels ;
+			desc.bits_per_chan = 64 ;
+			break ;
+
+		case SF_FORMAT_ALAW :
+			desc.fmt_id = alaw_MARKER ;
+			psf->bytewidth = 1 ;
+			desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
+			desc.pkt_frames = 1 ;
+			desc.channels_per_frame = psf->sf.channels ;
+			desc.bits_per_chan = 8 ;
+			break ;
+
+		case SF_FORMAT_ULAW :
+			desc.fmt_id = ulaw_MARKER ;
+			psf->bytewidth = 1 ;
+			desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
+			desc.pkt_frames = 1 ;
+			desc.channels_per_frame = psf->sf.channels ;
+			desc.bits_per_chan = 8 ;
+			break ;
+
+		default :
+			return SFE_UNIMPLEMENTED ;
+		} ;
+
+	psf_binheader_writef (psf, "mE44444", desc.fmt_id, desc.fmt_flags, desc.pkt_bytes, desc.pkt_frames, desc.channels_per_frame, desc.bits_per_chan) ;
+
+#if 0
+	if (psf->str_flags & SF_STR_LOCATE_START)
+		caf_write_strings (psf, SF_STR_LOCATE_START) ;
+#endif
+
+	if (psf->peak_info != NULL)
+	{	int k ;
+		psf_binheader_writef (psf, "Em84", peak_MARKER, (sf_count_t) CAF_PEAK_CHUNK_SIZE (psf->sf.channels), psf->peak_info->edit_number) ;
+		for (k = 0 ; k < psf->sf.channels ; k++)
+			psf_binheader_writef (psf, "Ef8", (float) psf->peak_info->peaks [k].value, psf->peak_info->peaks [k].position) ;
+		} ;
+
+	if (psf->channel_map && pcaf->chanmap_tag)
+		psf_binheader_writef (psf, "Em8444", chan_MARKER, (sf_count_t) 12, pcaf->chanmap_tag, 0, 0) ;
+
+	/* Add free chunk so that the actual audio data starts at a multiple 0x1000. */
+	free_len = 0x1000 - psf->headindex - 16 - 12 ;
+	while (free_len < 0)
+		free_len += 0x1000 ;
+	psf_binheader_writef (psf, "Em8z", free_MARKER, free_len, (int) free_len) ;
+
+	psf_binheader_writef (psf, "Em84", data_MARKER, psf->datalength + 4, 0) ;
+
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+	if (psf->error)
+		return psf->error ;
+
+	psf->dataoffset = psf->headindex ;
+	if (current < psf->dataoffset)
+		psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+	else if (current > 0)
+		psf_fseek (psf, current, SEEK_SET) ;
+
+	return psf->error ;
+} /* caf_write_header */
+
+static int
+caf_read_chanmap (SF_PRIVATE * psf, sf_count_t chunk_size)
+{	const AIFF_CAF_CHANNEL_MAP * map_info ;
+	unsigned channel_bitmap, channel_decriptions, bytesread ;
+	int layout_tag ;
+
+	bytesread = psf_binheader_readf (psf, "E444", &layout_tag, &channel_bitmap, &channel_decriptions) ;
+
+	map_info = aiff_caf_of_channel_layout_tag (layout_tag) ;
+
+	psf_log_printf (psf, "  Tag    : %x\n", layout_tag) ;
+	if (map_info)
+		psf_log_printf (psf, "  Layout : %s\n", map_info->name) ;
+
+	if (bytesread < chunk_size)
+		psf_binheader_readf (psf, "j", chunk_size - bytesread) ;
+
+	if (map_info->channel_map != NULL)
+	{	size_t chanmap_size = psf->sf.channels * sizeof (psf->channel_map [0]) ;
+
+		free (psf->channel_map) ;
+
+		if ((psf->channel_map = malloc (chanmap_size)) == NULL)
+			return SFE_MALLOC_FAILED ;
+
+		memcpy (psf->channel_map, map_info->channel_map, chanmap_size) ;
+		} ;
+
+	return 0 ;
+} /* caf_read_chanmap */
+
diff --git a/jni/libsndfile-1.0.25/src/caf.lo b/jni/libsndfile-1.0.25/src/caf.lo
new file mode 100644
index 0000000..02f03bd
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/caf.lo
@@ -0,0 +1,12 @@
+# caf.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/caf.o'
+
+# Name of the non-PIC object
+non_pic_object='caf.o'
+
diff --git a/jni/libsndfile-1.0.25/src/caf.o b/jni/libsndfile-1.0.25/src/caf.o
new file mode 100644
index 0000000..7440a23
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/caf.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/chanmap.c b/jni/libsndfile-1.0.25/src/chanmap.c
new file mode 100644
index 0000000..9a9f7f0
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/chanmap.c
@@ -0,0 +1,262 @@
+/*
+** Copyright (C) 2009-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/*
+**	Mostly from "Apple Core Audio Format Specification 1.0":
+**
+**		http://developer.apple.com/documentation/MusicAudio/Reference/CAFSpec/CAFSpec.pdf
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "sndfile.h"
+#include "common.h"
+#include "chanmap.h"
+
+
+static const AIFF_CAF_CHANNEL_MAP zero_chan [] =
+{	{	(0 << 16) | 0, NULL, "Use channel descriptions." },
+	{	(1 << 16) | 0, NULL, "Use channel bitmap." }
+} ; /* zero_chan */
+
+
+static const int one_chan_mono [1] = {	SF_CHANNEL_MAP_MONO } ;
+
+static const AIFF_CAF_CHANNEL_MAP one_chan [] =
+{	{	(100 << 16) | 1, one_chan_mono, "mono" }
+} ; /* one_chan */
+
+
+static const int two_channel_stereo [2] = {	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT } ;
+
+static const AIFF_CAF_CHANNEL_MAP two_chan [] =
+{	{	(101 << 16) | 2, two_channel_stereo, "stereo (L, R)" },
+	{	(102 << 16) | 2, two_channel_stereo, "stereo headphones (L, R)" },
+#if 0
+	{	(103 << 16) | 2, NULL, "matrix stereo (Lt, Rt)" },
+	{	(104 << 16) | 2, NULL, "2 channels (mid, side)" },
+	{	(105 << 16) | 2, NULL, "coincident mic pair" },
+	{	(106 << 16) | 2, NULL, "binaural stereo (L, R)"
+		}
+#endif
+} ; /* two_chan */
+
+
+static const int three_channel_mpeg_30a [3] =
+	{	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER } ;
+static const int three_channel_mpeg_30b [3] =
+	{	SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT } ;
+static const int three_channel_itu_21 [3] =
+	{	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_CENTER } ;
+static const int three_channel_dvd_4 [3] =
+	{	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_LFE } ;
+
+static const AIFF_CAF_CHANNEL_MAP three_chan [] =
+{	{	(113 << 16) | 3, three_channel_mpeg_30a, "MPEG 3 0 A (L, R, C)" },
+	{	(114 << 16) | 3, three_channel_mpeg_30b, "MPEG 3 0 B (C, L, R)" },
+	{	(131 << 16) | 3, three_channel_itu_21, "ITU 2.1 (L, R, Cs)" },
+	{	(133 << 16) | 3, three_channel_dvd_4, "DVD 4 (L, R, LFE)" }
+} ; /* three_chan */
+
+
+static const int four_channel_ambisonc_b [4] =
+	{	SF_CHANNEL_MAP_AMBISONIC_B_W, SF_CHANNEL_MAP_AMBISONIC_B_X, SF_CHANNEL_MAP_AMBISONIC_B_Y, SF_CHANNEL_MAP_AMBISONIC_B_Z } ;
+static const int four_channel_quad [4] =
+	{	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ;
+static const int four_channel_mpeg_40a [4] =
+	{	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_REAR_CENTER } ;
+static const int four_channel_mpeg_40b [4] =
+	{	SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_CENTER } ;
+static const int four_channel_itu_23 [4] =
+	{	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ;
+static const int four_channel_dvd_5 [4] =
+	{	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_LFE, SF_CHANNEL_MAP_REAR_CENTER } ;
+static const int four_channel_dvd_10 [4] =
+	{	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LFE } ;
+
+static const AIFF_CAF_CHANNEL_MAP four_chan [] =
+{	{	(107 << 16) | 4, four_channel_ambisonc_b, "ambisonic B (W,  X, Y, Z)" },
+	{	(108 << 16) | 4, four_channel_quad, "quad (Lfront, Rfront, Lrear, Rrear)" },
+	{	(115 << 16) | 4, four_channel_mpeg_40a, "MPEG 4.0 A (L, R, C, Cs)" },
+	{	(116 << 16) | 4, four_channel_mpeg_40b, "MPEG 4.0 B (C, L, R, Cs)" },
+	{	(132 << 16) | 4, four_channel_itu_23, "ITU 2.3 (L, R, Ls, Rs)" },
+	{	(134 << 16) | 4, four_channel_dvd_5, "DVD 5 (L, R, LFE, Cs)" },
+	{	(136 << 16) | 4, four_channel_dvd_10, "DVD 10 (L, R, C, LFE)" }
+} ; /* four_chan */
+
+
+static const int five_channel_pentagonal [5] =
+	{	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_CENTER } ;
+static const int five_channel_mpeg_50_a [5] =
+	{	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ;
+static const int five_channel_mpeg_50_b [5] =
+	{	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_CENTER } ;
+static const int five_channel_mpeg_50_c [5] =
+	{	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ;
+static const int five_channel_mpeg_50_d [5] =
+	{	SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ;
+static const int five_channel_dvd_6 [5] =
+	{	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_LFE, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ;
+static const int five_channel_dvd_11 [5] =
+	{	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LFE, SF_CHANNEL_MAP_REAR_CENTER } ;
+static const int five_channel_dvd_18 [5] =
+	{	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_LFE } ;
+
+static const AIFF_CAF_CHANNEL_MAP five_chan [] =
+{	{	(109 << 16) | 5, five_channel_pentagonal, "pentagonal (L,  R, Lrear, Rrear, C)" },
+	{	(117 << 16) | 5, five_channel_mpeg_50_a, "MPEG 5.0 A (L, R, C, Ls, Rs)" },
+	{	(118 << 16) | 5, five_channel_mpeg_50_b, "MPEG 5.0 B (L, R, Ls, Rs, C)" },
+	{	(119 << 16) | 5, five_channel_mpeg_50_c, "MPEG 5.0 C (L, C, R, Ls, Rs,)" },
+	{	(120 << 16) | 5, five_channel_mpeg_50_d, "MPEG 5.0 D (C, L, R, Ls, Rs)" },
+	{	(135 << 16) | 5, five_channel_dvd_6, "DVD 6 (L, R, LFE, Ls, Rs)" },
+	{	(137 << 16) | 5, five_channel_dvd_11, "DVD 11 (L, R, C, LFE, Cs)" },
+	{	(138 << 16) | 5, five_channel_dvd_18, "DVD 18 (L, R, Ls, Rs, LFE)" }
+} ; /* five_chan */
+
+
+static const int six_channel_mpeg_51_a [6] =
+	{	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LFE, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ;
+static const int six_channel_mpeg_51_b [6] =
+	{	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LFE } ;
+static const int six_channel_mpeg_51_c [6] =
+	{	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_LFE } ;
+static const int six_channel_mpeg_51_d [6] =
+	{	SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_LFE } ;
+static const int six_channel_audio_unit_60 [6] =
+	{	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_REAR_CENTER } ;
+static const int six_channel_aac_60 [6] =
+	{	SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_REAR_CENTER } ;
+
+static const AIFF_CAF_CHANNEL_MAP six_chan [] =
+{	{	(110 << 16) | 6, NULL, "hexagonal (L, R, Lr, Rr, C, Rear)" },
+	{	(121 << 16) | 6, six_channel_mpeg_51_a, "MPEG 5.1 A (L, R, C, LFE, Ls, Rs)" },
+	{	(122 << 16) | 6, six_channel_mpeg_51_b, "MPEG 5.1 B (L, R, Ls, Rs, C, LFE)" },
+	{	(123 << 16) | 6, six_channel_mpeg_51_c, "MPEG 5.1 C (L, C, R, Ls, Rs, LFE)" },
+	{	(124 << 16) | 6, six_channel_mpeg_51_d, "MPEG 5.1 D (C, L, R, Ls, Rs, LFE)" },
+	{	(139 << 16) | 6, six_channel_audio_unit_60, "AudioUnit 6.0 (L, R, Ls, Rs, C, Cs)" },
+	{	(141 << 16) | 6, six_channel_aac_60, "AAC 6.0 (C, L, R, Ls, Rs, Cs)" }
+} ; /* six_chan */
+
+
+static const int six_channel_mpeg_61a [7] =
+	{	SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LFE, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_REAR_CENTER } ;
+static const int six_channel_aac_61 [7] =
+	{	SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_REAR_CENTER, SF_CHANNEL_MAP_LFE } ;
+
+static const AIFF_CAF_CHANNEL_MAP seven_chan [] =
+{	{	(125 << 16) | 7, six_channel_mpeg_61a, "MPEG 6.1 A (L, R, C, LFE, Ls, Rs, Cs)" },
+	{	(140 << 16) | 7, NULL, "AudioUnit 7.0 (L, R, Ls, Rs, C, Rls, Rrs)" },
+	{	(142 << 16) | 7, six_channel_aac_61, "AAC 6.1 (C, L, R, Ls, Rs, Cs, Lfe)" },
+	{	(143 << 16) | 7, NULL, "AAC 7.0 (C, L, R, Ls, Rs, Rls, Rrs,)" }
+} ; /* seven_chan */
+
+
+static const AIFF_CAF_CHANNEL_MAP eight_chan [] =
+{	{	(111 << 16) | 8, NULL,
+		// front left, front right, rear left, rear right,
+		// front center, rear center, side left, side right
+		"octagonal (Lf, Rf, Lr, Rr, Cf, Cr, Ls, Rs)"
+		},
+	{	(112 << 16) | 8, NULL,
+		// left, right, rear left, rear right
+		// top left, top right, top rear left, top rear right
+		"cube (L, R, Lrear, Rrear, Ltop, Rtop, Ltoprear, Rtoprear)"
+		},
+	{	(126 << 16) | 8, NULL, "MPEG 7.1 A (L, R, C, LFE, Ls, Rs, Lc, Rc)" },
+	{	(127 << 16) | 8, NULL, "MPEG 7.1 B (C, Lc, Rc, L, R, Ls, Rs, LFE)" },
+	{	(128 << 16) | 8, NULL, "MPEG 7.1 C (L, R, C, LFE, Ls, R, Rls, Rrs)" },
+	{	(129 << 16) | 8, NULL, "Emagic Default 7.1 (L, R, Ls, Rs, C, LFE, Lc, Rc)" },
+	{	(130 << 16) | 8, NULL,
+		// (ITU_5_1 plus a matrix encoded stereo mix)
+		"SMPTE DTV (L, R, C, LFE, Ls, Rs, Lt, Rt)"
+		},
+	{	(144 << 16) | 8, NULL, "AAC octagonal (C, L, R, Ls, Rs, Rls, Rrs, Cs)" }
+} ; /* eight_chan */
+
+
+
+#if 0
+
+TMH_10_2_std = (145 << 16) | 16,
+// L R C Vhc Lsd Rsd Ls Rs Vhl Vhr Lw Rw Csd Cs LFE1 LFE2
+
+TMH_10_2_full = (146 << 16) | 21,
+// TMH_10_2_std plus: Lc Rc HI VI Haptic
+
+#endif
+
+
+typedef struct
+{	const AIFF_CAF_CHANNEL_MAP * map ;
+	int len ;
+} MAP_MAP ;
+
+static const MAP_MAP map [] =
+{	{ zero_chan,	ARRAY_LEN (zero_chan) },
+	{ one_chan,		ARRAY_LEN (one_chan) },
+	{ two_chan,		ARRAY_LEN (two_chan) },
+	{ three_chan,	ARRAY_LEN (three_chan) },
+	{ four_chan,	ARRAY_LEN (four_chan) },
+	{ five_chan,	ARRAY_LEN (five_chan) },
+	{ six_chan,		ARRAY_LEN (six_chan) },
+	{ seven_chan,	ARRAY_LEN (seven_chan) },
+	{ eight_chan,	ARRAY_LEN (eight_chan) }
+} ; /* map */
+
+
+int
+aiff_caf_find_channel_layout_tag (const int *chan_map, int channels)
+{	const AIFF_CAF_CHANNEL_MAP * curr_map ;
+	unsigned k, len ;
+
+	if (channels < 1 || channels > ARRAY_LEN (map))
+		return 0 ;
+
+	curr_map = map [channels].map ;
+	len = map [channels].len ;
+
+	for (k = 0 ; k < len ; k++)
+		if (curr_map [k].channel_map != NULL)
+			if (memcmp (chan_map, curr_map [k].channel_map, channels * sizeof (chan_map [0])) == 0)
+				return curr_map [k].channel_layout_tag ;
+
+	return 0 ;
+} /* aiff_caf_find_channel_layout_tag */
+
+const AIFF_CAF_CHANNEL_MAP *
+aiff_caf_of_channel_layout_tag (int tag)
+{	const AIFF_CAF_CHANNEL_MAP * curr_map ;
+	unsigned k, len ;
+	int channels = tag & 0xffff ;
+
+	if (channels < 0 || channels > ARRAY_LEN (map))
+		return NULL ;
+
+	curr_map = map [channels].map ;
+	len = map [channels].len ;
+
+	for (k = 0 ; k < len ; k++)
+		if (curr_map [k].channel_layout_tag == tag)
+			return curr_map + k ;
+
+	return NULL ;
+} /* aiff_caf_of_channel_layout_tag */
diff --git a/jni/libsndfile-1.0.25/src/chanmap.h b/jni/libsndfile-1.0.25/src/chanmap.h
new file mode 100644
index 0000000..8af409d
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/chanmap.h
@@ -0,0 +1,32 @@
+/*
+** Copyright (C) 2009-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+typedef struct
+{	/* The tag in the AIFF or CAF file. */
+	int channel_layout_tag ;
+
+	/* The equivalent array of SF_CHANNEL_MAP_* entries. */
+	const int * channel_map ;
+
+	const char * name ;
+} AIFF_CAF_CHANNEL_MAP ;
+
+
+int aiff_caf_find_channel_layout_tag (const int *chan_map, int channels) ;
+
+const AIFF_CAF_CHANNEL_MAP * aiff_caf_of_channel_layout_tag (int tag) ;
diff --git a/jni/libsndfile-1.0.25/src/chanmap.lo b/jni/libsndfile-1.0.25/src/chanmap.lo
new file mode 100644
index 0000000..aa11437
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/chanmap.lo
@@ -0,0 +1,12 @@
+# chanmap.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/chanmap.o'
+
+# Name of the non-PIC object
+non_pic_object='chanmap.o'
+
diff --git a/jni/libsndfile-1.0.25/src/chanmap.o b/jni/libsndfile-1.0.25/src/chanmap.o
new file mode 100644
index 0000000..1ea23b2
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/chanmap.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/chunk.c b/jni/libsndfile-1.0.25/src/chunk.c
new file mode 100644
index 0000000..dc17aae
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/chunk.c
@@ -0,0 +1,54 @@
+/*
+** Copyright (C) 2008-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdlib.h>
+#include	<string.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+
+void
+pchk4_store (PRIV_CHUNK4 * pchk, int marker, sf_count_t offset, sf_count_t len)
+{
+	if (pchk->count >= ARRAY_LEN (pchk->l))
+		return ;
+
+	pchk->l [pchk->count].chunk = marker ;
+	pchk->l [pchk->count].offset = offset ;
+	pchk->l [pchk->count].len = len ;
+
+	pchk->count ++ ;
+
+	return ;
+} /* pchk4_store */
+
+int
+pchk4_find (PRIV_CHUNK4 * pchk, int marker)
+{	int k ;
+
+	for (k = 0 ; k < pchk->count ; k++)
+		if (pchk->l [k].chunk == marker)
+			return k ;
+
+	return -1 ;
+} /* pchk4_find */
+
diff --git a/jni/libsndfile-1.0.25/src/chunk.lo b/jni/libsndfile-1.0.25/src/chunk.lo
new file mode 100644
index 0000000..abd451e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/chunk.lo
@@ -0,0 +1,12 @@
+# chunk.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/chunk.o'
+
+# Name of the non-PIC object
+non_pic_object='chunk.o'
+
diff --git a/jni/libsndfile-1.0.25/src/chunk.o b/jni/libsndfile-1.0.25/src/chunk.o
new file mode 100644
index 0000000..63cb0ad
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/chunk.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/command.c b/jni/libsndfile-1.0.25/src/command.c
new file mode 100644
index 0000000..aae2a27
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/command.c
@@ -0,0 +1,376 @@
+/*
+** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<string.h>
+#include	<math.h>
+
+#include	"sndfile.h"
+#include	"common.h"
+
+static SF_FORMAT_INFO const simple_formats [] =
+{
+	{	SF_FORMAT_AIFF | SF_FORMAT_PCM_16,
+		"AIFF (Apple/SGI 16 bit PCM)", "aiff"
+		},
+
+	{	SF_FORMAT_AIFF | SF_FORMAT_FLOAT,
+		"AIFF (Apple/SGI 32 bit float)", "aifc"
+		},
+
+	{	SF_FORMAT_AIFF | SF_FORMAT_PCM_S8,
+		"AIFF (Apple/SGI 8 bit PCM)", "aiff"
+		},
+
+	{	SF_FORMAT_AU | SF_FORMAT_PCM_16,
+		"AU (Sun/Next 16 bit PCM)", "au"
+		},
+
+	{	SF_FORMAT_AU | SF_FORMAT_ULAW,
+		"AU (Sun/Next 8-bit u-law)", "au"
+		},
+
+	{	SF_FORMAT_CAF | SF_FORMAT_PCM_16,
+		"CAF (Apple 16 bit PCM)", "caf"
+		},
+
+#if HAVE_EXTERNAL_LIBS
+	{	SF_FORMAT_FLAC | SF_FORMAT_PCM_16,
+		"FLAC 16 bit", "flac"
+		},
+#endif
+
+	{	SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM,
+		"OKI Dialogic VOX ADPCM", "vox"
+		},
+
+#if HAVE_EXTERNAL_LIBS
+	{	SF_FORMAT_OGG | SF_FORMAT_VORBIS,
+		"Ogg Vorbis (Xiph Foundation)", "oga"
+		},
+#endif
+
+	{	SF_FORMAT_WAV | SF_FORMAT_PCM_16,
+		"WAV (Microsoft 16 bit PCM)", "wav"
+		},
+
+	{	SF_FORMAT_WAV | SF_FORMAT_FLOAT,
+		"WAV (Microsoft 32 bit float)", "wav"
+		},
+
+	{	SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM,
+		"WAV (Microsoft 4 bit IMA ADPCM)", "wav"
+		},
+
+	{	SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM,
+		"WAV (Microsoft 4 bit MS ADPCM)", "wav"
+		},
+
+	{	SF_FORMAT_WAV | SF_FORMAT_PCM_U8,
+		"WAV (Microsoft 8 bit PCM)", "wav"
+		},
+
+} ; /* simple_formats */
+
+int
+psf_get_format_simple_count	(void)
+{	return (sizeof (simple_formats) / sizeof (SF_FORMAT_INFO)) ;
+} /* psf_get_format_simple_count */
+
+int
+psf_get_format_simple (SF_FORMAT_INFO *data)
+{	int indx ;
+
+	if (data->format < 0 || data->format >= (SIGNED_SIZEOF (simple_formats) / SIGNED_SIZEOF (SF_FORMAT_INFO)))
+		return SFE_BAD_COMMAND_PARAM ;
+
+	indx = data->format ;
+	memcpy (data, &(simple_formats [indx]), SIGNED_SIZEOF (SF_FORMAT_INFO)) ;
+
+	return 0 ;
+} /* psf_get_format_simple */
+
+/*============================================================================
+** Major format info.
+*/
+
+static SF_FORMAT_INFO const major_formats [] =
+{
+	{	SF_FORMAT_AIFF,		"AIFF (Apple/SGI)",						"aiff" 	},
+	{	SF_FORMAT_AU,		"AU (Sun/NeXT)", 						"au"	},
+	{	SF_FORMAT_AVR,		"AVR (Audio Visual Research)",	 		"avr"	},
+	{	SF_FORMAT_CAF,		"CAF (Apple Core Audio File)",	 		"caf"	},
+#if HAVE_EXTERNAL_LIBS
+	{	SF_FORMAT_FLAC,		"FLAC (FLAC Lossless Audio Codec)",	 	"flac"	},
+#endif
+	{	SF_FORMAT_HTK,		"HTK (HMM Tool Kit)",					"htk"	},
+	{	SF_FORMAT_SVX,		"IFF (Amiga IFF/SVX8/SV16)",			"iff"	},
+	{	SF_FORMAT_MAT4,		"MAT4 (GNU Octave 2.0 / Matlab 4.2)",	"mat"	},
+	{	SF_FORMAT_MAT5,		"MAT5 (GNU Octave 2.1 / Matlab 5.0)",	"mat"	},
+	{	SF_FORMAT_MPC2K,	"MPC (Akai MPC 2k)",					"mpc"	},
+#if HAVE_EXTERNAL_LIBS
+	{	SF_FORMAT_OGG,		"OGG (OGG Container format)",		 	"oga"	},
+#endif
+	{	SF_FORMAT_PAF,		"PAF (Ensoniq PARIS)", 					"paf"	},
+	{	SF_FORMAT_PVF,		"PVF (Portable Voice Format)",			"pvf"	},
+	{	SF_FORMAT_RAW,		"RAW (header-less)",				 	"raw"	},
+	{	SF_FORMAT_RF64,		"RF64 (RIFF 64)",						"rf64"	},
+	{	SF_FORMAT_SD2,		"SD2 (Sound Designer II)", 				"sd2"	},
+	{	SF_FORMAT_SDS,		"SDS (Midi Sample Dump Standard)", 		"sds"	},
+	{	SF_FORMAT_IRCAM,	"SF (Berkeley/IRCAM/CARL)",				"sf"	},
+	{	SF_FORMAT_VOC,		"VOC (Creative Labs)",					"voc"	},
+	{	SF_FORMAT_W64,		"W64 (SoundFoundry WAVE 64)",			"w64"	},
+	{	SF_FORMAT_WAV,		"WAV (Microsoft)",						"wav"	},
+	{	SF_FORMAT_NIST,		"WAV (NIST Sphere)",	 				"wav"	},
+	{	SF_FORMAT_WAVEX,	"WAVEX (Microsoft)",					"wav"	},
+	{	SF_FORMAT_WVE,		"WVE (Psion Series 3)",					"wve"	},
+	{	SF_FORMAT_XI,		"XI (FastTracker 2)",					"xi"	},
+
+} ; /* major_formats */
+
+int
+psf_get_format_major_count	(void)
+{	return (sizeof (major_formats) / sizeof (SF_FORMAT_INFO)) ;
+} /* psf_get_format_major_count */
+
+int
+psf_get_format_major (SF_FORMAT_INFO *data)
+{	int indx ;
+
+	if (data->format < 0 || data->format >= (SIGNED_SIZEOF (major_formats) / SIGNED_SIZEOF (SF_FORMAT_INFO)))
+		return SFE_BAD_COMMAND_PARAM ;
+
+	indx = data->format ;
+	memcpy (data, &(major_formats [indx]), SIGNED_SIZEOF (SF_FORMAT_INFO)) ;
+
+	return 0 ;
+} /* psf_get_format_major */
+
+/*============================================================================
+** Subtype format info.
+*/
+
+static SF_FORMAT_INFO subtype_formats [] =
+{
+	{	SF_FORMAT_PCM_S8,		"Signed 8 bit PCM",		NULL 	},
+	{	SF_FORMAT_PCM_16,		"Signed 16 bit PCM",	NULL 	},
+	{	SF_FORMAT_PCM_24,		"Signed 24 bit PCM",	NULL 	},
+	{	SF_FORMAT_PCM_32,		"Signed 32 bit PCM",	NULL 	},
+
+	{	SF_FORMAT_PCM_U8,		"Unsigned 8 bit PCM",	NULL 	},
+
+	{	SF_FORMAT_FLOAT,		"32 bit float",			NULL 	},
+	{	SF_FORMAT_DOUBLE,		"64 bit float",			NULL 	},
+
+	{	SF_FORMAT_ULAW,			"U-Law",				NULL 	},
+	{	SF_FORMAT_ALAW,			"A-Law",				NULL 	},
+	{	SF_FORMAT_IMA_ADPCM,	"IMA ADPCM",			NULL 	},
+	{	SF_FORMAT_MS_ADPCM,		"Microsoft ADPCM",		NULL 	},
+
+	{	SF_FORMAT_GSM610,		"GSM 6.10",				NULL 	},
+
+	{	SF_FORMAT_G721_32,		"32kbs G721 ADPCM",		NULL 	},
+	{	SF_FORMAT_G723_24,		"24kbs G723 ADPCM",		NULL 	},
+
+	{	SF_FORMAT_DWVW_12,		"12 bit DWVW",			NULL 	},
+	{	SF_FORMAT_DWVW_16,		"16 bit DWVW",			NULL 	},
+	{	SF_FORMAT_DWVW_24,		"24 bit DWVW",			NULL 	},
+	{	SF_FORMAT_VOX_ADPCM,	"VOX ADPCM",			"vox" 	},
+
+	{	SF_FORMAT_DPCM_16,		"16 bit DPCM",			NULL 	},
+	{	SF_FORMAT_DPCM_8,		"8 bit DPCM",			NULL 	},
+
+#if HAVE_EXTERNAL_LIBS
+	{	SF_FORMAT_VORBIS,		"Vorbis",				NULL 	},
+#endif
+} ; /* subtype_formats */
+
+int
+psf_get_format_subtype_count	(void)
+{	return (sizeof (subtype_formats) / sizeof (SF_FORMAT_INFO)) ;
+} /* psf_get_format_subtype_count */
+
+int
+psf_get_format_subtype (SF_FORMAT_INFO *data)
+{	int indx ;
+
+	if (data->format < 0 || data->format >= (SIGNED_SIZEOF (subtype_formats) / SIGNED_SIZEOF (SF_FORMAT_INFO)))
+		return SFE_BAD_COMMAND_PARAM ;
+
+	indx = data->format ;
+	memcpy (data, &(subtype_formats [indx]), sizeof (SF_FORMAT_INFO)) ;
+
+	return 0 ;
+} /* psf_get_format_subtype */
+
+/*==============================================================================
+*/
+
+int
+psf_get_format_info (SF_FORMAT_INFO *data)
+{	int k, format ;
+
+	if (SF_CONTAINER (data->format))
+	{	format = SF_CONTAINER (data->format) ;
+
+		for (k = 0 ; k < (SIGNED_SIZEOF (major_formats) / SIGNED_SIZEOF (SF_FORMAT_INFO)) ; k++)
+		{	if (format == major_formats [k].format)
+			{	memcpy (data, &(major_formats [k]), sizeof (SF_FORMAT_INFO)) ;
+				return 0 ;
+				} ;
+			} ;
+		}
+	else if (SF_CODEC (data->format))
+	{	format = SF_CODEC (data->format) ;
+
+		for (k = 0 ; k < (SIGNED_SIZEOF (subtype_formats) / SIGNED_SIZEOF (SF_FORMAT_INFO)) ; k++)
+		{	if (format == subtype_formats [k].format)
+			{	memcpy (data, &(subtype_formats [k]), sizeof (SF_FORMAT_INFO)) ;
+				return 0 ;
+				} ;
+			} ;
+		} ;
+
+	memset (data, 0, sizeof (SF_FORMAT_INFO)) ;
+
+	return SFE_BAD_COMMAND_PARAM ;
+} /* psf_get_format_info */
+
+/*==============================================================================
+*/
+
+double
+psf_calc_signal_max (SF_PRIVATE *psf, int normalize)
+{	sf_count_t	position ;
+	double 		max_val, temp, *data ;
+	int			k, len, readcount, save_state ;
+
+	/* 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	0.0 ;
+		} ;
+
+	save_state = sf_command ((SNDFILE*) psf, SFC_GET_NORM_DOUBLE, NULL, 0) ;
+	sf_command ((SNDFILE*) psf, SFC_SET_NORM_DOUBLE, NULL, normalize) ;
+
+	/* Brute force. Read the whole file and find the biggest sample. */
+	/* Get current position in file */
+	position = sf_seek ((SNDFILE*) psf, 0, SEEK_CUR) ;
+	/* Go to start of file. */
+	sf_seek ((SNDFILE*) psf, 0, SEEK_SET) ;
+
+	data = psf->u.dbuf ;
+	len = ARRAY_LEN (psf->u.dbuf) ;
+
+	for (readcount = 1, max_val = 0.0 ; readcount > 0 ; /* nothing */)
+	{	readcount = sf_read_double ((SNDFILE*) psf, data, len) ;
+		for (k = 0 ; k < readcount ; k++)
+		{	temp = fabs (data [k]) ;
+			max_val = temp > max_val ? temp : max_val ;
+			} ;
+		} ;
+
+	/* Return to SNDFILE to original state. */
+	sf_seek ((SNDFILE*) psf, position, SEEK_SET) ;
+	sf_command ((SNDFILE*) psf, SFC_SET_NORM_DOUBLE, NULL, save_state) ;
+
+	return	max_val ;
+} /* psf_calc_signal_max */
+
+int
+psf_calc_max_all_channels (SF_PRIVATE *psf, double *peaks, int normalize)
+{	sf_count_t	position ;
+	double 		temp, *data ;
+	int			k, len, readcount, save_state ;
+	int			chan ;
+
+	/* If the file is not seekable, there is nothing we can do. */
+	if (! psf->sf.seekable)
+		return (psf->error = SFE_NOT_SEEKABLE) ;
+
+	if (! psf->read_double)
+		return (psf->error = SFE_UNIMPLEMENTED) ;
+
+	save_state = sf_command ((SNDFILE*) psf, SFC_GET_NORM_DOUBLE, NULL, 0) ;
+	sf_command ((SNDFILE*) psf, SFC_SET_NORM_DOUBLE, NULL, normalize) ;
+
+	memset (peaks, 0, sizeof (double) * psf->sf.channels) ;
+
+	/* Brute force. Read the whole file and find the biggest sample for each channel. */
+	position = sf_seek ((SNDFILE*) psf, 0, SEEK_CUR) ; /* Get current position in file */
+	sf_seek ((SNDFILE*) psf, 0, SEEK_SET) ;			/* Go to start of file. */
+
+	len = ARRAY_LEN (psf->u.dbuf) ;
+
+	data = psf->u.dbuf ;
+
+	chan = 0 ;
+	readcount = len ;
+	while (readcount > 0)
+	{	readcount = sf_read_double ((SNDFILE*) psf, data, len) ;
+		for (k = 0 ; k < readcount ; k++)
+		{	temp = fabs (data [k]) ;
+			peaks [chan] = temp > peaks [chan] ? temp : peaks [chan] ;
+			chan = (chan + 1) % psf->sf.channels ;
+			} ;
+		} ;
+
+	sf_seek ((SNDFILE*) psf, position, SEEK_SET) ;		/* Return to original position. */
+
+	sf_command ((SNDFILE*) psf, SFC_SET_NORM_DOUBLE, NULL, save_state) ;
+
+	return	0 ;
+} /* psf_calc_max_all_channels */
+
+int
+psf_get_signal_max (SF_PRIVATE *psf, double *peak)
+{	int k ;
+
+	if (psf->peak_info == NULL)
+		return SF_FALSE ;
+
+	peak [0] = psf->peak_info->peaks [0].value ;
+
+	for (k = 1 ; k < psf->sf.channels ; k++)
+		peak [0] = SF_MAX (peak [0], psf->peak_info->peaks [k].value) ;
+
+	return SF_TRUE ;
+} /* psf_get_signal_max */
+
+int
+psf_get_max_all_channels (SF_PRIVATE *psf, double *peaks)
+{	int k ;
+
+	if (psf->peak_info == NULL)
+		return SF_FALSE ;
+
+	for (k = 0 ; k < psf->sf.channels ; k++)
+		peaks [k] = psf->peak_info->peaks [k].value ;
+
+	return SF_TRUE ;
+} /* psf_get_max_all_channels */
+
+
diff --git a/jni/libsndfile-1.0.25/src/command.lo b/jni/libsndfile-1.0.25/src/command.lo
new file mode 100644
index 0000000..65b0eea
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/command.lo
@@ -0,0 +1,12 @@
+# command.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/command.o'
+
+# Name of the non-PIC object
+non_pic_object='command.o'
+
diff --git a/jni/libsndfile-1.0.25/src/command.o b/jni/libsndfile-1.0.25/src/command.o
new file mode 100644
index 0000000..aa42c03
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/command.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/common.c b/jni/libsndfile-1.0.25/src/common.c
new file mode 100644
index 0000000..8aadbab
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/common.c
@@ -0,0 +1,1465 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	<config.h>
+
+#include	<stdarg.h>
+#include	<string.h>
+#include	<ctype.h>
+#include	<math.h>
+#include	<time.h>
+#include	<sys/time.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+/*-----------------------------------------------------------------------------------------------
+** 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.
+*/
+
+static inline void
+log_putchar (SF_PRIVATE *psf, char ch)
+{	if (psf->logindex < SIGNED_SIZEOF (psf->logbuffer) - 1)
+	{	psf->logbuffer [psf->logindex++] = ch ;
+		psf->logbuffer [psf->logindex] = 0 ;
+		} ;
+	return ;
+} /* log_putchar */
+
+void
+psf_log_printf (SF_PRIVATE *psf, const char *format, ...)
+{	va_list			ap ;
+	unsigned int	u ;
+	int				d, tens, shift, width, width_specifier, left_align ;
+	char			c, *strptr, istr [5], lead_char, sign_char ;
+
+	va_start (ap, format) ;
+
+	while ((c = *format++))
+	{	if (c != '%')
+		{	log_putchar (psf, c) ;
+			continue ;
+			} ;
+
+		if (format [0] == '%') /* Handle %% */
+		{ 	log_putchar (psf, '%') ;
+			format ++ ;
+			continue ;
+			} ;
+
+		sign_char = 0 ;
+		left_align = SF_FALSE ;
+		while (1)
+		{	switch (format [0])
+			{	case ' ' :
+				case '+' :
+					sign_char = format [0] ;
+					format ++ ;
+					continue ;
+
+				case '-' :
+					left_align = SF_TRUE ;
+					format ++ ;
+					continue ;
+
+				default : break ;
+				} ;
+
+			break ;
+			} ;
+
+		if (format [0] == 0)
+			break ;
+
+		lead_char = ' ' ;
+		if (format [0] == '0')
+			lead_char = '0' ;
+
+		width_specifier = 0 ;
+		while ((c = *format++) && isdigit (c))
+			width_specifier = width_specifier * 10 + (c - '0') ;
+
+		switch (c)
+		{	case 0 : /* NULL character. */
+					va_end (ap) ;
+					return ;
+
+			case 's': /* string */
+					strptr = va_arg (ap, char *) ;
+					if (strptr == NULL)
+						break ;
+					width_specifier -= strlen (strptr) ;
+					if (left_align == SF_FALSE)
+						while (width_specifier -- > 0)
+							log_putchar (psf, ' ') ;
+					while (*strptr)
+						log_putchar (psf, *strptr++) ;
+					while (width_specifier -- > 0)
+						log_putchar (psf, ' ') ;
+					break ;
+
+			case 'd': /* int */
+					d = va_arg (ap, int) ;
+
+					if (d < 0)
+					{	d = -d ;
+						sign_char = '-' ;
+						if (lead_char != '0' && left_align == SF_FALSE)
+							width_specifier -- ;
+						} ;
+
+					tens = 1 ;
+					width = 1 ;
+					while (d / tens >= 10)
+					{	tens *= 10 ;
+						width ++ ;
+						} ;
+
+					width_specifier -= width ;
+
+					if (sign_char == ' ')
+					{	log_putchar (psf, ' ') ;
+						width_specifier -- ;
+						} ;
+
+					if (left_align == SF_FALSE && lead_char != '0')
+					{	if (sign_char == '+')
+							width_specifier -- ;
+
+						while (width_specifier -- > 0)
+							log_putchar (psf, lead_char) ;
+						} ;
+
+					if (sign_char == '+' || sign_char == '-')
+					{	log_putchar (psf, sign_char) ;
+						width_specifier -- ;
+						} ;
+
+					if (left_align == SF_FALSE)
+						while (width_specifier -- > 0)
+							log_putchar (psf, lead_char) ;
+
+					while (tens > 0)
+					{	log_putchar (psf, '0' + d / tens) ;
+						d %= tens ;
+						tens /= 10 ;
+						} ;
+
+					while (width_specifier -- > 0)
+						log_putchar (psf, lead_char) ;
+					break ;
+
+			case 'D': /* sf_count_t */
+					{	sf_count_t		D, Tens ;
+
+						D = va_arg (ap, sf_count_t) ;
+
+						if (D == 0)
+						{	while (-- width_specifier > 0)
+								log_putchar (psf, lead_char) ;
+							log_putchar (psf, '0') ;
+							break ;
+							}
+						if (D < 0)
+						{	log_putchar (psf, '-') ;
+							D = -D ;
+							} ;
+						Tens = 1 ;
+						width = 1 ;
+						while (D / Tens >= 10)
+						{	Tens *= 10 ;
+							width ++ ;
+							} ;
+
+						while (width_specifier > width)
+						{	log_putchar (psf, lead_char) ;
+							width_specifier-- ;
+							} ;
+
+						while (Tens > 0)
+						{	log_putchar (psf, '0' + D / Tens) ;
+							D %= Tens ;
+							Tens /= 10 ;
+							} ;
+						} ;
+					break ;
+
+			case 'u': /* unsigned int */
+					u = va_arg (ap, unsigned int) ;
+
+					tens = 1 ;
+					width = 1 ;
+					while (u / tens >= 10)
+					{	tens *= 10 ;
+						width ++ ;
+						} ;
+
+					width_specifier -= width ;
+
+					if (sign_char == ' ')
+					{	log_putchar (psf, ' ') ;
+						width_specifier -- ;
+						} ;
+
+					if (left_align == SF_FALSE && lead_char != '0')
+					{	if (sign_char == '+')
+							width_specifier -- ;
+
+						while (width_specifier -- > 0)
+							log_putchar (psf, lead_char) ;
+						} ;
+
+					if (sign_char == '+' || sign_char == '-')
+					{	log_putchar (psf, sign_char) ;
+						width_specifier -- ;
+						} ;
+
+					if (left_align == SF_FALSE)
+						while (width_specifier -- > 0)
+							log_putchar (psf, lead_char) ;
+
+					while (tens > 0)
+					{	log_putchar (psf, '0' + u / tens) ;
+						u %= tens ;
+						tens /= 10 ;
+						} ;
+
+					while (width_specifier -- > 0)
+						log_putchar (psf, lead_char) ;
+					break ;
+
+			case 'c': /* char */
+					c = va_arg (ap, int) & 0xFF ;
+					log_putchar (psf, c) ;
+					break ;
+
+			case 'x': /* hex */
+			case 'X': /* hex */
+					d = va_arg (ap, int) ;
+
+					if (d == 0)
+					{	while (--width_specifier > 0)
+							log_putchar (psf, lead_char) ;
+						log_putchar (psf, '0') ;
+						break ;
+						} ;
+					shift = 28 ;
+					width = (width_specifier < 8) ? 8 : width_specifier ;
+					while (! ((0xF << shift) & d))
+					{	shift -= 4 ;
+						width -- ;
+						} ;
+
+					while (width > 0 && width_specifier > width)
+					{	log_putchar (psf, lead_char) ;
+						width_specifier-- ;
+						} ;
+
+					while (shift >= 0)
+					{	c = (d >> shift) & 0xF ;
+						log_putchar (psf, (c > 9) ? c + 'A' - 10 : c + '0') ;
+						shift -= 4 ;
+						} ;
+					break ;
+
+			case 'M': /* int2str */
+					d = va_arg (ap, int) ;
+					if (CPU_IS_LITTLE_ENDIAN)
+					{	istr [0] = d & 0xFF ;
+						istr [1] = (d >> 8) & 0xFF ;
+						istr [2] = (d >> 16) & 0xFF ;
+						istr [3] = (d >> 24) & 0xFF ;
+						}
+					else
+					{	istr [3] = d & 0xFF ;
+						istr [2] = (d >> 8) & 0xFF ;
+						istr [1] = (d >> 16) & 0xFF ;
+						istr [0] = (d >> 24) & 0xFF ;
+						} ;
+					istr [4] = 0 ;
+					strptr = istr ;
+					while (*strptr)
+					{	c = *strptr++ ;
+						log_putchar (psf, c) ;
+						} ;
+					break ;
+
+			default :
+					log_putchar (psf, '*') ;
+					log_putchar (psf, c) ;
+					log_putchar (psf, '*') ;
+					break ;
+			} /* switch */
+		} /* while */
+
+	va_end (ap) ;
+	return ;
+} /* psf_log_printf */
+
+/*-----------------------------------------------------------------------------------------------
+**  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, const char *format, ...)
+{	va_list	argptr ;
+	int		maxlen ;
+	char	*start ;
+
+	maxlen = strlen ((char*) psf->header) ;
+	start	= ((char*) psf->header) + maxlen ;
+	maxlen	= sizeof (psf->header) - maxlen ;
+
+	va_start (argptr, format) ;
+	vsnprintf (start, maxlen, format, argptr) ;
+	va_end (argptr) ;
+
+	/* Make sure the string is properly terminated. */
+	start [maxlen - 1] = 0 ;
+
+	psf->headindex = strlen ((char*) psf->header) ;
+
+	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
+**
+**		e   - all following numerical values will be little endian
+**		E   - all following numerical values will be big endian
+**
+**		t   - all following O types will be truncated to 4 bytes
+**		T   - switch off truncation of all following O types
+**
+**		1	- single byte value
+**		2	- two byte value
+**		3	- three byte value
+**		4	- four byte value
+**		8	- eight byte value (sometimes written as 4 bytes)
+**
+**		s   - string preceded by a four byte length
+**		S   - string including null terminator
+**		f	- floating point data
+**		d	- double precision floating point data
+**		h	- 16 binary bytes value
+**
+**		b	- binary data (see below)
+**		z   - zero bytes (ses below)
+**		j	- jump forwards or backwards
+**
+**	To write a word followed by an int (both little endian) use:
+**		psf_binheader_writef ("e24", wordval, longval) ;
+**
+**	To write binary data use:
+**		psf_binheader_writef ("b", &bindata, sizeof (bindata)) ;
+**
+**	To write N zero bytes use:
+**			NOTE: due to platform issues (ie x86-64) you should cast the
+**			argument to size_t or ensure the variable type is size_t.
+**		psf_binheader_writef ("z", N) ;
+*/
+
+/* These macros may seem a bit messy but do prevent problems with processors which
+** seg. fault when asked to write an int or short to a non-int/short aligned address.
+*/
+
+static inline void
+header_put_byte (SF_PRIVATE *psf, char x)
+{	if (psf->headindex < SIGNED_SIZEOF (psf->header) - 1)
+		psf->header [psf->headindex++] = x ;
+} /* header_put_byte */
+
+#if (CPU_IS_BIG_ENDIAN == 1)
+static inline void
+header_put_marker (SF_PRIVATE *psf, int x)
+{	if (psf->headindex < SIGNED_SIZEOF (psf->header) - 4)
+	{	psf->header [psf->headindex++] = (x >> 24) ;
+		psf->header [psf->headindex++] = (x >> 16) ;
+		psf->header [psf->headindex++] = (x >> 8) ;
+		psf->header [psf->headindex++] = x ;
+		} ;
+} /* header_put_marker */
+
+#elif (CPU_IS_LITTLE_ENDIAN == 1)
+static inline void
+header_put_marker (SF_PRIVATE *psf, int x)
+{	if (psf->headindex < SIGNED_SIZEOF (psf->header) - 4)
+	{	psf->header [psf->headindex++] = x ;
+		psf->header [psf->headindex++] = (x >> 8) ;
+		psf->header [psf->headindex++] = (x >> 16) ;
+		psf->header [psf->headindex++] = (x >> 24) ;
+		} ;
+} /* header_put_marker */
+
+#else
+#	error "Cannot determine endian-ness of processor."
+#endif
+
+
+static inline void
+header_put_be_short (SF_PRIVATE *psf, int x)
+{	if (psf->headindex < SIGNED_SIZEOF (psf->header) - 2)
+	{	psf->header [psf->headindex++] = (x >> 8) ;
+		psf->header [psf->headindex++] = x ;
+		} ;
+} /* header_put_be_short */
+
+static inline void
+header_put_le_short (SF_PRIVATE *psf, int x)
+{	if (psf->headindex < SIGNED_SIZEOF (psf->header) - 2)
+	{	psf->header [psf->headindex++] = x ;
+		psf->header [psf->headindex++] = (x >> 8) ;
+		} ;
+} /* header_put_le_short */
+
+static inline void
+header_put_be_3byte (SF_PRIVATE *psf, int x)
+{	if (psf->headindex < SIGNED_SIZEOF (psf->header) - 3)
+	{	psf->header [psf->headindex++] = (x >> 16) ;
+		psf->header [psf->headindex++] = (x >> 8) ;
+		psf->header [psf->headindex++] = x ;
+		} ;
+} /* header_put_be_3byte */
+
+static inline void
+header_put_le_3byte (SF_PRIVATE *psf, int x)
+{	if (psf->headindex < SIGNED_SIZEOF (psf->header) - 3)
+	{	psf->header [psf->headindex++] = x ;
+		psf->header [psf->headindex++] = (x >> 8) ;
+		psf->header [psf->headindex++] = (x >> 16) ;
+		} ;
+} /* header_put_le_3byte */
+
+static inline void
+header_put_be_int (SF_PRIVATE *psf, int x)
+{	if (psf->headindex < SIGNED_SIZEOF (psf->header) - 4)
+	{	psf->header [psf->headindex++] = (x >> 24) ;
+		psf->header [psf->headindex++] = (x >> 16) ;
+		psf->header [psf->headindex++] = (x >> 8) ;
+		psf->header [psf->headindex++] = x ;
+		} ;
+} /* header_put_be_int */
+
+static inline void
+header_put_le_int (SF_PRIVATE *psf, int x)
+{	if (psf->headindex < SIGNED_SIZEOF (psf->header) - 4)
+	{	psf->header [psf->headindex++] = x ;
+		psf->header [psf->headindex++] = (x >> 8) ;
+		psf->header [psf->headindex++] = (x >> 16) ;
+		psf->header [psf->headindex++] = (x >> 24) ;
+		} ;
+} /* header_put_le_int */
+
+#if (SIZEOF_SF_COUNT_T == 4)
+
+static inline void
+header_put_be_8byte (SF_PRIVATE *psf, sf_count_t x)
+{	if (psf->headindex < SIGNED_SIZEOF (psf->header) - 8)
+	{	psf->header [psf->headindex++] = 0 ;
+		psf->header [psf->headindex++] = 0 ;
+		psf->header [psf->headindex++] = 0 ;
+		psf->header [psf->headindex++] = 0 ;
+		psf->header [psf->headindex++] = (x >> 24) ;
+		psf->header [psf->headindex++] = (x >> 16) ;
+		psf->header [psf->headindex++] = (x >> 8) ;
+		psf->header [psf->headindex++] = x ;
+		} ;
+} /* header_put_be_8byte */
+
+static inline void
+header_put_le_8byte (SF_PRIVATE *psf, sf_count_t x)
+{	if (psf->headindex < SIGNED_SIZEOF (psf->header) - 8)
+	{	psf->header [psf->headindex++] = x ;
+		psf->header [psf->headindex++] = (x >> 8) ;
+		psf->header [psf->headindex++] = (x >> 16) ;
+		psf->header [psf->headindex++] = (x >> 24) ;
+		psf->header [psf->headindex++] = 0 ;
+		psf->header [psf->headindex++] = 0 ;
+		psf->header [psf->headindex++] = 0 ;
+		psf->header [psf->headindex++] = 0 ;
+		} ;
+} /* header_put_le_8byte */
+
+#elif (SIZEOF_SF_COUNT_T == 8)
+
+static inline void
+header_put_be_8byte (SF_PRIVATE *psf, sf_count_t x)
+{	if (psf->headindex < SIGNED_SIZEOF (psf->header) - 8)
+	{	psf->header [psf->headindex++] = (x >> 56) ;
+		psf->header [psf->headindex++] = (x >> 48) ;
+		psf->header [psf->headindex++] = (x >> 40) ;
+		psf->header [psf->headindex++] = (x >> 32) ;
+		psf->header [psf->headindex++] = (x >> 24) ;
+		psf->header [psf->headindex++] = (x >> 16) ;
+		psf->header [psf->headindex++] = (x >> 8) ;
+		psf->header [psf->headindex++] = x ;
+		} ;
+} /* header_put_be_8byte */
+
+static inline void
+header_put_le_8byte (SF_PRIVATE *psf, sf_count_t x)
+{	if (psf->headindex < SIGNED_SIZEOF (psf->header) - 8)
+	{	psf->header [psf->headindex++] = x ;
+		psf->header [psf->headindex++] = (x >> 8) ;
+		psf->header [psf->headindex++] = (x >> 16) ;
+		psf->header [psf->headindex++] = (x >> 24) ;
+		psf->header [psf->headindex++] = (x >> 32) ;
+		psf->header [psf->headindex++] = (x >> 40) ;
+		psf->header [psf->headindex++] = (x >> 48) ;
+		psf->header [psf->headindex++] = (x >> 56) ;
+		} ;
+} /* header_put_le_8byte */
+
+#else
+#error "SIZEOF_SF_COUNT_T is not defined."
+#endif
+
+int
+psf_binheader_writef (SF_PRIVATE *psf, const char *format, ...)
+{	va_list	argptr ;
+	sf_count_t 		countdata ;
+	unsigned long 	longdata ;
+	unsigned int 	data ;
+	float			floatdata ;
+	double			doubledata ;
+	void			*bindata ;
+	size_t			size ;
+	char			c, *strptr ;
+	int				count = 0, trunc_8to4 ;
+
+	trunc_8to4 = SF_FALSE ;
+
+	va_start (argptr, format) ;
+
+	while ((c = *format++))
+	{	switch (c)
+		{	case ' ' : /* Do nothing. Just used to space out format string. */
+					break ;
+
+			case 'e' : /* All conversions are now from LE to host. */
+					psf->rwf_endian = SF_ENDIAN_LITTLE ;
+					break ;
+
+			case 'E' : /* All conversions are now from BE to host. */
+					psf->rwf_endian = SF_ENDIAN_BIG ;
+					break ;
+
+			case 't' : /* All 8 byte values now get written as 4 bytes. */
+					trunc_8to4 = SF_TRUE ;
+					break ;
+
+			case 'T' : /* All 8 byte values now get written as 8 bytes. */
+					trunc_8to4 = SF_FALSE ;
+					break ;
+
+			case 'm' :
+					data = va_arg (argptr, unsigned int) ;
+					header_put_marker (psf, data) ;
+					count += 4 ;
+					break ;
+
+			case '1' :
+					data = va_arg (argptr, unsigned int) ;
+					header_put_byte (psf, data) ;
+					count += 1 ;
+					break ;
+
+			case '2' :
+					data = va_arg (argptr, unsigned int) ;
+					if (psf->rwf_endian == SF_ENDIAN_BIG)
+					{	header_put_be_short (psf, data) ;
+						}
+					else
+					{	header_put_le_short (psf, data) ;
+						} ;
+					count += 2 ;
+					break ;
+
+			case '3' : /* tribyte */
+					data = va_arg (argptr, unsigned int) ;
+					if (psf->rwf_endian == SF_ENDIAN_BIG)
+					{	header_put_be_3byte (psf, data) ;
+						}
+					else
+					{	header_put_le_3byte (psf, data) ;
+						} ;
+					count += 3 ;
+					break ;
+
+			case '4' :
+					data = va_arg (argptr, unsigned int) ;
+					if (psf->rwf_endian == SF_ENDIAN_BIG)
+					{	header_put_be_int (psf, data) ;
+						}
+					else
+					{	header_put_le_int (psf, data) ;
+						} ;
+					count += 4 ;
+					break ;
+
+			case '8' :
+					countdata = va_arg (argptr, sf_count_t) ;
+					if (psf->rwf_endian == SF_ENDIAN_BIG && trunc_8to4 == SF_FALSE)
+					{	header_put_be_8byte (psf, countdata) ;
+						count += 8 ;
+						}
+					else if (psf->rwf_endian == SF_ENDIAN_LITTLE && trunc_8to4 == SF_FALSE)
+					{	header_put_le_8byte (psf, countdata) ;
+						count += 8 ;
+						}
+					else if (psf->rwf_endian == SF_ENDIAN_BIG && trunc_8to4 == SF_TRUE)
+					{	longdata = countdata & 0xFFFFFFFF ;
+						header_put_be_int (psf, longdata) ;
+						count += 4 ;
+						}
+					else if (psf->rwf_endian == SF_ENDIAN_LITTLE && trunc_8to4 == SF_TRUE)
+					{	longdata = countdata & 0xFFFFFFFF ;
+						header_put_le_int (psf, longdata) ;
+						count += 4 ;
+						}
+					break ;
+
+			case 'f' :
+					/* Floats are passed as doubles. Is this always true? */
+					floatdata = (float) va_arg (argptr, double) ;
+					if (psf->rwf_endian == SF_ENDIAN_BIG)
+						float32_be_write (floatdata, psf->header + psf->headindex) ;
+					else
+						float32_le_write (floatdata, psf->header + psf->headindex) ;
+					psf->headindex += 4 ;
+					count += 4 ;
+					break ;
+
+			case 'd' :
+					doubledata = va_arg (argptr, double) ;
+					if (psf->rwf_endian == SF_ENDIAN_BIG)
+						double64_be_write (doubledata, psf->header + psf->headindex) ;
+					else
+						double64_le_write (doubledata, psf->header + psf->headindex) ;
+					psf->headindex += 8 ;
+					count += 8 ;
+					break ;
+
+			case 's' :
+					/* Write a C string (guaranteed to have a zero terminator). */
+					strptr = va_arg (argptr, char *) ;
+					size = strlen (strptr) + 1 ;
+					size += (size & 1) ;
+					if (psf->rwf_endian == SF_ENDIAN_BIG)
+						header_put_be_int (psf, size) ;
+					else
+						header_put_le_int (psf, size) ;
+					memcpy (&(psf->header [psf->headindex]), strptr, size) ;
+					psf->headindex += size ;
+					psf->header [psf->headindex - 1] = 0 ;
+					count += 4 + size ;
+					break ;
+
+			case 'S' :
+					/*
+					**	Write an AIFF style string (no zero terminator but possibly
+					**	an extra pad byte if the string length is odd).
+					*/
+					strptr = va_arg (argptr, char *) ;
+					size = strlen (strptr) ;
+					if (psf->rwf_endian == SF_ENDIAN_BIG)
+						header_put_be_int (psf, size) ;
+					else
+						header_put_le_int (psf, size) ;
+					memcpy (&(psf->header [psf->headindex]), strptr, size + 1) ;
+					size += (size & 1) ;
+					psf->headindex += size ;
+					psf->header [psf->headindex] = 0 ;
+					count += 4 + size ;
+					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 ;
+
+			case 'h' :
+					bindata = va_arg (argptr, void *) ;
+					memcpy (&(psf->header [psf->headindex]), bindata, 16) ;
+					psf->headindex += 16 ;
+					count += 16 ;
+					break ;
+
+			case 'j' :
+					size = va_arg (argptr, size_t) ;
+					psf->headindex += size ;
+					count = size ;
+					break ;
+
+			default :
+				psf_log_printf (psf, "*** Invalid format specifier `%c'\n", c) ;
+				psf->error = SFE_INTERNAL ;
+				break ;
+			} ;
+		} ;
+
+	va_end (argptr) ;
+	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.
+*/
+
+#if (CPU_IS_BIG_ENDIAN == 1)
+#define	GET_MARKER(ptr)	(	((ptr) [0] << 24)	| ((ptr) [1] << 16) |	\
+							((ptr) [2] << 8)	| ((ptr) [3]) )
+
+#elif (CPU_IS_LITTLE_ENDIAN == 1)
+#define	GET_MARKER(ptr)	(	((ptr) [0])			| ((ptr) [1] << 8) |	\
+							((ptr) [2] << 16)	| ((ptr) [3] << 24) )
+
+#else
+#	error "Cannot determine endian-ness of processor."
+#endif
+
+#define	GET_LE_SHORT(ptr)	( ((ptr) [1] << 8) | ((ptr) [0]) )
+#define	GET_BE_SHORT(ptr)	( ((ptr) [0] << 8) | ((ptr) [1]) )
+
+#define	GET_LE_3BYTE(ptr)	( 	((ptr) [2] << 16) | ((ptr) [1] << 8) | ((ptr) [0]) )
+#define	GET_BE_3BYTE(ptr)	( 	((ptr) [0] << 16) | ((ptr) [1] << 8) | ((ptr) [2]) )
+
+#define	GET_LE_INT(ptr)		( 	((ptr) [3] << 24)	| ((ptr) [2] << 16) |	\
+								((ptr) [1] << 8)	| ((ptr) [0]) )
+
+#define	GET_BE_INT(ptr)		( 	((ptr) [0] << 24)	| ((ptr) [1] << 16) |	\
+							 	((ptr) [2] << 8)	| ((ptr) [3]) )
+
+#define	GET_LE_8BYTE(ptr)	( 	(((sf_count_t) (ptr) [7]) << 56) | (((sf_count_t) (ptr) [6]) << 48) |	\
+							 	(((sf_count_t) (ptr) [5]) << 40) | (((sf_count_t) (ptr) [4]) << 32) |	\
+							 	(((sf_count_t) (ptr) [3]) << 24) | (((sf_count_t) (ptr) [2]) << 16) |	\
+							 	(((sf_count_t) (ptr) [1]) << 8 ) | ((ptr) [0]))
+
+#define	GET_BE_8BYTE(ptr)	( 	(((sf_count_t) (ptr) [0]) << 56) | (((sf_count_t) (ptr) [1]) << 48) |	\
+							 	(((sf_count_t) (ptr) [2]) << 40) | (((sf_count_t) (ptr) [3]) << 32) |	\
+							 	(((sf_count_t) (ptr) [4]) << 24) | (((sf_count_t) (ptr) [5]) << 16) |	\
+							 	(((sf_count_t) (ptr) [6]) << 8 ) | ((ptr) [7]))
+
+
+
+static int
+header_read (SF_PRIVATE *psf, void *ptr, int bytes)
+{	int count = 0 ;
+
+	if (psf->headindex >= SIGNED_SIZEOF (psf->header))
+	{	memset (ptr, 0, SIGNED_SIZEOF (psf->header) - psf->headindex) ;
+
+		/* This is the best that we can do. */
+		psf_fseek (psf, bytes, SEEK_CUR) ;
+		return bytes ;
+		} ;
+
+	if (psf->headindex + bytes > SIGNED_SIZEOF (psf->header))
+	{	int most ;
+
+		most = SIGNED_SIZEOF (psf->header) - psf->headindex ;
+		psf_fread (psf->header + psf->headend, 1, most, psf) ;
+		memset ((char *) ptr + most, 0, bytes - most) ;
+
+		psf_fseek (psf, bytes - most, SEEK_CUR) ;
+		return bytes ;
+		} ;
+
+	if (psf->headindex + bytes > psf->headend)
+	{	count = psf_fread (psf->header + psf->headend, 1, bytes - (psf->headend - psf->headindex), psf) ;
+		if (count != bytes - (int) (psf->headend - psf->headindex))
+		{	psf_log_printf (psf, "Error : psf_fread returned short count.\n") ;
+			return 0 ;
+			} ;
+		psf->headend += count ;
+		} ;
+
+	memcpy (ptr, psf->header + psf->headindex, bytes) ;
+	psf->headindex += bytes ;
+
+	return bytes ;
+} /* header_read */
+
+static void
+header_seek (SF_PRIVATE *psf, sf_count_t position, int whence)
+{
+
+	switch (whence)
+	{	case SEEK_SET :
+			if (position > SIGNED_SIZEOF (psf->header))
+			{	/* Too much header to cache so just seek instead. */
+				psf_fseek (psf, position, whence) ;
+				return ;
+				} ;
+			if (position > psf->headend)
+				psf->headend += psf_fread (psf->header + psf->headend, 1, position - psf->headend, psf) ;
+			psf->headindex = position ;
+			break ;
+
+		case SEEK_CUR :
+			if (psf->headindex + position < 0)
+				break ;
+
+			if (psf->headindex >= SIGNED_SIZEOF (psf->header))
+			{	psf_fseek (psf, position, whence) ;
+				return ;
+				} ;
+
+			if (psf->headindex + position <= psf->headend)
+			{	psf->headindex += position ;
+				break ;
+				} ;
+
+			if (psf->headindex + position > SIGNED_SIZEOF (psf->header))
+			{	/* Need to jump this without caching it. */
+				psf->headindex = psf->headend ;
+				psf_fseek (psf, position, SEEK_CUR) ;
+				break ;
+				} ;
+
+			psf->headend += psf_fread (psf->header + psf->headend, 1, position - (psf->headend - psf->headindex), psf) ;
+			psf->headindex = psf->headend ;
+			break ;
+
+		case SEEK_END :
+		default :
+			psf_log_printf (psf, "Bad whence param in header_seek().\n") ;
+			break ;
+		} ;
+
+	return ;
+} /* header_seek */
+
+static int
+header_gets (SF_PRIVATE *psf, char *ptr, int bufsize)
+{
+	int		k ;
+
+	for (k = 0 ; k < bufsize - 1 ; k++)
+	{	if (psf->headindex < psf->headend)
+		{	ptr [k] = psf->header [psf->headindex] ;
+			psf->headindex ++ ;
+			}
+		else
+		{	psf->headend += psf_fread (psf->header + psf->headend, 1, 1, psf) ;
+			ptr [k] = psf->header [psf->headindex] ;
+			psf->headindex = psf->headend ;
+			} ;
+
+		if (ptr [k] == '\n')
+			break ;
+		} ;
+
+	ptr [k] = 0 ;
+
+	return k ;
+} /* header_gets */
+
+int
+psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
+{	va_list			argptr ;
+	sf_count_t		*countptr, countdata ;
+	unsigned char	*ucptr, sixteen_bytes [16] ;
+	unsigned int 	*intptr, intdata ;
+	unsigned short	*shortptr ;
+	char			*charptr ;
+	float			*floatptr ;
+	double			*doubleptr ;
+	char			c ;
+	int				byte_count = 0, count ;
+
+	if (! format)
+		return psf_ftell (psf) ;
+
+	va_start (argptr, format) ;
+
+	while ((c = *format++))
+	{	switch (c)
+		{	case 'e' : /* All conversions are now from LE to host. */
+					psf->rwf_endian = SF_ENDIAN_LITTLE ;
+					break ;
+
+			case 'E' : /* All conversions are now from BE to host. */
+					psf->rwf_endian = SF_ENDIAN_BIG ;
+					break ;
+
+			case 'm' :
+					intptr = va_arg (argptr, unsigned int*) ;
+					ucptr = (unsigned char*) intptr ;
+					byte_count += header_read (psf, ucptr, sizeof (int)) ;
+					*intptr = GET_MARKER (ucptr) ;
+					break ;
+
+			case 'h' :
+					intptr = va_arg (argptr, unsigned int*) ;
+					ucptr = (unsigned char*) intptr ;
+					byte_count += header_read (psf, sixteen_bytes, sizeof (sixteen_bytes)) ;
+					{	int k ;
+						intdata = 0 ;
+						for (k = 0 ; k < 16 ; k++)
+							intdata ^= sixteen_bytes [k] << k ;
+						}
+					*intptr = intdata ;
+					break ;
+
+			case '1' :
+					charptr = va_arg (argptr, char*) ;
+					*charptr = 0 ;
+					byte_count += header_read (psf, charptr, sizeof (char)) ;
+					break ;
+
+			case '2' :
+					shortptr = va_arg (argptr, unsigned short*) ;
+					*shortptr = 0 ;
+					ucptr = (unsigned char*) shortptr ;
+					byte_count += header_read (psf, ucptr, sizeof (short)) ;
+					if (psf->rwf_endian == SF_ENDIAN_BIG)
+						*shortptr = GET_BE_SHORT (ucptr) ;
+					else
+						*shortptr = GET_LE_SHORT (ucptr) ;
+					break ;
+
+			case '3' :
+					intptr = va_arg (argptr, unsigned int*) ;
+					*intptr = 0 ;
+					byte_count += header_read (psf, sixteen_bytes, 3) ;
+					if (psf->rwf_endian == SF_ENDIAN_BIG)
+						*intptr = GET_BE_3BYTE (sixteen_bytes) ;
+					else
+						*intptr = GET_LE_3BYTE (sixteen_bytes) ;
+					break ;
+
+			case '4' :
+					intptr = va_arg (argptr, unsigned int*) ;
+					*intptr = 0 ;
+					ucptr = (unsigned char*) intptr ;
+					byte_count += header_read (psf, ucptr, sizeof (int)) ;
+					if (psf->rwf_endian == SF_ENDIAN_BIG)
+						*intptr = GET_BE_INT (ucptr) ;
+					else
+						*intptr = GET_LE_INT (ucptr) ;
+					break ;
+
+			case '8' :
+					countptr = va_arg (argptr, sf_count_t *) ;
+					*countptr = 0 ;
+					byte_count += header_read (psf, sixteen_bytes, 8) ;
+					if (psf->rwf_endian == SF_ENDIAN_BIG)
+						countdata = GET_BE_8BYTE (sixteen_bytes) ;
+					else
+						countdata = GET_LE_8BYTE (sixteen_bytes) ;
+					*countptr = countdata ;
+					break ;
+
+			case 'f' : /* Float conversion */
+					floatptr = va_arg (argptr, float *) ;
+					*floatptr = 0.0 ;
+					byte_count += header_read (psf, floatptr, sizeof (float)) ;
+					if (psf->rwf_endian == SF_ENDIAN_BIG)
+						*floatptr = float32_be_read ((unsigned char*) floatptr) ;
+					else
+						*floatptr = float32_le_read ((unsigned char*) floatptr) ;
+					break ;
+
+			case 'd' : /* double conversion */
+					doubleptr = va_arg (argptr, double *) ;
+					*doubleptr = 0.0 ;
+					byte_count += header_read (psf, doubleptr, sizeof (double)) ;
+					if (psf->rwf_endian == SF_ENDIAN_BIG)
+						*doubleptr = double64_be_read ((unsigned char*) doubleptr) ;
+					else
+						*doubleptr = double64_le_read ((unsigned char*) doubleptr) ;
+					break ;
+
+			case 's' :
+					psf_log_printf (psf, "Format conversion 's' not implemented yet.\n") ;
+					/*
+					strptr = va_arg (argptr, char *) ;
+					size   = strlen (strptr) + 1 ;
+					size  += (size & 1) ;
+					longdata = H2LE_INT (size) ;
+					get_int (psf, longdata) ;
+					memcpy (&(psf->header [psf->headindex]), strptr, size) ;
+					psf->headindex += size ;
+					*/
+					break ;
+
+			case 'b' :
+					charptr = va_arg (argptr, char*) ;
+					count = va_arg (argptr, size_t) ;
+					if (count > 0)
+						byte_count += header_read (psf, charptr, count) ;
+					break ;
+
+			case 'G' :
+					charptr = va_arg (argptr, char*) ;
+					count = va_arg (argptr, size_t) ;
+					if (count > 0)
+						byte_count += header_gets (psf, charptr, count) ;
+					break ;
+
+			case 'z' :
+					psf_log_printf (psf, "Format conversion 'z' 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. */
+					count = va_arg (argptr, size_t) ;
+					header_seek (psf, count, SEEK_SET) ;
+					byte_count = count ;
+					break ;
+
+			case 'j' :
+					/* Get the seek position first. */
+					count = va_arg (argptr, size_t) ;
+					header_seek (psf, count, SEEK_CUR) ;
+					byte_count += count ;
+					break ;
+
+			default :
+				psf_log_printf (psf, "*** Invalid format specifier `%c'\n", c) ;
+				psf->error = SFE_INTERNAL ;
+				break ;
+			} ;
+		} ;
+
+	va_end (argptr) ;
+
+	return byte_count ;
+} /* psf_binheader_readf */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+sf_count_t
+psf_default_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t samples_from_start)
+{	sf_count_t position, retval ;
+
+	if (! (psf->blockwidth && psf->dataoffset >= 0))
+	{	psf->error = SFE_BAD_SEEK ;
+		return	PSF_SEEK_ERROR ;
+		} ;
+
+	if (! psf->sf.seekable)
+	{	psf->error = SFE_NOT_SEEKABLE ;
+		return	PSF_SEEK_ERROR ;
+		} ;
+
+	position = psf->dataoffset + psf->blockwidth * samples_from_start ;
+
+	if ((retval = psf_fseek (psf, position, SEEK_SET)) != position)
+	{	psf->error = SFE_SEEK_FAILED ;
+		return PSF_SEEK_ERROR ;
+		} ;
+
+	return samples_from_start ;
+} /* psf_default_seek */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+void
+psf_hexdump (const void *ptr, int len)
+{	const char *data ;
+	char	ascii [17] ;
+	int		k, m ;
+
+	if ((data = ptr) == NULL)
+		return ;
+	if (len <= 0)
+		return ;
+
+	puts ("") ;
+	for (k = 0 ; k < len ; k += 16)
+	{	memset (ascii, ' ', sizeof (ascii)) ;
+
+		printf ("%08X: ", k) ;
+		for (m = 0 ; m < 16 && k + m < len ; m++)
+		{	printf (m == 8 ? " %02X " : "%02X ", data [k + m] & 0xFF) ;
+			ascii [m] = psf_isprint (data [k + m]) ? data [k + m] : '.' ;
+			} ;
+
+		if (m <= 8) printf (" ") ;
+		for ( ; m < 16 ; m++) printf ("   ") ;
+
+		ascii [16] = 0 ;
+		printf (" %s\n", ascii) ;
+		} ;
+
+	puts ("") ;
+} /* psf_hexdump */
+
+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, " Frames      :   %D\n", psf->sf.frames) ;
+	psf_log_printf (psf, " Channels    :   %d\n", psf->sf.channels) ;
+
+	psf_log_printf (psf, " Format      :   0x%X\n", psf->sf.format) ;
+	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 */
+
+/*========================================================================================
+*/
+
+void*
+psf_memset (void *s, int c, sf_count_t len)
+{	char	*ptr ;
+	int 	setcount ;
+
+	ptr = (char *) s ;
+
+	while (len > 0)
+	{	setcount = (len > 0x10000000) ? 0x10000000 : (int) len ;
+
+		memset (ptr, c, setcount) ;
+
+		ptr += setcount ;
+		len -= setcount ;
+		} ;
+
+	return s ;
+} /* psf_memset */
+
+SF_INSTRUMENT *
+psf_instrument_alloc (void)
+{	SF_INSTRUMENT *instr ;
+
+	instr = calloc (1, sizeof (SF_INSTRUMENT)) ;
+
+	if (instr == NULL)
+		return NULL ;
+
+	/* Set non-zero default values. */
+	instr->basenote = -1 ;
+	instr->velocity_lo = -1 ;
+	instr->velocity_hi = -1 ;
+	instr->key_lo = -1 ;
+	instr->key_hi = -1 ;
+
+	return instr ;
+} /* psf_instrument_alloc */
+
+void
+psf_sanitize_string (char * cptr, int len)
+{
+	do
+	{
+		len -- ;
+		cptr [len] = psf_isprint (cptr [len]) ? cptr [len] : '.' ;
+	}
+	while (len > 0) ;
+} /* psf_sanitize_string */
+
+void
+psf_get_date_str (char *str, int maxlen)
+{	time_t		current ;
+	struct tm	timedata, *tmptr ;
+
+	time (&current) ;
+
+#if defined (HAVE_GMTIME_R)
+	/* If the re-entrant version is available, use it. */
+	tmptr = gmtime_r (&current, &timedata) ;
+#elif defined (HAVE_GMTIME)
+	/* Otherwise use the standard one and copy the data to local storage. */
+	tmptr = gmtime (&current) ;
+	memcpy (&timedata, tmptr, sizeof (timedata)) ;
+#else
+	tmptr = NULL ;
+#endif
+
+	if (tmptr)
+		snprintf (str, maxlen, "%4d-%02d-%02d %02d:%02d:%02d UTC",
+			1900 + timedata.tm_year, timedata.tm_mon, timedata.tm_mday,
+			timedata.tm_hour, timedata.tm_min, timedata.tm_sec) ;
+	else
+		snprintf (str, maxlen, "Unknown date") ;
+
+	return ;
+} /* psf_get_date_str */
+
+int
+subformat_to_bytewidth (int format)
+{
+	switch (format)
+	{	case SF_FORMAT_PCM_U8 :
+		case SF_FORMAT_PCM_S8 :
+				return 1 ;
+		case SF_FORMAT_PCM_16 :
+				return 2 ;
+		case SF_FORMAT_PCM_24 :
+				return 3 ;
+		case SF_FORMAT_PCM_32 :
+		case SF_FORMAT_FLOAT :
+				return 4 ;
+		case SF_FORMAT_DOUBLE :
+				return 8 ;
+		} ;
+
+	return 0 ;
+} /* subformat_to_bytewidth */
+
+int
+s_bitwidth_to_subformat (int bits)
+{	static int array [] =
+	{	SF_FORMAT_PCM_S8, SF_FORMAT_PCM_16, SF_FORMAT_PCM_24, SF_FORMAT_PCM_32
+		} ;
+
+	if (bits < 8 || bits > 32)
+		return 0 ;
+
+	return array [((bits + 7) / 8) - 1] ;
+} /* bitwidth_to_subformat */
+
+int
+u_bitwidth_to_subformat (int bits)
+{	static int array [] =
+	{	SF_FORMAT_PCM_U8, SF_FORMAT_PCM_16, SF_FORMAT_PCM_24, SF_FORMAT_PCM_32
+		} ;
+
+	if (bits < 8 || bits > 32)
+		return 0 ;
+
+	return array [((bits + 7) / 8) - 1] ;
+} /* bitwidth_to_subformat */
+
+/*
+**	psf_rand_int32 : Not crypto quality, but more than adequate for things
+**	like stream serial numbers in Ogg files or the unique_id field of the
+**	SF_PRIVATE struct.
+*/
+
+int32_t
+psf_rand_int32 (void)
+{	static int32_t value = -1 ;
+	int k, count ;
+
+	if (value == -1)
+	{
+#if HAVE_GETTIMEOFDAY
+		struct timeval tv ;
+		gettimeofday (&tv, NULL) ;
+		value = tv.tv_sec + tv.tv_usec ;
+#else
+		value = time (NULL) ;
+#endif
+		} ;
+
+	count = 4 + (value & 7) ;
+	for (k = 0 ; k < count ; k++)
+		value = 11117 * value + 211231 ;
+
+	return value ;
+} /* psf_rand_int32 */
+
+void
+append_snprintf (char * dest, size_t maxlen, const char * fmt, ...)
+{	size_t len = strlen (dest) ;
+
+	if (len < maxlen)
+	{	va_list ap ;
+
+		va_start (ap, fmt) ;
+		vsnprintf (dest + len, maxlen - len, fmt, ap) ;
+		va_end (ap) ;
+		} ;
+
+	return ;
+} /* append_snprintf */
+
+
+void
+psf_strlcpy_crlf (char *dest, const char *src, size_t destmax, size_t srcmax)
+{	/* Must be minus 2 so it can still expand a single trailing '\n' or '\r'. */
+	char * destend = dest + destmax - 2 ;
+	const char * srcend = src + srcmax ;
+
+	while (dest < destend && src < srcend)
+	{	if ((src [0] == '\r' && src [1] == '\n') || (src [0] == '\n' && src [1] == '\r'))
+		{	*dest++ = '\r' ;
+			*dest++ = '\n' ;
+			src += 2 ;
+			continue ;
+			} ;
+
+		if (src [0] == '\r')
+		{	*dest++ = '\r' ;
+			*dest++ = '\n' ;
+			src += 1 ;
+			continue ;
+			} ;
+
+		if (src [0] == '\n')
+		{	*dest++ = '\r' ;
+			*dest++ = '\n' ;
+			src += 1 ;
+			continue ;
+			} ;
+
+		*dest++ = *src++ ;
+		} ;
+
+	/* Make sure dest is terminated. */
+	*dest = 0 ;
+} /* psf_strlcpy_crlf */
+
+/*==============================================================================
+*/
+
+#define CASE_NAME(x)		case x : return #x ; break ;
+
+const char *
+str_of_major_format (int format)
+{	switch (SF_CONTAINER (format))
+	{	CASE_NAME (SF_FORMAT_WAV) ;
+		CASE_NAME (SF_FORMAT_AIFF) ;
+		CASE_NAME (SF_FORMAT_AU) ;
+		CASE_NAME (SF_FORMAT_RAW) ;
+		CASE_NAME (SF_FORMAT_PAF) ;
+		CASE_NAME (SF_FORMAT_SVX) ;
+		CASE_NAME (SF_FORMAT_NIST) ;
+		CASE_NAME (SF_FORMAT_VOC) ;
+		CASE_NAME (SF_FORMAT_IRCAM) ;
+		CASE_NAME (SF_FORMAT_W64) ;
+		CASE_NAME (SF_FORMAT_MAT4) ;
+		CASE_NAME (SF_FORMAT_MAT5) ;
+		CASE_NAME (SF_FORMAT_PVF) ;
+		CASE_NAME (SF_FORMAT_XI) ;
+		CASE_NAME (SF_FORMAT_HTK) ;
+		CASE_NAME (SF_FORMAT_SDS) ;
+		CASE_NAME (SF_FORMAT_AVR) ;
+		CASE_NAME (SF_FORMAT_WAVEX) ;
+		CASE_NAME (SF_FORMAT_SD2) ;
+		CASE_NAME (SF_FORMAT_FLAC) ;
+		CASE_NAME (SF_FORMAT_CAF) ;
+		CASE_NAME (SF_FORMAT_WVE) ;
+		CASE_NAME (SF_FORMAT_OGG) ;
+		default :
+			break ;
+		} ;
+
+	return "BAD_MAJOR_FORMAT" ;
+} /* str_of_major_format */
+
+const char *
+str_of_minor_format (int format)
+{	switch (SF_CODEC (format))
+	{	CASE_NAME (SF_FORMAT_PCM_S8) ;
+		CASE_NAME (SF_FORMAT_PCM_16) ;
+		CASE_NAME (SF_FORMAT_PCM_24) ;
+		CASE_NAME (SF_FORMAT_PCM_32) ;
+		CASE_NAME (SF_FORMAT_PCM_U8) ;
+		CASE_NAME (SF_FORMAT_FLOAT) ;
+		CASE_NAME (SF_FORMAT_DOUBLE) ;
+		CASE_NAME (SF_FORMAT_ULAW) ;
+		CASE_NAME (SF_FORMAT_ALAW) ;
+		CASE_NAME (SF_FORMAT_IMA_ADPCM) ;
+		CASE_NAME (SF_FORMAT_MS_ADPCM) ;
+		CASE_NAME (SF_FORMAT_GSM610) ;
+		CASE_NAME (SF_FORMAT_VOX_ADPCM) ;
+		CASE_NAME (SF_FORMAT_G721_32) ;
+		CASE_NAME (SF_FORMAT_G723_24) ;
+		CASE_NAME (SF_FORMAT_G723_40) ;
+		CASE_NAME (SF_FORMAT_DWVW_12) ;
+		CASE_NAME (SF_FORMAT_DWVW_16) ;
+		CASE_NAME (SF_FORMAT_DWVW_24) ;
+		CASE_NAME (SF_FORMAT_DWVW_N) ;
+		CASE_NAME (SF_FORMAT_DPCM_8) ;
+		CASE_NAME (SF_FORMAT_DPCM_16) ;
+		CASE_NAME (SF_FORMAT_VORBIS) ;
+		default :
+			break ;
+		} ;
+
+	return "BAD_MINOR_FORMAT" ;
+} /* str_of_minor_format */
+
+const char *
+str_of_open_mode (int mode)
+{	switch (mode)
+	{	CASE_NAME (SFM_READ) ;
+		CASE_NAME (SFM_WRITE) ;
+		CASE_NAME (SFM_RDWR) ;
+
+		default :
+			break ;
+		} ;
+
+	return "BAD_MODE" ;
+} /* str_of_open_mode */
+
+const char *
+str_of_endianness (int end)
+{	switch (end)
+	{	CASE_NAME (SF_ENDIAN_BIG) ;
+		CASE_NAME (SF_ENDIAN_LITTLE) ;
+		CASE_NAME (SF_ENDIAN_CPU) ;
+		default :
+			break ;
+		} ;
+
+	/* Zero length string for SF_ENDIAN_FILE. */
+	return "" ;
+} /* str_of_endianness */
diff --git a/jni/libsndfile-1.0.25/src/common.h b/jni/libsndfile-1.0.25/src/common.h
new file mode 100644
index 0000000..ed57804
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/common.h
@@ -0,0 +1,919 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#ifndef SNDFILE_COMMON_H
+#define SNDFILE_COMMON_H
+
+#include "sfconfig.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#if HAVE_STDINT_H
+#include <stdint.h>
+#elif HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#ifndef SNDFILE_H
+#include "sndfile.h"
+#endif
+
+#ifdef __cplusplus
+#error "This code is not designed to be compiled with a C++ compiler."
+#endif
+
+#if (SIZEOF_LONG == 8)
+#	define	SF_PLATFORM_S64(x)		x##l
+#elif (SIZEOF_LONG_LONG == 8)
+#	define	SF_PLATFORM_S64(x)		x##ll
+#elif COMPILER_IS_GCC
+#	define	SF_PLATFORM_S64(x)		x##ll
+#elif OS_IS_WIN32
+#	define	SF_PLATFORM_S64(x)		x##I64
+#else
+#	error "Don't know how to define a 64 bit integer constant."
+#endif
+
+
+
+/*
+** Inspiration : http://sourcefrog.net/weblog/software/languages/C/unused.html
+*/
+#ifdef UNUSED
+#elif defined (__GNUC__)
+#	define UNUSED(x) UNUSED_ ## x __attribute__ ((unused))
+#elif defined (__LCLINT__)
+#	define UNUSED(x) /*@unused@*/ x
+#else
+#	define UNUSED(x) x
+#endif
+
+#ifdef __GNUC__
+#	define WARN_UNUSED	__attribute__ ((warn_unused_result))
+#else
+#	define WARN_UNUSED
+#endif
+
+#define	SF_BUFFER_LEN			(8192*2)
+#define	SF_FILENAME_LEN			(512)
+#define SF_SYSERR_LEN			(256)
+#define SF_MAX_STRINGS			(32)
+#define SF_STR_BUFFER_LEN		(8192)
+#define	SF_HEADER_LEN			(4100 + SF_STR_BUFFER_LEN)
+
+#define	PSF_SEEK_ERROR			((sf_count_t) -1)
+
+
+#define	BITWIDTH2BYTES(x)	(((x) + 7) / 8)
+
+/*	For some reason sizeof returns an unsigned  value which causes
+**	a warning when that value is added or subtracted from a signed
+**	value. Use SIGNED_SIZEOF instead.
+*/
+#define		SIGNED_SIZEOF(x)	((int) sizeof (x))
+
+#define		ARRAY_LEN(x)	((int) (sizeof (x) / sizeof ((x) [0])))
+
+#define		NOT(x)			(! (x))
+
+#if (COMPILER_IS_GCC == 1)
+#define		SF_MAX(x,y)		({ \
+								typeof (x) sf_max_x1 = (x) ; \
+								typeof (y) sf_max_y1 = (y) ; \
+								(void) (&sf_max_x1 == &sf_max_y1) ; \
+								sf_max_x1 > sf_max_y1 ? sf_max_x1 : sf_max_y1 ; })
+
+#define		SF_MIN(x,y)		({ \
+								typeof (x) sf_min_x2 = (x) ; \
+								typeof (y) sf_min_y2 = (y) ; \
+								(void) (&sf_min_x2 == &sf_min_y2) ; \
+								sf_min_x2 < sf_min_y2 ? sf_min_x2 : sf_min_y2 ; })
+#else
+#define		SF_MAX(a,b)		((a) > (b) ? (a) : (b))
+#define		SF_MIN(a,b)		((a) < (b) ? (a) : (b))
+#endif
+
+
+#define		SF_MAX_CHANNELS	256
+
+
+/*
+*	Macros for spliting the format file of SF_INFI into contrainer type,
+**	codec type and endian-ness.
+*/
+#define SF_CONTAINER(x)		((x) & SF_FORMAT_TYPEMASK)
+#define SF_CODEC(x)			((x) & SF_FORMAT_SUBMASK)
+#define SF_ENDIAN(x)		((x) & SF_FORMAT_ENDMASK)
+
+enum
+{	/* PEAK chunk location. */
+	SF_PEAK_START		= 42,
+	SF_PEAK_END			= 43,
+
+	/* PEAK chunk location. */
+	SF_SCALE_MAX		= 52,
+	SF_SCALE_MIN		= 53,
+
+	/* str_flags values. */
+	SF_STR_ALLOW_START	= 0x0100,
+	SF_STR_ALLOW_END	= 0x0200,
+
+	/* Location of strings. */
+	SF_STR_LOCATE_START	= 0x0400,
+	SF_STR_LOCATE_END	= 0x0800,
+
+	SFD_TYPEMASK		= 0x0FFFFFFF
+} ;
+
+#define		SFM_MASK 	(SFM_READ | SFM_WRITE | SFM_RDWR)
+#define		SFM_UNMASK 	(~SFM_MASK)
+
+/*---------------------------------------------------------------------------------------
+** Formats that may be supported at some time in the future.
+** When support is finalised, these values move to src/sndfile.h.
+*/
+
+enum
+{	/* Work in progress. */
+	SF_FORMAT_SPEEX			= 0x5000000,
+	SF_FORMAT_OGGFLAC		= 0x5000001,
+
+	/* Formats supported read only. */
+	SF_FORMAT_TXW			= 0x4030000,		/* Yamaha TX16 sampler file */
+	SF_FORMAT_DWD			= 0x4040000,		/* DiamondWare Digirized */
+
+	/* Following are detected but not supported. */
+	SF_FORMAT_REX			= 0x40A0000,		/* Propellorheads Rex/Rcy */
+	SF_FORMAT_REX2			= 0x40D0000,		/* Propellorheads Rex2 */
+	SF_FORMAT_KRZ			= 0x40E0000,		/* Kurzweil sampler file */
+	SF_FORMAT_WMA			= 0x4100000,		/* Windows Media Audio. */
+	SF_FORMAT_SHN			= 0x4110000,		/* Shorten. */
+
+	/* Unsupported encodings. */
+	SF_FORMAT_SVX_FIB		= 0x1020, 		/* SVX Fibonacci Delta encoding. */
+	SF_FORMAT_SVX_EXP		= 0x1021, 		/* SVX Exponential Delta encoding. */
+
+	SF_FORMAT_PCM_N			= 0x1030
+} ;
+
+/*---------------------------------------------------------------------------------------
+**	PEAK_CHUNK - This chunk type is common to both AIFF and WAVE files although their
+**	endian encodings are different.
+*/
+
+typedef struct
+{	double		value ;		/* signed value of peak */
+	sf_count_t	position ;	/* the sample frame for the peak */
+} PEAK_POS ;
+
+typedef struct
+{	/* libsndfile internal : write a PEAK chunk at the start or end of the file? */
+	int				peak_loc ;
+
+	/* WAV/AIFF */
+	unsigned int	version ;	/* version of the PEAK chunk */
+	unsigned int	timestamp ;	/* secs since 1/1/1970  */
+
+	/* CAF */
+	unsigned int	edit_number ;
+
+#if HAVE_FLEXIBLE_ARRAY
+	/* the per channel peak info */
+	PEAK_POS		peaks [] ;
+#else
+	/*
+	** This is not ISO compliant C. It works on some compilers which
+	** don't support the ISO standard flexible struct array which is
+	** used above. If your compiler doesn't like this I suggest you find
+	** youself a 1999 ISO C standards compilant compiler. GCC-3.X is
+	** highly recommended.
+	*/
+	PEAK_POS		peaks [0] ;
+#endif
+} PEAK_INFO ;
+
+static inline PEAK_INFO *
+peak_info_calloc (int channels)
+{	return calloc (1, sizeof (PEAK_INFO) + channels * sizeof (PEAK_POS)) ;
+} /* peak_info_calloc */
+
+typedef struct
+{	int		type ;
+	int		flags ;
+	char 	*str ;
+} STR_DATA ;
+
+static inline size_t
+make_size_t (int x)
+{	return (size_t) x ;
+} /* size_t_of_int */
+
+typedef SF_BROADCAST_INFO_VAR (16 * 1024) SF_BROADCAST_INFO_16K ;
+
+#if SIZEOF_WCHAR_T == 2
+typedef wchar_t	sfwchar_t ;
+#else
+typedef int16_t sfwchar_t ;
+#endif
+
+/*
+**	This version of isprint specifically ignores any locale info. Its used for
+**	determining which characters can be printed in things like hexdumps.
+*/
+static inline int
+psf_isprint (int ch)
+{	return (ch >= ' ' && ch <= '~') ;
+} /* psf_isprint */
+
+/*=======================================================================================
+**	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
+{
+	union
+	{	char		c [SF_FILENAME_LEN] ;
+		sfwchar_t	wc [SF_FILENAME_LEN] ;
+	} path ;
+
+	union
+	{	char		c [SF_FILENAME_LEN] ;
+		sfwchar_t	wc [SF_FILENAME_LEN] ;
+	} dir ;
+
+	union
+	{	char		c [SF_FILENAME_LEN / 4] ;
+		sfwchar_t	wc [SF_FILENAME_LEN / 4] ;
+	} name ;
+
+#if USE_WINDOWS_API
+	/*
+	**	These fields can only be used in src/file_io.c.
+	**	They are basically the same as a windows file HANDLE.
+	*/
+	void 			*handle, *hsaved ;
+
+	int				use_wchar ;
+#else
+	/* These fields can only be used in src/file_io.c. */
+	int 			filedes, savedes ;
+#endif
+
+	int				do_not_close_descriptor ;
+	int				mode ;			/* Open mode : SFM_READ, SFM_WRITE or SFM_RDWR. */
+} PSF_FILE ;
+
+
+typedef struct sf_private_tag
+{
+	/* Canary in a coal mine. */
+	union
+	{	/* Place a double here to encourage double alignment. */
+		double d [2] ;
+		char c [16] ;
+		} canary ;
+
+	/* Force the compiler to double align the start of buffer. */
+	union
+	{	double			dbuf	[SF_BUFFER_LEN / sizeof (double)] ;
+#if (defined (SIZEOF_INT64_T) && (SIZEOF_INT64_T == 8))
+		int64_t			lbuf	[SF_BUFFER_LEN / sizeof (int64_t)] ;
+#else
+		long			lbuf	[SF_BUFFER_LEN / sizeof (double)] ;
+#endif
+		float			fbuf	[SF_BUFFER_LEN / sizeof (float)] ;
+		int				ibuf	[SF_BUFFER_LEN / sizeof (int)] ;
+		short			sbuf	[SF_BUFFER_LEN / sizeof (short)] ;
+		char			cbuf	[SF_BUFFER_LEN / sizeof (char)] ;
+		signed char		scbuf	[SF_BUFFER_LEN / sizeof (signed char)] ;
+		unsigned char	ucbuf	[SF_BUFFER_LEN / sizeof (signed char)] ;
+		} u ;
+
+
+	PSF_FILE		file, rsrc ;
+
+	char			syserr		[SF_SYSERR_LEN] ;
+
+	/* logbuffer and logindex should only be changed within the logging functions
+	** of common.c
+	*/
+	char			logbuffer	[SF_BUFFER_LEN] ;
+	unsigned char	header		[SF_HEADER_LEN] ; /* Must be unsigned */
+	int				rwf_endian ;	/* Header endian-ness flag. */
+
+	/* Storage and housekeeping data for adding/reading strings from
+	** sound files.
+	*/
+	STR_DATA		strings [SF_MAX_STRINGS] ;
+	char			str_storage [SF_STR_BUFFER_LEN] ;
+	char			*str_end ;
+	int				str_flags ;
+
+	/* Guard value. If this changes the buffers above have overflowed. */
+	int				Magick ;
+
+	unsigned		unique_id ;
+
+	/* Index variables for maintaining logbuffer and header above. */
+	int				logindex ;
+	int				headindex, headend ;
+	int				has_text ;
+
+	int				error ;
+
+	int				endian ;		/* File endianness : SF_ENDIAN_LITTLE or SF_ENDIAN_BIG. */
+	int				data_endswap ;	/* Need to endswap data? */
+
+	/*
+	** Maximum float value for calculating the multiplier for
+	** float/double to short/int conversions.
+	*/
+	int				float_int_mult ;
+	float			float_max ;
+
+	int				scale_int_float ;
+
+	/* Vairables for handling pipes. */
+	int				is_pipe ;		/* True if file is a pipe. */
+	sf_count_t		pipeoffset ;	/* Number of bytes read from a pipe. */
+
+	/* True if clipping must be performed on float->int conversions. */
+	int				add_clipping ;
+
+	SF_INFO			sf ;
+
+	int				have_written ;	/* Has a single write been done to the file? */
+	PEAK_INFO		*peak_info ;
+
+	/* Loop Info */
+	SF_LOOP_INFO	*loop_info ;
+	SF_INSTRUMENT	*instrument ;
+
+	/* Broadcast (EBU) Info */
+	SF_BROADCAST_INFO_16K *broadcast_16k ;
+
+	/* Channel map data (if present) : an array of ints. */
+	int				*channel_map ;
+
+	sf_count_t		filelength ;	/* Overall length of (embedded) file. */
+	sf_count_t		fileoffset ;	/* Offset in number of bytes from beginning of file. */
+
+	sf_count_t		rsrclength ;	/* Length of the resource fork (if it exists). */
+
+	sf_count_t		dataoffset ;	/* Offset in number of bytes from beginning of file. */
+	sf_count_t		datalength ;	/* Length in bytes of the audio data. */
+	sf_count_t		dataend ;		/* Offset to file tailer. */
+
+	int				blockwidth ;	/* Size in bytes of one set of interleaved samples. */
+	int				bytewidth ;		/* Size in bytes of one sample (one channel). */
+
+	void			*dither ;
+	void			*interleave ;
+
+	int				last_op ;		/* Last operation; either SFM_READ or SFM_WRITE */
+	sf_count_t		read_current ;
+	sf_count_t		write_current ;
+
+	void			*container_data ;	/*	This is a pointer to dynamically allocated file
+										**	container format specific data.
+										*/
+
+	void			*codec_data ;		/*	This is a pointer to dynamically allocated file
+										**	codec format specific data.
+										*/
+
+	SF_DITHER_INFO	write_dither ;
+	SF_DITHER_INFO	read_dither ;
+
+	int				norm_double ;
+	int				norm_float ;
+
+	int				auto_header ;
+
+	int				ieee_replace ;
+
+	/* A set of file specific function pointers */
+	sf_count_t		(*read_short)	(struct sf_private_tag*, short *ptr, sf_count_t len) ;
+	sf_count_t		(*read_int)		(struct sf_private_tag*, int *ptr, sf_count_t len) ;
+	sf_count_t		(*read_float)	(struct sf_private_tag*, float *ptr, sf_count_t len) ;
+	sf_count_t		(*read_double)	(struct sf_private_tag*, double *ptr, sf_count_t len) ;
+
+	sf_count_t		(*write_short)	(struct sf_private_tag*, const short *ptr, sf_count_t len) ;
+	sf_count_t		(*write_int)	(struct sf_private_tag*, const int *ptr, sf_count_t len) ;
+	sf_count_t		(*write_float)	(struct sf_private_tag*, const float *ptr, sf_count_t len) ;
+	sf_count_t		(*write_double)	(struct sf_private_tag*, const double *ptr, sf_count_t len) ;
+
+	sf_count_t		(*seek) 		(struct sf_private_tag*, int mode, sf_count_t samples_from_start) ;
+	int				(*write_header)	(struct sf_private_tag*, int calc_length) ;
+	int				(*command)		(struct sf_private_tag*, int command, void *data, int datasize) ;
+
+	/*
+	**	Separate close functions for the codec and the container.
+	**	The codec close function is always called first.
+	*/
+	int				(*codec_close)		(struct sf_private_tag*) ;
+	int				(*container_close)	(struct sf_private_tag*) ;
+
+	char			*format_desc ;
+
+	/* Virtual I/O functions. */
+	int					virtual_io ;
+	SF_VIRTUAL_IO		vio ;
+	void				*vio_user_data ;
+} SF_PRIVATE ;
+
+
+
+enum
+{	SFE_NO_ERROR				= SF_ERR_NO_ERROR,
+	SFE_BAD_OPEN_FORMAT			= SF_ERR_UNRECOGNISED_FORMAT,
+	SFE_SYSTEM					= SF_ERR_SYSTEM,
+	SFE_MALFORMED_FILE			= SF_ERR_MALFORMED_FILE,
+	SFE_UNSUPPORTED_ENCODING	= SF_ERR_UNSUPPORTED_ENCODING,
+
+	SFE_ZERO_MAJOR_FORMAT,
+	SFE_ZERO_MINOR_FORMAT,
+	SFE_BAD_FILE,
+	SFE_BAD_FILE_READ,
+	SFE_OPEN_FAILED,
+	SFE_BAD_SNDFILE_PTR,
+	SFE_BAD_SF_INFO_PTR,
+	SFE_BAD_SF_INCOMPLETE,
+	SFE_BAD_FILE_PTR,
+	SFE_BAD_INT_PTR,
+	SFE_BAD_STAT_SIZE,
+	SFE_MALLOC_FAILED,
+	SFE_UNIMPLEMENTED,
+	SFE_BAD_READ_ALIGN,
+	SFE_BAD_WRITE_ALIGN,
+	SFE_UNKNOWN_FORMAT,
+	SFE_NOT_READMODE,
+	SFE_NOT_WRITEMODE,
+	SFE_BAD_MODE_RW,
+	SFE_BAD_SF_INFO,
+	SFE_BAD_OFFSET,
+	SFE_NO_EMBED_SUPPORT,
+	SFE_NO_EMBEDDED_RDWR,
+	SFE_NO_PIPE_WRITE,
+
+	SFE_INTERNAL,
+	SFE_BAD_COMMAND_PARAM,
+	SFE_BAD_ENDIAN,
+	SFE_CHANNEL_COUNT_ZERO,
+	SFE_CHANNEL_COUNT,
+
+	SFE_BAD_VIRTUAL_IO,
+
+	SFE_INTERLEAVE_MODE,
+	SFE_INTERLEAVE_SEEK,
+	SFE_INTERLEAVE_READ,
+
+	SFE_BAD_SEEK,
+	SFE_NOT_SEEKABLE,
+	SFE_AMBIGUOUS_SEEK,
+	SFE_WRONG_SEEK,
+	SFE_SEEK_FAILED,
+
+	SFE_BAD_OPEN_MODE,
+	SFE_OPEN_PIPE_RDWR,
+	SFE_RDWR_POSITION,
+	SFE_RDWR_BAD_HEADER,
+	SFE_CMD_HAS_DATA,
+	SFE_BAD_BROADCAST_INFO_SIZE,
+	SFE_BAD_BROADCAST_INFO_TOO_BIG,
+
+	SFE_STR_NO_SUPPORT,
+	SFE_STR_NOT_WRITE,
+	SFE_STR_MAX_DATA,
+	SFE_STR_MAX_COUNT,
+	SFE_STR_BAD_TYPE,
+	SFE_STR_NO_ADD_END,
+	SFE_STR_BAD_STRING,
+	SFE_STR_WEIRD,
+
+	SFE_WAV_NO_RIFF,
+	SFE_WAV_NO_WAVE,
+	SFE_WAV_NO_FMT,
+	SFE_WAV_BAD_FMT,
+	SFE_WAV_FMT_SHORT,
+	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,
+	SFE_WAV_BAD_LIST,
+	SFE_WAV_ADPCM_NOT4BIT,
+	SFE_WAV_ADPCM_CHANNELS,
+	SFE_WAV_GSM610_FORMAT,
+	SFE_WAV_UNKNOWN_CHUNK,
+	SFE_WAV_WVPK_DATA,
+
+	SFE_AIFF_NO_FORM,
+	SFE_AIFF_AIFF_NO_FORM,
+	SFE_AIFF_COMM_NO_FORM,
+	SFE_AIFF_SSND_NO_COMM,
+	SFE_AIFF_UNKNOWN_CHUNK,
+	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_AIFF_RW_SSND_NOT_LAST,
+
+	SFE_AU_UNKNOWN_FORMAT,
+	SFE_AU_NO_DOTSND,
+	SFE_AU_EMBED_BAD_LEN,
+
+	SFE_RAW_READ_BAD_SPEC,
+	SFE_RAW_BAD_BITWIDTH,
+	SFE_RAW_BAD_FORMAT,
+
+	SFE_PAF_NO_MARKER,
+	SFE_PAF_VERSION,
+	SFE_PAF_UNKNOWN_FORMAT,
+	SFE_PAF_SHORT_HEADER,
+	SFE_PAF_BAD_CHANNELS,
+
+	SFE_SVX_NO_FORM,
+	SFE_SVX_NO_BODY,
+	SFE_SVX_NO_DATA,
+	SFE_SVX_BAD_COMP,
+	SFE_SVX_BAD_NAME_LENGTH,
+
+	SFE_NIST_BAD_HEADER,
+	SFE_NIST_CRLF_CONVERISON,
+	SFE_NIST_BAD_ENCODING,
+
+	SFE_VOC_NO_CREATIVE,
+	SFE_VOC_BAD_FORMAT,
+	SFE_VOC_BAD_VERSION,
+	SFE_VOC_BAD_MARKER,
+	SFE_VOC_BAD_SECTIONS,
+	SFE_VOC_MULTI_SAMPLERATE,
+	SFE_VOC_MULTI_SECTION,
+	SFE_VOC_MULTI_PARAM,
+	SFE_VOC_SECTION_COUNT,
+	SFE_VOC_NO_PIPE,
+
+	SFE_IRCAM_NO_MARKER,
+	SFE_IRCAM_BAD_CHANNELS,
+	SFE_IRCAM_UNKNOWN_FORMAT,
+
+	SFE_W64_64_BIT,
+	SFE_W64_NO_RIFF,
+	SFE_W64_NO_WAVE,
+	SFE_W64_NO_DATA,
+	SFE_W64_ADPCM_NOT4BIT,
+	SFE_W64_ADPCM_CHANNELS,
+	SFE_W64_GSM610_FORMAT,
+
+	SFE_MAT4_BAD_NAME,
+	SFE_MAT4_NO_SAMPLERATE,
+
+	SFE_MAT5_BAD_ENDIAN,
+	SFE_MAT5_NO_BLOCK,
+	SFE_MAT5_SAMPLE_RATE,
+
+	SFE_PVF_NO_PVF1,
+	SFE_PVF_BAD_HEADER,
+	SFE_PVF_BAD_BITWIDTH,
+
+	SFE_DWVW_BAD_BITWIDTH,
+	SFE_G72X_NOT_MONO,
+
+	SFE_XI_BAD_HEADER,
+	SFE_XI_EXCESS_SAMPLES,
+	SFE_XI_NO_PIPE,
+
+	SFE_HTK_NO_PIPE,
+
+	SFE_SDS_NOT_SDS,
+	SFE_SDS_BAD_BIT_WIDTH,
+
+	SFE_SD2_FD_DISALLOWED,
+	SFE_SD2_BAD_DATA_OFFSET,
+	SFE_SD2_BAD_MAP_OFFSET,
+	SFE_SD2_BAD_DATA_LENGTH,
+	SFE_SD2_BAD_MAP_LENGTH,
+	SFE_SD2_BAD_RSRC,
+	SFE_SD2_BAD_SAMPLE_SIZE,
+
+	SFE_FLAC_BAD_HEADER,
+	SFE_FLAC_NEW_DECODER,
+	SFE_FLAC_INIT_DECODER,
+	SFE_FLAC_LOST_SYNC,
+	SFE_FLAC_BAD_SAMPLE_RATE,
+	SFE_FLAC_UNKOWN_ERROR,
+
+	SFE_WVE_NOT_WVE,
+	SFE_WVE_NO_PIPE,
+
+	SFE_VORBIS_ENCODER_BUG,
+
+	SFE_RF64_NOT_RF64,
+
+	SFE_MAX_ERROR			/* This must be last in list. */
+} ;
+
+int subformat_to_bytewidth (int format) ;
+int s_bitwidth_to_subformat (int bits) ;
+int u_bitwidth_to_subformat (int bits) ;
+
+/*  Functions for reading and writing floats and doubles on processors
+**	with non-IEEE floats/doubles.
+*/
+float	float32_be_read		(unsigned char *cptr) ;
+float	float32_le_read		(unsigned char *cptr) ;
+void	float32_be_write	(float in, unsigned char *out) ;
+void	float32_le_write	(float in, unsigned char *out) ;
+
+double	double64_be_read	(unsigned char *cptr) ;
+double	double64_le_read	(unsigned char *cptr) ;
+void	double64_be_write	(double in, unsigned char *out) ;
+void	double64_le_write	(double in, unsigned char *out) ;
+
+/* Functions for writing to the internal logging buffer. */
+
+void	psf_log_printf		(SF_PRIVATE *psf, const char *format, ...) ;
+void	psf_log_SF_INFO 	(SF_PRIVATE *psf) ;
+
+int32_t	psf_rand_int32 (void) ;
+
+void append_snprintf (char * dest, size_t maxlen, const char * fmt, ...) ;
+void psf_strlcpy_crlf (char *dest, const char *src, size_t destmax, size_t srcmax) ;
+
+/* Functions used when writing file headers. */
+
+int		psf_binheader_writef	(SF_PRIVATE *psf, const char *format, ...) ;
+void	psf_asciiheader_printf	(SF_PRIVATE *psf, const 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) ;
+
+/* Functions defined in command.c. */
+
+int		psf_get_format_simple_count	(void) ;
+int		psf_get_format_simple		(SF_FORMAT_INFO *data) ;
+
+int		psf_get_format_info			(SF_FORMAT_INFO *data) ;
+
+int		psf_get_format_major_count	(void) ;
+int		psf_get_format_major		(SF_FORMAT_INFO *data) ;
+
+int		psf_get_format_subtype_count	(void) ;
+int		psf_get_format_subtype		(SF_FORMAT_INFO *data) ;
+
+void	psf_generate_format_desc (SF_PRIVATE *psf) ;
+
+double	psf_calc_signal_max			(SF_PRIVATE *psf, int normalize) ;
+int		psf_calc_max_all_channels	(SF_PRIVATE *psf, double *peaks, int normalize) ;
+
+int		psf_get_signal_max			(SF_PRIVATE *psf, double *peak) ;
+int		psf_get_max_all_channels	(SF_PRIVATE *psf, double *peaks) ;
+
+/* Functions in strings.c. */
+
+const char* psf_get_string (SF_PRIVATE *psf, int str_type) ;
+int psf_set_string (SF_PRIVATE *psf, int str_type, const char *str) ;
+int psf_store_string (SF_PRIVATE *psf, int str_type, const char *str) ;
+int psf_location_string_count (const SF_PRIVATE * psf, int location) ;
+
+/* Default seek function. Use for PCM and float encoded data. */
+sf_count_t	psf_default_seek (SF_PRIVATE *psf, int mode, sf_count_t samples_from_start) ;
+
+int macos_guess_file_type (SF_PRIVATE *psf, const char *filename) ;
+
+/*------------------------------------------------------------------------------------
+**	File I/O functions which will allow access to large files (> 2 Gig) on
+**	some 32 bit OSes. Implementation in file_io.c.
+*/
+
+int psf_fopen (SF_PRIVATE *psf) ;
+int psf_set_stdio (SF_PRIVATE *psf) ;
+int psf_file_valid (SF_PRIVATE *psf) ;
+void psf_set_file (SF_PRIVATE *psf, int fd) ;
+void psf_init_files (SF_PRIVATE *psf) ;
+void psf_use_rsrc (SF_PRIVATE *psf, int on_off) ;
+
+SNDFILE * psf_open_file (SF_PRIVATE *psf, SF_INFO *sfinfo) ;
+
+sf_count_t psf_fseek (SF_PRIVATE *psf, sf_count_t offset, int whence) ;
+sf_count_t psf_fread (void *ptr, sf_count_t bytes, sf_count_t count, SF_PRIVATE *psf) ;
+sf_count_t psf_fwrite (const void *ptr, sf_count_t bytes, sf_count_t count, SF_PRIVATE *psf) ;
+sf_count_t psf_fgets (char *buffer, sf_count_t bufsize, SF_PRIVATE *psf) ;
+sf_count_t psf_ftell (SF_PRIVATE *psf) ;
+sf_count_t psf_get_filelen (SF_PRIVATE *psf) ;
+
+void psf_fsync (SF_PRIVATE *psf) ;
+
+int psf_is_pipe (SF_PRIVATE *psf) ;
+
+int psf_ftruncate (SF_PRIVATE *psf, sf_count_t len) ;
+int psf_fclose (SF_PRIVATE *psf) ;
+
+/* Open and close the resource fork of a file. */
+int psf_open_rsrc (SF_PRIVATE *psf) ;
+int psf_close_rsrc (SF_PRIVATE *psf) ;
+
+/*
+void psf_fclearerr (SF_PRIVATE *psf) ;
+int psf_ferror (SF_PRIVATE *psf) ;
+*/
+
+/*------------------------------------------------------------------------------------
+** Functions for reading and writing different file formats.
+*/
+
+int		aiff_open	(SF_PRIVATE *psf) ;
+int		au_open		(SF_PRIVATE *psf) ;
+int		avr_open	(SF_PRIVATE *psf) ;
+int		htk_open	(SF_PRIVATE *psf) ;
+int		ircam_open	(SF_PRIVATE *psf) ;
+int		mat4_open	(SF_PRIVATE *psf) ;
+int		mat5_open	(SF_PRIVATE *psf) ;
+int		nist_open	(SF_PRIVATE *psf) ;
+int		paf_open	(SF_PRIVATE *psf) ;
+int		pvf_open	(SF_PRIVATE *psf) ;
+int		raw_open	(SF_PRIVATE *psf) ;
+int		sd2_open	(SF_PRIVATE *psf) ;
+int		sds_open	(SF_PRIVATE *psf) ;
+int		svx_open	(SF_PRIVATE *psf) ;
+int		voc_open	(SF_PRIVATE *psf) ;
+int		w64_open	(SF_PRIVATE *psf) ;
+int		wav_open	(SF_PRIVATE *psf) ;
+int		xi_open		(SF_PRIVATE *psf) ;
+int		flac_open	(SF_PRIVATE *psf) ;
+int		caf_open	(SF_PRIVATE *psf) ;
+int		mpc2k_open	(SF_PRIVATE *psf) ;
+int		rf64_open	(SF_PRIVATE *psf) ;
+
+/* In progress. Do not currently work. */
+
+int		ogg_vorbis_open	(SF_PRIVATE *psf) ;
+int		ogg_speex_open	(SF_PRIVATE *psf) ;
+int		ogg_pcm_open	(SF_PRIVATE *psf) ;
+
+
+int		mpeg_open	(SF_PRIVATE *psf) ;
+int		ogg_open	(SF_PRIVATE *psf) ;
+int		rx2_open	(SF_PRIVATE *psf) ;
+int		txw_open	(SF_PRIVATE *psf) ;
+int		wve_open	(SF_PRIVATE *psf) ;
+int		dwd_open	(SF_PRIVATE *psf) ;
+
+int		macbinary3_open (SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------------
+**	Init functions for a number of common data encodings.
+*/
+
+int		pcm_init		(SF_PRIVATE *psf) ;
+int		ulaw_init		(SF_PRIVATE *psf) ;
+int		alaw_init		(SF_PRIVATE *psf) ;
+int		float32_init	(SF_PRIVATE *psf) ;
+int		double64_init	(SF_PRIVATE *psf) ;
+int		dwvw_init		(SF_PRIVATE *psf, int bitwidth) ;
+int		gsm610_init		(SF_PRIVATE *psf) ;
+int		vox_adpcm_init	(SF_PRIVATE *psf) ;
+int		flac_init		(SF_PRIVATE *psf) ;
+int		g72x_init 		(SF_PRIVATE * psf) ;
+
+int 	dither_init		(SF_PRIVATE *psf, int mode) ;
+
+int		wav_w64_ima_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ;
+int		wav_w64_msadpcm_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ;
+
+int		aiff_ima_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ;
+
+int		interleave_init (SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------------
+** Chunk logging functions.
+*/
+
+typedef struct
+{	struct
+	{	int chunk ;
+		sf_count_t offset ;
+		sf_count_t len ;
+	} l [100] ;
+
+	int count ;
+} PRIV_CHUNK4 ;
+
+void pchk4_store (PRIV_CHUNK4 * pchk, int marker, sf_count_t offset, sf_count_t len) ;
+int pchk4_find (PRIV_CHUNK4 * pchk, int marker) ;
+
+/*------------------------------------------------------------------------------------
+** Functions that work like OpenBSD's strlcpy/strlcat to replace strncpy/strncat.
+**
+** See : http://www.gratisoft.us/todd/papers/strlcpy.html
+**
+** These functions are available on *BSD, but are not avaialble everywhere so we
+** implement them here.
+**
+** The argument order has been changed to that of strncpy/strncat to cause
+** compiler errors if code is carelessly converted from one to the other.
+*/
+
+static inline void
+psf_strlcat (char *dest, size_t n, const char *src)
+{	strncat (dest, src, n - strlen (dest) - 1) ;
+	dest [n - 1] = 0 ;
+} /* psf_strlcat */
+
+static inline void
+psf_strlcpy (char *dest, size_t n, const char *src)
+{	strncpy (dest, src, n - 1) ;
+	dest [n - 1] = 0 ;
+} /* psf_strlcpy */
+
+/*------------------------------------------------------------------------------------
+** Other helper functions.
+*/
+
+void	*psf_memset (void *s, int c, sf_count_t n) ;
+
+SF_INSTRUMENT * psf_instrument_alloc (void) ;
+
+void	psf_sanitize_string (char * cptr, int len) ;
+
+/* Generate the current date as a string. */
+void	psf_get_date_str (char *str, int maxlen) ;
+
+SF_BROADCAST_INFO_16K * broadcast_var_alloc (void) ;
+int		broadcast_var_set (SF_PRIVATE *psf, const SF_BROADCAST_INFO * data, size_t datasize) ;
+int		broadcast_var_get (SF_PRIVATE *psf, SF_BROADCAST_INFO * data, size_t datasize) ;
+
+
+typedef struct
+{	int channels ;
+	int endianness ;
+} AUDIO_DETECT ;
+
+int audio_detect (SF_PRIVATE * psf, AUDIO_DETECT *ad, const unsigned char * data, int datalen) ;
+int id3_skip (SF_PRIVATE * psf) ;
+
+/*------------------------------------------------------------------------------------
+** Helper/debug functions.
+*/
+
+void	psf_hexdump (const void *ptr, int len) ;
+
+const char * str_of_major_format (int format) ;
+const char * str_of_minor_format (int format) ;
+const char * str_of_open_mode (int mode) ;
+const char * str_of_endianness (int end) ;
+
+/*------------------------------------------------------------------------------------
+** Extra commands for sf_command(). Not for public use yet.
+*/
+
+enum
+{	SFC_TEST_AIFF_ADD_INST_CHUNK	= 0x2000,
+	SFC_TEST_WAV_ADD_INFO_CHUNK		= 0x2010
+} ;
+
+/*
+** Maybe, one day, make these functions or something like them, public.
+**
+** Buffer to buffer dithering. Pointer in and out are allowed to point
+** to the same buffer for in-place dithering.
+*/
+
+#if 0
+int sf_dither_short		(const SF_DITHER_INFO *dither, const short *in, short *out, int count) ;
+int sf_dither_int		(const SF_DITHER_INFO *dither, const int *in, int *out, int count) ;
+int sf_dither_float		(const SF_DITHER_INFO *dither, const float *in, float *out, int count) ;
+int sf_dither_double	(const SF_DITHER_INFO *dither, const double *in, double *out, int count) ;
+#endif
+
+#endif /* SNDFILE_COMMON_H */
+
diff --git a/jni/libsndfile-1.0.25/src/common.lo b/jni/libsndfile-1.0.25/src/common.lo
new file mode 100644
index 0000000..aa8b8e0
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/common.lo
@@ -0,0 +1,12 @@
+# common.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/common.o'
+
+# Name of the non-PIC object
+non_pic_object='common.o'
+
diff --git a/jni/libsndfile-1.0.25/src/common.o b/jni/libsndfile-1.0.25/src/common.o
new file mode 100644
index 0000000..13880f3
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/common.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/config.h b/jni/libsndfile-1.0.25/src/config.h
new file mode 100644
index 0000000..c253a1d
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/config.h
@@ -0,0 +1,291 @@
+/* src/config.h.  Generated from config.h.in by configure.  */
+/* src/config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Set to 1 if the compile is GNU GCC. */
+#define COMPILER_IS_GCC 1
+
+/* Target processor clips on negative float to int conversion. */
+#define CPU_CLIPS_NEGATIVE 0
+
+/* Target processor clips on positive float to int conversion. */
+#define CPU_CLIPS_POSITIVE 0
+
+/* Target processor is big endian. */
+#define CPU_IS_BIG_ENDIAN 0
+
+/* Target processor is little endian. */
+#define CPU_IS_LITTLE_ENDIAN 1
+
+/* Set to 1 to enable experimental code. */
+#define ENABLE_EXPERIMENTAL_CODE 0
+
+/* Define to 1 if you have the <alsa/asoundlib.h> header file. */
+/* #undef HAVE_ALSA_ASOUNDLIB_H */
+
+/* Define to 1 if you have the <byteswap.h> header file. */
+#define HAVE_BYTESWAP_H 1
+
+/* Define to 1 if you have the `calloc' function. */
+#define HAVE_CALLOC 1
+
+/* Define to 1 if you have the `ceil' function. */
+#define HAVE_CEIL 1
+
+/* Set to 1 if S_IRGRP is defined. */
+#define HAVE_DECL_S_IRGRP 1
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the <endian.h> header file. */
+#define HAVE_ENDIAN_H 1
+
+/* Will be set to 1 if flac, ogg and vorbis are available. */
+#define HAVE_EXTERNAL_LIBS 0
+
+/* Set to 1 if the compile supports the struct hack. */
+#define HAVE_FLEXIBLE_ARRAY 1
+
+/* Define to 1 if you have the `floor' function. */
+#define HAVE_FLOOR 1
+
+/* Define to 1 if you have the `fmod' function. */
+#define HAVE_FMOD 1
+
+/* Define to 1 if you have the `free' function. */
+#define HAVE_FREE 1
+
+/* Define to 1 if you have the `fstat' function. */
+#define HAVE_FSTAT 1
+
+/* Define to 1 if you have the `fsync' function. */
+#define HAVE_FSYNC 1
+
+/* Define to 1 if you have the `ftruncate' function. */
+#define HAVE_FTRUNCATE 1
+
+/* Define to 1 if you have the `getpagesize' function. */
+#define HAVE_GETPAGESIZE 1
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#define HAVE_GETTIMEOFDAY 1
+
+/* Define to 1 if you have the `gmtime' function. */
+#define HAVE_GMTIME 1
+
+/* Define to 1 if you have the `gmtime_r' function. */
+#define HAVE_GMTIME_R 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the `m' library (-lm). */
+#define HAVE_LIBM 1
+
+/* Define to 1 if you have the <locale.h> header file. */
+#define HAVE_LOCALE_H 1
+
+/* Define to 1 if you have the `localtime' function. */
+#define HAVE_LOCALTIME 1
+
+/* Define to 1 if you have the `localtime_r' function. */
+#define HAVE_LOCALTIME_R 1
+
+/* Define if you have C99's lrint function. */
+#define HAVE_LRINT 1
+
+/* Define if you have C99's lrintf function. */
+#define HAVE_LRINTF 1
+
+/* Define to 1 if you have the `lseek' function. */
+#define HAVE_LSEEK 1
+
+/* Define to 1 if you have the `malloc' function. */
+#define HAVE_MALLOC 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the `mmap' function. */
+#define HAVE_MMAP 1
+
+/* Define to 1 if you have the `open' function. */
+#define HAVE_OPEN 1
+
+/* Define to 1 if you have the `pipe' function. */
+#define HAVE_PIPE 1
+
+/* Define to 1 if you have the `pread' function. */
+#define HAVE_PREAD 1
+
+/* Define to 1 if you have the `pwrite' function. */
+#define HAVE_PWRITE 1
+
+/* Define to 1 if you have the `read' function. */
+#define HAVE_READ 1
+
+/* Define to 1 if you have the `realloc' function. */
+#define HAVE_REALLOC 1
+
+/* Define to 1 if you have the `setlocale' function. */
+#define HAVE_SETLOCALE 1
+
+/* Define to 1 if you have the <sndio.h> header file. */
+/* #undef HAVE_SNDIO_H */
+
+/* Define to 1 if you have the `snprintf' function. */
+#define HAVE_SNPRINTF 1
+
+/* Set to 1 if you have libsqlite3. */
+#define HAVE_SQLITE3 1
+
+/* Define to 1 if the system has the type `ssize_t'. */
+#define HAVE_SSIZE_T 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
+#define HAVE_SYS_WAIT_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#define HAVE_VSNPRINTF 1
+
+/* Define to 1 if you have the `waitpid' function. */
+#define HAVE_WAITPID 1
+
+/* Define to 1 if you have the `write' function. */
+#define HAVE_WRITE 1
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#define LT_OBJDIR ".libs/"
+
+/* Define to 1 if your C compiler doesn't accept -c and -o together. */
+/* #undef NO_MINUS_C_MINUS_O */
+
+/* Set to 1 if compiling for MacOSX */
+#define OS_IS_MACOSX 0
+
+/* Set to 1 if compiling for Win32 */
+#define OS_IS_WIN32 0
+
+/* Name of package */
+#define PACKAGE "libsndfile"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "sndfile@mega-nerd.com"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "libsndfile"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "libsndfile 1.0.25"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "libsndfile"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL "http://www.mega-nerd.com/libsndfile/"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "1.0.25"
+
+/* Set to maximum allowed value of sf_count_t type. */
+#define SF_COUNT_MAX 0x7FFFFFFFFFFFFFFFLL
+
+/* The size of `double', as computed by sizeof. */
+#define SIZEOF_DOUBLE 8
+
+/* The size of `float', as computed by sizeof. */
+#define SIZEOF_FLOAT 4
+
+/* The size of `int', as computed by sizeof. */
+#define SIZEOF_INT 4
+
+/* The size of `int64_t', as computed by sizeof. */
+#define SIZEOF_INT64_T 8
+
+/* The size of `loff_t', as computed by sizeof. */
+/* #undef SIZEOF_LOFF_T */
+
+/* The size of `long', as computed by sizeof. */
+#define SIZEOF_LONG 8
+
+/* The size of `long long', as computed by sizeof. */
+#define SIZEOF_LONG_LONG 8
+
+/* The size of `off64_t', as computed by sizeof. */
+/* #undef SIZEOF_OFF64_T */
+
+/* The size of `off_t', as computed by sizeof. */
+#define SIZEOF_OFF_T 8
+
+/* Set to sizeof (long) if unknown. */
+#define SIZEOF_SF_COUNT_T 8
+
+/* The size of `short', as computed by sizeof. */
+#define SIZEOF_SHORT 2
+
+/* The size of `size_t', as computed by sizeof. */
+#define SIZEOF_SIZE_T 8
+
+/* The size of `ssize_t', as computed by sizeof. */
+#define SIZEOF_SSIZE_T 8
+
+/* The size of `void*', as computed by sizeof. */
+#define SIZEOF_VOIDP 8
+
+/* The size of `wchar_t', as computed by sizeof. */
+#define SIZEOF_WCHAR_T 4
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Set to long if unknown. */
+#define TYPEOF_SF_COUNT_T int64_t
+
+/* Set to 1 to use the native windows API */
+#define USE_WINDOWS_API 0
+
+/* Version number of package */
+#define VERSION "1.0.25"
+
+/* Set to 1 if windows DLL is being built. */
+#define WIN32_TARGET_DLL 0
+
+/* Target processor is big endian. */
+#define WORDS_BIGENDIAN 0
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS */
+
+/* Define to make fseeko etc. visible, on some hosts. */
+/* #undef _LARGEFILE_SOURCE */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
+
+/* Set to 1 to use C99 printf/snprintf in MinGW. */
+/* #undef __USE_MINGW_ANSI_STDIO */
diff --git a/jni/libsndfile-1.0.25/src/config.h.in b/jni/libsndfile-1.0.25/src/config.h.in
new file mode 100644
index 0000000..f55a59a
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/config.h.in
@@ -0,0 +1,290 @@
+/* src/config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Set to 1 if the compile is GNU GCC. */
+#undef COMPILER_IS_GCC
+
+/* Target processor clips on negative float to int conversion. */
+#undef CPU_CLIPS_NEGATIVE
+
+/* Target processor clips on positive float to int conversion. */
+#undef CPU_CLIPS_POSITIVE
+
+/* Target processor is big endian. */
+#undef CPU_IS_BIG_ENDIAN
+
+/* Target processor is little endian. */
+#undef CPU_IS_LITTLE_ENDIAN
+
+/* Set to 1 to enable experimental code. */
+#undef ENABLE_EXPERIMENTAL_CODE
+
+/* Define to 1 if you have the <alsa/asoundlib.h> header file. */
+#undef HAVE_ALSA_ASOUNDLIB_H
+
+/* Define to 1 if you have the <byteswap.h> header file. */
+#undef HAVE_BYTESWAP_H
+
+/* Define to 1 if you have the `calloc' function. */
+#undef HAVE_CALLOC
+
+/* Define to 1 if you have the `ceil' function. */
+#undef HAVE_CEIL
+
+/* Set to 1 if S_IRGRP is defined. */
+#undef HAVE_DECL_S_IRGRP
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <endian.h> header file. */
+#undef HAVE_ENDIAN_H
+
+/* Will be set to 1 if flac, ogg and vorbis are available. */
+#undef HAVE_EXTERNAL_LIBS
+
+/* Set to 1 if the compile supports the struct hack. */
+#undef HAVE_FLEXIBLE_ARRAY
+
+/* Define to 1 if you have the `floor' function. */
+#undef HAVE_FLOOR
+
+/* Define to 1 if you have the `fmod' function. */
+#undef HAVE_FMOD
+
+/* Define to 1 if you have the `free' function. */
+#undef HAVE_FREE
+
+/* Define to 1 if you have the `fstat' function. */
+#undef HAVE_FSTAT
+
+/* Define to 1 if you have the `fsync' function. */
+#undef HAVE_FSYNC
+
+/* Define to 1 if you have the `ftruncate' function. */
+#undef HAVE_FTRUNCATE
+
+/* Define to 1 if you have the `getpagesize' function. */
+#undef HAVE_GETPAGESIZE
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define to 1 if you have the `gmtime' function. */
+#undef HAVE_GMTIME
+
+/* Define to 1 if you have the `gmtime_r' function. */
+#undef HAVE_GMTIME_R
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `m' library (-lm). */
+#undef HAVE_LIBM
+
+/* Define to 1 if you have the <locale.h> header file. */
+#undef HAVE_LOCALE_H
+
+/* Define to 1 if you have the `localtime' function. */
+#undef HAVE_LOCALTIME
+
+/* Define to 1 if you have the `localtime_r' function. */
+#undef HAVE_LOCALTIME_R
+
+/* Define if you have C99's lrint function. */
+#undef HAVE_LRINT
+
+/* Define if you have C99's lrintf function. */
+#undef HAVE_LRINTF
+
+/* Define to 1 if you have the `lseek' function. */
+#undef HAVE_LSEEK
+
+/* Define to 1 if you have the `malloc' function. */
+#undef HAVE_MALLOC
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `mmap' function. */
+#undef HAVE_MMAP
+
+/* Define to 1 if you have the `open' function. */
+#undef HAVE_OPEN
+
+/* Define to 1 if you have the `pipe' function. */
+#undef HAVE_PIPE
+
+/* Define to 1 if you have the `pread' function. */
+#undef HAVE_PREAD
+
+/* Define to 1 if you have the `pwrite' function. */
+#undef HAVE_PWRITE
+
+/* Define to 1 if you have the `read' function. */
+#undef HAVE_READ
+
+/* Define to 1 if you have the `realloc' function. */
+#undef HAVE_REALLOC
+
+/* Define to 1 if you have the `setlocale' function. */
+#undef HAVE_SETLOCALE
+
+/* Define to 1 if you have the <sndio.h> header file. */
+#undef HAVE_SNDIO_H
+
+/* Define to 1 if you have the `snprintf' function. */
+#undef HAVE_SNPRINTF
+
+/* Set to 1 if you have libsqlite3. */
+#undef HAVE_SQLITE3
+
+/* Define to 1 if the system has the type `ssize_t'. */
+#undef HAVE_SSIZE_T
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#undef HAVE_VSNPRINTF
+
+/* Define to 1 if you have the `waitpid' function. */
+#undef HAVE_WAITPID
+
+/* Define to 1 if you have the `write' function. */
+#undef HAVE_WRITE
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
+/* Define to 1 if your C compiler doesn't accept -c and -o together. */
+#undef NO_MINUS_C_MINUS_O
+
+/* Set to 1 if compiling for MacOSX */
+#undef OS_IS_MACOSX
+
+/* Set to 1 if compiling for Win32 */
+#undef OS_IS_WIN32
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Set to maximum allowed value of sf_count_t type. */
+#undef SF_COUNT_MAX
+
+/* The size of `double', as computed by sizeof. */
+#undef SIZEOF_DOUBLE
+
+/* The size of `float', as computed by sizeof. */
+#undef SIZEOF_FLOAT
+
+/* The size of `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of `int64_t', as computed by sizeof. */
+#undef SIZEOF_INT64_T
+
+/* The size of `loff_t', as computed by sizeof. */
+#undef SIZEOF_LOFF_T
+
+/* The size of `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* The size of `long long', as computed by sizeof. */
+#undef SIZEOF_LONG_LONG
+
+/* The size of `off64_t', as computed by sizeof. */
+#undef SIZEOF_OFF64_T
+
+/* The size of `off_t', as computed by sizeof. */
+#undef SIZEOF_OFF_T
+
+/* Set to sizeof (long) if unknown. */
+#undef SIZEOF_SF_COUNT_T
+
+/* The size of `short', as computed by sizeof. */
+#undef SIZEOF_SHORT
+
+/* The size of `size_t', as computed by sizeof. */
+#undef SIZEOF_SIZE_T
+
+/* The size of `ssize_t', as computed by sizeof. */
+#undef SIZEOF_SSIZE_T
+
+/* The size of `void*', as computed by sizeof. */
+#undef SIZEOF_VOIDP
+
+/* The size of `wchar_t', as computed by sizeof. */
+#undef SIZEOF_WCHAR_T
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Set to long if unknown. */
+#undef TYPEOF_SF_COUNT_T
+
+/* Set to 1 to use the native windows API */
+#undef USE_WINDOWS_API
+
+/* Version number of package */
+#undef VERSION
+
+/* Set to 1 if windows DLL is being built. */
+#undef WIN32_TARGET_DLL
+
+/* Target processor is big endian. */
+#undef WORDS_BIGENDIAN
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define to make fseeko etc. visible, on some hosts. */
+#undef _LARGEFILE_SOURCE
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+/* Set to 1 to use C99 printf/snprintf in MinGW. */
+#undef __USE_MINGW_ANSI_STDIO
diff --git a/jni/libsndfile-1.0.25/src/create_symbols_file.py b/jni/libsndfile-1.0.25/src/create_symbols_file.py
new file mode 100755
index 0000000..f2cab12
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/create_symbols_file.py
@@ -0,0 +1,176 @@
+#!/usr/bin/python
+
+# Copyright (C) 2003-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the author nor the names of any contributors may be used
+#       to endorse or promote products derived from this software without
+#       specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import re, sys
+
+#----------------------------------------------------------------
+# These are all of the public functions exported from libsndfile.
+#
+# Its important not to change the order they are listed in or
+# the ordinal values in the second column.
+
+ALL_SYMBOLS = (
+	(	"sf_command", 		1	),
+	(	"sf_open",			2	),
+	(	"sf_close",			3	),
+	(	"sf_seek",			4	),
+	(	"sf_error",			7	),
+	(	"sf_perror",		8	),
+	(	"sf_error_str",		9	),
+	(	"sf_error_number",	10	),
+	(	"sf_format_check",	11	),
+	(	"sf_read_raw",		16	),
+	(	"sf_readf_short",	17	),
+	(	"sf_readf_int",		18	),
+	(	"sf_readf_float",	19	),
+	(	"sf_readf_double",	20	),
+	(	"sf_read_short",	21	),
+	(	"sf_read_int",		22	),
+	(	"sf_read_float",	23	),
+	(	"sf_read_double",	24	),
+	(	"sf_write_raw",		32	),
+	(	"sf_writef_short",	33	),
+	(	"sf_writef_int",	34	),
+	(	"sf_writef_float",	35	),
+	(	"sf_writef_double",	36	),
+	(	"sf_write_short",	37	),
+	(	"sf_write_int",		38	),
+	(	"sf_write_float",	39	),
+	(	"sf_write_double",	40	),
+	(	"sf_strerror",		50	),
+	(	"sf_get_string",	60	),
+	(	"sf_set_string",	61	),
+	(	"sf_version_string",68	),
+	(	"sf_open_fd",		70	),
+	(	"sf_wchar_open",	71  ),
+	(	"sf_open_virtual",	80	),
+	(	"sf_write_sync",	90	)
+	)
+
+#-------------------------------------------------------------------------------
+
+def linux_symbols (progname, version):
+	print "# Auto-generated by %s\n" %progname
+	print "libsndfile.so.%s" % version
+	print "{"
+	print "  global:"
+	for name, ordinal in ALL_SYMBOLS:
+		if  name == "sf_wchar_open":
+			continue
+		print "    %s ;" % name
+	print "  local:"
+	print "    * ;"
+	print "} ;"
+	print
+	return
+
+def darwin_symbols (progname, version):
+	print "# Auto-generated by %s\n" %progname
+	for name, ordinal in ALL_SYMBOLS:
+		if  name == "sf_wchar_open":
+			continue
+		print "_%s" % name
+	print
+	return
+
+def win32_symbols (progname, version, name):
+	print "; Auto-generated by %s\n" %progname
+	print "LIBRARY %s-%s.dll" % (name, re.sub ("\..*", "", version))
+	print "EXPORTS\n"
+	for name, ordinal in ALL_SYMBOLS:
+		print "%-20s @%s" % (name, ordinal)
+	print
+	return
+
+def os2_symbols (progname, version, name):
+	print "; Auto-generated by %s\n" %progname
+	print "LIBRARY %s%s" % (name, re.sub ("\..*", "", version))
+	print "INITINSTANCE TERMINSTANCE"
+	print "CODE PRELOAD MOVEABLE DISCARDABLE"
+	print "DATA PRELOAD MOVEABLE MULTIPLE NONSHARED"
+	print "EXPORTS\n"
+	for name, ordinal in ALL_SYMBOLS:
+		if  name == "sf_wchar_open":
+			continue
+		print "_%-20s @%s" % (name, ordinal)
+	print
+	return
+
+def plain_symbols (progname, version, name):
+	for name, ordinal in ALL_SYMBOLS:
+		print name
+
+def no_symbols (os_name):
+	print
+	print "No known way of restricting exported symbols on '%s'." % os_name
+	print "If you know a way, please contact the author."
+	print
+	return
+
+#-------------------------------------------------------------------------------
+
+progname = re.sub (".*[\\/]", "", sys.argv [0])
+
+if len (sys.argv) != 3:
+	print
+	print "Usage : %s <target OS name> <libsndfile version>." % progname
+	print
+	print "    Currently supported values for target OS are:"
+	print "          linux"
+	print "          darwin     (ie MacOSX)"
+	print "          win32      (ie wintendo)"
+	print "          cygwin     (Cygwin on wintendo)"
+	print "          os2        (OS/2)"
+	print "          plain      (plain list of symbols)"
+	print
+	sys.exit (1)
+
+os_name = sys.argv [1]
+version = re.sub ("\.[a-z0-9]+$", "", sys.argv [2])
+
+if os_name == "linux" or os_name == "gnu" or os_name == "binutils":
+	linux_symbols (progname, version)
+elif os_name == "darwin":
+	darwin_symbols (progname, version)
+elif os_name == "win32":
+	win32_symbols (progname, version, "libsndfile")
+elif os_name == "cygwin":
+	win32_symbols (progname, version, "cygsndfile")
+elif os_name == "os2":
+	os2_symbols (progname, version, "sndfile")
+elif os_name == "static":
+	plain_symbols (progname, version, "")
+else:
+	no_symbols (os_name)
+
+sys.exit (0)
+
diff --git a/jni/libsndfile-1.0.25/src/dither.c b/jni/libsndfile-1.0.25/src/dither.c
new file mode 100644
index 0000000..d149bc1
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/dither.c
@@ -0,0 +1,534 @@
+/*
+** Copyright (C) 2003-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdlib.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+/*============================================================================
+**	Rule number 1 is to only apply dither when going from a larger bitwidth
+**	to a smaller bitwidth. This can happen on both read and write.
+**
+**	Need to apply dither on all conversions marked X below.
+**
+**	Dither on write:
+**
+**										Input
+**					|	short		int			float		double
+**			--------+-----------------------------------------------
+**		O	8 bit	|	X			X			X			X
+**		u	16 bit	|	none		X			X			X
+**		t	24 bit	|	none		X			X			X
+**		p	32 bit	|	none		none		X			X
+**		u	float	|	none		none		none		none
+**		t	double	|	none		none		none		none
+**
+**	Dither on read:
+**
+**										Input
+**		O			|	8 bit	16 bit	24 bit	32 bit	float	double
+**		u	--------+-------------------------------------------------
+**		t	short	|	none	none	X		X		X		X
+**		p	int		|	none	none	none	X		X		X
+**		u	float	|	none	none	none	none	none	none
+**		t	double	|	none	none	none	none	none	none
+*/
+
+#define	SFE_DITHER_BAD_PTR	666
+#define	SFE_DITHER_BAD_TYPE	667
+
+typedef struct
+{	int			read_short_dither_bits, read_int_dither_bits ;
+	int			write_short_dither_bits, write_int_dither_bits ;
+	double		read_float_dither_scale, read_double_dither_bits ;
+	double		write_float_dither_scale, write_double_dither_bits ;
+
+	sf_count_t	(*read_short)	(SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+	sf_count_t	(*read_int)		(SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+	sf_count_t	(*read_float)	(SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+	sf_count_t	(*read_double)	(SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+	sf_count_t	(*write_short)	(SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+	sf_count_t	(*write_int)	(SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+	sf_count_t	(*write_float)	(SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+	sf_count_t	(*write_double)	(SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+	double buffer [SF_BUFFER_LEN / sizeof (double)] ;
+} DITHER_DATA ;
+
+static sf_count_t dither_read_short		(SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t dither_read_int		(SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+
+static sf_count_t dither_write_short	(SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t dither_write_int		(SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t dither_write_float	(SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t dither_write_double	(SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+int
+dither_init (SF_PRIVATE *psf, int mode)
+{	DITHER_DATA *pdither ;
+
+	pdither = psf->dither ; /* This may be NULL. */
+
+	/* Turn off dither on read. */
+	if (mode == SFM_READ && psf->read_dither.type == SFD_NO_DITHER)
+	{	if (pdither == NULL)
+			return 0 ; /* Dither is already off, so just return. */
+
+		if (pdither->read_short)
+			psf->read_short = pdither->read_short ;
+		if (pdither->read_int)
+			psf->read_int = pdither->read_int ;
+		if (pdither->read_float)
+			psf->read_float = pdither->read_float ;
+		if (pdither->read_double)
+			psf->read_double = pdither->read_double ;
+		return 0 ;
+		} ;
+
+	/* Turn off dither on write. */
+	if (mode == SFM_WRITE && psf->write_dither.type == SFD_NO_DITHER)
+	{	if (pdither == NULL)
+			return 0 ; /* Dither is already off, so just return. */
+
+		if (pdither->write_short)
+			psf->write_short = pdither->write_short ;
+		if (pdither->write_int)
+			psf->write_int = pdither->write_int ;
+		if (pdither->write_float)
+			psf->write_float = pdither->write_float ;
+		if (pdither->write_double)
+			psf->write_double = pdither->write_double ;
+		return 0 ;
+		} ;
+
+	/* Turn on dither on read if asked. */
+	if (mode == SFM_READ && psf->read_dither.type != 0)
+	{	if (pdither == NULL)
+			pdither = psf->dither = calloc (1, sizeof (DITHER_DATA)) ;
+		if (pdither == NULL)
+			return SFE_MALLOC_FAILED ;
+
+		switch (SF_CODEC (psf->sf.format))
+		{	case SF_FORMAT_DOUBLE :
+			case SF_FORMAT_FLOAT :
+					pdither->read_int = psf->read_int ;
+					psf->read_int = dither_read_int ;
+					break ;
+
+			case SF_FORMAT_PCM_32 :
+			case SF_FORMAT_PCM_24 :
+			case SF_FORMAT_PCM_16 :
+			case SF_FORMAT_PCM_S8 :
+			case SF_FORMAT_PCM_U8 :
+					pdither->read_short = psf->read_short ;
+					psf->read_short = dither_read_short ;
+					break ;
+
+			default : break ;
+			} ;
+		} ;
+
+	/* Turn on dither on write if asked. */
+	if (mode == SFM_WRITE && psf->write_dither.type != 0)
+	{	if (pdither == NULL)
+			pdither = psf->dither = calloc (1, sizeof (DITHER_DATA)) ;
+		if (pdither == NULL)
+			return SFE_MALLOC_FAILED ;
+
+		switch (SF_CODEC (psf->sf.format))
+		{	case SF_FORMAT_DOUBLE :
+			case SF_FORMAT_FLOAT :
+					pdither->write_int = psf->write_int ;
+					psf->write_int = dither_write_int ;
+					break ;
+
+			case SF_FORMAT_PCM_32 :
+			case SF_FORMAT_PCM_24 :
+			case SF_FORMAT_PCM_16 :
+			case SF_FORMAT_PCM_S8 :
+			case SF_FORMAT_PCM_U8 :
+					break ;
+
+			default : break ;
+			} ;
+
+		pdither->write_short = psf->write_short ;
+		psf->write_short = dither_write_short ;
+
+		pdither->write_int = psf->write_int ;
+		psf->write_int = dither_write_int ;
+
+		pdither->write_float = psf->write_float ;
+		psf->write_float = dither_write_float ;
+
+		pdither->write_double = psf->write_double ;
+		psf->write_double = dither_write_double ;
+		} ;
+
+	return 0 ;
+} /* dither_init */
+
+/*==============================================================================
+*/
+
+static void dither_short	(const short *in, short *out, int frames, int channels) ;
+static void dither_int		(const int *in, int *out, int frames, int channels) ;
+
+static void dither_float	(const float *in, float *out, int frames, int channels) ;
+static void dither_double	(const double *in, double *out, int frames, int channels) ;
+
+static sf_count_t
+dither_read_short (SF_PRIVATE * UNUSED (psf), short * UNUSED (ptr), sf_count_t len)
+{
+	return len ;
+} /* dither_read_short */
+
+static sf_count_t
+dither_read_int (SF_PRIVATE * UNUSED (psf), int * UNUSED (ptr), sf_count_t len)
+{
+	return len ;
+} /* dither_read_int */
+
+/*------------------------------------------------------------------------------
+*/
+
+static sf_count_t
+dither_write_short	(SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	DITHER_DATA *pdither ;
+	int			bufferlen, writecount, thiswrite ;
+	sf_count_t	total = 0 ;
+
+	if ((pdither = psf->dither) == NULL)
+	{	psf->error = SFE_DITHER_BAD_PTR ;
+		return 0 ;
+		} ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_S8 :
+		case SF_FORMAT_PCM_U8 :
+		case SF_FORMAT_DPCM_8 :
+				break ;
+
+		default :
+			return pdither->write_short (psf, ptr, len) ;
+		} ;
+
+	bufferlen = sizeof (pdither->buffer) / sizeof (short) ;
+
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : (int) len ;
+		writecount /= psf->sf.channels ;
+		writecount *= psf->sf.channels ;
+
+		dither_short (ptr, (short*) pdither->buffer, writecount / psf->sf.channels, psf->sf.channels) ;
+
+		thiswrite = pdither->write_short (psf, (short*) pdither->buffer, writecount) ;
+		total += thiswrite ;
+		len -= thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* dither_write_short */
+
+static sf_count_t
+dither_write_int	(SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	DITHER_DATA *pdither ;
+	int			bufferlen, writecount, thiswrite ;
+	sf_count_t	total = 0 ;
+
+	if ((pdither = psf->dither) == NULL)
+	{	psf->error = SFE_DITHER_BAD_PTR ;
+		return 0 ;
+		} ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_S8 :
+		case SF_FORMAT_PCM_U8 :
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_24 :
+				break ;
+
+		case SF_FORMAT_DPCM_8 :
+		case SF_FORMAT_DPCM_16 :
+				break ;
+
+		default :
+			return pdither->write_int (psf, ptr, len) ;
+		} ;
+
+
+	bufferlen = sizeof (pdither->buffer) / sizeof (int) ;
+
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : (int) len ;
+		writecount /= psf->sf.channels ;
+		writecount *= psf->sf.channels ;
+
+		dither_int (ptr, (int*) pdither->buffer, writecount / psf->sf.channels, psf->sf.channels) ;
+
+		thiswrite = pdither->write_int (psf, (int*) pdither->buffer, writecount) ;
+		total += thiswrite ;
+		len -= thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* dither_write_int */
+
+static sf_count_t
+dither_write_float	(SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	DITHER_DATA *pdither ;
+	int			bufferlen, writecount, thiswrite ;
+	sf_count_t	total = 0 ;
+
+	if ((pdither = psf->dither) == NULL)
+	{	psf->error = SFE_DITHER_BAD_PTR ;
+		return 0 ;
+		} ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_S8 :
+		case SF_FORMAT_PCM_U8 :
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_24 :
+				break ;
+
+		case SF_FORMAT_DPCM_8 :
+		case SF_FORMAT_DPCM_16 :
+				break ;
+
+		default :
+			return pdither->write_float (psf, ptr, len) ;
+		} ;
+
+	bufferlen = sizeof (pdither->buffer) / sizeof (float) ;
+
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : (float) len ;
+		writecount /= psf->sf.channels ;
+		writecount *= psf->sf.channels ;
+
+		dither_float (ptr, (float*) pdither->buffer, writecount / psf->sf.channels, psf->sf.channels) ;
+
+		thiswrite = pdither->write_float (psf, (float*) pdither->buffer, writecount) ;
+		total += thiswrite ;
+		len -= thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* dither_write_float */
+
+static sf_count_t
+dither_write_double	(SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	DITHER_DATA *pdither ;
+	int			bufferlen, writecount, thiswrite ;
+	sf_count_t	total = 0 ;
+
+	if ((pdither = psf->dither) == NULL)
+	{	psf->error = SFE_DITHER_BAD_PTR ;
+		return 0 ;
+		} ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_S8 :
+		case SF_FORMAT_PCM_U8 :
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_24 :
+				break ;
+
+		case SF_FORMAT_DPCM_8 :
+		case SF_FORMAT_DPCM_16 :
+				break ;
+
+		default :
+			return pdither->write_double (psf, ptr, len) ;
+		} ;
+
+
+	bufferlen = sizeof (pdither->buffer) / sizeof (double) ;
+
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : (double) len ;
+		writecount /= psf->sf.channels ;
+		writecount *= psf->sf.channels ;
+
+		dither_double (ptr, (double*) pdither->buffer, writecount / psf->sf.channels, psf->sf.channels) ;
+
+		thiswrite = pdither->write_double (psf, (double*) pdither->buffer, writecount) ;
+		total += thiswrite ;
+		len -= thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* dither_write_double */
+
+/*==============================================================================
+*/
+
+static void
+dither_short (const short *in, short *out, int frames, int channels)
+{	int ch, k ;
+
+	for (ch = 0 ; ch < channels ; ch++)
+		for (k = ch ; k < channels * frames ; k += channels)
+			out [k] = in [k] ;
+
+} /* dither_short */
+
+static void
+dither_int (const int *in, int *out, int frames, int channels)
+{	int ch, k ;
+
+	for (ch = 0 ; ch < channels ; ch++)
+		for (k = ch ; k < channels * frames ; k += channels)
+			out [k] = in [k] ;
+
+} /* dither_int */
+
+static void
+dither_float (const float *in, float *out, int frames, int channels)
+{	int ch, k ;
+
+	for (ch = 0 ; ch < channels ; ch++)
+		for (k = ch ; k < channels * frames ; k += channels)
+			out [k] = in [k] ;
+
+} /* dither_float */
+
+static void
+dither_double (const double *in, double *out, int frames, int channels)
+{	int ch, k ;
+
+	for (ch = 0 ; ch < channels ; ch++)
+		for (k = ch ; k < channels * frames ; k += channels)
+			out [k] = in [k] ;
+
+} /* dither_double */
+
+/*==============================================================================
+*/
+#if 0
+
+/*
+** Not made public because this (maybe) requires storage of state information.
+**
+** Also maybe need separate state info for each channel!!!!
+*/
+
+int
+DO_NOT_USE_sf_dither_short (const SF_DITHER_INFO *dither, const short *in, short *out, int frames, int channels)
+{	int ch, k ;
+
+	if (! dither)
+		return SFE_DITHER_BAD_PTR ;
+
+	switch (dither->type & SFD_TYPEMASK)
+	{	case SFD_WHITE :
+		case SFD_TRIANGULAR_PDF :
+				for (ch = 0 ; ch < channels ; ch++)
+					for (k = ch ; k < channels * frames ; k += channels)
+						out [k] = in [k] ;
+				break ;
+
+		default :
+			return SFE_DITHER_BAD_TYPE ;
+		} ;
+
+	return 0 ;
+} /* DO_NOT_USE_sf_dither_short */
+
+int
+DO_NOT_USE_sf_dither_int (const SF_DITHER_INFO *dither, const int *in, int *out, int frames, int channels)
+{	int ch, k ;
+
+	if (! dither)
+		return SFE_DITHER_BAD_PTR ;
+
+	switch (dither->type & SFD_TYPEMASK)
+	{	case SFD_WHITE :
+		case SFD_TRIANGULAR_PDF :
+				for (ch = 0 ; ch < channels ; ch++)
+					for (k = ch ; k < channels * frames ; k += channels)
+						out [k] = in [k] ;
+				break ;
+
+		default :
+			return SFE_DITHER_BAD_TYPE ;
+		} ;
+
+	return 0 ;
+} /* DO_NOT_USE_sf_dither_int */
+
+int
+DO_NOT_USE_sf_dither_float (const SF_DITHER_INFO *dither, const float *in, float *out, int frames, int channels)
+{	int ch, k ;
+
+	if (! dither)
+		return SFE_DITHER_BAD_PTR ;
+
+	switch (dither->type & SFD_TYPEMASK)
+	{	case SFD_WHITE :
+		case SFD_TRIANGULAR_PDF :
+				for (ch = 0 ; ch < channels ; ch++)
+					for (k = ch ; k < channels * frames ; k += channels)
+						out [k] = in [k] ;
+				break ;
+
+		default :
+			return SFE_DITHER_BAD_TYPE ;
+		} ;
+
+	return 0 ;
+} /* DO_NOT_USE_sf_dither_float */
+
+int
+DO_NOT_USE_sf_dither_double (const SF_DITHER_INFO *dither, const double *in, double *out, int frames, int channels)
+{	int ch, k ;
+
+	if (! dither)
+		return SFE_DITHER_BAD_PTR ;
+
+	switch (dither->type & SFD_TYPEMASK)
+	{	case SFD_WHITE :
+		case SFD_TRIANGULAR_PDF :
+				for (ch = 0 ; ch < channels ; ch++)
+					for (k = ch ; k < channels * frames ; k += channels)
+						out [k] = in [k] ;
+				break ;
+
+		default :
+			return SFE_DITHER_BAD_TYPE ;
+		} ;
+
+	return 0 ;
+} /* DO_NOT_USE_sf_dither_double */
+
+#endif
+
diff --git a/jni/libsndfile-1.0.25/src/dither.lo b/jni/libsndfile-1.0.25/src/dither.lo
new file mode 100644
index 0000000..9ce96e9
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/dither.lo
@@ -0,0 +1,12 @@
+# dither.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/dither.o'
+
+# Name of the non-PIC object
+non_pic_object='dither.o'
+
diff --git a/jni/libsndfile-1.0.25/src/dither.o b/jni/libsndfile-1.0.25/src/dither.o
new file mode 100644
index 0000000..2b4b41d
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/dither.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/double64.c b/jni/libsndfile-1.0.25/src/double64.c
new file mode 100644
index 0000000..425088b
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/double64.c
@@ -0,0 +1,1043 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<stdlib.h>
+#include	<string.h>
+#include	<limits.h>
+#include	<math.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+#if CPU_IS_LITTLE_ENDIAN
+	#define DOUBLE64_READ	double64_le_read
+	#define DOUBLE64_WRITE	double64_le_write
+#elif CPU_IS_BIG_ENDIAN
+	#define DOUBLE64_READ	double64_be_read
+	#define DOUBLE64_WRITE	double64_be_write
+#endif
+
+/* A 32 number which will not overflow when multiplied by sizeof (double). */
+#define SENSIBLE_LEN	(0x8000000)
+
+/*--------------------------------------------------------------------------------------------
+**	Processor floating point capabilities. double64_get_capability () returns one of the
+**	latter three values.
+*/
+
+enum
+{	DOUBLE_UNKNOWN		= 0x00,
+	DOUBLE_CAN_RW_LE	= 0x23,
+	DOUBLE_CAN_RW_BE	= 0x34,
+	DOUBLE_BROKEN_LE	= 0x45,
+	DOUBLE_BROKEN_BE	= 0x56
+} ;
+
+/*--------------------------------------------------------------------------------------------
+**	Prototypes for private functions.
+*/
+
+static sf_count_t		host_read_d2s	(SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t		host_read_d2i	(SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t		host_read_d2f	(SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t		host_read_d		(SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t		host_write_s2d	(SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t		host_write_i2d	(SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t		host_write_f2d	(SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t		host_write_d	(SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+static void		double64_peak_update	(SF_PRIVATE *psf, const double *buffer, int count, sf_count_t indx) ;
+
+static int		double64_get_capability	(SF_PRIVATE *psf) ;
+
+static sf_count_t	replace_read_d2s	(SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	replace_read_d2i	(SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	replace_read_d2f	(SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	replace_read_d	(SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t	replace_write_s2d	(SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t	replace_write_i2d	(SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t	replace_write_f2d	(SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t	replace_write_d	(SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+static	void	d2bd_read (double *buffer, int count) ;
+static	void	bd2d_write (double *buffer, int count) ;
+
+/*--------------------------------------------------------------------------------------------
+**	Exported functions.
+*/
+
+int
+double64_init	(SF_PRIVATE *psf)
+{	static int double64_caps ;
+
+	double64_caps = double64_get_capability (psf) ;
+
+	psf->blockwidth = sizeof (double) * psf->sf.channels ;
+
+	if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR)
+	{	switch (psf->endian + double64_caps)
+		{	case (SF_ENDIAN_BIG + DOUBLE_CAN_RW_BE) :
+					psf->data_endswap = SF_FALSE ;
+					psf->read_short		= host_read_d2s ;
+					psf->read_int		= host_read_d2i ;
+					psf->read_float		= host_read_d2f ;
+					psf->read_double	= host_read_d ;
+					break ;
+
+			case (SF_ENDIAN_LITTLE + DOUBLE_CAN_RW_LE) :
+					psf->data_endswap = SF_FALSE ;
+					psf->read_short		= host_read_d2s ;
+					psf->read_int		= host_read_d2i ;
+					psf->read_float		= host_read_d2f ;
+					psf->read_double	= host_read_d ;
+					break ;
+
+			case (SF_ENDIAN_BIG + DOUBLE_CAN_RW_LE) :
+					psf->data_endswap = SF_TRUE ;
+					psf->read_short		= host_read_d2s ;
+					psf->read_int		= host_read_d2i ;
+					psf->read_float		= host_read_d2f ;
+					psf->read_double	= host_read_d ;
+					break ;
+
+			case (SF_ENDIAN_LITTLE + DOUBLE_CAN_RW_BE) :
+					psf->data_endswap = SF_TRUE ;
+					psf->read_short		= host_read_d2s ;
+					psf->read_int		= host_read_d2i ;
+					psf->read_float		= host_read_d2f ;
+					psf->read_double	= host_read_d ;
+					break ;
+
+			/* When the CPU is not IEEE compatible. */
+			case (SF_ENDIAN_BIG + DOUBLE_BROKEN_BE) :
+					psf->data_endswap = SF_FALSE ;
+					psf->read_short		= replace_read_d2s ;
+					psf->read_int		= replace_read_d2i ;
+					psf->read_float		= replace_read_d2f ;
+					psf->read_double	= replace_read_d ;
+					break ;
+
+			case (SF_ENDIAN_LITTLE + DOUBLE_BROKEN_LE) :
+					psf->data_endswap = SF_FALSE ;
+					psf->read_short		= replace_read_d2s ;
+					psf->read_int		= replace_read_d2i ;
+					psf->read_float		= replace_read_d2f ;
+					psf->read_double	= replace_read_d ;
+					break ;
+
+			case (SF_ENDIAN_BIG + DOUBLE_BROKEN_LE) :
+					psf->data_endswap = SF_TRUE ;
+					psf->read_short		= replace_read_d2s ;
+					psf->read_int		= replace_read_d2i ;
+					psf->read_float		= replace_read_d2f ;
+					psf->read_double	= replace_read_d ;
+					break ;
+
+			case (SF_ENDIAN_LITTLE + DOUBLE_BROKEN_BE) :
+					psf->data_endswap = SF_TRUE ;
+					psf->read_short		= replace_read_d2s ;
+					psf->read_int		= replace_read_d2i ;
+					psf->read_float		= replace_read_d2f ;
+					psf->read_double	= replace_read_d ;
+					break ;
+
+			default : break ;
+			} ;
+		} ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	switch (psf->endian + double64_caps)
+		{	case (SF_ENDIAN_LITTLE + DOUBLE_CAN_RW_LE) :
+					psf->data_endswap = SF_FALSE ;
+					psf->write_short	= host_write_s2d ;
+					psf->write_int		= host_write_i2d ;
+					psf->write_float	= host_write_f2d ;
+					psf->write_double	= host_write_d ;
+					break ;
+
+			case (SF_ENDIAN_BIG + DOUBLE_CAN_RW_BE) :
+					psf->data_endswap = SF_FALSE ;
+					psf->write_short	= host_write_s2d ;
+					psf->write_int		= host_write_i2d ;
+					psf->write_float	= host_write_f2d ;
+					psf->write_double	= host_write_d ;
+					break ;
+
+			case (SF_ENDIAN_BIG + DOUBLE_CAN_RW_LE) :
+					psf->data_endswap = SF_TRUE ;
+					psf->write_short	= host_write_s2d ;
+					psf->write_int		= host_write_i2d ;
+					psf->write_float	= host_write_f2d ;
+					psf->write_double	= host_write_d ;
+					break ;
+
+			case (SF_ENDIAN_LITTLE + DOUBLE_CAN_RW_BE) :
+					psf->data_endswap = SF_TRUE ;
+					psf->write_short	= host_write_s2d ;
+					psf->write_int		= host_write_i2d ;
+					psf->write_float	= host_write_f2d ;
+					psf->write_double	= host_write_d ;
+					break ;
+
+			/* When the CPU is not IEEE compatible. */
+			case (SF_ENDIAN_LITTLE + DOUBLE_BROKEN_LE) :
+					psf->data_endswap = SF_FALSE ;
+					psf->write_short	= replace_write_s2d ;
+					psf->write_int		= replace_write_i2d ;
+					psf->write_float	= replace_write_f2d ;
+					psf->write_double	= replace_write_d ;
+					break ;
+
+			case (SF_ENDIAN_BIG + DOUBLE_BROKEN_BE) :
+					psf->data_endswap = SF_FALSE ;
+					psf->write_short	= replace_write_s2d ;
+					psf->write_int		= replace_write_i2d ;
+					psf->write_float	= replace_write_f2d ;
+					psf->write_double	= replace_write_d ;
+					break ;
+
+			case (SF_ENDIAN_BIG + DOUBLE_BROKEN_LE) :
+					psf->data_endswap = SF_TRUE ;
+					psf->write_short	= replace_write_s2d ;
+					psf->write_int		= replace_write_i2d ;
+					psf->write_float	= replace_write_f2d ;
+					psf->write_double	= replace_write_d ;
+					break ;
+
+			case (SF_ENDIAN_LITTLE + DOUBLE_BROKEN_BE) :
+					psf->data_endswap = SF_TRUE ;
+					psf->write_short	= replace_write_s2d ;
+					psf->write_int		= replace_write_i2d ;
+					psf->write_float	= replace_write_f2d ;
+					psf->write_double	= replace_write_d ;
+					break ;
+
+			default : break ;
+			} ;
+		} ;
+
+	if (psf->filelength > psf->dataoffset)
+	{	psf->datalength = (psf->dataend > 0) ? psf->dataend - psf->dataoffset :
+							psf->filelength - psf->dataoffset ;
+		}
+	else
+		psf->datalength = 0 ;
+
+	psf->sf.frames = psf->datalength / psf->blockwidth ;
+
+	return 0 ;
+} /* double64_init */
+
+/*----------------------------------------------------------------------------
+** From : http://www.hpcf.cam.ac.uk/fp_formats.html
+**
+** 64 bit double precision layout (big endian)
+** 	  Sign				bit 0
+** 	  Exponent			bits 1-11
+** 	  Mantissa			bits 12-63
+** 	  Exponent Offset	1023
+**
+**            double             single
+**
+** +INF     7FF0000000000000     7F800000
+** -INF     FFF0000000000000     FF800000
+**  NaN     7FF0000000000001     7F800001
+**                to               to
+**          7FFFFFFFFFFFFFFF     7FFFFFFF
+**                and              and
+**          FFF0000000000001     FF800001
+**                to               to
+**          FFFFFFFFFFFFFFFF     FFFFFFFF
+** +OVER    7FEFFFFFFFFFFFFF     7F7FFFFF
+** -OVER    FFEFFFFFFFFFFFFF     FF7FFFFF
+** +UNDER   0010000000000000     00800000
+** -UNDER   8010000000000000     80800000
+*/
+
+double
+double64_be_read (unsigned char *cptr)
+{	int		exponent, negative, upper, lower ;
+	double	dvalue ;
+
+	negative = (cptr [0] & 0x80) ? 1 : 0 ;
+	exponent = ((cptr [0] & 0x7F) << 4) | ((cptr [1] >> 4) & 0xF) ;
+
+	/* Might not have a 64 bit long, so load the mantissa into a double. */
+	upper = (((cptr [1] & 0xF) << 24) | (cptr [2] << 16) | (cptr [3] << 8) | cptr [4]) ;
+	lower = (cptr [5] << 16) | (cptr [6] << 8) | cptr [7] ;
+
+	if (exponent == 0 && upper == 0 && lower == 0)
+		return 0.0 ;
+
+	dvalue = upper + lower / ((double) 0x1000000) ;
+	dvalue += 0x10000000 ;
+
+	exponent = exponent - 0x3FF ;
+
+	dvalue = dvalue / ((double) 0x10000000) ;
+
+	if (negative)
+		dvalue *= -1 ;
+
+	if (exponent > 0)
+		dvalue *= pow (2.0, exponent) ;
+	else if (exponent < 0)
+		dvalue /= pow (2.0, abs (exponent)) ;
+
+	return dvalue ;
+} /* double64_be_read */
+
+double
+double64_le_read (unsigned char *cptr)
+{	int		exponent, negative, upper, lower ;
+	double	dvalue ;
+
+	negative = (cptr [7] & 0x80) ? 1 : 0 ;
+	exponent = ((cptr [7] & 0x7F) << 4) | ((cptr [6] >> 4) & 0xF) ;
+
+	/* Might not have a 64 bit long, so load the mantissa into a double. */
+	upper = ((cptr [6] & 0xF) << 24) | (cptr [5] << 16) | (cptr [4] << 8) | cptr [3] ;
+	lower = (cptr [2] << 16) | (cptr [1] << 8) | cptr [0] ;
+
+	if (exponent == 0 && upper == 0 && lower == 0)
+		return 0.0 ;
+
+	dvalue = upper + lower / ((double) 0x1000000) ;
+	dvalue += 0x10000000 ;
+
+	exponent = exponent - 0x3FF ;
+
+	dvalue = dvalue / ((double) 0x10000000) ;
+
+	if (negative)
+		dvalue *= -1 ;
+
+	if (exponent > 0)
+		dvalue *= pow (2.0, exponent) ;
+	else if (exponent < 0)
+		dvalue /= pow (2.0, abs (exponent)) ;
+
+	return dvalue ;
+} /* double64_le_read */
+
+void
+double64_be_write (double in, unsigned char *out)
+{	int		exponent, mantissa ;
+
+	memset (out, 0, sizeof (double)) ;
+
+	if (fabs (in) < 1e-30)
+		return ;
+
+	if (in < 0.0)
+	{	in *= -1.0 ;
+		out [0] |= 0x80 ;
+		} ;
+
+	in = frexp (in, &exponent) ;
+
+	exponent += 1022 ;
+
+	out [0] |= (exponent >> 4) & 0x7F ;
+	out [1] |= (exponent << 4) & 0xF0 ;
+
+	in *= 0x20000000 ;
+	mantissa = lrint (floor (in)) ;
+
+	out [1] |= (mantissa >> 24) & 0xF ;
+	out [2] = (mantissa >> 16) & 0xFF ;
+	out [3] = (mantissa >> 8) & 0xFF ;
+	out [4] = mantissa & 0xFF ;
+
+	in = fmod (in, 1.0) ;
+	in *= 0x1000000 ;
+	mantissa = lrint (floor (in)) ;
+
+	out [5] = (mantissa >> 16) & 0xFF ;
+	out [6] = (mantissa >> 8) & 0xFF ;
+	out [7] = mantissa & 0xFF ;
+
+	return ;
+} /* double64_be_write */
+
+void
+double64_le_write (double in, unsigned char *out)
+{	int		exponent, mantissa ;
+
+	memset (out, 0, sizeof (double)) ;
+
+	if (fabs (in) < 1e-30)
+		return ;
+
+	if (in < 0.0)
+	{	in *= -1.0 ;
+		out [7] |= 0x80 ;
+		} ;
+
+	in = frexp (in, &exponent) ;
+
+	exponent += 1022 ;
+
+	out [7] |= (exponent >> 4) & 0x7F ;
+	out [6] |= (exponent << 4) & 0xF0 ;
+
+	in *= 0x20000000 ;
+	mantissa = lrint (floor (in)) ;
+
+	out [6] |= (mantissa >> 24) & 0xF ;
+	out [5] = (mantissa >> 16) & 0xFF ;
+	out [4] = (mantissa >> 8) & 0xFF ;
+	out [3] = mantissa & 0xFF ;
+
+	in = fmod (in, 1.0) ;
+	in *= 0x1000000 ;
+	mantissa = lrint (floor (in)) ;
+
+	out [2] = (mantissa >> 16) & 0xFF ;
+	out [1] = (mantissa >> 8) & 0xFF ;
+	out [0] = mantissa & 0xFF ;
+
+	return ;
+} /* double64_le_write */
+
+/*==============================================================================================
+**	Private functions.
+*/
+
+static void
+double64_peak_update	(SF_PRIVATE *psf, const double *buffer, int count, sf_count_t indx)
+{	int 	chan ;
+	int		k, 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_info->peaks [chan].value)
+		{	psf->peak_info->peaks [chan].value = fmaxval ;
+			psf->peak_info->peaks [chan].position = psf->write_current + indx + (position / psf->sf.channels) ;
+			} ;
+		} ;
+
+	return ;
+} /* double64_peak_update */
+
+static int
+double64_get_capability	(SF_PRIVATE *psf)
+{	union
+	{	double			d ;
+		unsigned char	c [8] ;
+	} data ;
+
+	data.d = 1.234567890123456789 ; /* Some abitrary value. */
+
+	if (! psf->ieee_replace)
+	{	/* If this test is true ints and floats are compatible and little endian. */
+		if (data.c [0] == 0xfb && data.c [1] == 0x59 && data.c [2] == 0x8c && data.c [3] == 0x42 &&
+			data.c [4] == 0xca && data.c [5] == 0xc0 && data.c [6] == 0xf3 && data.c [7] == 0x3f)
+			return DOUBLE_CAN_RW_LE ;
+
+		/* If this test is true ints and floats are compatible and big endian. */
+		if (data.c [0] == 0x3f && data.c [1] == 0xf3 && data.c [2] == 0xc0 && data.c [3] == 0xca &&
+			data.c [4] == 0x42 && data.c [5] == 0x8c && data.c [6] == 0x59 && data.c [7] == 0xfb)
+			return DOUBLE_CAN_RW_BE ;
+		} ;
+
+	/* Doubles are broken. Don't expect reading or writing to be fast. */
+	psf_log_printf (psf, "Using IEEE replacement code for double.\n") ;
+
+	return (CPU_IS_LITTLE_ENDIAN) ? DOUBLE_BROKEN_LE : DOUBLE_BROKEN_BE ;
+} /* double64_get_capability */
+
+/*=======================================================================================
+*/
+
+static void
+d2s_array (const double *src, int count, short *dest, double scale)
+{	while (--count >= 0)
+	{	dest [count] = lrint (scale * src [count]) ;
+		} ;
+} /* d2s_array */
+
+static void
+d2s_clip_array (const double *src, int count, short *dest, double scale)
+{	while (--count >= 0)
+	{	double tmp = scale * src [count] ;
+
+		if (CPU_CLIPS_POSITIVE == 0 && tmp > 32767.0)
+			dest [count] = SHRT_MAX ;
+		else if (CPU_CLIPS_NEGATIVE == 0 && tmp < -32768.0)
+			dest [count] = SHRT_MIN ;
+		else
+			dest [count] = lrint (tmp) ;
+		} ;
+} /* d2s_clip_array */
+
+static void
+d2i_array (const double *src, int count, int *dest, double scale)
+{	while (--count >= 0)
+	{	dest [count] = lrint (scale * src [count]) ;
+		} ;
+} /* d2i_array */
+
+static void
+d2i_clip_array (const double *src, int count, int *dest, double scale)
+{	while (--count >= 0)
+	{	float tmp = scale * src [count] ;
+
+		if (CPU_CLIPS_POSITIVE == 0 && tmp > (1.0 * INT_MAX))
+			dest [count] = INT_MAX ;
+		else if (CPU_CLIPS_NEGATIVE == 0 && tmp < (-1.0 * INT_MAX))
+			dest [count] = INT_MIN ;
+		else
+			dest [count] = lrint (tmp) ;
+		} ;
+} /* d2i_clip_array */
+
+static inline void
+d2f_array (const double *src, int count, float *dest)
+{	while (--count >= 0)
+	{	dest [count] = src [count] ;
+		} ;
+} /* d2f_array */
+
+static inline void
+s2d_array (const short *src, double *dest, int count, double scale)
+{	while (--count >= 0)
+	{	dest [count] = scale * src [count] ;
+		} ;
+} /* s2d_array */
+
+static inline void
+i2d_array (const int *src, double *dest, int count, double scale)
+{	while (--count >= 0)
+	{	dest [count] = scale * src [count] ;
+		} ;
+} /* i2d_array */
+
+static inline void
+f2d_array (const float *src, double *dest, int count)
+{	while (--count >= 0)
+	{	dest [count] = src [count] ;
+		} ;
+} /* f2d_array */
+
+/*----------------------------------------------------------------------------------------------
+*/
+
+static sf_count_t
+host_read_d2s	(SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	void		(*convert) (const double *, int, short *, double) ;
+	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	double		scale ;
+
+	convert = (psf->add_clipping) ? d2s_clip_array : d2s_array ;
+	bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+	scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_double_array (psf->u.dbuf, readcount) ;
+
+		convert (psf->u.dbuf, readcount, ptr + total, scale) ;
+		total += readcount ;
+		len -= readcount ;
+		if (readcount < bufferlen)
+			break ;
+		} ;
+
+	return total ;
+} /* host_read_d2s */
+
+static sf_count_t
+host_read_d2i	(SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	void		(*convert) (const double *, int, int *, double) ;
+	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	double		scale ;
+
+	convert = (psf->add_clipping) ? d2i_clip_array : d2i_array ;
+	bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+	scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFFFFFF / psf->float_max ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_double_array (psf->u.dbuf, bufferlen) ;
+
+		convert (psf->u.dbuf, readcount, ptr + total, scale) ;
+		total += readcount ;
+		len -= readcount ;
+		if (readcount < bufferlen)
+			break ;
+		} ;
+
+	return total ;
+} /* host_read_d2i */
+
+static sf_count_t
+host_read_d2f	(SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_double_array (psf->u.dbuf, bufferlen) ;
+
+		d2f_array (psf->u.dbuf, readcount, ptr + total) ;
+		total += readcount ;
+		len -= readcount ;
+		if (readcount < bufferlen)
+			break ;
+		} ;
+
+	return total ;
+} /* host_read_d2f */
+
+static sf_count_t
+host_read_d	(SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	int			bufferlen ;
+	sf_count_t	readcount, total = 0 ;
+
+	readcount = psf_fread (ptr, sizeof (double), len, psf) ;
+
+	if (psf->data_endswap != SF_TRUE)
+		return readcount ;
+
+	/* If the read length was sensible, endswap output in one go. */
+	if (readcount < SENSIBLE_LEN)
+	{	endswap_double_array (ptr, readcount) ;
+		return readcount ;
+		} ;
+
+	bufferlen = SENSIBLE_LEN ;
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+
+		endswap_double_array (ptr + total, bufferlen) ;
+
+		total += bufferlen ;
+		len -= bufferlen ;
+		} ;
+
+	return total ;
+} /* host_read_d */
+
+static sf_count_t
+host_write_s2d	(SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+	double		scale ;
+
+	scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / 0x8000 ;
+	bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+
+		s2d_array (ptr + total, psf->u.dbuf, bufferlen, scale) ;
+
+		if (psf->peak_info)
+			double64_peak_update (psf, psf->u.dbuf, bufferlen, total / psf->sf.channels) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_double_array (psf->u.dbuf, bufferlen) ;
+
+		writecount = psf_fwrite (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* host_write_s2d */
+
+static sf_count_t
+host_write_i2d	(SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+	double		scale ;
+
+	scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / (8.0 * 0x10000000) ;
+	bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		i2d_array (ptr + total, psf->u.dbuf, bufferlen, scale) ;
+
+		if (psf->peak_info)
+			double64_peak_update (psf, psf->u.dbuf, bufferlen, total / psf->sf.channels) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_double_array (psf->u.dbuf, bufferlen) ;
+
+		writecount = psf_fwrite (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* host_write_i2d */
+
+static sf_count_t
+host_write_f2d	(SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		f2d_array (ptr + total, psf->u.dbuf, bufferlen) ;
+
+		if (psf->peak_info)
+			double64_peak_update (psf, psf->u.dbuf, bufferlen, total / psf->sf.channels) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_double_array (psf->u.dbuf, bufferlen) ;
+
+		writecount = psf_fwrite (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* host_write_f2d */
+
+static sf_count_t
+host_write_d	(SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	if (psf->peak_info)
+		double64_peak_update (psf, ptr, len, 0) ;
+
+	if (psf->data_endswap != SF_TRUE)
+		return psf_fwrite (ptr, sizeof (double), len, psf) ;
+
+	bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+
+		endswap_double_copy (psf->u.dbuf, ptr + total, bufferlen) ;
+
+		writecount = psf_fwrite (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* host_write_d */
+
+/*=======================================================================================
+*/
+
+static sf_count_t
+replace_read_d2s	(SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	double		scale ;
+
+	bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+	scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_double_array (psf->u.dbuf, bufferlen) ;
+
+		d2bd_read (psf->u.dbuf, bufferlen) ;
+
+		d2s_array (psf->u.dbuf, readcount, ptr + total, scale) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* replace_read_d2s */
+
+static sf_count_t
+replace_read_d2i	(SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	double		scale ;
+
+	bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+	scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFFFFFF / psf->float_max ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_double_array (psf->u.dbuf, bufferlen) ;
+
+		d2bd_read (psf->u.dbuf, bufferlen) ;
+
+		d2i_array (psf->u.dbuf, readcount, ptr + total, scale) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* replace_read_d2i */
+
+static sf_count_t
+replace_read_d2f	(SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_double_array (psf->u.dbuf, bufferlen) ;
+
+		d2bd_read (psf->u.dbuf, bufferlen) ;
+
+		memcpy (ptr + total, psf->u.dbuf, bufferlen * sizeof (double)) ;
+
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* replace_read_d2f */
+
+static sf_count_t
+replace_read_d	(SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	/* FIXME : This is probably nowhere near optimal. */
+	bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_double_array (psf->u.dbuf, readcount) ;
+
+		d2bd_read (psf->u.dbuf, readcount) ;
+
+		memcpy (ptr + total, psf->u.dbuf, readcount * sizeof (double)) ;
+
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* replace_read_d */
+
+static sf_count_t
+replace_write_s2d	(SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+	double		scale ;
+
+	scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / 0x8000 ;
+	bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		s2d_array (ptr + total, psf->u.dbuf, bufferlen, scale) ;
+
+		if (psf->peak_info)
+			double64_peak_update (psf, psf->u.dbuf, bufferlen, total / psf->sf.channels) ;
+
+		bd2d_write (psf->u.dbuf, bufferlen) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_double_array (psf->u.dbuf, bufferlen) ;
+
+		writecount = psf_fwrite (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* replace_write_s2d */
+
+static sf_count_t
+replace_write_i2d	(SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+	double		scale ;
+
+	scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / (8.0 * 0x10000000) ;
+	bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		i2d_array (ptr + total, psf->u.dbuf, bufferlen, scale) ;
+
+		if (psf->peak_info)
+			double64_peak_update (psf, psf->u.dbuf, bufferlen, total / psf->sf.channels) ;
+
+		bd2d_write (psf->u.dbuf, bufferlen) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_double_array (psf->u.dbuf, bufferlen) ;
+
+		writecount = psf_fwrite (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* replace_write_i2d */
+
+static sf_count_t
+replace_write_f2d	(SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		f2d_array (ptr + total, psf->u.dbuf, bufferlen) ;
+
+		bd2d_write (psf->u.dbuf, bufferlen) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_double_array (psf->u.dbuf, bufferlen) ;
+
+		writecount = psf_fwrite (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* replace_write_f2d */
+
+static sf_count_t
+replace_write_d	(SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	/* FIXME : This is probably nowhere near optimal. */
+	if (psf->peak_info)
+		double64_peak_update (psf, ptr, len, 0) ;
+
+	bufferlen = ARRAY_LEN (psf->u.dbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+
+		memcpy (psf->u.dbuf, ptr + total, bufferlen * sizeof (double)) ;
+
+		bd2d_write (psf->u.dbuf, bufferlen) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_double_array (psf->u.dbuf, bufferlen) ;
+
+		writecount = psf_fwrite (psf->u.dbuf, sizeof (double), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* replace_write_d */
+
+/*----------------------------------------------------------------------------------------------
+*/
+
+static void
+d2bd_read (double *buffer, int count)
+{	while (--count >= 0)
+	{	buffer [count] = DOUBLE64_READ ((unsigned char *) (buffer + count)) ;
+		} ;
+} /* d2bd_read */
+
+static void
+bd2d_write (double *buffer, int count)
+{	while (--count >= 0)
+	{	DOUBLE64_WRITE (buffer [count], (unsigned char*) (buffer + count)) ;
+		} ;
+} /* bd2d_write */
+
diff --git a/jni/libsndfile-1.0.25/src/double64.lo b/jni/libsndfile-1.0.25/src/double64.lo
new file mode 100644
index 0000000..a26310e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/double64.lo
@@ -0,0 +1,12 @@
+# double64.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/double64.o'
+
+# Name of the non-PIC object
+non_pic_object='double64.o'
+
diff --git a/jni/libsndfile-1.0.25/src/double64.o b/jni/libsndfile-1.0.25/src/double64.o
new file mode 100644
index 0000000..d3f1765
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/double64.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/dwd.c b/jni/libsndfile-1.0.25/src/dwd.c
new file mode 100644
index 0000000..fba7b0c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/dwd.c
@@ -0,0 +1,200 @@
+/*
+** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+#if (ENABLE_EXPERIMENTAL_CODE == 0)
+
+int
+dwd_open	(SF_PRIVATE *psf)
+{	if (psf)
+		return SFE_UNIMPLEMENTED ;
+	return 0 ;
+} /* dwd_open */
+
+#else
+
+/*------------------------------------------------------------------------------
+** Macros to handle big/little endian issues.
+*/
+
+#define SFE_DWD_NO_DWD			1666
+#define SFE_DWD_BAND_BIT_WIDTH 	1667
+#define SFE_DWD_COMPRESSION		1668
+
+#define	DWD_IDENTIFIER		"DiamondWare Digitized\n\0\x1a"
+#define	DWD_IDENTIFIER_LEN	24
+
+#define	DWD_HEADER_LEN		57
+
+/*------------------------------------------------------------------------------
+** Typedefs.
+*/
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static int	dwd_read_header (SF_PRIVATE *psf) ;
+
+static int	dwd_close		(SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+dwd_open (SF_PRIVATE *psf)
+{	int	error = 0 ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = dwd_read_header (psf)))
+			return error ;
+		} ;
+
+	if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_DWD)
+		return	SFE_BAD_OPEN_FORMAT ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{
+		/*-psf->endian = SF_ENDIAN (psf->sf.format) ;
+		if (CPU_IS_LITTLE_ENDIAN && psf->endian == SF_ENDIAN_CPU)
+			psf->endian = SF_ENDIAN_LITTLE ;
+		else if (psf->endian != SF_ENDIAN_LITTLE)
+			psf->endian = SF_ENDIAN_BIG ;
+
+		if (! (encoding = dwd_write_header (psf, SF_FALSE)))
+			return psf->error ;
+
+		psf->write_header = dwd_write_header ;
+		-*/
+		} ;
+
+	psf->container_close = dwd_close ;
+
+	/*-psf->blockwidth = psf->bytewidth * psf->sf.channels ;-*/
+
+	return error ;
+} /* dwd_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+dwd_close	(SF_PRIVATE * UNUSED (psf))
+{
+	return 0 ;
+} /* dwd_close */
+
+/* This struct contains all the fields of interest om the DWD header, but does not
+** do so in the same order and layout as the actual file, header.
+** No assumptions are made about the packing of this struct.
+*/
+typedef struct
+{	unsigned char major, minor, compression, channels, bitwidth ;
+	unsigned short srate, maxval ;
+	unsigned int id, datalen, frames, offset ;
+} DWD_HEADER ;
+
+static int
+dwd_read_header (SF_PRIVATE *psf)
+{	DWD_HEADER	dwdh ;
+
+	memset (psf->u.cbuf, 0, sizeof (psf->u.cbuf)) ;
+	/* Set position to start of file to begin reading header. */
+	psf_binheader_readf (psf, "pb", 0, psf->u.cbuf, DWD_IDENTIFIER_LEN) ;
+
+	if (memcmp (psf->u.cbuf, DWD_IDENTIFIER, DWD_IDENTIFIER_LEN) != 0)
+		return SFE_DWD_NO_DWD ;
+
+	psf_log_printf (psf, "Read only : DiamondWare Digitized (.dwd)\n", psf->u.cbuf) ;
+
+	psf_binheader_readf (psf, "11", &dwdh.major, &dwdh.minor) ;
+	psf_binheader_readf (psf, "e4j1", &dwdh.id, 1, &dwdh.compression) ;
+	psf_binheader_readf (psf, "e211", &dwdh.srate, &dwdh.channels, &dwdh.bitwidth) ;
+	psf_binheader_readf (psf, "e24", &dwdh.maxval, &dwdh.datalen) ;
+	psf_binheader_readf (psf, "e44", &dwdh.frames, &dwdh.offset) ;
+
+	psf_log_printf (psf, "  Version Major : %d\n  Version Minor : %d\n  Unique ID     : %08X\n",
+						dwdh.major, dwdh.minor, dwdh.id) ;
+	psf_log_printf (psf, "  Compression   : %d => ", dwdh.compression) ;
+
+	if (dwdh.compression != 0)
+	{	psf_log_printf (psf, "Unsupported compression\n") ;
+		return SFE_DWD_COMPRESSION ;
+		}
+	else
+		psf_log_printf (psf, "None\n") ;
+
+	psf_log_printf (psf, "  Sample Rate   : %d\n  Channels      : %d\n"
+						 "  Bit Width     : %d\n",
+						 dwdh.srate, dwdh.channels, dwdh.bitwidth) ;
+
+	switch (dwdh.bitwidth)
+	{	case 8 :
+				psf->sf.format = SF_FORMAT_DWD | SF_FORMAT_PCM_S8 ;
+				psf->bytewidth = 1 ;
+				break ;
+
+		case 16 :
+				psf->sf.format = SF_FORMAT_DWD | SF_FORMAT_PCM_16 ;
+				psf->bytewidth = 2 ;
+				break ;
+
+		default :
+				psf_log_printf (psf, "*** Bad bit width %d\n", dwdh.bitwidth) ;
+				return SFE_DWD_BAND_BIT_WIDTH ;
+				} ;
+
+	if (psf->filelength != dwdh.offset + dwdh.datalen)
+	{	psf_log_printf (psf, "  Data Length   : %d (should be %D)\n", dwdh.datalen, psf->filelength - dwdh.offset) ;
+		dwdh.datalen = (unsigned int) (psf->filelength - dwdh.offset) ;
+		}
+	else
+		psf_log_printf (psf, "  Data Length   : %d\n", dwdh.datalen) ;
+
+	psf_log_printf (psf, "  Max Value     : %d\n", dwdh.maxval) ;
+	psf_log_printf (psf, "  Frames        : %d\n", dwdh.frames) ;
+	psf_log_printf (psf, "  Data Offset   : %d\n", dwdh.offset) ;
+
+	psf->datalength = dwdh.datalen ;
+	psf->dataoffset = dwdh.offset ;
+
+	psf->endian = SF_ENDIAN_LITTLE ;
+
+	psf->sf.samplerate = dwdh.srate ;
+	psf->sf.channels = dwdh.channels ;
+	psf->sf.sections = 1 ;
+
+	return pcm_init (psf) ;
+} /* dwd_read_header */
+
+/*------------------------------------------------------------------------------
+*/
+
+#endif
+
diff --git a/jni/libsndfile-1.0.25/src/dwd.lo b/jni/libsndfile-1.0.25/src/dwd.lo
new file mode 100644
index 0000000..639fa5a
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/dwd.lo
@@ -0,0 +1,12 @@
+# dwd.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/dwd.o'
+
+# Name of the non-PIC object
+non_pic_object='dwd.o'
+
diff --git a/jni/libsndfile-1.0.25/src/dwd.o b/jni/libsndfile-1.0.25/src/dwd.o
new file mode 100644
index 0000000..0e66c34
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/dwd.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/dwvw.c b/jni/libsndfile-1.0.25/src/dwvw.c
new file mode 100644
index 0000000..562f015
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/dwvw.c
@@ -0,0 +1,662 @@
+/*
+** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/*===========================================================================
+** Delta Word Variable Width
+**
+** This decoder and encoder were implemented using information found in this
+** document : http://home.swbell.net/rubywand/R011SNDFMTS.TXT
+**
+** According to the document, the algorithm "was invented 1991 by Magnus
+** Lidstrom and is copyright 1993 by NuEdge Development".
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<stdlib.h>
+#include	<string.h>
+#include	<math.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+typedef struct
+{	int		dwm_maxsize, bit_width, max_delta, span ;
+	int		samplecount ;
+	int		bit_count, bits, last_delta_width, last_sample ;
+	struct
+	{	int				index, end ;
+		unsigned char	buffer [256] ;
+	} b ;
+} DWVW_PRIVATE ;
+
+/*============================================================================================
+*/
+
+static sf_count_t dwvw_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t dwvw_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t dwvw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t dwvw_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t dwvw_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t dwvw_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t dwvw_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t dwvw_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+static sf_count_t	dwvw_seek	(SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+static int	dwvw_close	(SF_PRIVATE *psf) ;
+
+static int	dwvw_decode_data (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int *ptr, int len) ;
+static int	dwvw_decode_load_bits (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int bit_count) ;
+
+static int	dwvw_encode_data (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, const int *ptr, int len) ;
+static void dwvw_encode_store_bits (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int data, int new_bits) ;
+static void dwvw_read_reset (DWVW_PRIVATE *pdwvw) ;
+
+/*============================================================================================
+** DWVW initialisation function.
+*/
+
+int
+dwvw_init (SF_PRIVATE *psf, int bitwidth)
+{	DWVW_PRIVATE	*pdwvw ;
+
+	if (psf->codec_data != NULL)
+	{	psf_log_printf (psf, "*** psf->codec_data is not NULL.\n") ;
+		return SFE_INTERNAL ;
+		} ;
+
+	if (bitwidth > 24)
+		return SFE_DWVW_BAD_BITWIDTH ;
+
+	if (psf->file.mode == SFM_RDWR)
+		return SFE_BAD_MODE_RW ;
+
+	if ((pdwvw = calloc (1, sizeof (DWVW_PRIVATE))) == NULL)
+		return SFE_MALLOC_FAILED ;
+
+	psf->codec_data = (void*) pdwvw ;
+
+	pdwvw->bit_width 	= bitwidth ;
+	pdwvw->dwm_maxsize	= bitwidth / 2 ;
+	pdwvw->max_delta	= 1 << (bitwidth - 1) ;
+	pdwvw->span			= 1 << bitwidth ;
+
+	dwvw_read_reset (pdwvw) ;
+
+	if (psf->file.mode == SFM_READ)
+	{	psf->read_short		= dwvw_read_s ;
+		psf->read_int		= dwvw_read_i ;
+		psf->read_float		= dwvw_read_f ;
+		psf->read_double	= dwvw_read_d ;
+		} ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	psf->write_short	= dwvw_write_s ;
+		psf->write_int		= dwvw_write_i ;
+		psf->write_float	= dwvw_write_f ;
+		psf->write_double	= dwvw_write_d ;
+		} ;
+
+	psf->codec_close = dwvw_close ;
+	psf->seek = dwvw_seek ;
+
+	/* FIXME : This is bogus. */
+	psf->sf.frames = SF_COUNT_MAX ;
+	psf->datalength = psf->sf.frames ;
+	/* EMXIF : This is bogus. */
+
+	return 0 ;
+} /* dwvw_init */
+
+/*--------------------------------------------------------------------------------------------
+*/
+
+static int
+dwvw_close (SF_PRIVATE *psf)
+{	DWVW_PRIVATE *pdwvw ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	pdwvw = (DWVW_PRIVATE*) psf->codec_data ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	static int last_values [12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ;
+
+		/* Write 8 zero samples to fully flush output. */
+		dwvw_encode_data (psf, pdwvw, last_values, 12) ;
+
+		/* Write the last buffer worth of data to disk. */
+		psf_fwrite (pdwvw->b.buffer, 1, pdwvw->b.index, psf) ;
+
+		if (psf->write_header)
+			psf->write_header (psf, SF_TRUE) ;
+		} ;
+
+	return 0 ;
+} /* dwvw_close */
+
+static sf_count_t
+dwvw_seek	(SF_PRIVATE *psf, int UNUSED (mode), sf_count_t offset)
+{	DWVW_PRIVATE *pdwvw ;
+
+	if (! psf->codec_data)
+	{	psf->error = SFE_INTERNAL ;
+		return PSF_SEEK_ERROR ;
+		} ;
+
+	pdwvw = (DWVW_PRIVATE*) psf->codec_data ;
+
+	if (offset == 0)
+	{	psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+		dwvw_read_reset (pdwvw) ;
+		return 0 ;
+		} ;
+
+	psf->error = SFE_BAD_SEEK ;
+	return	PSF_SEEK_ERROR ;
+} /* dwvw_seek */
+
+
+/*==============================================================================
+*/
+
+static sf_count_t
+dwvw_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	DWVW_PRIVATE *pdwvw ;
+	int		*iptr ;
+	int		k, bufferlen, readcount = 0, count ;
+	sf_count_t	total = 0 ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pdwvw = (DWVW_PRIVATE*) psf->codec_data ;
+
+	iptr = psf->u.ibuf ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = dwvw_decode_data (psf, pdwvw, iptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = iptr [k] >> 16 ;
+
+		total += count ;
+		len -= readcount ;
+		if (count != readcount)
+			break ;
+		} ;
+
+	return total ;
+} /* dwvw_read_s */
+
+static sf_count_t
+dwvw_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	DWVW_PRIVATE *pdwvw ;
+	int			readcount, count ;
+	sf_count_t	total = 0 ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pdwvw = (DWVW_PRIVATE*) psf->codec_data ;
+
+	while (len > 0)
+	{	readcount = (len > 0x10000000) ? 0x10000000 : (int) len ;
+
+		count = dwvw_decode_data (psf, pdwvw, ptr, readcount) ;
+
+		total += count ;
+		len -= count ;
+
+		if (count != readcount)
+			break ;
+		} ;
+
+	return total ;
+} /* dwvw_read_i */
+
+static sf_count_t
+dwvw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	DWVW_PRIVATE *pdwvw ;
+	int		*iptr ;
+	int		k, bufferlen, readcount = 0, count ;
+	sf_count_t	total = 0 ;
+	float	normfact ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pdwvw = (DWVW_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ;
+
+	iptr = psf->u.ibuf ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = dwvw_decode_data (psf, pdwvw, iptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = normfact * (float) (iptr [k]) ;
+
+		total += count ;
+		len -= readcount ;
+		if (count != readcount)
+			break ;
+		} ;
+
+	return total ;
+} /* dwvw_read_f */
+
+static sf_count_t
+dwvw_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	DWVW_PRIVATE *pdwvw ;
+	int		*iptr ;
+	int		k, bufferlen, readcount = 0, count ;
+	sf_count_t	total = 0 ;
+	double 	normfact ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pdwvw = (DWVW_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 ;
+
+	iptr = psf->u.ibuf ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = dwvw_decode_data (psf, pdwvw, iptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = normfact * (double) (iptr [k]) ;
+
+		total += count ;
+		len -= readcount ;
+		if (count != readcount)
+			break ;
+		} ;
+
+	return total ;
+} /* dwvw_read_d */
+
+static int
+dwvw_decode_data (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int *ptr, int len)
+{	int	count ;
+	int delta_width_modifier, delta_width, delta_negative, delta, sample ;
+
+	/* Restore state from last decode call. */
+	delta_width = pdwvw->last_delta_width ;
+	sample = pdwvw->last_sample ;
+
+	for (count = 0 ; count < len ; count++)
+	{	/* If bit_count parameter is zero get the delta_width_modifier. */
+		delta_width_modifier = dwvw_decode_load_bits (psf, pdwvw, -1) ;
+
+		/* Check for end of input bit stream. Break loop if end. */
+		if (delta_width_modifier < 0)
+			break ;
+
+		if (delta_width_modifier && dwvw_decode_load_bits (psf, pdwvw, 1))
+			delta_width_modifier = - delta_width_modifier ;
+
+		/* Calculate the current word width. */
+		delta_width = (delta_width + delta_width_modifier + pdwvw->bit_width) % pdwvw->bit_width ;
+
+		/* Load the delta. */
+		delta = 0 ;
+		if (delta_width)
+		{	delta = dwvw_decode_load_bits (psf, pdwvw, delta_width - 1) | (1 << (delta_width - 1)) ;
+			delta_negative = dwvw_decode_load_bits (psf, pdwvw, 1) ;
+			if (delta == pdwvw->max_delta - 1)
+				delta += dwvw_decode_load_bits (psf, pdwvw, 1) ;
+			if (delta_negative)
+				delta = -delta ;
+			} ;
+
+		/* Calculate the sample */
+		sample += delta ;
+
+		if (sample >= pdwvw->max_delta)
+			sample -= pdwvw->span ;
+		else if (sample < - pdwvw->max_delta)
+			sample += pdwvw->span ;
+
+		/* Store the sample justifying to the most significant bit. */
+		ptr [count] = sample << (32 - pdwvw->bit_width) ;
+
+		if (pdwvw->b.end == 0 && pdwvw->bit_count == 0)
+			break ;
+		} ;
+
+	pdwvw->last_delta_width = delta_width ;
+	pdwvw->last_sample = sample ;
+
+	pdwvw->samplecount += count ;
+
+	return count ;
+} /* dwvw_decode_data */
+
+static int
+dwvw_decode_load_bits (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int bit_count)
+{	int output = 0, get_dwm = SF_FALSE ;
+
+	/*
+	**	Depending on the value of parameter bit_count, either get the
+	**	required number of bits (ie bit_count > 0) or the
+	**	delta_width_modifier (otherwise).
+	*/
+
+	if (bit_count < 0)
+	{	get_dwm = SF_TRUE ;
+		/* modify bit_count to ensure we have enought bits for finding dwm. */
+		bit_count = pdwvw->dwm_maxsize ;
+		} ;
+
+	/* Load bits in bit reseviour. */
+	while (pdwvw->bit_count < bit_count)
+	{	if (pdwvw->b.index >= pdwvw->b.end)
+		{	pdwvw->b.end = psf_fread (pdwvw->b.buffer, 1, sizeof (pdwvw->b.buffer), psf) ;
+			pdwvw->b.index = 0 ;
+			} ;
+
+		/* Check for end of input stream. */
+		if (bit_count < 8 && pdwvw->b.end == 0)
+			return -1 ;
+
+		pdwvw->bits = (pdwvw->bits << 8) ;
+
+		if (pdwvw->b.index < pdwvw->b.end)
+		{	pdwvw->bits |= pdwvw->b.buffer [pdwvw->b.index] ;
+			pdwvw->b.index ++ ;
+			} ;
+		pdwvw->bit_count += 8 ;
+		} ;
+
+	/* If asked to get bits do so. */
+	if (! get_dwm)
+	{	output = (pdwvw->bits >> (pdwvw->bit_count - bit_count)) & ((1 << bit_count) - 1) ;
+		pdwvw->bit_count -= bit_count ;
+		return output ;
+		} ;
+
+	/* Otherwise must have been asked to get delta_width_modifier. */
+	while (output < (pdwvw->dwm_maxsize))
+	{	pdwvw->bit_count -= 1 ;
+		if (pdwvw->bits & (1 << pdwvw->bit_count))
+			break ;
+		output += 1 ;
+		} ;
+
+	return output ;
+} /* dwvw_decode_load_bits */
+
+static void
+dwvw_read_reset (DWVW_PRIVATE *pdwvw)
+{	pdwvw->samplecount		= 0 ;
+	pdwvw->b.index			= 0 ;
+	pdwvw->b.end			= 0 ;
+	pdwvw->bit_count		= 0 ;
+	pdwvw->bits				= 0 ;
+	pdwvw->last_delta_width = 0 ;
+	pdwvw->last_sample		= 0 ;
+} /* dwvw_read_reset */
+
+static void
+dwvw_encode_store_bits (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int data, int new_bits)
+{	int 	byte ;
+
+	/* Shift the bits into the resevoir. */
+	pdwvw->bits = (pdwvw->bits << new_bits) | (data & ((1 << new_bits) - 1)) ;
+	pdwvw->bit_count += new_bits ;
+
+	/* Transfer bit to buffer. */
+	while (pdwvw->bit_count >= 8)
+	{	byte = pdwvw->bits >> (pdwvw->bit_count - 	8) ;
+		pdwvw->bit_count -= 8 ;
+		pdwvw->b.buffer [pdwvw->b.index] = byte & 0xFF ;
+		pdwvw->b.index ++ ;
+		} ;
+
+	if (pdwvw->b.index > SIGNED_SIZEOF (pdwvw->b.buffer) - 4)
+	{	psf_fwrite (pdwvw->b.buffer, 1, pdwvw->b.index, psf) ;
+		pdwvw->b.index = 0 ;
+		} ;
+
+	return ;
+} /* dwvw_encode_store_bits */
+
+#if 0
+/* Debigging routine. */
+static void
+dump_bits (DWVW_PRIVATE *pdwvw)
+{	int k, mask ;
+
+	for (k = 0 ; k < 10 && k < pdwvw->b.index ; k++)
+	{	mask = 0x80 ;
+		while (mask)
+		{	putchar (mask & pdwvw->b.buffer [k] ? '1' : '0') ;
+			mask >>= 1 ;
+			} ;
+		putchar (' ') ;
+		}
+
+	for (k = pdwvw->bit_count - 1 ; k >= 0 ; k --)
+		putchar (pdwvw->bits & (1 << k) ? '1' : '0') ;
+
+	putchar ('\n') ;
+} /* dump_bits */
+#endif
+
+#define HIGHEST_BIT(x,count)		\
+			{	int y = x ;			\
+				(count) = 0 ;	 	\
+				while (y)			\
+				{	(count) ++ ;	\
+					y >>= 1 ;		\
+					} ;				\
+				} ;
+
+static int
+dwvw_encode_data (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, const int *ptr, int len)
+{	int	count ;
+	int delta_width_modifier, delta, delta_negative, delta_width, extra_bit ;
+
+	for (count = 0 ; count < len ; count++)
+	{	delta = (ptr [count] >> (32 - pdwvw->bit_width)) - pdwvw->last_sample ;
+
+		/* Calculate extra_bit if needed. */
+		extra_bit = -1 ;
+		delta_negative = 0 ;
+		if (delta < -pdwvw->max_delta)
+			delta = pdwvw->max_delta + (delta % pdwvw->max_delta) ;
+		else if (delta == -pdwvw->max_delta)
+		{	extra_bit = 1 ;
+			delta_negative = 1 ;
+			delta = pdwvw->max_delta - 1 ;
+			}
+		else if (delta > pdwvw->max_delta)
+		{	delta_negative = 1 ;
+			delta = pdwvw->span - delta ;
+			delta = abs (delta) ;
+			}
+		else if (delta == pdwvw->max_delta)
+		{	extra_bit = 1 ;
+			delta = pdwvw->max_delta - 1 ;
+			}
+		else if (delta < 0)
+		{	delta_negative = 1 ;
+			delta = abs (delta) ;
+			} ;
+
+		if (delta == pdwvw->max_delta - 1 && extra_bit == -1)
+			extra_bit = 0 ;
+
+		/* Find width in bits of delta */
+		HIGHEST_BIT (delta, delta_width) ;
+
+		/* Calculate the delta_width_modifier */
+		delta_width_modifier = (delta_width - pdwvw->last_delta_width) % pdwvw->bit_width ;
+		if (delta_width_modifier > pdwvw->dwm_maxsize)
+			delta_width_modifier -= pdwvw->bit_width ;
+		if (delta_width_modifier < -pdwvw->dwm_maxsize)
+			delta_width_modifier += pdwvw->bit_width ;
+
+		/* Write delta_width_modifier zeros, followed by terminating '1'. */
+		dwvw_encode_store_bits (psf, pdwvw, 0, abs (delta_width_modifier)) ;
+		if (abs (delta_width_modifier) != pdwvw->dwm_maxsize)
+			dwvw_encode_store_bits (psf, pdwvw, 1, 1) ;
+
+		/*  Write delta_width_modifier sign. */
+		if (delta_width_modifier < 0)
+			dwvw_encode_store_bits (psf, pdwvw, 1, 1) ;
+		if (delta_width_modifier > 0)
+			dwvw_encode_store_bits (psf, pdwvw, 0, 1) ;
+
+		/* Write delta and delta sign bit. */
+		if (delta_width)
+		{	dwvw_encode_store_bits (psf, pdwvw, delta, abs (delta_width) - 1) ;
+			dwvw_encode_store_bits (psf, pdwvw, (delta_negative ? 1 : 0), 1) ;
+			} ;
+
+		/* Write extra bit!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
+		if (extra_bit >= 0)
+			dwvw_encode_store_bits (psf, pdwvw, extra_bit, 1) ;
+
+		pdwvw->last_sample = ptr [count] >> (32 - pdwvw->bit_width) ;
+		pdwvw->last_delta_width = delta_width ;
+		} ;
+
+	pdwvw->samplecount += count ;
+
+	return count ;
+} /* dwvw_encode_data */
+
+static sf_count_t
+dwvw_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	DWVW_PRIVATE *pdwvw ;
+	int		*iptr ;
+	int		k, bufferlen, writecount = 0, count ;
+	sf_count_t	total = 0 ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pdwvw = (DWVW_PRIVATE*) psf->codec_data ;
+
+	iptr = psf->u.ibuf ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			iptr [k] = ptr [total + k] << 16 ;
+		count = dwvw_encode_data (psf, pdwvw, iptr, writecount) ;
+
+		total += count ;
+		len -= writecount ;
+		if (count != writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* dwvw_write_s */
+
+static sf_count_t
+dwvw_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	DWVW_PRIVATE *pdwvw ;
+	int			writecount, count ;
+	sf_count_t	total = 0 ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pdwvw = (DWVW_PRIVATE*) psf->codec_data ;
+
+	while (len > 0)
+	{	writecount = (len > 0x10000000) ? 0x10000000 : (int) len ;
+
+		count = dwvw_encode_data (psf, pdwvw, ptr, writecount) ;
+
+		total += count ;
+		len -= count ;
+
+		if (count != writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* dwvw_write_i */
+
+static sf_count_t
+dwvw_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	DWVW_PRIVATE *pdwvw ;
+	int			*iptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	sf_count_t	total = 0 ;
+	float		normfact ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pdwvw = (DWVW_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFFFFFF) : 1.0 ;
+
+	iptr = psf->u.ibuf ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			iptr [k] = lrintf (normfact * ptr [total + k]) ;
+		count = dwvw_encode_data (psf, pdwvw, iptr, writecount) ;
+
+		total += count ;
+		len -= writecount ;
+		if (count != writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* dwvw_write_f */
+
+static sf_count_t
+dwvw_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	DWVW_PRIVATE *pdwvw ;
+	int			*iptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	sf_count_t	total = 0 ;
+	double 		normfact ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pdwvw = (DWVW_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFFFFFF) : 1.0 ;
+
+	iptr = psf->u.ibuf ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			iptr [k] = lrint (normfact * ptr [total + k]) ;
+		count = dwvw_encode_data (psf, pdwvw, iptr, writecount) ;
+
+		total += count ;
+		len -= writecount ;
+		if (count != writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* dwvw_write_d */
+
diff --git a/jni/libsndfile-1.0.25/src/dwvw.lo b/jni/libsndfile-1.0.25/src/dwvw.lo
new file mode 100644
index 0000000..c09edcf
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/dwvw.lo
@@ -0,0 +1,12 @@
+# dwvw.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/dwvw.o'
+
+# Name of the non-PIC object
+non_pic_object='dwvw.o'
+
diff --git a/jni/libsndfile-1.0.25/src/dwvw.o b/jni/libsndfile-1.0.25/src/dwvw.o
new file mode 100644
index 0000000..f09b031
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/dwvw.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/file_io.c b/jni/libsndfile-1.0.25/src/file_io.c
new file mode 100644
index 0000000..44f1b5a
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/file_io.c
@@ -0,0 +1,1547 @@
+/*
+** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2003 Ross Bencina <rbencina@iprimus.com.au>
+**
+** This program is free software; you can redistribute it and/or modify
+** 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.
+*/
+
+/*
+**	The file is split into three sections as follows:
+**		- The top section (USE_WINDOWS_API == 0) for Linux, Unix and MacOSX
+**			systems (including Cygwin).
+**		- The middle section (USE_WINDOWS_API == 1) for microsoft windows
+**			(including MinGW) using the native windows API.
+**		- A legacy windows section which attempted to work around grevious
+**			bugs in microsoft's POSIX implementation.
+*/
+
+/*
+**	The header file sfconfig.h MUST be included before the others to ensure
+**	that large file support is enabled correctly on Unix systems.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#if (HAVE_DECL_S_IRGRP == 0)
+#include <sf_unistd.h>
+#endif
+
+#include <string.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/stat.h>
+
+#include "sndfile.h"
+#include "common.h"
+
+#define	SENSIBLE_SIZE	(0x40000000)
+
+/*
+**	Neat solution to the Win32/OS2 binary file flage requirement.
+**	If O_BINARY isn't already defined by the inclusion of the system
+**	headers, set it to zero.
+*/
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
+static void psf_log_syserr (SF_PRIVATE *psf, int error) ;
+
+#if (USE_WINDOWS_API == 0)
+
+/*------------------------------------------------------------------------------
+** Win32 stuff at the bottom of the file. Unix and other sensible OSes here.
+*/
+
+static int psf_close_fd (int fd) ;
+static int psf_open_fd (PSF_FILE * pfile) ;
+static sf_count_t psf_get_filelen_fd (int fd) ;
+
+int
+psf_fopen (SF_PRIVATE *psf)
+{
+	psf->error = 0 ;
+	psf->file.filedes = psf_open_fd (&psf->file) ;
+
+	if (psf->file.filedes == - SFE_BAD_OPEN_MODE)
+	{	psf->error = SFE_BAD_OPEN_MODE ;
+		psf->file.filedes = -1 ;
+		return psf->error ;
+		} ;
+
+	if (psf->file.filedes == -1)
+		psf_log_syserr (psf, errno) ;
+
+	return psf->error ;
+} /* psf_fopen */
+
+int
+psf_fclose (SF_PRIVATE *psf)
+{	int retval ;
+
+	if (psf->virtual_io)
+		return 0 ;
+
+	if (psf->file.do_not_close_descriptor)
+	{	psf->file.filedes = -1 ;
+		return 0 ;
+		} ;
+
+	if ((retval = psf_close_fd (psf->file.filedes)) == -1)
+		psf_log_syserr (psf, errno) ;
+
+	psf->file.filedes = -1 ;
+
+	return retval ;
+} /* psf_fclose */
+
+int
+psf_open_rsrc (SF_PRIVATE *psf)
+{
+	if (psf->rsrc.filedes > 0)
+		return 0 ;
+
+	/* Test for MacOSX style resource fork on HPFS or HPFS+ filesystems. */
+	snprintf (psf->rsrc.path.c, sizeof (psf->rsrc.path.c), "%s/rsrc", psf->file.path.c) ;
+	psf->error = SFE_NO_ERROR ;
+	if ((psf->rsrc.filedes = psf_open_fd (&psf->rsrc)) >= 0)
+	{	psf->rsrclength = psf_get_filelen_fd (psf->rsrc.filedes) ;
+		if (psf->rsrclength > 0 || (psf->rsrc.mode & SFM_WRITE))
+			return SFE_NO_ERROR ;
+		psf_close_fd (psf->rsrc.filedes) ;
+		psf->rsrc.filedes = -1 ;
+		} ;
+
+	if (psf->rsrc.filedes == - SFE_BAD_OPEN_MODE)
+	{	psf->error = SFE_BAD_OPEN_MODE ;
+		return psf->error ;
+		} ;
+
+	/*
+	** Now try for a resource fork stored as a separate file in the same
+	** directory, but preceded with a dot underscore.
+	*/
+	snprintf (psf->rsrc.path.c, sizeof (psf->rsrc.path.c), "%s._%s", psf->file.dir.c, psf->file.name.c) ;
+	psf->error = SFE_NO_ERROR ;
+	if ((psf->rsrc.filedes = psf_open_fd (&psf->rsrc)) >= 0)
+	{	psf->rsrclength = psf_get_filelen_fd (psf->rsrc.filedes) ;
+		return SFE_NO_ERROR ;
+		} ;
+
+	/*
+	** Now try for a resource fork stored in a separate file in the
+	** .AppleDouble/ directory.
+	*/
+	snprintf (psf->rsrc.path.c, sizeof (psf->rsrc.path.c), "%s.AppleDouble/%s", psf->file.dir.c, psf->file.name.c) ;
+	psf->error = SFE_NO_ERROR ;
+	if ((psf->rsrc.filedes = psf_open_fd (&psf->rsrc)) >= 0)
+	{	psf->rsrclength = psf_get_filelen_fd (psf->rsrc.filedes) ;
+		return SFE_NO_ERROR ;
+		} ;
+
+	/* No resource file found. */
+	if (psf->rsrc.filedes == -1)
+		psf_log_syserr (psf, errno) ;
+
+	psf->rsrc.filedes = -1 ;
+
+	return psf->error ;
+} /* psf_open_rsrc */
+
+sf_count_t
+psf_get_filelen (SF_PRIVATE *psf)
+{	sf_count_t	filelen ;
+
+	if (psf->virtual_io)
+		return psf->vio.get_filelen (psf->vio_user_data) ;
+
+	filelen = psf_get_filelen_fd (psf->file.filedes) ;
+
+	if (filelen == -1)
+	{	psf_log_syserr (psf, errno) ;
+		return (sf_count_t) -1 ;
+		} ;
+
+	if (filelen == -SFE_BAD_STAT_SIZE)
+	{	psf->error = SFE_BAD_STAT_SIZE ;
+		return (sf_count_t) -1 ;
+		} ;
+
+	switch (psf->file.mode)
+	{	case SFM_WRITE :
+			filelen = filelen - psf->fileoffset ;
+			break ;
+
+		case SFM_READ :
+			if (psf->fileoffset > 0 && psf->filelength > 0)
+				filelen = psf->filelength ;
+			break ;
+
+		case SFM_RDWR :
+			/*
+			** Cannot open embedded files SFM_RDWR so we don't need to
+			** subtract psf->fileoffset. We already have the answer we
+			** need.
+			*/
+			break ;
+
+		default :
+			/* Shouldn't be here, so return error. */
+			filelen = -1 ;
+		} ;
+
+	return filelen ;
+} /* psf_get_filelen */
+
+int
+psf_close_rsrc (SF_PRIVATE *psf)
+{	psf_close_fd (psf->rsrc.filedes) ;
+	psf->rsrc.filedes = -1 ;
+	return 0 ;
+} /* psf_close_rsrc */
+
+int
+psf_set_stdio (SF_PRIVATE *psf)
+{	int	error = 0 ;
+
+	switch (psf->file.mode)
+	{	case SFM_RDWR :
+				error = SFE_OPEN_PIPE_RDWR ;
+				break ;
+
+		case SFM_READ :
+				psf->file.filedes = 0 ;
+				break ;
+
+		case SFM_WRITE :
+				psf->file.filedes = 1 ;
+				break ;
+
+		default :
+				error = SFE_BAD_OPEN_MODE ;
+				break ;
+		} ;
+	psf->filelength = 0 ;
+
+	return error ;
+} /* psf_set_stdio */
+
+void
+psf_set_file (SF_PRIVATE *psf, int fd)
+{	psf->file.filedes = fd ;
+} /* psf_set_file */
+
+int
+psf_file_valid (SF_PRIVATE *psf)
+{	return (psf->file.filedes >= 0) ? SF_TRUE : SF_FALSE ;
+} /* psf_set_file */
+
+sf_count_t
+psf_fseek (SF_PRIVATE *psf, sf_count_t offset, int whence)
+{	sf_count_t	current_pos, new_position ;
+
+	if (psf->virtual_io)
+		return psf->vio.seek (offset, whence, psf->vio_user_data) ;
+
+	current_pos = psf_ftell (psf) ;
+
+	switch (whence)
+	{	case SEEK_SET :
+				offset += psf->fileoffset ;
+				break ;
+
+		case SEEK_END :
+				if (psf->file.mode == SFM_WRITE)
+				{	new_position = lseek (psf->file.filedes, offset, whence) ;
+
+					if (new_position < 0)
+						psf_log_syserr (psf, errno) ;
+
+					return new_position - psf->fileoffset ;
+					} ;
+
+				/* Transform SEEK_END into a SEEK_SET, ie find the file
+				** length add the requested offset (should be <= 0) to
+				** get the offset wrt the start of file.
+				*/
+				whence = SEEK_SET ;
+				offset = lseek (psf->file.filedes, 0, SEEK_END) + offset ;
+				break ;
+
+		case SEEK_CUR :
+				/* Translate a SEEK_CUR into a SEEK_SET. */
+				offset += current_pos ;
+				whence = SEEK_SET ;
+				break ;
+
+		default :
+				/* We really should not be here. */
+				psf_log_printf (psf, "psf_fseek : whence is %d *****.\n", whence) ;
+				return 0 ;
+		} ;
+
+	if (current_pos != offset)
+		new_position = lseek (psf->file.filedes, offset, whence) ;
+	else
+		new_position = offset ;
+
+	if (new_position < 0)
+		psf_log_syserr (psf, errno) ;
+
+	new_position -= psf->fileoffset ;
+
+	return new_position ;
+} /* psf_fseek */
+
+sf_count_t
+psf_fread (void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf)
+{	sf_count_t total = 0 ;
+	ssize_t	count ;
+
+	if (psf->virtual_io)
+		return psf->vio.read (ptr, bytes*items, psf->vio_user_data) / bytes ;
+
+	items *= bytes ;
+
+	/* Do this check after the multiplication above. */
+	if (items <= 0)
+		return 0 ;
+
+	while (items > 0)
+	{	/* Break the read down to a sensible size. */
+		count = (items > SENSIBLE_SIZE) ? SENSIBLE_SIZE : (ssize_t) items ;
+
+		count = read (psf->file.filedes, ((char*) ptr) + total, (size_t) count) ;
+
+		if (count == -1)
+		{	if (errno == EINTR)
+				continue ;
+
+			psf_log_syserr (psf, errno) ;
+			break ;
+			} ;
+
+		if (count == 0)
+			break ;
+
+		total += count ;
+		items -= count ;
+		} ;
+
+	if (psf->is_pipe)
+		psf->pipeoffset += total ;
+
+	return total / bytes ;
+} /* psf_fread */
+
+sf_count_t
+psf_fwrite (const void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf)
+{	sf_count_t total = 0 ;
+	ssize_t	count ;
+
+	if (psf->virtual_io)
+		return psf->vio.write (ptr, bytes*items, psf->vio_user_data) / bytes ;
+
+	items *= bytes ;
+
+	/* Do this check after the multiplication above. */
+	if (items <= 0)
+		return 0 ;
+
+	while (items > 0)
+	{	/* Break the writes down to a sensible size. */
+		count = (items > SENSIBLE_SIZE) ? SENSIBLE_SIZE : items ;
+
+		count = write (psf->file.filedes, ((const char*) ptr) + total, count) ;
+
+		if (count == -1)
+		{	if (errno == EINTR)
+				continue ;
+
+			psf_log_syserr (psf, errno) ;
+			break ;
+			} ;
+
+		if (count == 0)
+			break ;
+
+		total += count ;
+		items -= count ;
+		} ;
+
+	if (psf->is_pipe)
+		psf->pipeoffset += total ;
+
+	return total / bytes ;
+} /* psf_fwrite */
+
+sf_count_t
+psf_ftell (SF_PRIVATE *psf)
+{	sf_count_t pos ;
+
+	if (psf->virtual_io)
+		return psf->vio.tell (psf->vio_user_data) ;
+
+	if (psf->is_pipe)
+		return psf->pipeoffset ;
+
+	pos = lseek (psf->file.filedes, 0, SEEK_CUR) ;
+
+	if (pos == ((sf_count_t) -1))
+	{	psf_log_syserr (psf, errno) ;
+		return -1 ;
+		} ;
+
+	return pos - psf->fileoffset ;
+} /* psf_ftell */
+
+static int
+psf_close_fd (int fd)
+{	int retval ;
+
+	if (fd < 0)
+		return 0 ;
+
+	while ((retval = close (fd)) == -1 && errno == EINTR)
+		/* Do nothing. */ ;
+
+	return retval ;
+} /* psf_close_fd */
+
+sf_count_t
+psf_fgets (char *buffer, sf_count_t bufsize, SF_PRIVATE *psf)
+{	sf_count_t	k = 0 ;
+	sf_count_t		count ;
+
+	while (k < bufsize - 1)
+	{	count = read (psf->file.filedes, &(buffer [k]), 1) ;
+
+		if (count == -1)
+		{	if (errno == EINTR)
+				continue ;
+
+			psf_log_syserr (psf, errno) ;
+			break ;
+			} ;
+
+		if (count == 0 || buffer [k++] == '\n')
+			break ;
+		} ;
+
+	buffer [k] = 0 ;
+
+	return k ;
+} /* psf_fgets */
+
+int
+psf_is_pipe (SF_PRIVATE *psf)
+{	struct stat statbuf ;
+
+	if (psf->virtual_io)
+		return SF_FALSE ;
+
+	if (fstat (psf->file.filedes, &statbuf) == -1)
+	{	psf_log_syserr (psf, errno) ;
+		/* Default to maximum safety. */
+		return SF_TRUE ;
+		} ;
+
+	if (S_ISFIFO (statbuf.st_mode) || S_ISSOCK (statbuf.st_mode))
+		return SF_TRUE ;
+
+	return SF_FALSE ;
+} /* psf_is_pipe */
+
+static sf_count_t
+psf_get_filelen_fd (int fd)
+{	struct stat statbuf ;
+
+	/*
+	** Sanity check.
+	** If everything is OK, this will be optimised out.
+	*/
+	if (sizeof (statbuf.st_size) == 4 && sizeof (sf_count_t) == 8)
+		return (sf_count_t) -SFE_BAD_STAT_SIZE ;
+
+	if (fstat (fd, &statbuf) == -1)
+		return (sf_count_t) -1 ;
+
+	return statbuf.st_size ;
+} /* psf_get_filelen_fd */
+
+int
+psf_ftruncate (SF_PRIVATE *psf, sf_count_t len)
+{	int retval ;
+
+	/* Returns 0 on success, non-zero on failure. */
+	if (len < 0)
+		return -1 ;
+
+	if ((sizeof (off_t) < sizeof (sf_count_t)) && len > 0x7FFFFFFF)
+		return -1 ;
+
+	retval = ftruncate (psf->file.filedes, len) ;
+
+	if (retval == -1)
+		psf_log_syserr (psf, errno) ;
+
+	return retval ;
+} /* psf_ftruncate */
+
+void
+psf_init_files (SF_PRIVATE *psf)
+{	psf->file.filedes = -1 ;
+	psf->rsrc.filedes = -1 ;
+	psf->file.savedes = -1 ;
+} /* psf_init_files */
+
+void
+psf_use_rsrc (SF_PRIVATE *psf, int on_off)
+{
+	if (on_off)
+	{	if (psf->file.filedes != psf->rsrc.filedes)
+		{	psf->file.savedes = psf->file.filedes ;
+			psf->file.filedes = psf->rsrc.filedes ;
+			} ;
+		}
+	else if (psf->file.filedes == psf->rsrc.filedes)
+		psf->file.filedes = psf->file.savedes ;
+
+	return ;
+} /* psf_use_rsrc */
+
+static int
+psf_open_fd (PSF_FILE * pfile)
+{	int fd, oflag, mode ;
+
+	/*
+	** Sanity check. If everything is OK, this test and the printfs will
+	** be optimised out. This is meant to catch the problems caused by
+	** "sfconfig.h" being included after <stdio.h>.
+	*/
+	if (sizeof (off_t) != sizeof (sf_count_t))
+	{	puts ("\n\n*** Fatal error : sizeof (off_t) != sizeof (sf_count_t)") ;
+		puts ("*** This means that libsndfile was not configured correctly.\n") ;
+		exit (1) ;
+		} ;
+
+	switch (pfile->mode)
+	{	case SFM_READ :
+				oflag = O_RDONLY | O_BINARY ;
+				mode = 0 ;
+				break ;
+
+		case SFM_WRITE :
+				oflag = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ;
+				mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ;
+				break ;
+
+		case SFM_RDWR :
+				oflag = O_RDWR | O_CREAT | O_BINARY ;
+				mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ;
+				break ;
+
+		default :
+				return - SFE_BAD_OPEN_MODE ;
+				break ;
+		} ;
+
+	if (mode == 0)
+		fd = open (pfile->path.c, oflag) ;
+	else
+		fd = open (pfile->path.c, oflag, mode) ;
+
+	return fd ;
+} /* psf_open_fd */
+
+static void
+psf_log_syserr (SF_PRIVATE *psf, int error)
+{
+	/* Only log an error if no error has been set yet. */
+	if (psf->error == 0)
+	{	psf->error = SFE_SYSTEM ;
+		snprintf (psf->syserr, sizeof (psf->syserr), "System error : %s.", strerror (error)) ;
+		} ;
+
+	return ;
+} /* psf_log_syserr */
+
+void
+psf_fsync (SF_PRIVATE *psf)
+{
+#if HAVE_FSYNC
+    if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+        fsync (psf->file.filedes) ;
+#else
+    psf = NULL ;
+#endif
+} /* psf_fsync */
+
+#elif	USE_WINDOWS_API
+
+/* Win32 file i/o functions implemented using native Win32 API */
+
+#include <windows.h>
+#include <io.h>
+
+static int psf_close_handle (HANDLE handle) ;
+static HANDLE psf_open_handle (PSF_FILE * pfile) ;
+static sf_count_t psf_get_filelen_handle (HANDLE handle) ;
+
+/* USE_WINDOWS_API */ int
+psf_fopen (SF_PRIVATE *psf)
+{
+	psf->error = 0 ;
+	psf->file.handle = psf_open_handle (&psf->file) ;
+
+	if (psf->file.handle == NULL)
+		psf_log_syserr (psf, GetLastError ()) ;
+
+	return psf->error ;
+} /* psf_fopen */
+
+/* USE_WINDOWS_API */ int
+psf_fclose (SF_PRIVATE *psf)
+{	int retval ;
+
+	if (psf->virtual_io)
+		return 0 ;
+
+	if (psf->file.do_not_close_descriptor)
+	{	psf->file.handle = NULL ;
+		return 0 ;
+		} ;
+
+	if ((retval = psf_close_handle (psf->file.handle)) == -1)
+		psf_log_syserr (psf, GetLastError ()) ;
+
+	psf->file.handle = NULL ;
+
+	return retval ;
+} /* psf_fclose */
+
+/* USE_WINDOWS_API */ int
+psf_open_rsrc (SF_PRIVATE *psf)
+{
+	if (psf->rsrc.handle != NULL)
+		return 0 ;
+
+	/* Test for MacOSX style resource fork on HPFS or HPFS+ filesystems. */
+	snprintf (psf->rsrc.path.c, sizeof (psf->rsrc.path.c), "%s/rsrc", psf->file.path.c) ;
+	psf->error = SFE_NO_ERROR ;
+	if ((psf->rsrc.handle = psf_open_handle (&psf->rsrc)) != NULL)
+	{	psf->rsrclength = psf_get_filelen_handle (psf->rsrc.handle) ;
+		return SFE_NO_ERROR ;
+		} ;
+
+	/*
+	** Now try for a resource fork stored as a separate file in the same
+	** directory, but preceded with a dot underscore.
+	*/
+	snprintf (psf->rsrc.path.c, sizeof (psf->rsrc.path.c), "%s._%s", psf->file.dir.c, psf->file.name.c) ;
+	psf->error = SFE_NO_ERROR ;
+	if ((psf->rsrc.handle = psf_open_handle (&psf->rsrc)) != NULL)
+	{	psf->rsrclength = psf_get_filelen_handle (psf->rsrc.handle) ;
+		return SFE_NO_ERROR ;
+		} ;
+
+	/*
+	** Now try for a resource fork stored in a separate file in the
+	** .AppleDouble/ directory.
+	*/
+	snprintf (psf->rsrc.path.c, sizeof (psf->rsrc.path.c), "%s.AppleDouble/%s", psf->file.dir.c, psf->file.name.c) ;
+	psf->error = SFE_NO_ERROR ;
+	if ((psf->rsrc.handle = psf_open_handle (&psf->rsrc)) != NULL)
+	{	psf->rsrclength = psf_get_filelen_handle (psf->rsrc.handle) ;
+      		return SFE_NO_ERROR ;
+		} ;
+
+	/* No resource file found. */
+	if (psf->rsrc.handle == NULL)
+		psf_log_syserr (psf, GetLastError ()) ;
+
+	psf->rsrc.handle = NULL ;
+
+	return psf->error ;
+} /* psf_open_rsrc */
+
+/* USE_WINDOWS_API */ sf_count_t
+psf_get_filelen (SF_PRIVATE *psf)
+{	sf_count_t	filelen ;
+
+	if (psf->virtual_io)
+		return psf->vio.get_filelen (psf->vio_user_data) ;
+
+	filelen = psf_get_filelen_handle (psf->file.handle) ;
+
+	if (filelen == -1)
+	{	psf_log_syserr (psf, errno) ;
+		return (sf_count_t) -1 ;
+		} ;
+
+	if (filelen == -SFE_BAD_STAT_SIZE)
+	{	psf->error = SFE_BAD_STAT_SIZE ;
+		return (sf_count_t) -1 ;
+		} ;
+
+	switch (psf->file.mode)
+	{	case SFM_WRITE :
+			filelen = filelen - psf->fileoffset ;
+			break ;
+
+		case SFM_READ :
+			if (psf->fileoffset > 0 && psf->filelength > 0)
+				filelen = psf->filelength ;
+			break ;
+
+		case SFM_RDWR :
+			/*
+			** Cannot open embedded files SFM_RDWR so we don't need to
+			** subtract psf->fileoffset. We already have the answer we
+			** need.
+			*/
+			break ;
+
+		default :
+			/* Shouldn't be here, so return error. */
+			filelen = -1 ;
+		} ;
+
+	return filelen ;
+} /* psf_get_filelen */
+
+/* USE_WINDOWS_API */ void
+psf_init_files (SF_PRIVATE *psf)
+{	psf->file.handle = NULL ;
+	psf->rsrc.handle = NULL ;
+	psf->file.hsaved = NULL ;
+} /* psf_init_files */
+
+/* USE_WINDOWS_API */ void
+psf_use_rsrc (SF_PRIVATE *psf, int on_off)
+{
+	if (on_off)
+	{	if (psf->file.handle != psf->rsrc.handle)
+		{	psf->file.hsaved = psf->file.handle ;
+			psf->file.handle = psf->rsrc.handle ;
+			} ;
+		}
+	else if (psf->file.handle == psf->rsrc.handle)
+		psf->file.handle = psf->file.hsaved ;
+
+	return ;
+} /* psf_use_rsrc */
+
+/* USE_WINDOWS_API */ static HANDLE
+psf_open_handle (PSF_FILE * pfile)
+{	DWORD dwDesiredAccess ;
+	DWORD dwShareMode ;
+	DWORD dwCreationDistribution ;
+	HANDLE handle ;
+
+	switch (pfile->mode)
+	{	case SFM_READ :
+				dwDesiredAccess = GENERIC_READ ;
+				dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE ;
+				dwCreationDistribution = OPEN_EXISTING ;
+				break ;
+
+		case SFM_WRITE :
+				dwDesiredAccess = GENERIC_WRITE ;
+				dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE ;
+				dwCreationDistribution = CREATE_ALWAYS ;
+				break ;
+
+		case SFM_RDWR :
+				dwDesiredAccess = GENERIC_READ | GENERIC_WRITE ;
+				dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE ;
+				dwCreationDistribution = OPEN_ALWAYS ;
+				break ;
+
+		default :
+				return NULL ;
+		} ;
+
+	if (pfile->use_wchar)
+		handle = CreateFileW (
+					pfile->path.wc,				/* pointer to name of the file */
+					dwDesiredAccess,			/* access (read-write) mode */
+					dwShareMode,				/* share mode */
+					0,							/* pointer to security attributes */
+					dwCreationDistribution,		/* how to create */
+					FILE_ATTRIBUTE_NORMAL,		/* file attributes (could use FILE_FLAG_SEQUENTIAL_SCAN) */
+					NULL						/* handle to file with attributes to copy */
+					) ;
+	else
+		handle = CreateFile (
+					pfile->path.c,				/* pointer to name of the file */
+					dwDesiredAccess,			/* access (read-write) mode */
+					dwShareMode,				/* share mode */
+					0,							/* pointer to security attributes */
+					dwCreationDistribution,		/* how to create */
+					FILE_ATTRIBUTE_NORMAL,		/* file attributes (could use FILE_FLAG_SEQUENTIAL_SCAN) */
+					NULL						/* handle to file with attributes to copy */
+					) ;
+
+	if (handle == INVALID_HANDLE_VALUE)
+		return NULL ;
+
+	return handle ;
+} /* psf_open_handle */
+
+/* USE_WINDOWS_API */ static void
+psf_log_syserr (SF_PRIVATE *psf, int error)
+{	LPVOID lpMsgBuf ;
+
+	/* Only log an error if no error has been set yet. */
+	if (psf->error == 0)
+	{	psf->error = SFE_SYSTEM ;
+
+		FormatMessage (
+			FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
+			NULL,
+			error,
+			MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
+			(LPTSTR) &lpMsgBuf,
+			0,
+			NULL
+			) ;
+
+		snprintf (psf->syserr, sizeof (psf->syserr), "System error : %s", (char*) lpMsgBuf) ;
+		LocalFree (lpMsgBuf) ;
+		} ;
+
+	return ;
+} /* psf_log_syserr */
+
+
+/* USE_WINDOWS_API */ int
+psf_close_rsrc (SF_PRIVATE *psf)
+{	psf_close_handle (psf->rsrc.handle) ;
+	psf->rsrc.handle = NULL ;
+	return 0 ;
+} /* psf_close_rsrc */
+
+
+/* USE_WINDOWS_API */ int
+psf_set_stdio (SF_PRIVATE *psf)
+{	HANDLE	handle = NULL ;
+	int	error = 0 ;
+
+	switch (psf->file.mode)
+	{	case SFM_RDWR :
+				error = SFE_OPEN_PIPE_RDWR ;
+				break ;
+
+		case SFM_READ :
+				handle = GetStdHandle (STD_INPUT_HANDLE) ;
+				psf->file.do_not_close_descriptor = 1 ;
+				break ;
+
+		case SFM_WRITE :
+				handle = GetStdHandle (STD_OUTPUT_HANDLE) ;
+				psf->file.do_not_close_descriptor = 1 ;
+				break ;
+
+		default :
+				error = SFE_BAD_OPEN_MODE ;
+				break ;
+		} ;
+
+	psf->file.handle = handle ;
+	psf->filelength = 0 ;
+
+	return error ;
+} /* psf_set_stdio */
+
+/* USE_WINDOWS_API */ void
+psf_set_file (SF_PRIVATE *psf, int fd)
+{	HANDLE handle ;
+	intptr_t osfhandle ;
+
+	osfhandle = _get_osfhandle (fd) ;
+	handle = (HANDLE) osfhandle ;
+
+	psf->file.handle = handle ;
+} /* psf_set_file */
+
+/* USE_WINDOWS_API */ int
+psf_file_valid (SF_PRIVATE *psf)
+{	if (psf->file.handle == NULL)
+		return SF_FALSE ;
+	if (psf->file.handle == INVALID_HANDLE_VALUE)
+		return SF_FALSE ;
+	return SF_TRUE ;
+} /* psf_set_file */
+
+/* USE_WINDOWS_API */ sf_count_t
+psf_fseek (SF_PRIVATE *psf, sf_count_t offset, int whence)
+{	sf_count_t new_position ;
+	LONG lDistanceToMove, lDistanceToMoveHigh ;
+	DWORD dwMoveMethod ;
+	DWORD dwResult, dwError ;
+
+	if (psf->virtual_io)
+		return psf->vio.seek (offset, whence, psf->vio_user_data) ;
+
+	switch (whence)
+	{	case SEEK_SET :
+				offset += psf->fileoffset ;
+				dwMoveMethod = FILE_BEGIN ;
+				break ;
+
+		case SEEK_END :
+				dwMoveMethod = FILE_END ;
+				break ;
+
+		default :
+				dwMoveMethod = FILE_CURRENT ;
+				break ;
+		} ;
+
+	lDistanceToMove = (DWORD) (offset & 0xFFFFFFFF) ;
+	lDistanceToMoveHigh = (DWORD) ((offset >> 32) & 0xFFFFFFFF) ;
+
+	dwResult = SetFilePointer (psf->file.handle, lDistanceToMove, &lDistanceToMoveHigh, dwMoveMethod) ;
+
+	if (dwResult == 0xFFFFFFFF)
+		dwError = GetLastError () ;
+	else
+		dwError = NO_ERROR ;
+
+	if (dwError != NO_ERROR)
+	{	psf_log_syserr (psf, dwError) ;
+		return -1 ;
+		} ;
+
+	new_position = (dwResult + ((__int64) lDistanceToMoveHigh << 32)) - psf->fileoffset ;
+
+	return new_position ;
+} /* psf_fseek */
+
+/* USE_WINDOWS_API */ sf_count_t
+psf_fread (void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf)
+{	sf_count_t total = 0 ;
+	ssize_t count ;
+	DWORD dwNumberOfBytesRead ;
+
+	if (psf->virtual_io)
+		return psf->vio.read (ptr, bytes*items, psf->vio_user_data) / bytes ;
+
+	items *= bytes ;
+
+	/* Do this check after the multiplication above. */
+	if (items <= 0)
+		return 0 ;
+
+	while (items > 0)
+	{	/* Break the writes down to a sensible size. */
+		count = (items > SENSIBLE_SIZE) ? SENSIBLE_SIZE : (ssize_t) items ;
+
+		if (ReadFile (psf->file.handle, ((char*) ptr) + total, count, &dwNumberOfBytesRead, 0) == 0)
+		{	psf_log_syserr (psf, GetLastError ()) ;
+			break ;
+			}
+		else
+			count = dwNumberOfBytesRead ;
+
+		if (count == 0)
+			break ;
+
+		total += count ;
+		items -= count ;
+		} ;
+
+	if (psf->is_pipe)
+		psf->pipeoffset += total ;
+
+	return total / bytes ;
+} /* psf_fread */
+
+/* USE_WINDOWS_API */ sf_count_t
+psf_fwrite (const void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf)
+{	sf_count_t total = 0 ;
+	ssize_t	 count ;
+	DWORD dwNumberOfBytesWritten ;
+
+	if (psf->virtual_io)
+		return psf->vio.write (ptr, bytes * items, psf->vio_user_data) / bytes ;
+
+	items *= bytes ;
+
+	/* Do this check after the multiplication above. */
+	if (items <= 0)
+		return 0 ;
+
+	while (items > 0)
+	{	/* Break the writes down to a sensible size. */
+		count = (items > SENSIBLE_SIZE) ? SENSIBLE_SIZE : (ssize_t) items ;
+
+		if (WriteFile (psf->file.handle, ((const char*) ptr) + total, count, &dwNumberOfBytesWritten, 0) == 0)
+		{	psf_log_syserr (psf, GetLastError ()) ;
+			break ;
+			}
+		else
+			count = dwNumberOfBytesWritten ;
+
+		if (count == 0)
+			break ;
+
+		total += count ;
+		items -= count ;
+		} ;
+
+	if (psf->is_pipe)
+		psf->pipeoffset += total ;
+
+	return total / bytes ;
+} /* psf_fwrite */
+
+/* USE_WINDOWS_API */ sf_count_t
+psf_ftell (SF_PRIVATE *psf)
+{	sf_count_t pos ;
+	LONG lDistanceToMoveLow, lDistanceToMoveHigh ;
+	DWORD dwResult, dwError ;
+
+	if (psf->virtual_io)
+		return psf->vio.tell (psf->vio_user_data) ;
+
+	if (psf->is_pipe)
+		return psf->pipeoffset ;
+
+	lDistanceToMoveLow = 0 ;
+	lDistanceToMoveHigh = 0 ;
+
+	dwResult = SetFilePointer (psf->file.handle, lDistanceToMoveLow, &lDistanceToMoveHigh, FILE_CURRENT) ;
+
+	if (dwResult == 0xFFFFFFFF)
+		dwError = GetLastError () ;
+	else
+		dwError = NO_ERROR ;
+
+	if (dwError != NO_ERROR)
+	{	psf_log_syserr (psf, dwError) ;
+		return -1 ;
+		} ;
+
+	pos = (dwResult + ((__int64) lDistanceToMoveHigh << 32)) ;
+
+	return pos - psf->fileoffset ;
+} /* psf_ftell */
+
+/* USE_WINDOWS_API */ static int
+psf_close_handle (HANDLE handle)
+{	if (handle == NULL)
+		return 0 ;
+
+	if (CloseHandle (handle) == 0)
+		return -1 ;
+
+	return 0 ;
+} /* psf_close_handle */
+
+/* USE_WINDOWS_API */ sf_count_t
+psf_fgets (char *buffer, sf_count_t bufsize, SF_PRIVATE *psf)
+{	sf_count_t k = 0 ;
+	sf_count_t count ;
+	DWORD dwNumberOfBytesRead ;
+
+	while (k < bufsize - 1)
+	{	if (ReadFile (psf->file.handle, &(buffer [k]), 1, &dwNumberOfBytesRead, 0) == 0)
+		{	psf_log_syserr (psf, GetLastError ()) ;
+			break ;
+			}
+		else
+		{	count = dwNumberOfBytesRead ;
+			/* note that we only check for '\n' not other line endings such as CRLF */
+			if (count == 0 || buffer [k++] == '\n')
+				break ;
+			} ;
+		} ;
+
+	buffer [k] = 0 ;
+
+	return k ;
+} /* psf_fgets */
+
+/* USE_WINDOWS_API */ int
+psf_is_pipe (SF_PRIVATE *psf)
+{
+	if (psf->virtual_io)
+		return SF_FALSE ;
+
+	if (GetFileType (psf->file.handle) == FILE_TYPE_DISK)
+		return SF_FALSE ;
+
+	/* Default to maximum safety. */
+	return SF_TRUE ;
+} /* psf_is_pipe */
+
+/* USE_WINDOWS_API */ sf_count_t
+psf_get_filelen_handle (HANDLE handle)
+{	sf_count_t filelen ;
+	DWORD dwFileSizeLow, dwFileSizeHigh, dwError = NO_ERROR ;
+
+	dwFileSizeLow = GetFileSize (handle, &dwFileSizeHigh) ;
+
+	if (dwFileSizeLow == 0xFFFFFFFF)
+		dwError = GetLastError () ;
+
+	if (dwError != NO_ERROR)
+		return (sf_count_t) -1 ;
+
+	filelen = dwFileSizeLow + ((__int64) dwFileSizeHigh << 32) ;
+
+	return filelen ;
+} /* psf_get_filelen_handle */
+
+/* USE_WINDOWS_API */ void
+psf_fsync (SF_PRIVATE *psf)
+{	FlushFileBuffers (psf->file.handle) ;
+} /* psf_fsync */
+
+
+/* USE_WINDOWS_API */ int
+psf_ftruncate (SF_PRIVATE *psf, sf_count_t len)
+{	int retval = 0 ;
+	LONG lDistanceToMoveLow, lDistanceToMoveHigh ;
+	DWORD dwResult, dwError = NO_ERROR ;
+
+	/* This implementation trashes the current file position.
+	** should it save and restore it? what if the current position is past
+	** the new end of file?
+	*/
+
+	/* Returns 0 on success, non-zero on failure. */
+	if (len < 0)
+		return 1 ;
+
+	lDistanceToMoveLow = (DWORD) (len & 0xFFFFFFFF) ;
+	lDistanceToMoveHigh = (DWORD) ((len >> 32) & 0xFFFFFFFF) ;
+
+	dwResult = SetFilePointer (psf->file.handle, lDistanceToMoveLow, &lDistanceToMoveHigh, FILE_BEGIN) ;
+
+	if (dwResult == 0xFFFFFFFF)
+		dwError = GetLastError () ;
+
+	if (dwError != NO_ERROR)
+	{	retval = -1 ;
+		psf_log_syserr (psf, dwError) ;
+		}
+	else
+	{	/* Note: when SetEndOfFile is used to extend a file, the contents of the
+		** new portion of the file is undefined. This is unlike chsize(),
+		** which guarantees that the new portion of the file will be zeroed.
+		** Not sure if this is important or not.
+		*/
+		if (SetEndOfFile (psf->file.handle) == 0)
+		{	retval = -1 ;
+			psf_log_syserr (psf, GetLastError ()) ;
+			} ;
+		} ;
+
+	return retval ;
+} /* psf_ftruncate */
+
+
+#else
+/* Win32 file i/o functions implemented using Unix-style file i/o API */
+
+/* Win32 has a 64 file offset seek function:
+**
+**		__int64 _lseeki64 (int handle, __int64 offset, int origin) ;
+**
+** It also has a 64 bit fstat function:
+**
+**		int fstati64 (int, struct _stati64) ;
+**
+** but the fscking thing doesn't work!!!!! The file size parameter returned
+** by this function is only valid up until more data is written at the end of
+** the file. That makes this function completely 100% useless.
+*/
+
+#include <io.h>
+#include <direct.h>
+
+/* Win32 */ int
+psf_fopen (SF_PRIVATE *psf, const char *pathname, int open_mode)
+{	int oflag, mode ;
+
+	switch (open_mode)
+	{	case SFM_READ :
+				oflag = O_RDONLY | O_BINARY ;
+				mode = 0 ;
+				break ;
+
+		case SFM_WRITE :
+				oflag = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ;
+				mode = S_IRUSR | S_IWUSR | S_IRGRP ;
+				break ;
+
+		case SFM_RDWR :
+				oflag = O_RDWR | O_CREAT | O_BINARY ;
+				mode = S_IRUSR | S_IWUSR | S_IRGRP ;
+				break ;
+
+		default :
+				psf->error = SFE_BAD_OPEN_MODE ;
+				return -1 ;
+				break ;
+		} ;
+
+	if (mode == 0)
+		psf->file.filedes = open (pathname, oflag) ;
+	else
+		psf->file.filedes = open (pathname, oflag, mode) ;
+
+	if (psf->file.filedes == -1)
+		psf_log_syserr (psf, errno) ;
+
+	return psf->file.filedes ;
+} /* psf_fopen */
+
+/* Win32 */ sf_count_t
+psf_fseek (SF_PRIVATE *psf, sf_count_t offset, int whence)
+{	sf_count_t	new_position ;
+
+	if (psf->virtual_io)
+		return psf->vio.seek (offset, whence, psf->vio_user_data) ;
+
+	switch (whence)
+	{	case SEEK_SET :
+				offset += psf->fileoffset ;
+				break ;
+
+		case SEEK_END :
+				if (psf->file.mode == SFM_WRITE)
+				{	new_position = _lseeki64 (psf->file.filedes, offset, whence) ;
+
+					if (new_position < 0)
+						psf_log_syserr (psf, errno) ;
+
+					return new_position - psf->fileoffset ;
+					} ;
+
+				/* Transform SEEK_END into a SEEK_SET, ie find the file
+				** length add the requested offset (should be <= 0) to
+				** get the offset wrt the start of file.
+				*/
+				whence = SEEK_SET ;
+				offset = _lseeki64 (psf->file.filedes, 0, SEEK_END) + offset ;
+				break ;
+
+		default :
+				/* No need to do anything about SEEK_CUR. */
+				break ;
+		} ;
+
+	/*
+	** Bypass weird Win32-ism if necessary.
+	** _lseeki64() returns an "invalid parameter" error if called with the
+	** offset == 0 and whence == SEEK_CUR.
+	*** Use the _telli64() function instead.
+	*/
+	if (offset == 0 && whence == SEEK_CUR)
+		new_position = _telli64 (psf->file.filedes) ;
+	else
+		new_position = _lseeki64 (psf->file.filedes, offset, whence) ;
+
+	if (new_position < 0)
+		psf_log_syserr (psf, errno) ;
+
+	new_position -= psf->fileoffset ;
+
+	return new_position ;
+} /* psf_fseek */
+
+/* Win32 */ sf_count_t
+psf_fread (void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf)
+{	sf_count_t total = 0 ;
+	ssize_t	 count ;
+
+	if (psf->virtual_io)
+		return psf->vio.read (ptr, bytes*items, psf->vio_user_data) / bytes ;
+
+	items *= bytes ;
+
+	/* Do this check after the multiplication above. */
+	if (items <= 0)
+		return 0 ;
+
+	while (items > 0)
+	{	/* Break the writes down to a sensible size. */
+		count = (items > SENSIBLE_SIZE) ? SENSIBLE_SIZE : (ssize_t) items ;
+
+		count = read (psf->file.filedes, ((char*) ptr) + total, (size_t) count) ;
+
+		if (count == -1)
+		{	if (errno == EINTR)
+				continue ;
+
+			psf_log_syserr (psf, errno) ;
+			break ;
+			} ;
+
+		if (count == 0)
+			break ;
+
+		total += count ;
+		items -= count ;
+		} ;
+
+	return total / bytes ;
+} /* psf_fread */
+
+/* Win32 */ sf_count_t
+psf_fwrite (const void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf)
+{	sf_count_t total = 0 ;
+	ssize_t	 count ;
+
+	if (psf->virtual_io)
+		return psf->vio.write (ptr, bytes*items, psf->vio_user_data) / bytes ;
+
+	items *= bytes ;
+
+	/* Do this check after the multiplication above. */
+	if (items <= 0)
+		return 0 ;
+
+	while (items > 0)
+	{	/* Break the writes down to a sensible size. */
+		count = (items > SENSIBLE_SIZE) ? SENSIBLE_SIZE : items ;
+
+		count = write (psf->file.filedes, ((const char*) ptr) + total, count) ;
+
+		if (count == -1)
+		{	if (errno == EINTR)
+				continue ;
+
+			psf_log_syserr (psf, errno) ;
+			break ;
+			} ;
+
+		if (count == 0)
+			break ;
+
+		total += count ;
+		items -= count ;
+		} ;
+
+	return total / bytes ;
+} /* psf_fwrite */
+
+/* Win32 */ sf_count_t
+psf_ftell (SF_PRIVATE *psf)
+{	sf_count_t pos ;
+
+	if (psf->virtual_io)
+		return psf->vio.tell (psf->vio_user_data) ;
+
+	pos = _telli64 (psf->file.filedes) ;
+
+	if (pos == ((sf_count_t) -1))
+	{	psf_log_syserr (psf, errno) ;
+		return -1 ;
+		} ;
+
+	return pos - psf->fileoffset ;
+} /* psf_ftell */
+
+/* Win32 */ int
+psf_fclose (SF_PRIVATE *psf)
+{	int retval ;
+
+	while ((retval = close (psf->file.filedes)) == -1 && errno == EINTR)
+		/* Do nothing. */ ;
+
+	if (retval == -1)
+		psf_log_syserr (psf, errno) ;
+
+	psf->file.filedes = -1 ;
+
+	return retval ;
+} /* psf_fclose */
+
+/* Win32 */ sf_count_t
+psf_fgets (char *buffer, sf_count_t bufsize, SF_PRIVATE *psf)
+{	sf_count_t	k = 0 ;
+	sf_count_t	count ;
+
+	while (k < bufsize - 1)
+	{	count = read (psf->file.filedes, &(buffer [k]), 1) ;
+
+		if (count == -1)
+		{	if (errno == EINTR)
+				continue ;
+
+			psf_log_syserr (psf, errno) ;
+			break ;
+			} ;
+
+		if (count == 0 || buffer [k++] == '\n')
+			break ;
+		} ;
+
+	buffer [k] = 0 ;
+
+	return k ;
+} /* psf_fgets */
+
+/* Win32 */ int
+psf_is_pipe (SF_PRIVATE *psf)
+{	struct stat statbuf ;
+
+	if (psf->virtual_io)
+		return SF_FALSE ;
+
+	/* Not sure if this works. */
+	if (fstat (psf->file.filedes, &statbuf) == -1)
+	{	psf_log_syserr (psf, errno) ;
+		/* Default to maximum safety. */
+		return SF_TRUE ;
+		} ;
+
+	/* These macros are defined in Win32/unistd.h. */
+	if (S_ISFIFO (statbuf.st_mode) || S_ISSOCK (statbuf.st_mode))
+		return SF_TRUE ;
+
+	return SF_FALSE ;
+} /* psf_checkpipe */
+
+/* Win32 */ sf_count_t
+psf_get_filelen (SF_PRIVATE *psf)
+{
+#if 0
+	/*
+	** Windoze is SOOOOO FUCKED!!!!!!!
+	** This code should work but doesn't. Why?
+	** Code below does work.
+	*/
+	struct _stati64 statbuf ;
+
+	if (_fstati64 (psf->file.filedes, &statbuf))
+	{	psf_log_syserr (psf, errno) ;
+		return (sf_count_t) -1 ;
+		} ;
+
+	return statbuf.st_size ;
+#else
+	sf_count_t current, filelen ;
+
+	if (psf->virtual_io)
+		return psf->vio.get_filelen (psf->vio_user_data) ;
+
+	if ((current = _telli64 (psf->file.filedes)) < 0)
+	{	psf_log_syserr (psf, errno) ;
+		return (sf_count_t) -1 ;
+		} ;
+
+	/*
+	** Lets face it, windoze if FUBAR!!!
+	**
+	** For some reason, I have to call _lseeki64() TWICE to get to the
+	** end of the file.
+	**
+	** This might have been avoided if windows had implemented the POSIX
+	** standard function fsync() but NO, that would have been too easy.
+	**
+	** I am VERY close to saying that windoze will no longer be supported
+	** by libsndfile and changing the license to GPL at the same time.
+	*/
+
+	_lseeki64 (psf->file.filedes, 0, SEEK_END) ;
+
+	if ((filelen = _lseeki64 (psf->file.filedes, 0, SEEK_END)) < 0)
+	{	psf_log_syserr (psf, errno) ;
+		return (sf_count_t) -1 ;
+		} ;
+
+	if (filelen > current)
+		_lseeki64 (psf->file.filedes, current, SEEK_SET) ;
+
+	switch (psf->file.mode)
+	{	case SFM_WRITE :
+			filelen = filelen - psf->fileoffset ;
+			break ;
+
+		case SFM_READ :
+			if (psf->fileoffset > 0 && psf->filelength > 0)
+				filelen = psf->filelength ;
+			break ;
+
+		case SFM_RDWR :
+			/*
+			** Cannot open embedded files SFM_RDWR so we don't need to
+			** subtract psf->fileoffset. We already have the answer we
+			** need.
+			*/
+			break ;
+
+		default :
+			filelen = 0 ;
+		} ;
+
+	return filelen ;
+#endif
+} /* psf_get_filelen */
+
+/* Win32 */ int
+psf_ftruncate (SF_PRIVATE *psf, sf_count_t len)
+{	int retval ;
+
+	/* Returns 0 on success, non-zero on failure. */
+	if (len < 0)
+		return 1 ;
+
+	/* The global village idiots at micorsoft decided to implement
+	** nearly all the required 64 bit file offset functions except
+	** for one, truncate. The fscking morons!
+	**
+	** This is not 64 bit file offset clean. Somone needs to clean
+	** this up.
+	*/
+	if (len > 0x7FFFFFFF)
+		return -1 ;
+
+	retval = chsize (psf->file.filedes, len) ;
+
+	if (retval == -1)
+		psf_log_syserr (psf, errno) ;
+
+	return retval ;
+} /* psf_ftruncate */
+
+
+static void
+psf_log_syserr (SF_PRIVATE *psf, int error)
+{
+	/* Only log an error if no error has been set yet. */
+	if (psf->error == 0)
+	{	psf->error = SFE_SYSTEM ;
+		snprintf (psf->syserr, sizeof (psf->syserr), "System error : %s", strerror (error)) ;
+		} ;
+
+	return ;
+} /* psf_log_syserr */
+
+#endif
+
diff --git a/jni/libsndfile-1.0.25/src/file_io.lo b/jni/libsndfile-1.0.25/src/file_io.lo
new file mode 100644
index 0000000..008aa8c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/file_io.lo
@@ -0,0 +1,12 @@
+# file_io.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/file_io.o'
+
+# Name of the non-PIC object
+non_pic_object='file_io.o'
+
diff --git a/jni/libsndfile-1.0.25/src/file_io.o b/jni/libsndfile-1.0.25/src/file_io.o
new file mode 100644
index 0000000..9c06876
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/file_io.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/flac.c b/jni/libsndfile-1.0.25/src/flac.c
new file mode 100644
index 0000000..7949b0a
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/flac.c
@@ -0,0 +1,1324 @@
+/*
+** Copyright (C) 2004-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2004 Tobias Gehrig <tgehrig@ira.uka.de>
+**
+** This program is free software ; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation ; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY ; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program ; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<stdlib.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+#include	<math.h>
+
+#include	"sndfile.h"
+#include	"common.h"
+
+#if HAVE_EXTERNAL_LIBS
+
+#include	<FLAC/stream_decoder.h>
+#include	<FLAC/stream_encoder.h>
+#include	<FLAC/metadata.h>
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+#define ENC_BUFFER_SIZE 8192
+
+typedef enum
+{	PFLAC_PCM_SHORT = 50,
+	PFLAC_PCM_INT = 51,
+	PFLAC_PCM_FLOAT = 52,
+	PFLAC_PCM_DOUBLE = 53
+} PFLAC_PCM ;
+
+typedef struct
+{
+	FLAC__StreamDecoder *fsd ;
+	FLAC__StreamEncoder *fse ;
+
+	PFLAC_PCM pcmtype ;
+	void* ptr ;
+	unsigned pos, len, remain ;
+
+	FLAC__StreamMetadata *metadata ;
+
+	const FLAC__int32 * const * wbuffer ;
+	FLAC__int32 * rbuffer [FLAC__MAX_CHANNELS] ;
+
+	FLAC__int32* encbuffer ;
+	unsigned bufferpos ;
+
+	const FLAC__Frame *frame ;
+	FLAC__bool bufferbackup ;
+} FLAC_PRIVATE ;
+
+typedef struct
+{	const char *tag ;
+	int type ;
+} FLAC_TAG ;
+
+static sf_count_t	flac_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+static int			flac_close (SF_PRIVATE *psf) ;
+
+static int			flac_enc_init (SF_PRIVATE *psf) ;
+static int			flac_read_header (SF_PRIVATE *psf) ;
+
+static sf_count_t	flac_read_flac2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	flac_read_flac2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	flac_read_flac2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	flac_read_flac2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t	flac_write_s2flac (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t	flac_write_i2flac (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t	flac_write_f2flac (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t	flac_write_d2flac (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+static void		f2flac8_array (const float *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		f2flac16_array (const float *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		f2flac24_array (const float *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		f2flac8_clip_array (const float *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		f2flac16_clip_array (const float *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		f2flac24_clip_array (const float *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		d2flac8_array (const double *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		d2flac16_array (const double *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		d2flac24_array (const double *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		d2flac8_clip_array (const double *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		d2flac16_clip_array (const double *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		d2flac24_clip_array (const double *src, FLAC__int32 *dest, int count, int normalize) ;
+
+static int flac_command (SF_PRIVATE *psf, int command, void *data, int datasize) ;
+
+/* Decoder Callbacks */
+static FLAC__StreamDecoderReadStatus sf_flac_read_callback (const FLAC__StreamDecoder *decoder, FLAC__byte buffer [], size_t *bytes, void *client_data) ;
+static FLAC__StreamDecoderSeekStatus sf_flac_seek_callback (const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) ;
+static FLAC__StreamDecoderTellStatus sf_flac_tell_callback (const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) ;
+static FLAC__StreamDecoderLengthStatus sf_flac_length_callback (const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) ;
+static FLAC__bool sf_flac_eof_callback (const FLAC__StreamDecoder *decoder, void *client_data) ;
+static FLAC__StreamDecoderWriteStatus sf_flac_write_callback (const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer [], void *client_data) ;
+static void sf_flac_meta_callback (const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) ;
+static void sf_flac_error_callback (const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) ;
+
+/* Encoder Callbacks */
+static FLAC__StreamEncoderSeekStatus sf_flac_enc_seek_callback (const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data) ;
+static FLAC__StreamEncoderTellStatus sf_flac_enc_tell_callback (const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data) ;
+static FLAC__StreamEncoderWriteStatus sf_flac_enc_write_callback (const FLAC__StreamEncoder *encoder, const FLAC__byte buffer [], size_t bytes, unsigned samples, unsigned current_frame, void *client_data) ;
+
+static void
+s2flac8_array (const short *src, FLAC__int32 *dest, int count)
+{	while (--count >= 0)
+		dest [count] = src [count] >> 8 ;
+} /* s2flac8_array */
+
+static void
+s2flac16_array (const short *src, FLAC__int32 *dest, int count)
+{	while (--count >= 0)
+		dest [count] = src [count] ;
+} /* s2flac16_array */
+
+static void
+s2flac24_array (const short *src, FLAC__int32 *dest, int count)
+{	while (--count >= 0)
+		dest [count] = src [count] << 8 ;
+} /* s2flac24_array */
+
+static void
+i2flac8_array (const int *src, FLAC__int32 *dest, int count)
+{	while (--count >= 0)
+		dest [count] = src [count] >> 24 ;
+} /* i2flac8_array */
+
+static void
+i2flac16_array (const int *src, FLAC__int32 *dest, int count)
+{
+  while (--count >= 0)
+    dest [count] = src [count] >> 16 ;
+} /* i2flac16_array */
+
+static void
+i2flac24_array (const int *src, FLAC__int32 *dest, int count)
+{	while (--count >= 0)
+		dest [count] = src [count] >> 8 ;
+} /* i2flac24_array */
+
+static sf_count_t
+flac_buffer_copy (SF_PRIVATE *psf)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	const FLAC__Frame *frame = pflac->frame ;
+	const FLAC__int32* const *buffer = pflac->wbuffer ;
+	unsigned i = 0, j, offset ;
+
+	/*
+	**	frame->header.blocksize is variable and we're using a constant blocksize
+	**	of FLAC__MAX_BLOCK_SIZE.
+	**	Check our assumptions here.
+	*/
+	if (frame->header.blocksize > FLAC__MAX_BLOCK_SIZE)
+	{	psf_log_printf (psf, "Ooops : frame->header.blocksize (%d) > FLAC__MAX_BLOCK_SIZE (%d)\n", __func__, __LINE__, frame->header.blocksize, FLAC__MAX_BLOCK_SIZE) ;
+		psf->error = SFE_INTERNAL ;
+		return 0 ;
+		} ;
+
+	if (pflac->ptr == NULL)
+	{	/*
+		**	Not sure why this code is here and not elsewhere.
+		**	Removing it causes valgrind errors.
+		*/
+		pflac->bufferbackup = SF_TRUE ;
+		for (i = 0 ; i < frame->header.channels ; i++)
+		{
+			if (pflac->rbuffer [i] == NULL)
+				pflac->rbuffer [i] = calloc (FLAC__MAX_BLOCK_SIZE, sizeof (FLAC__int32)) ;
+
+			memcpy (pflac->rbuffer [i], buffer [i], frame->header.blocksize * sizeof (FLAC__int32)) ;
+			} ;
+		pflac->wbuffer = (const FLAC__int32* const*) pflac->rbuffer ;
+
+		return 0 ;
+		} ;
+
+	switch (pflac->pcmtype)
+	{	case PFLAC_PCM_SHORT :
+			{	short *retpcm = (short*) pflac->ptr ;
+				int shift = 16 - frame->header.bits_per_sample ;
+				if (shift < 0)
+				{	shift = abs (shift) ;
+					for (i = 0 ; i < frame->header.blocksize && pflac->remain > 0 ; i++)
+					{	offset = pflac->pos + i * frame->header.channels ;
+
+						if (pflac->bufferpos >= frame->header.blocksize)
+							break ;
+
+						for (j = 0 ; j < frame->header.channels ; j++)
+							retpcm [offset + j] = buffer [j][pflac->bufferpos] >> shift ;
+						pflac->remain -= frame->header.channels ;
+						pflac->bufferpos++ ;
+						}
+					}
+				else
+				{	for (i = 0 ; i < frame->header.blocksize && pflac->remain > 0 ; i++)
+					{	offset = pflac->pos + i * frame->header.channels ;
+
+						if (pflac->bufferpos >= frame->header.blocksize)
+							break ;
+
+						for (j = 0 ; j < frame->header.channels ; j++)
+							retpcm [offset + j] = (buffer [j][pflac->bufferpos]) << shift ;
+
+						pflac->remain -= frame->header.channels ;
+						pflac->bufferpos++ ;
+						} ;
+					} ;
+				} ;
+			break ;
+
+		case PFLAC_PCM_INT :
+			{	int *retpcm = (int*) pflac->ptr ;
+				int shift = 32 - frame->header.bits_per_sample ;
+				for (i = 0 ; i < frame->header.blocksize && pflac->remain > 0 ; i++)
+				{	offset = pflac->pos + i * frame->header.channels ;
+
+					if (pflac->bufferpos >= frame->header.blocksize)
+						break ;
+
+					for (j = 0 ; j < frame->header.channels ; j++)
+						retpcm [offset + j] = buffer [j][pflac->bufferpos] << shift ;
+					pflac->remain -= frame->header.channels ;
+					pflac->bufferpos++ ;
+					} ;
+				} ;
+			break ;
+
+		case PFLAC_PCM_FLOAT :
+			{	float *retpcm = (float*) pflac->ptr ;
+				float norm = (psf->norm_float == SF_TRUE) ? 1.0 / (1 << (frame->header.bits_per_sample - 1)) : 1.0 ;
+
+				for (i = 0 ; i < frame->header.blocksize && pflac->remain > 0 ; i++)
+				{	offset = pflac->pos + i * frame->header.channels ;
+
+					if (pflac->bufferpos >= frame->header.blocksize)
+						break ;
+
+					for (j = 0 ; j < frame->header.channels ; j++)
+						retpcm [offset + j] = buffer [j][pflac->bufferpos] * norm ;
+					pflac->remain -= frame->header.channels ;
+					pflac->bufferpos++ ;
+					} ;
+				} ;
+			break ;
+
+		case PFLAC_PCM_DOUBLE :
+			{	double *retpcm = (double*) pflac->ptr ;
+				double norm = (psf->norm_double == SF_TRUE) ? 1.0 / (1 << (frame->header.bits_per_sample - 1)) : 1.0 ;
+
+				for (i = 0 ; i < frame->header.blocksize && pflac->remain > 0 ; i++)
+				{	offset = pflac->pos + i * frame->header.channels ;
+
+					if (pflac->bufferpos >= frame->header.blocksize)
+						break ;
+
+					for (j = 0 ; j < frame->header.channels ; j++)
+						retpcm [offset + j] = buffer [j][pflac->bufferpos] * norm ;
+					pflac->remain -= frame->header.channels ;
+					pflac->bufferpos++ ;
+					} ;
+				} ;
+			break ;
+
+		default :
+			return 0 ;
+		} ;
+
+	offset = i * frame->header.channels ;
+	pflac->pos += i * frame->header.channels ;
+
+	return offset ;
+} /* flac_buffer_copy */
+
+
+static FLAC__StreamDecoderReadStatus
+sf_flac_read_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__byte buffer [], size_t *bytes, void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+
+	*bytes = psf_fread (buffer, 1, *bytes, psf) ;
+	if (*bytes > 0 && psf->error == 0)
+		return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE ;
+
+    return FLAC__STREAM_DECODER_READ_STATUS_ABORT ;
+} /* sf_flac_read_callback */
+
+static FLAC__StreamDecoderSeekStatus
+sf_flac_seek_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__uint64 absolute_byte_offset, void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+
+	psf_fseek (psf, absolute_byte_offset, SEEK_SET) ;
+	if (psf->error)
+		return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR ;
+
+	return FLAC__STREAM_DECODER_SEEK_STATUS_OK ;
+} /* sf_flac_seek_callback */
+
+static FLAC__StreamDecoderTellStatus
+sf_flac_tell_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__uint64 *absolute_byte_offset, void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+
+	*absolute_byte_offset = psf_ftell (psf) ;
+	if (psf->error)
+		return FLAC__STREAM_DECODER_TELL_STATUS_ERROR ;
+
+	return FLAC__STREAM_DECODER_TELL_STATUS_OK ;
+} /* sf_flac_tell_callback */
+
+static FLAC__StreamDecoderLengthStatus
+sf_flac_length_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__uint64 *stream_length, void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+
+	if ((*stream_length = psf->filelength) == 0)
+		return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR ;
+
+	return FLAC__STREAM_DECODER_LENGTH_STATUS_OK ;
+} /* sf_flac_length_callback */
+
+static FLAC__bool
+sf_flac_eof_callback (const FLAC__StreamDecoder *UNUSED (decoder), void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+
+	if (psf_ftell (psf) == psf->filelength)
+		return SF_TRUE ;
+
+    return SF_FALSE ;
+} /* sf_flac_eof_callback */
+
+static FLAC__StreamDecoderWriteStatus
+sf_flac_write_callback (const FLAC__StreamDecoder * UNUSED (decoder), const FLAC__Frame *frame, const FLAC__int32 * const buffer [], void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+
+	pflac->frame = frame ;
+	pflac->bufferpos = 0 ;
+
+	pflac->bufferbackup = SF_FALSE ;
+	pflac->wbuffer = buffer ;
+
+	flac_buffer_copy (psf) ;
+
+	return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE ;
+} /* sf_flac_write_callback */
+
+static void
+sf_flac_meta_get_vorbiscomments (SF_PRIVATE *psf, const FLAC__StreamMetadata *metadata)
+{	FLAC_TAG tags [] =
+	{ 	{ "title", SF_STR_TITLE },
+		{ "copyright", SF_STR_COPYRIGHT },
+		{ "software", SF_STR_SOFTWARE },
+		{ "artist", SF_STR_ARTIST },
+		{ "comment", SF_STR_COMMENT },
+		{ "date", SF_STR_DATE },
+		{ "album", SF_STR_ALBUM },
+		{ "license", SF_STR_LICENSE },
+		{ "tracknumber", SF_STR_TRACKNUMBER },
+		{ "genre", SF_STR_GENRE }
+		} ;
+
+	const char *value, *cptr ;
+	int k, tag_num ;
+
+	for (k = 0 ; k < ARRAY_LEN (tags) ; k++)
+	{	tag_num = FLAC__metadata_object_vorbiscomment_find_entry_from (metadata, 0, tags [k].tag) ;
+
+		if (tag_num < 0)
+			continue ;
+
+		value = (const char*) metadata->data.vorbis_comment.comments [tag_num].entry ;
+		if ((cptr = strchr (value, '=')) != NULL)
+			value = cptr + 1 ;
+
+		psf_log_printf (psf, "  %-10s : %s\n", tags [k].tag, value) ;
+		psf_store_string (psf, tags [k].type, value) ;
+		} ;
+
+	return ;
+} /* sf_flac_meta_get_vorbiscomments */
+
+static void
+sf_flac_meta_callback (const FLAC__StreamDecoder * UNUSED (decoder), const FLAC__StreamMetadata *metadata, void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+	int bitwidth = 0 ;
+
+	switch (metadata->type)
+	{	case FLAC__METADATA_TYPE_STREAMINFO :
+			psf->sf.channels = metadata->data.stream_info.channels ;
+			psf->sf.samplerate = metadata->data.stream_info.sample_rate ;
+			psf->sf.frames = metadata->data.stream_info.total_samples ;
+
+			psf_log_printf (psf, "FLAC Stream Metadata\n  Channels    : %d\n  Sample rate : %d\n", psf->sf.channels, psf->sf.samplerate) ;
+
+			if (psf->sf.frames == 0)
+			{	psf_log_printf (psf, "  Frames      : 0 (bumping to SF_COUNT_MAX)\n") ;
+				psf->sf.frames = SF_COUNT_MAX ;
+				}
+			else
+				psf_log_printf (psf, "  Frames      : %D\n", psf->sf.frames) ;
+
+			switch (metadata->data.stream_info.bits_per_sample)
+			{	case 8 :
+					psf->sf.format |= SF_FORMAT_PCM_S8 ;
+					bitwidth = 8 ;
+					break ;
+				case 16 :
+					psf->sf.format |= SF_FORMAT_PCM_16 ;
+					bitwidth = 16 ;
+					break ;
+				case 24 :
+					psf->sf.format |= SF_FORMAT_PCM_24 ;
+					bitwidth = 24 ;
+					break ;
+				default :
+					psf_log_printf (psf, "sf_flac_meta_callback : bits_per_sample %d not yet implemented.\n", metadata->data.stream_info.bits_per_sample) ;
+					break ;
+				} ;
+
+			if (bitwidth > 0)
+				psf_log_printf (psf, "  Bit width   : %d\n", bitwidth) ;
+			break ;
+
+		case FLAC__METADATA_TYPE_VORBIS_COMMENT :
+			psf_log_printf (psf, "Vorbis Comment Metadata\n") ;
+			sf_flac_meta_get_vorbiscomments (psf, metadata) ;
+			break ;
+
+		case FLAC__METADATA_TYPE_PADDING :
+			psf_log_printf (psf, "Padding Metadata\n") ;
+			break ;
+
+		case FLAC__METADATA_TYPE_APPLICATION :
+			psf_log_printf (psf, "Application Metadata\n") ;
+			break ;
+
+		case FLAC__METADATA_TYPE_SEEKTABLE :
+			psf_log_printf (psf, "Seektable Metadata\n") ;
+			break ;
+
+		case FLAC__METADATA_TYPE_CUESHEET :
+			psf_log_printf (psf, "Cuesheet Metadata\n") ;
+			break ;
+
+		case FLAC__METADATA_TYPE_PICTURE :
+			psf_log_printf (psf, "Picture Metadata\n") ;
+			break ;
+
+		case FLAC__METADATA_TYPE_UNDEFINED :
+			psf_log_printf (psf, "Undefined Metadata\n") ;
+			break ;
+
+		default :
+			psf_log_printf (psf, "sf_flac_meta_callback : metadata-type %d not yet implemented.\n", metadata->type) ;
+			break ;
+		} ;
+
+	return ;
+} /* sf_flac_meta_callback */
+
+static void
+sf_flac_error_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__StreamDecoderErrorStatus status, void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+
+	psf_log_printf (psf, "ERROR : %s\n", FLAC__StreamDecoderErrorStatusString [status]) ;
+
+	switch (status)
+	{	case FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC :
+			psf->error = SFE_FLAC_LOST_SYNC ;
+			break ;
+		case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER :
+			psf->error = SFE_FLAC_BAD_HEADER ;
+			break ;
+		default :
+			psf->error = SFE_FLAC_UNKOWN_ERROR ;
+			break ;
+		} ;
+
+	return ;
+} /* sf_flac_error_callback */
+
+static FLAC__StreamEncoderSeekStatus
+sf_flac_enc_seek_callback (const FLAC__StreamEncoder * UNUSED (encoder), FLAC__uint64 absolute_byte_offset, void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+
+	psf_fseek (psf, absolute_byte_offset, SEEK_SET) ;
+	if (psf->error)
+		return FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR ;
+
+    return FLAC__STREAM_ENCODER_SEEK_STATUS_OK ;
+} /* sf_flac_enc_seek_callback */
+
+static FLAC__StreamEncoderTellStatus
+sf_flac_enc_tell_callback (const FLAC__StreamEncoder *UNUSED (encoder), FLAC__uint64 *absolute_byte_offset, void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+
+	*absolute_byte_offset = psf_ftell (psf) ;
+	if (psf->error)
+		return FLAC__STREAM_ENCODER_TELL_STATUS_ERROR ;
+
+	return FLAC__STREAM_ENCODER_TELL_STATUS_OK ;
+} /* sf_flac_enc_tell_callback */
+
+static FLAC__StreamEncoderWriteStatus
+sf_flac_enc_write_callback (const FLAC__StreamEncoder * UNUSED (encoder), const FLAC__byte buffer [], size_t bytes, unsigned UNUSED (samples), unsigned UNUSED (current_frame), void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+
+	if (psf_fwrite (buffer, 1, bytes, psf) == (sf_count_t) bytes && psf->error == 0)
+		return FLAC__STREAM_ENCODER_WRITE_STATUS_OK ;
+
+	return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR ;
+} /* sf_flac_enc_write_callback */
+
+static void
+flac_write_strings (SF_PRIVATE *psf, FLAC_PRIVATE* pflac)
+{	FLAC__StreamMetadata_VorbisComment_Entry entry ;
+	int	k, string_count = 0 ;
+
+	for (k = 0 ; k < SF_MAX_STRINGS ; k++)
+	{	if (psf->strings [k].type != 0)
+			string_count ++ ;
+		} ;
+
+	if (string_count == 0)
+		return ;
+
+	if (pflac->metadata == NULL && (pflac->metadata = FLAC__metadata_object_new (FLAC__METADATA_TYPE_VORBIS_COMMENT)) == NULL)
+	{	psf_log_printf (psf, "FLAC__metadata_object_new returned NULL\n") ;
+		return ;
+		} ;
+
+	for (k = 0 ; k < SF_MAX_STRINGS && psf->strings [k].type != 0 ; k++)
+	{	const char * key, * value ;
+
+		switch (psf->strings [k].type)
+		{	case SF_STR_SOFTWARE :
+				key = "software" ;
+				break ;
+			case SF_STR_TITLE :
+				key = "title" ;
+				break ;
+			case SF_STR_COPYRIGHT :
+				key = "copyright" ;
+				break ;
+			case SF_STR_ARTIST :
+				key = "artist" ;
+				break ;
+			case SF_STR_COMMENT :
+				key = "comment" ;
+				break ;
+			case SF_STR_DATE :
+				key = "date" ;
+				break ;
+			case SF_STR_ALBUM :
+				key = "album" ;
+				break ;
+			case SF_STR_LICENSE :
+				key = "license" ;
+				break ;
+			case SF_STR_TRACKNUMBER :
+				key = "tracknumber" ;
+				break ;
+			case SF_STR_GENRE :
+				key = "genre" ;
+				break ;
+			default :
+				continue ;
+			} ;
+
+		value = psf->strings [k].str ;
+
+		FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair (&entry, key, value) ;
+		FLAC__metadata_object_vorbiscomment_append_comment (pflac->metadata, entry, /* copy */ SF_FALSE) ;
+		} ;
+
+	if (! FLAC__stream_encoder_set_metadata (pflac->fse, &pflac->metadata, 1))
+	{	printf ("%s %d : fail\n", __func__, __LINE__) ;
+		return ;
+		} ;
+
+	return ;
+} /* flac_write_strings */
+
+static int
+flac_write_header (SF_PRIVATE *psf, int UNUSED (calc_length))
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	int err ;
+
+	flac_write_strings (psf, pflac) ;
+
+	if ((err = FLAC__stream_encoder_init_stream (pflac->fse, sf_flac_enc_write_callback, sf_flac_enc_seek_callback, sf_flac_enc_tell_callback, NULL, psf)) != FLAC__STREAM_DECODER_INIT_STATUS_OK)
+	{	psf_log_printf (psf, "Error : FLAC encoder init returned error : %s\n", FLAC__StreamEncoderInitStatusString [err]) ;
+		return SFE_FLAC_INIT_DECODER ;
+		} ;
+
+	if (psf->error == 0)
+		psf->dataoffset = psf_ftell (psf) ;
+	pflac->encbuffer = calloc (ENC_BUFFER_SIZE, sizeof (FLAC__int32)) ;
+
+	return psf->error ;
+} /* flac_write_header */
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+flac_open	(SF_PRIVATE *psf)
+{	int		subformat ;
+	int		error = 0 ;
+
+	FLAC_PRIVATE* pflac = calloc (1, sizeof (FLAC_PRIVATE)) ;
+	psf->codec_data = pflac ;
+
+	if (psf->file.mode == SFM_RDWR)
+		return SFE_BAD_MODE_RW ;
+
+	if (psf->file.mode == SFM_READ)
+	{	if ((error = flac_read_header (psf)))
+			return error ;
+		} ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_FLAC)
+			return	SFE_BAD_OPEN_FORMAT ;
+
+		psf->endian = SF_ENDIAN_BIG ;
+		psf->sf.seekable = 0 ;
+
+		psf->str_flags = SF_STR_ALLOW_START ;
+
+		if ((error = flac_enc_init (psf)))
+			return error ;
+
+		psf->write_header = flac_write_header ;
+		} ;
+
+	psf->datalength = psf->filelength ;
+	psf->dataoffset = 0 ;
+	psf->blockwidth = 0 ;
+	psf->bytewidth = 1 ;
+
+	psf->container_close = flac_close ;
+	psf->seek = flac_seek ;
+	psf->command = flac_command ;
+
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+	switch (subformat)
+	{	case SF_FORMAT_PCM_S8 :	/* 8-bit FLAC.  */
+		case SF_FORMAT_PCM_16 :	/* 16-bit FLAC. */
+		case SF_FORMAT_PCM_24 :	/* 24-bit FLAC. */
+			error = flac_init (psf) ;
+			break ;
+
+		default : return SFE_UNIMPLEMENTED ;
+		} ;
+
+	return error ;
+} /* flac_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+flac_close	(SF_PRIVATE *psf)
+{	FLAC_PRIVATE* pflac ;
+	int k ;
+
+	if ((pflac = (FLAC_PRIVATE*) psf->codec_data) == NULL)
+		return 0 ;
+
+	if (pflac->metadata != NULL)
+		FLAC__metadata_object_delete (pflac->metadata) ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	FLAC__stream_encoder_finish (pflac->fse) ;
+		FLAC__stream_encoder_delete (pflac->fse) ;
+
+		if (pflac->encbuffer)
+			free (pflac->encbuffer) ;
+		} ;
+
+	if (psf->file.mode == SFM_READ)
+	{	FLAC__stream_decoder_finish (pflac->fsd) ;
+		FLAC__stream_decoder_delete (pflac->fsd) ;
+		} ;
+
+	for (k = 0 ; k < ARRAY_LEN (pflac->rbuffer) ; k++)
+		free (pflac->rbuffer [k]) ;
+
+	free (pflac) ;
+	psf->codec_data = NULL ;
+
+	return 0 ;
+} /* flac_close */
+
+static int
+flac_enc_init (SF_PRIVATE *psf)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	unsigned bps ;
+
+	/* To cite the flac FAQ at
+	** http://flac.sourceforge.net/faq.html#general__samples
+	**     "FLAC supports linear sample rates from 1Hz - 655350Hz in 1Hz
+	**     increments."
+	*/
+	if ( psf->sf.samplerate < 1 || psf->sf.samplerate > 655350 )
+	{	psf_log_printf (psf, "flac sample rate out of range.\n", psf->sf.samplerate) ;
+		return SFE_FLAC_BAD_SAMPLE_RATE ;
+		} ;
+
+	psf_fseek (psf, 0, SEEK_SET) ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_S8 :
+			bps = 8 ;
+			break ;
+		case SF_FORMAT_PCM_16 :
+			bps = 16 ;
+			break ;
+		case SF_FORMAT_PCM_24 :
+			bps = 24 ;
+			break ;
+
+		default :
+			bps = 0 ;
+			break ;
+		} ;
+
+	if ((pflac->fse = FLAC__stream_encoder_new ()) == NULL)
+		return SFE_FLAC_NEW_DECODER ;
+
+	if (! FLAC__stream_encoder_set_channels (pflac->fse, psf->sf.channels))
+	{	psf_log_printf (psf, "FLAC__stream_encoder_set_channels (%d) return false.\n", psf->sf.channels) ;
+		return SFE_FLAC_INIT_DECODER ;
+		} ;
+
+	if (! FLAC__stream_encoder_set_sample_rate (pflac->fse, psf->sf.samplerate))
+	{	psf_log_printf (psf, "FLAC__stream_encoder_set_sample_rate (%d) returned false.\n", psf->sf.samplerate) ;
+		return SFE_FLAC_BAD_SAMPLE_RATE ;
+		} ;
+
+	if (! FLAC__stream_encoder_set_bits_per_sample (pflac->fse, bps))
+	{	psf_log_printf (psf, "FLAC__stream_encoder_set_bits_per_sample (%d) return false.\n", bps) ;
+		return SFE_FLAC_INIT_DECODER ;
+		} ;
+
+	return 0 ;
+} /* flac_enc_init */
+
+static int
+flac_read_header (SF_PRIVATE *psf)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+
+	psf_fseek (psf, 0, SEEK_SET) ;
+	if ((pflac->fsd = FLAC__stream_decoder_new ()) == NULL)
+		return SFE_FLAC_NEW_DECODER ;
+
+	FLAC__stream_decoder_set_metadata_respond_all (pflac->fsd) ;
+
+	if (FLAC__stream_decoder_init_stream (pflac->fsd, sf_flac_read_callback, sf_flac_seek_callback, sf_flac_tell_callback, sf_flac_length_callback, sf_flac_eof_callback, sf_flac_write_callback, sf_flac_meta_callback, sf_flac_error_callback, psf) != FLAC__STREAM_DECODER_INIT_STATUS_OK)
+		return SFE_FLAC_INIT_DECODER ;
+
+	FLAC__stream_decoder_process_until_end_of_metadata (pflac->fsd) ;
+
+	psf_log_printf (psf, "End\n") ;
+
+	if (psf->error == 0)
+	{	FLAC__uint64 position ;
+
+		FLAC__stream_decoder_get_decode_position (pflac->fsd, &position) ;
+		psf->dataoffset = position ;
+		} ;
+
+	return psf->error ;
+} /* flac_read_header */
+
+static int
+flac_command (SF_PRIVATE * UNUSED (psf), int UNUSED (command), void * UNUSED (data), int UNUSED (datasize))
+{
+	return 0 ;
+} /* flac_command */
+
+int
+flac_init (SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_RDWR)
+		return SFE_BAD_MODE_RW ;
+
+	if (psf->file.mode == SFM_READ)
+	{	psf->read_short		= flac_read_flac2s ;
+		psf->read_int		= flac_read_flac2i ;
+		psf->read_float		= flac_read_flac2f ;
+		psf->read_double	= flac_read_flac2d ;
+		} ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	psf->write_short	= flac_write_s2flac ;
+		psf->write_int		= flac_write_i2flac ;
+		psf->write_float	= flac_write_f2flac ;
+		psf->write_double	= flac_write_d2flac ;
+		} ;
+
+	psf->bytewidth = 1 ;
+	psf->blockwidth = psf->sf.channels ;
+
+	if (psf->filelength > psf->dataoffset)
+		psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : psf->filelength - psf->dataoffset ;
+	else
+		psf->datalength = 0 ;
+
+	return 0 ;
+} /* flac_init */
+
+static unsigned
+flac_read_loop (SF_PRIVATE *psf, unsigned len)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+
+	pflac->pos = 0 ;
+	pflac->len = len ;
+	pflac->remain = len ;
+	if (pflac->frame != NULL && pflac->bufferpos < pflac->frame->header.blocksize)
+		flac_buffer_copy (psf) ;
+
+	while (pflac->pos < pflac->len)
+	{	if (FLAC__stream_decoder_process_single (pflac->fsd) == 0)
+			break ;
+		if (FLAC__stream_decoder_get_state (pflac->fsd) >= FLAC__STREAM_DECODER_END_OF_STREAM)
+			break ;
+		} ;
+
+	pflac->ptr = NULL ;
+
+	return pflac->pos ;
+} /* flac_read_loop */
+
+static sf_count_t
+flac_read_flac2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	sf_count_t total = 0, current ;
+	unsigned readlen ;
+
+	pflac->pcmtype = PFLAC_PCM_SHORT ;
+
+	while (total < len)
+	{	pflac->ptr = ptr + total ;
+		readlen = (len - total > 0x1000000) ? 0x1000000 : (unsigned) (len - total) ;
+		current = flac_read_loop (psf, readlen) ;
+		if (current == 0)
+			break ;
+		total += current ;
+		} ;
+
+	return total ;
+} /* flac_read_flac2s */
+
+static sf_count_t
+flac_read_flac2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	sf_count_t total = 0, current ;
+	unsigned readlen ;
+
+	pflac->pcmtype = PFLAC_PCM_INT ;
+
+	while (total < len)
+	{	pflac->ptr = ptr + total ;
+		readlen = (len - total > 0x1000000) ? 0x1000000 : (unsigned) (len - total) ;
+		current = flac_read_loop (psf, readlen) ;
+		if (current == 0)
+			break ;
+		total += current ;
+		} ;
+
+	return total ;
+} /* flac_read_flac2i */
+
+static sf_count_t
+flac_read_flac2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	sf_count_t total = 0, current ;
+	unsigned readlen ;
+
+	pflac->pcmtype = PFLAC_PCM_FLOAT ;
+
+	while (total < len)
+	{	pflac->ptr = ptr + total ;
+		readlen = (len - total > 0x1000000) ? 0x1000000 : (unsigned) (len - total) ;
+		current = flac_read_loop (psf, readlen) ;
+		if (current == 0)
+			break ;
+		total += current ;
+		} ;
+
+	return total ;
+} /* flac_read_flac2f */
+
+static sf_count_t
+flac_read_flac2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	sf_count_t total = 0, current ;
+	unsigned readlen ;
+
+	pflac->pcmtype = PFLAC_PCM_DOUBLE ;
+
+	while (total < len)
+	{	pflac->ptr = ptr + total ;
+		readlen = (len - total > 0x1000000) ? 0x1000000 : (unsigned) (len - total) ;
+		current = flac_read_loop (psf, readlen) ;
+		if (current == 0)
+			break ;
+		total += current ;
+		} ;
+
+	return total ;
+} /* flac_read_flac2d */
+
+static sf_count_t
+flac_write_s2flac (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	void (*convert) (const short *, FLAC__int32 *, int) ;
+	int bufferlen, writecount, thiswrite ;
+	sf_count_t	total = 0 ;
+	FLAC__int32* buffer = pflac->encbuffer ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_S8 :
+			convert = s2flac8_array ;
+			break ;
+		case SF_FORMAT_PCM_16 :
+			convert = s2flac16_array ;
+			break ;
+			case SF_FORMAT_PCM_24 :
+			convert = s2flac24_array ;
+			break ;
+		default :
+			return -1 ;
+		} ;
+
+	bufferlen = ENC_BUFFER_SIZE / (sizeof (FLAC__int32) * psf->sf.channels) ;
+	bufferlen *= psf->sf.channels ;
+
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : (int) len ;
+		convert (ptr + total, buffer, writecount) ;
+		if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount/psf->sf.channels))
+			thiswrite = writecount ;
+		else
+			break ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+
+		len -= thiswrite ;
+		} ;
+
+	return total ;
+} /* flac_write_s2flac */
+
+static sf_count_t
+flac_write_i2flac (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	void (*convert) (const int *, FLAC__int32 *, int) ;
+	int bufferlen, writecount, thiswrite ;
+	sf_count_t	total = 0 ;
+	FLAC__int32* buffer = pflac->encbuffer ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_S8 :
+			convert = i2flac8_array ;
+			break ;
+		case SF_FORMAT_PCM_16 :
+			convert = i2flac16_array ;
+			break ;
+		case SF_FORMAT_PCM_24 :
+			convert = i2flac24_array ;
+			break ;
+		default :
+			return -1 ;
+		} ;
+
+	bufferlen = ENC_BUFFER_SIZE / (sizeof (FLAC__int32) * psf->sf.channels) ;
+	bufferlen *= psf->sf.channels ;
+
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : (int) len ;
+		convert (ptr + total, buffer, writecount) ;
+		if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount/psf->sf.channels))
+			thiswrite = writecount ;
+		else
+			break ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+
+		len -= thiswrite ;
+		} ;
+
+	return total ;
+} /* flac_write_i2flac */
+
+static sf_count_t
+flac_write_f2flac (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	void (*convert) (const float *, FLAC__int32 *, int, int) ;
+	int bufferlen, writecount, thiswrite ;
+	sf_count_t	total = 0 ;
+	FLAC__int32* buffer = pflac->encbuffer ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_S8 :
+			convert = (psf->add_clipping) ? f2flac8_clip_array : f2flac8_array ;
+			break ;
+		case SF_FORMAT_PCM_16 :
+			convert = (psf->add_clipping) ? f2flac16_clip_array : f2flac16_array ;
+			break ;
+		case SF_FORMAT_PCM_24 :
+			convert = (psf->add_clipping) ? f2flac24_clip_array : f2flac24_array ;
+			break ;
+		default :
+			return -1 ;
+		} ;
+
+	bufferlen = ENC_BUFFER_SIZE / (sizeof (FLAC__int32) * psf->sf.channels) ;
+	bufferlen *= psf->sf.channels ;
+
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : (int) len ;
+		convert (ptr + total, buffer, writecount, psf->norm_float) ;
+		if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount/psf->sf.channels))
+			thiswrite = writecount ;
+		else
+			break ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+
+		len -= thiswrite ;
+		} ;
+
+	return total ;
+} /* flac_write_f2flac */
+
+static void
+f2flac8_clip_array (const float *src, FLAC__int32 *dest, int count, int normalize)
+{	float normfact, scaled_value ;
+
+	normfact = normalize ? (8.0 * 0x10) : 1.0 ;
+
+	while (--count >= 0)
+	{	scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7F))
+		{	dest [count] = 0x7F ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10))
+		{	dest [count] = 0x80 ;
+			continue ;
+			} ;
+		dest [count] = lrintf (scaled_value) ;
+		} ;
+
+	return ;
+} /* f2flac8_clip_array */
+
+static void
+f2flac16_clip_array (const float *src, FLAC__int32 *dest, int count, int normalize)
+{
+  float normfact, scaled_value ;
+
+  normfact = normalize ? (8.0 * 0x1000) : 1.0 ;
+
+  while (--count >= 0) {
+    scaled_value = src [count] * normfact ;
+    if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFF)) {
+      dest [count] = 0x7FFF ;
+      continue ;
+    }
+    if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x1000)) {
+      dest [count] = 0x8000 ;
+      continue ;
+    }
+    dest [count] = lrintf (scaled_value) ;
+  }
+} /* f2flac16_clip_array */
+
+static void
+f2flac24_clip_array (const float *src, FLAC__int32 *dest, int count, int normalize)
+{	float normfact, scaled_value ;
+
+	normfact = normalize ? (8.0 * 0x100000) : 1.0 ;
+
+	while (--count >= 0)
+	{	scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFF))
+		{	dest [count] = 0x7FFFFF ;
+			continue ;
+			} ;
+
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x100000))
+		{	dest [count] = 0x800000 ;
+			continue ;
+			}
+		dest [count] = lrintf (scaled_value) ;
+		} ;
+
+	return ;
+} /* f2flac24_clip_array */
+
+static void
+f2flac8_array (const float *src, FLAC__int32 *dest, int count, int normalize)
+{	float normfact = normalize ? (1.0 * 0x7F) : 1.0 ;
+
+	while (--count >= 0)
+		dest [count] = lrintf (src [count] * normfact) ;
+} /* f2flac8_array */
+
+static void
+f2flac16_array (const float *src, FLAC__int32 *dest, int count, int normalize)
+{	float normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ;
+
+	while (--count >= 0)
+		dest [count] = lrintf (src [count] * normfact) ;
+} /* f2flac16_array */
+
+static void
+f2flac24_array (const float *src, FLAC__int32 *dest, int count, int normalize)
+{	float normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ;
+
+	while (--count >= 0)
+		dest [count] = lrintf (src [count] * normfact) ;
+} /* f2flac24_array */
+
+static sf_count_t
+flac_write_d2flac (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	void (*convert) (const double *, FLAC__int32 *, int, int) ;
+	int bufferlen, writecount, thiswrite ;
+	sf_count_t	total = 0 ;
+	FLAC__int32* buffer = pflac->encbuffer ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_S8 :
+			convert = (psf->add_clipping) ? d2flac8_clip_array : d2flac8_array ;
+			break ;
+		case SF_FORMAT_PCM_16 :
+			convert = (psf->add_clipping) ? d2flac16_clip_array : d2flac16_array ;
+			break ;
+		case SF_FORMAT_PCM_24 :
+			convert = (psf->add_clipping) ? d2flac24_clip_array : d2flac24_array ;
+			break ;
+		default :
+			return -1 ;
+		} ;
+
+	bufferlen = ENC_BUFFER_SIZE / (sizeof (FLAC__int32) * psf->sf.channels) ;
+	bufferlen *= psf->sf.channels ;
+
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : (int) len ;
+		convert (ptr + total, buffer, writecount, psf->norm_double) ;
+		if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount/psf->sf.channels))
+			thiswrite = writecount ;
+		else
+			break ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+
+		len -= thiswrite ;
+		} ;
+
+	return total ;
+} /* flac_write_d2flac */
+
+static void
+d2flac8_clip_array (const double *src, FLAC__int32 *dest, int count, int normalize)
+{	double normfact, scaled_value ;
+
+	normfact = normalize ? (8.0 * 0x10) : 1.0 ;
+
+	while (--count >= 0)
+	{	scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7F))
+		{	dest [count] = 0x7F ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10))
+		{	dest [count] = 0x80 ;
+			continue ;
+			} ;
+		dest [count] = lrint (scaled_value) ;
+		} ;
+
+	return ;
+} /* d2flac8_clip_array */
+
+static void
+d2flac16_clip_array (const double *src, FLAC__int32 *dest, int count, int normalize)
+{	double normfact, scaled_value ;
+
+	normfact = normalize ? (8.0 * 0x1000) : 1.0 ;
+
+	while (--count >= 0)
+	{	scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFF))
+		{	dest [count] = 0x7FFF ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x1000))
+		{	dest [count] = 0x8000 ;
+			continue ;
+			} ;
+		dest [count] = lrint (scaled_value) ;
+		} ;
+
+	return ;
+} /* d2flac16_clip_array */
+
+static void
+d2flac24_clip_array (const double *src, FLAC__int32 *dest, int count, int normalize)
+{	double normfact, scaled_value ;
+
+	normfact = normalize ? (8.0 * 0x100000) : 1.0 ;
+
+	while (--count >= 0)
+	{	scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFF))
+		{	dest [count] = 0x7FFFFF ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x100000))
+		{	dest [count] = 0x800000 ;
+			continue ;
+			} ;
+		dest [count] = lrint (scaled_value) ;
+		} ;
+
+	return ;
+} /* d2flac24_clip_array */
+
+static void
+d2flac8_array (const double *src, FLAC__int32 *dest, int count, int normalize)
+{	double normfact = normalize ? (1.0 * 0x7F) : 1.0 ;
+
+	while (--count >= 0)
+		dest [count] = lrint (src [count] * normfact) ;
+} /* d2flac8_array */
+
+static void
+d2flac16_array (const double *src, FLAC__int32 *dest, int count, int normalize)
+{	double normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ;
+
+	while (--count >= 0)
+		dest [count] = lrint (src [count] * normfact) ;
+} /* d2flac16_array */
+
+static void
+d2flac24_array (const double *src, FLAC__int32 *dest, int count, int normalize)
+{	double normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ;
+
+	while (--count >= 0)
+		dest [count] = lrint (src [count] * normfact) ;
+} /* d2flac24_array */
+
+static sf_count_t
+flac_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t offset)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+
+	if (pflac == NULL)
+		return 0 ;
+
+	if (psf->dataoffset < 0)
+	{	psf->error = SFE_BAD_SEEK ;
+		return ((sf_count_t) -1) ;
+		} ;
+
+	pflac->frame = NULL ;
+
+	if (psf->file.mode == SFM_READ)
+	{	FLAC__uint64 position ;
+		if (FLAC__stream_decoder_seek_absolute (pflac->fsd, offset))
+		{	FLAC__stream_decoder_get_decode_position (pflac->fsd, &position) ;
+			return offset ;
+			} ;
+
+		return ((sf_count_t) -1) ;
+		} ;
+
+	/* Seeking in write mode not yet supported. */
+	psf->error = SFE_BAD_SEEK ;
+
+	return ((sf_count_t) -1) ;
+} /* flac_seek */
+
+#else /* HAVE_EXTERNAL_LIBS */
+
+int
+flac_open	(SF_PRIVATE *psf)
+{
+	psf_log_printf (psf, "This version of libsndfile was compiled without FLAC support.\n") ;
+	return SFE_UNIMPLEMENTED ;
+} /* flac_open */
+
+#endif
diff --git a/jni/libsndfile-1.0.25/src/flac.c~ b/jni/libsndfile-1.0.25/src/flac.c~
new file mode 100644
index 0000000..7949b0a
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/flac.c~
@@ -0,0 +1,1324 @@
+/*
+** Copyright (C) 2004-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2004 Tobias Gehrig <tgehrig@ira.uka.de>
+**
+** This program is free software ; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation ; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY ; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program ; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<stdlib.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+#include	<math.h>
+
+#include	"sndfile.h"
+#include	"common.h"
+
+#if HAVE_EXTERNAL_LIBS
+
+#include	<FLAC/stream_decoder.h>
+#include	<FLAC/stream_encoder.h>
+#include	<FLAC/metadata.h>
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+#define ENC_BUFFER_SIZE 8192
+
+typedef enum
+{	PFLAC_PCM_SHORT = 50,
+	PFLAC_PCM_INT = 51,
+	PFLAC_PCM_FLOAT = 52,
+	PFLAC_PCM_DOUBLE = 53
+} PFLAC_PCM ;
+
+typedef struct
+{
+	FLAC__StreamDecoder *fsd ;
+	FLAC__StreamEncoder *fse ;
+
+	PFLAC_PCM pcmtype ;
+	void* ptr ;
+	unsigned pos, len, remain ;
+
+	FLAC__StreamMetadata *metadata ;
+
+	const FLAC__int32 * const * wbuffer ;
+	FLAC__int32 * rbuffer [FLAC__MAX_CHANNELS] ;
+
+	FLAC__int32* encbuffer ;
+	unsigned bufferpos ;
+
+	const FLAC__Frame *frame ;
+	FLAC__bool bufferbackup ;
+} FLAC_PRIVATE ;
+
+typedef struct
+{	const char *tag ;
+	int type ;
+} FLAC_TAG ;
+
+static sf_count_t	flac_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+static int			flac_close (SF_PRIVATE *psf) ;
+
+static int			flac_enc_init (SF_PRIVATE *psf) ;
+static int			flac_read_header (SF_PRIVATE *psf) ;
+
+static sf_count_t	flac_read_flac2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	flac_read_flac2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	flac_read_flac2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	flac_read_flac2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t	flac_write_s2flac (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t	flac_write_i2flac (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t	flac_write_f2flac (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t	flac_write_d2flac (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+static void		f2flac8_array (const float *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		f2flac16_array (const float *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		f2flac24_array (const float *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		f2flac8_clip_array (const float *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		f2flac16_clip_array (const float *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		f2flac24_clip_array (const float *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		d2flac8_array (const double *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		d2flac16_array (const double *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		d2flac24_array (const double *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		d2flac8_clip_array (const double *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		d2flac16_clip_array (const double *src, FLAC__int32 *dest, int count, int normalize) ;
+static void		d2flac24_clip_array (const double *src, FLAC__int32 *dest, int count, int normalize) ;
+
+static int flac_command (SF_PRIVATE *psf, int command, void *data, int datasize) ;
+
+/* Decoder Callbacks */
+static FLAC__StreamDecoderReadStatus sf_flac_read_callback (const FLAC__StreamDecoder *decoder, FLAC__byte buffer [], size_t *bytes, void *client_data) ;
+static FLAC__StreamDecoderSeekStatus sf_flac_seek_callback (const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) ;
+static FLAC__StreamDecoderTellStatus sf_flac_tell_callback (const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) ;
+static FLAC__StreamDecoderLengthStatus sf_flac_length_callback (const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) ;
+static FLAC__bool sf_flac_eof_callback (const FLAC__StreamDecoder *decoder, void *client_data) ;
+static FLAC__StreamDecoderWriteStatus sf_flac_write_callback (const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer [], void *client_data) ;
+static void sf_flac_meta_callback (const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) ;
+static void sf_flac_error_callback (const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) ;
+
+/* Encoder Callbacks */
+static FLAC__StreamEncoderSeekStatus sf_flac_enc_seek_callback (const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data) ;
+static FLAC__StreamEncoderTellStatus sf_flac_enc_tell_callback (const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data) ;
+static FLAC__StreamEncoderWriteStatus sf_flac_enc_write_callback (const FLAC__StreamEncoder *encoder, const FLAC__byte buffer [], size_t bytes, unsigned samples, unsigned current_frame, void *client_data) ;
+
+static void
+s2flac8_array (const short *src, FLAC__int32 *dest, int count)
+{	while (--count >= 0)
+		dest [count] = src [count] >> 8 ;
+} /* s2flac8_array */
+
+static void
+s2flac16_array (const short *src, FLAC__int32 *dest, int count)
+{	while (--count >= 0)
+		dest [count] = src [count] ;
+} /* s2flac16_array */
+
+static void
+s2flac24_array (const short *src, FLAC__int32 *dest, int count)
+{	while (--count >= 0)
+		dest [count] = src [count] << 8 ;
+} /* s2flac24_array */
+
+static void
+i2flac8_array (const int *src, FLAC__int32 *dest, int count)
+{	while (--count >= 0)
+		dest [count] = src [count] >> 24 ;
+} /* i2flac8_array */
+
+static void
+i2flac16_array (const int *src, FLAC__int32 *dest, int count)
+{
+  while (--count >= 0)
+    dest [count] = src [count] >> 16 ;
+} /* i2flac16_array */
+
+static void
+i2flac24_array (const int *src, FLAC__int32 *dest, int count)
+{	while (--count >= 0)
+		dest [count] = src [count] >> 8 ;
+} /* i2flac24_array */
+
+static sf_count_t
+flac_buffer_copy (SF_PRIVATE *psf)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	const FLAC__Frame *frame = pflac->frame ;
+	const FLAC__int32* const *buffer = pflac->wbuffer ;
+	unsigned i = 0, j, offset ;
+
+	/*
+	**	frame->header.blocksize is variable and we're using a constant blocksize
+	**	of FLAC__MAX_BLOCK_SIZE.
+	**	Check our assumptions here.
+	*/
+	if (frame->header.blocksize > FLAC__MAX_BLOCK_SIZE)
+	{	psf_log_printf (psf, "Ooops : frame->header.blocksize (%d) > FLAC__MAX_BLOCK_SIZE (%d)\n", __func__, __LINE__, frame->header.blocksize, FLAC__MAX_BLOCK_SIZE) ;
+		psf->error = SFE_INTERNAL ;
+		return 0 ;
+		} ;
+
+	if (pflac->ptr == NULL)
+	{	/*
+		**	Not sure why this code is here and not elsewhere.
+		**	Removing it causes valgrind errors.
+		*/
+		pflac->bufferbackup = SF_TRUE ;
+		for (i = 0 ; i < frame->header.channels ; i++)
+		{
+			if (pflac->rbuffer [i] == NULL)
+				pflac->rbuffer [i] = calloc (FLAC__MAX_BLOCK_SIZE, sizeof (FLAC__int32)) ;
+
+			memcpy (pflac->rbuffer [i], buffer [i], frame->header.blocksize * sizeof (FLAC__int32)) ;
+			} ;
+		pflac->wbuffer = (const FLAC__int32* const*) pflac->rbuffer ;
+
+		return 0 ;
+		} ;
+
+	switch (pflac->pcmtype)
+	{	case PFLAC_PCM_SHORT :
+			{	short *retpcm = (short*) pflac->ptr ;
+				int shift = 16 - frame->header.bits_per_sample ;
+				if (shift < 0)
+				{	shift = abs (shift) ;
+					for (i = 0 ; i < frame->header.blocksize && pflac->remain > 0 ; i++)
+					{	offset = pflac->pos + i * frame->header.channels ;
+
+						if (pflac->bufferpos >= frame->header.blocksize)
+							break ;
+
+						for (j = 0 ; j < frame->header.channels ; j++)
+							retpcm [offset + j] = buffer [j][pflac->bufferpos] >> shift ;
+						pflac->remain -= frame->header.channels ;
+						pflac->bufferpos++ ;
+						}
+					}
+				else
+				{	for (i = 0 ; i < frame->header.blocksize && pflac->remain > 0 ; i++)
+					{	offset = pflac->pos + i * frame->header.channels ;
+
+						if (pflac->bufferpos >= frame->header.blocksize)
+							break ;
+
+						for (j = 0 ; j < frame->header.channels ; j++)
+							retpcm [offset + j] = (buffer [j][pflac->bufferpos]) << shift ;
+
+						pflac->remain -= frame->header.channels ;
+						pflac->bufferpos++ ;
+						} ;
+					} ;
+				} ;
+			break ;
+
+		case PFLAC_PCM_INT :
+			{	int *retpcm = (int*) pflac->ptr ;
+				int shift = 32 - frame->header.bits_per_sample ;
+				for (i = 0 ; i < frame->header.blocksize && pflac->remain > 0 ; i++)
+				{	offset = pflac->pos + i * frame->header.channels ;
+
+					if (pflac->bufferpos >= frame->header.blocksize)
+						break ;
+
+					for (j = 0 ; j < frame->header.channels ; j++)
+						retpcm [offset + j] = buffer [j][pflac->bufferpos] << shift ;
+					pflac->remain -= frame->header.channels ;
+					pflac->bufferpos++ ;
+					} ;
+				} ;
+			break ;
+
+		case PFLAC_PCM_FLOAT :
+			{	float *retpcm = (float*) pflac->ptr ;
+				float norm = (psf->norm_float == SF_TRUE) ? 1.0 / (1 << (frame->header.bits_per_sample - 1)) : 1.0 ;
+
+				for (i = 0 ; i < frame->header.blocksize && pflac->remain > 0 ; i++)
+				{	offset = pflac->pos + i * frame->header.channels ;
+
+					if (pflac->bufferpos >= frame->header.blocksize)
+						break ;
+
+					for (j = 0 ; j < frame->header.channels ; j++)
+						retpcm [offset + j] = buffer [j][pflac->bufferpos] * norm ;
+					pflac->remain -= frame->header.channels ;
+					pflac->bufferpos++ ;
+					} ;
+				} ;
+			break ;
+
+		case PFLAC_PCM_DOUBLE :
+			{	double *retpcm = (double*) pflac->ptr ;
+				double norm = (psf->norm_double == SF_TRUE) ? 1.0 / (1 << (frame->header.bits_per_sample - 1)) : 1.0 ;
+
+				for (i = 0 ; i < frame->header.blocksize && pflac->remain > 0 ; i++)
+				{	offset = pflac->pos + i * frame->header.channels ;
+
+					if (pflac->bufferpos >= frame->header.blocksize)
+						break ;
+
+					for (j = 0 ; j < frame->header.channels ; j++)
+						retpcm [offset + j] = buffer [j][pflac->bufferpos] * norm ;
+					pflac->remain -= frame->header.channels ;
+					pflac->bufferpos++ ;
+					} ;
+				} ;
+			break ;
+
+		default :
+			return 0 ;
+		} ;
+
+	offset = i * frame->header.channels ;
+	pflac->pos += i * frame->header.channels ;
+
+	return offset ;
+} /* flac_buffer_copy */
+
+
+static FLAC__StreamDecoderReadStatus
+sf_flac_read_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__byte buffer [], size_t *bytes, void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+
+	*bytes = psf_fread (buffer, 1, *bytes, psf) ;
+	if (*bytes > 0 && psf->error == 0)
+		return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE ;
+
+    return FLAC__STREAM_DECODER_READ_STATUS_ABORT ;
+} /* sf_flac_read_callback */
+
+static FLAC__StreamDecoderSeekStatus
+sf_flac_seek_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__uint64 absolute_byte_offset, void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+
+	psf_fseek (psf, absolute_byte_offset, SEEK_SET) ;
+	if (psf->error)
+		return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR ;
+
+	return FLAC__STREAM_DECODER_SEEK_STATUS_OK ;
+} /* sf_flac_seek_callback */
+
+static FLAC__StreamDecoderTellStatus
+sf_flac_tell_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__uint64 *absolute_byte_offset, void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+
+	*absolute_byte_offset = psf_ftell (psf) ;
+	if (psf->error)
+		return FLAC__STREAM_DECODER_TELL_STATUS_ERROR ;
+
+	return FLAC__STREAM_DECODER_TELL_STATUS_OK ;
+} /* sf_flac_tell_callback */
+
+static FLAC__StreamDecoderLengthStatus
+sf_flac_length_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__uint64 *stream_length, void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+
+	if ((*stream_length = psf->filelength) == 0)
+		return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR ;
+
+	return FLAC__STREAM_DECODER_LENGTH_STATUS_OK ;
+} /* sf_flac_length_callback */
+
+static FLAC__bool
+sf_flac_eof_callback (const FLAC__StreamDecoder *UNUSED (decoder), void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+
+	if (psf_ftell (psf) == psf->filelength)
+		return SF_TRUE ;
+
+    return SF_FALSE ;
+} /* sf_flac_eof_callback */
+
+static FLAC__StreamDecoderWriteStatus
+sf_flac_write_callback (const FLAC__StreamDecoder * UNUSED (decoder), const FLAC__Frame *frame, const FLAC__int32 * const buffer [], void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+
+	pflac->frame = frame ;
+	pflac->bufferpos = 0 ;
+
+	pflac->bufferbackup = SF_FALSE ;
+	pflac->wbuffer = buffer ;
+
+	flac_buffer_copy (psf) ;
+
+	return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE ;
+} /* sf_flac_write_callback */
+
+static void
+sf_flac_meta_get_vorbiscomments (SF_PRIVATE *psf, const FLAC__StreamMetadata *metadata)
+{	FLAC_TAG tags [] =
+	{ 	{ "title", SF_STR_TITLE },
+		{ "copyright", SF_STR_COPYRIGHT },
+		{ "software", SF_STR_SOFTWARE },
+		{ "artist", SF_STR_ARTIST },
+		{ "comment", SF_STR_COMMENT },
+		{ "date", SF_STR_DATE },
+		{ "album", SF_STR_ALBUM },
+		{ "license", SF_STR_LICENSE },
+		{ "tracknumber", SF_STR_TRACKNUMBER },
+		{ "genre", SF_STR_GENRE }
+		} ;
+
+	const char *value, *cptr ;
+	int k, tag_num ;
+
+	for (k = 0 ; k < ARRAY_LEN (tags) ; k++)
+	{	tag_num = FLAC__metadata_object_vorbiscomment_find_entry_from (metadata, 0, tags [k].tag) ;
+
+		if (tag_num < 0)
+			continue ;
+
+		value = (const char*) metadata->data.vorbis_comment.comments [tag_num].entry ;
+		if ((cptr = strchr (value, '=')) != NULL)
+			value = cptr + 1 ;
+
+		psf_log_printf (psf, "  %-10s : %s\n", tags [k].tag, value) ;
+		psf_store_string (psf, tags [k].type, value) ;
+		} ;
+
+	return ;
+} /* sf_flac_meta_get_vorbiscomments */
+
+static void
+sf_flac_meta_callback (const FLAC__StreamDecoder * UNUSED (decoder), const FLAC__StreamMetadata *metadata, void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+	int bitwidth = 0 ;
+
+	switch (metadata->type)
+	{	case FLAC__METADATA_TYPE_STREAMINFO :
+			psf->sf.channels = metadata->data.stream_info.channels ;
+			psf->sf.samplerate = metadata->data.stream_info.sample_rate ;
+			psf->sf.frames = metadata->data.stream_info.total_samples ;
+
+			psf_log_printf (psf, "FLAC Stream Metadata\n  Channels    : %d\n  Sample rate : %d\n", psf->sf.channels, psf->sf.samplerate) ;
+
+			if (psf->sf.frames == 0)
+			{	psf_log_printf (psf, "  Frames      : 0 (bumping to SF_COUNT_MAX)\n") ;
+				psf->sf.frames = SF_COUNT_MAX ;
+				}
+			else
+				psf_log_printf (psf, "  Frames      : %D\n", psf->sf.frames) ;
+
+			switch (metadata->data.stream_info.bits_per_sample)
+			{	case 8 :
+					psf->sf.format |= SF_FORMAT_PCM_S8 ;
+					bitwidth = 8 ;
+					break ;
+				case 16 :
+					psf->sf.format |= SF_FORMAT_PCM_16 ;
+					bitwidth = 16 ;
+					break ;
+				case 24 :
+					psf->sf.format |= SF_FORMAT_PCM_24 ;
+					bitwidth = 24 ;
+					break ;
+				default :
+					psf_log_printf (psf, "sf_flac_meta_callback : bits_per_sample %d not yet implemented.\n", metadata->data.stream_info.bits_per_sample) ;
+					break ;
+				} ;
+
+			if (bitwidth > 0)
+				psf_log_printf (psf, "  Bit width   : %d\n", bitwidth) ;
+			break ;
+
+		case FLAC__METADATA_TYPE_VORBIS_COMMENT :
+			psf_log_printf (psf, "Vorbis Comment Metadata\n") ;
+			sf_flac_meta_get_vorbiscomments (psf, metadata) ;
+			break ;
+
+		case FLAC__METADATA_TYPE_PADDING :
+			psf_log_printf (psf, "Padding Metadata\n") ;
+			break ;
+
+		case FLAC__METADATA_TYPE_APPLICATION :
+			psf_log_printf (psf, "Application Metadata\n") ;
+			break ;
+
+		case FLAC__METADATA_TYPE_SEEKTABLE :
+			psf_log_printf (psf, "Seektable Metadata\n") ;
+			break ;
+
+		case FLAC__METADATA_TYPE_CUESHEET :
+			psf_log_printf (psf, "Cuesheet Metadata\n") ;
+			break ;
+
+		case FLAC__METADATA_TYPE_PICTURE :
+			psf_log_printf (psf, "Picture Metadata\n") ;
+			break ;
+
+		case FLAC__METADATA_TYPE_UNDEFINED :
+			psf_log_printf (psf, "Undefined Metadata\n") ;
+			break ;
+
+		default :
+			psf_log_printf (psf, "sf_flac_meta_callback : metadata-type %d not yet implemented.\n", metadata->type) ;
+			break ;
+		} ;
+
+	return ;
+} /* sf_flac_meta_callback */
+
+static void
+sf_flac_error_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__StreamDecoderErrorStatus status, void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+
+	psf_log_printf (psf, "ERROR : %s\n", FLAC__StreamDecoderErrorStatusString [status]) ;
+
+	switch (status)
+	{	case FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC :
+			psf->error = SFE_FLAC_LOST_SYNC ;
+			break ;
+		case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER :
+			psf->error = SFE_FLAC_BAD_HEADER ;
+			break ;
+		default :
+			psf->error = SFE_FLAC_UNKOWN_ERROR ;
+			break ;
+		} ;
+
+	return ;
+} /* sf_flac_error_callback */
+
+static FLAC__StreamEncoderSeekStatus
+sf_flac_enc_seek_callback (const FLAC__StreamEncoder * UNUSED (encoder), FLAC__uint64 absolute_byte_offset, void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+
+	psf_fseek (psf, absolute_byte_offset, SEEK_SET) ;
+	if (psf->error)
+		return FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR ;
+
+    return FLAC__STREAM_ENCODER_SEEK_STATUS_OK ;
+} /* sf_flac_enc_seek_callback */
+
+static FLAC__StreamEncoderTellStatus
+sf_flac_enc_tell_callback (const FLAC__StreamEncoder *UNUSED (encoder), FLAC__uint64 *absolute_byte_offset, void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+
+	*absolute_byte_offset = psf_ftell (psf) ;
+	if (psf->error)
+		return FLAC__STREAM_ENCODER_TELL_STATUS_ERROR ;
+
+	return FLAC__STREAM_ENCODER_TELL_STATUS_OK ;
+} /* sf_flac_enc_tell_callback */
+
+static FLAC__StreamEncoderWriteStatus
+sf_flac_enc_write_callback (const FLAC__StreamEncoder * UNUSED (encoder), const FLAC__byte buffer [], size_t bytes, unsigned UNUSED (samples), unsigned UNUSED (current_frame), void *client_data)
+{	SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
+
+	if (psf_fwrite (buffer, 1, bytes, psf) == (sf_count_t) bytes && psf->error == 0)
+		return FLAC__STREAM_ENCODER_WRITE_STATUS_OK ;
+
+	return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR ;
+} /* sf_flac_enc_write_callback */
+
+static void
+flac_write_strings (SF_PRIVATE *psf, FLAC_PRIVATE* pflac)
+{	FLAC__StreamMetadata_VorbisComment_Entry entry ;
+	int	k, string_count = 0 ;
+
+	for (k = 0 ; k < SF_MAX_STRINGS ; k++)
+	{	if (psf->strings [k].type != 0)
+			string_count ++ ;
+		} ;
+
+	if (string_count == 0)
+		return ;
+
+	if (pflac->metadata == NULL && (pflac->metadata = FLAC__metadata_object_new (FLAC__METADATA_TYPE_VORBIS_COMMENT)) == NULL)
+	{	psf_log_printf (psf, "FLAC__metadata_object_new returned NULL\n") ;
+		return ;
+		} ;
+
+	for (k = 0 ; k < SF_MAX_STRINGS && psf->strings [k].type != 0 ; k++)
+	{	const char * key, * value ;
+
+		switch (psf->strings [k].type)
+		{	case SF_STR_SOFTWARE :
+				key = "software" ;
+				break ;
+			case SF_STR_TITLE :
+				key = "title" ;
+				break ;
+			case SF_STR_COPYRIGHT :
+				key = "copyright" ;
+				break ;
+			case SF_STR_ARTIST :
+				key = "artist" ;
+				break ;
+			case SF_STR_COMMENT :
+				key = "comment" ;
+				break ;
+			case SF_STR_DATE :
+				key = "date" ;
+				break ;
+			case SF_STR_ALBUM :
+				key = "album" ;
+				break ;
+			case SF_STR_LICENSE :
+				key = "license" ;
+				break ;
+			case SF_STR_TRACKNUMBER :
+				key = "tracknumber" ;
+				break ;
+			case SF_STR_GENRE :
+				key = "genre" ;
+				break ;
+			default :
+				continue ;
+			} ;
+
+		value = psf->strings [k].str ;
+
+		FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair (&entry, key, value) ;
+		FLAC__metadata_object_vorbiscomment_append_comment (pflac->metadata, entry, /* copy */ SF_FALSE) ;
+		} ;
+
+	if (! FLAC__stream_encoder_set_metadata (pflac->fse, &pflac->metadata, 1))
+	{	printf ("%s %d : fail\n", __func__, __LINE__) ;
+		return ;
+		} ;
+
+	return ;
+} /* flac_write_strings */
+
+static int
+flac_write_header (SF_PRIVATE *psf, int UNUSED (calc_length))
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	int err ;
+
+	flac_write_strings (psf, pflac) ;
+
+	if ((err = FLAC__stream_encoder_init_stream (pflac->fse, sf_flac_enc_write_callback, sf_flac_enc_seek_callback, sf_flac_enc_tell_callback, NULL, psf)) != FLAC__STREAM_DECODER_INIT_STATUS_OK)
+	{	psf_log_printf (psf, "Error : FLAC encoder init returned error : %s\n", FLAC__StreamEncoderInitStatusString [err]) ;
+		return SFE_FLAC_INIT_DECODER ;
+		} ;
+
+	if (psf->error == 0)
+		psf->dataoffset = psf_ftell (psf) ;
+	pflac->encbuffer = calloc (ENC_BUFFER_SIZE, sizeof (FLAC__int32)) ;
+
+	return psf->error ;
+} /* flac_write_header */
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+flac_open	(SF_PRIVATE *psf)
+{	int		subformat ;
+	int		error = 0 ;
+
+	FLAC_PRIVATE* pflac = calloc (1, sizeof (FLAC_PRIVATE)) ;
+	psf->codec_data = pflac ;
+
+	if (psf->file.mode == SFM_RDWR)
+		return SFE_BAD_MODE_RW ;
+
+	if (psf->file.mode == SFM_READ)
+	{	if ((error = flac_read_header (psf)))
+			return error ;
+		} ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_FLAC)
+			return	SFE_BAD_OPEN_FORMAT ;
+
+		psf->endian = SF_ENDIAN_BIG ;
+		psf->sf.seekable = 0 ;
+
+		psf->str_flags = SF_STR_ALLOW_START ;
+
+		if ((error = flac_enc_init (psf)))
+			return error ;
+
+		psf->write_header = flac_write_header ;
+		} ;
+
+	psf->datalength = psf->filelength ;
+	psf->dataoffset = 0 ;
+	psf->blockwidth = 0 ;
+	psf->bytewidth = 1 ;
+
+	psf->container_close = flac_close ;
+	psf->seek = flac_seek ;
+	psf->command = flac_command ;
+
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+	switch (subformat)
+	{	case SF_FORMAT_PCM_S8 :	/* 8-bit FLAC.  */
+		case SF_FORMAT_PCM_16 :	/* 16-bit FLAC. */
+		case SF_FORMAT_PCM_24 :	/* 24-bit FLAC. */
+			error = flac_init (psf) ;
+			break ;
+
+		default : return SFE_UNIMPLEMENTED ;
+		} ;
+
+	return error ;
+} /* flac_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+flac_close	(SF_PRIVATE *psf)
+{	FLAC_PRIVATE* pflac ;
+	int k ;
+
+	if ((pflac = (FLAC_PRIVATE*) psf->codec_data) == NULL)
+		return 0 ;
+
+	if (pflac->metadata != NULL)
+		FLAC__metadata_object_delete (pflac->metadata) ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	FLAC__stream_encoder_finish (pflac->fse) ;
+		FLAC__stream_encoder_delete (pflac->fse) ;
+
+		if (pflac->encbuffer)
+			free (pflac->encbuffer) ;
+		} ;
+
+	if (psf->file.mode == SFM_READ)
+	{	FLAC__stream_decoder_finish (pflac->fsd) ;
+		FLAC__stream_decoder_delete (pflac->fsd) ;
+		} ;
+
+	for (k = 0 ; k < ARRAY_LEN (pflac->rbuffer) ; k++)
+		free (pflac->rbuffer [k]) ;
+
+	free (pflac) ;
+	psf->codec_data = NULL ;
+
+	return 0 ;
+} /* flac_close */
+
+static int
+flac_enc_init (SF_PRIVATE *psf)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	unsigned bps ;
+
+	/* To cite the flac FAQ at
+	** http://flac.sourceforge.net/faq.html#general__samples
+	**     "FLAC supports linear sample rates from 1Hz - 655350Hz in 1Hz
+	**     increments."
+	*/
+	if ( psf->sf.samplerate < 1 || psf->sf.samplerate > 655350 )
+	{	psf_log_printf (psf, "flac sample rate out of range.\n", psf->sf.samplerate) ;
+		return SFE_FLAC_BAD_SAMPLE_RATE ;
+		} ;
+
+	psf_fseek (psf, 0, SEEK_SET) ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_S8 :
+			bps = 8 ;
+			break ;
+		case SF_FORMAT_PCM_16 :
+			bps = 16 ;
+			break ;
+		case SF_FORMAT_PCM_24 :
+			bps = 24 ;
+			break ;
+
+		default :
+			bps = 0 ;
+			break ;
+		} ;
+
+	if ((pflac->fse = FLAC__stream_encoder_new ()) == NULL)
+		return SFE_FLAC_NEW_DECODER ;
+
+	if (! FLAC__stream_encoder_set_channels (pflac->fse, psf->sf.channels))
+	{	psf_log_printf (psf, "FLAC__stream_encoder_set_channels (%d) return false.\n", psf->sf.channels) ;
+		return SFE_FLAC_INIT_DECODER ;
+		} ;
+
+	if (! FLAC__stream_encoder_set_sample_rate (pflac->fse, psf->sf.samplerate))
+	{	psf_log_printf (psf, "FLAC__stream_encoder_set_sample_rate (%d) returned false.\n", psf->sf.samplerate) ;
+		return SFE_FLAC_BAD_SAMPLE_RATE ;
+		} ;
+
+	if (! FLAC__stream_encoder_set_bits_per_sample (pflac->fse, bps))
+	{	psf_log_printf (psf, "FLAC__stream_encoder_set_bits_per_sample (%d) return false.\n", bps) ;
+		return SFE_FLAC_INIT_DECODER ;
+		} ;
+
+	return 0 ;
+} /* flac_enc_init */
+
+static int
+flac_read_header (SF_PRIVATE *psf)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+
+	psf_fseek (psf, 0, SEEK_SET) ;
+	if ((pflac->fsd = FLAC__stream_decoder_new ()) == NULL)
+		return SFE_FLAC_NEW_DECODER ;
+
+	FLAC__stream_decoder_set_metadata_respond_all (pflac->fsd) ;
+
+	if (FLAC__stream_decoder_init_stream (pflac->fsd, sf_flac_read_callback, sf_flac_seek_callback, sf_flac_tell_callback, sf_flac_length_callback, sf_flac_eof_callback, sf_flac_write_callback, sf_flac_meta_callback, sf_flac_error_callback, psf) != FLAC__STREAM_DECODER_INIT_STATUS_OK)
+		return SFE_FLAC_INIT_DECODER ;
+
+	FLAC__stream_decoder_process_until_end_of_metadata (pflac->fsd) ;
+
+	psf_log_printf (psf, "End\n") ;
+
+	if (psf->error == 0)
+	{	FLAC__uint64 position ;
+
+		FLAC__stream_decoder_get_decode_position (pflac->fsd, &position) ;
+		psf->dataoffset = position ;
+		} ;
+
+	return psf->error ;
+} /* flac_read_header */
+
+static int
+flac_command (SF_PRIVATE * UNUSED (psf), int UNUSED (command), void * UNUSED (data), int UNUSED (datasize))
+{
+	return 0 ;
+} /* flac_command */
+
+int
+flac_init (SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_RDWR)
+		return SFE_BAD_MODE_RW ;
+
+	if (psf->file.mode == SFM_READ)
+	{	psf->read_short		= flac_read_flac2s ;
+		psf->read_int		= flac_read_flac2i ;
+		psf->read_float		= flac_read_flac2f ;
+		psf->read_double	= flac_read_flac2d ;
+		} ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	psf->write_short	= flac_write_s2flac ;
+		psf->write_int		= flac_write_i2flac ;
+		psf->write_float	= flac_write_f2flac ;
+		psf->write_double	= flac_write_d2flac ;
+		} ;
+
+	psf->bytewidth = 1 ;
+	psf->blockwidth = psf->sf.channels ;
+
+	if (psf->filelength > psf->dataoffset)
+		psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : psf->filelength - psf->dataoffset ;
+	else
+		psf->datalength = 0 ;
+
+	return 0 ;
+} /* flac_init */
+
+static unsigned
+flac_read_loop (SF_PRIVATE *psf, unsigned len)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+
+	pflac->pos = 0 ;
+	pflac->len = len ;
+	pflac->remain = len ;
+	if (pflac->frame != NULL && pflac->bufferpos < pflac->frame->header.blocksize)
+		flac_buffer_copy (psf) ;
+
+	while (pflac->pos < pflac->len)
+	{	if (FLAC__stream_decoder_process_single (pflac->fsd) == 0)
+			break ;
+		if (FLAC__stream_decoder_get_state (pflac->fsd) >= FLAC__STREAM_DECODER_END_OF_STREAM)
+			break ;
+		} ;
+
+	pflac->ptr = NULL ;
+
+	return pflac->pos ;
+} /* flac_read_loop */
+
+static sf_count_t
+flac_read_flac2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	sf_count_t total = 0, current ;
+	unsigned readlen ;
+
+	pflac->pcmtype = PFLAC_PCM_SHORT ;
+
+	while (total < len)
+	{	pflac->ptr = ptr + total ;
+		readlen = (len - total > 0x1000000) ? 0x1000000 : (unsigned) (len - total) ;
+		current = flac_read_loop (psf, readlen) ;
+		if (current == 0)
+			break ;
+		total += current ;
+		} ;
+
+	return total ;
+} /* flac_read_flac2s */
+
+static sf_count_t
+flac_read_flac2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	sf_count_t total = 0, current ;
+	unsigned readlen ;
+
+	pflac->pcmtype = PFLAC_PCM_INT ;
+
+	while (total < len)
+	{	pflac->ptr = ptr + total ;
+		readlen = (len - total > 0x1000000) ? 0x1000000 : (unsigned) (len - total) ;
+		current = flac_read_loop (psf, readlen) ;
+		if (current == 0)
+			break ;
+		total += current ;
+		} ;
+
+	return total ;
+} /* flac_read_flac2i */
+
+static sf_count_t
+flac_read_flac2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	sf_count_t total = 0, current ;
+	unsigned readlen ;
+
+	pflac->pcmtype = PFLAC_PCM_FLOAT ;
+
+	while (total < len)
+	{	pflac->ptr = ptr + total ;
+		readlen = (len - total > 0x1000000) ? 0x1000000 : (unsigned) (len - total) ;
+		current = flac_read_loop (psf, readlen) ;
+		if (current == 0)
+			break ;
+		total += current ;
+		} ;
+
+	return total ;
+} /* flac_read_flac2f */
+
+static sf_count_t
+flac_read_flac2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	sf_count_t total = 0, current ;
+	unsigned readlen ;
+
+	pflac->pcmtype = PFLAC_PCM_DOUBLE ;
+
+	while (total < len)
+	{	pflac->ptr = ptr + total ;
+		readlen = (len - total > 0x1000000) ? 0x1000000 : (unsigned) (len - total) ;
+		current = flac_read_loop (psf, readlen) ;
+		if (current == 0)
+			break ;
+		total += current ;
+		} ;
+
+	return total ;
+} /* flac_read_flac2d */
+
+static sf_count_t
+flac_write_s2flac (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	void (*convert) (const short *, FLAC__int32 *, int) ;
+	int bufferlen, writecount, thiswrite ;
+	sf_count_t	total = 0 ;
+	FLAC__int32* buffer = pflac->encbuffer ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_S8 :
+			convert = s2flac8_array ;
+			break ;
+		case SF_FORMAT_PCM_16 :
+			convert = s2flac16_array ;
+			break ;
+			case SF_FORMAT_PCM_24 :
+			convert = s2flac24_array ;
+			break ;
+		default :
+			return -1 ;
+		} ;
+
+	bufferlen = ENC_BUFFER_SIZE / (sizeof (FLAC__int32) * psf->sf.channels) ;
+	bufferlen *= psf->sf.channels ;
+
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : (int) len ;
+		convert (ptr + total, buffer, writecount) ;
+		if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount/psf->sf.channels))
+			thiswrite = writecount ;
+		else
+			break ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+
+		len -= thiswrite ;
+		} ;
+
+	return total ;
+} /* flac_write_s2flac */
+
+static sf_count_t
+flac_write_i2flac (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	void (*convert) (const int *, FLAC__int32 *, int) ;
+	int bufferlen, writecount, thiswrite ;
+	sf_count_t	total = 0 ;
+	FLAC__int32* buffer = pflac->encbuffer ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_S8 :
+			convert = i2flac8_array ;
+			break ;
+		case SF_FORMAT_PCM_16 :
+			convert = i2flac16_array ;
+			break ;
+		case SF_FORMAT_PCM_24 :
+			convert = i2flac24_array ;
+			break ;
+		default :
+			return -1 ;
+		} ;
+
+	bufferlen = ENC_BUFFER_SIZE / (sizeof (FLAC__int32) * psf->sf.channels) ;
+	bufferlen *= psf->sf.channels ;
+
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : (int) len ;
+		convert (ptr + total, buffer, writecount) ;
+		if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount/psf->sf.channels))
+			thiswrite = writecount ;
+		else
+			break ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+
+		len -= thiswrite ;
+		} ;
+
+	return total ;
+} /* flac_write_i2flac */
+
+static sf_count_t
+flac_write_f2flac (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	void (*convert) (const float *, FLAC__int32 *, int, int) ;
+	int bufferlen, writecount, thiswrite ;
+	sf_count_t	total = 0 ;
+	FLAC__int32* buffer = pflac->encbuffer ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_S8 :
+			convert = (psf->add_clipping) ? f2flac8_clip_array : f2flac8_array ;
+			break ;
+		case SF_FORMAT_PCM_16 :
+			convert = (psf->add_clipping) ? f2flac16_clip_array : f2flac16_array ;
+			break ;
+		case SF_FORMAT_PCM_24 :
+			convert = (psf->add_clipping) ? f2flac24_clip_array : f2flac24_array ;
+			break ;
+		default :
+			return -1 ;
+		} ;
+
+	bufferlen = ENC_BUFFER_SIZE / (sizeof (FLAC__int32) * psf->sf.channels) ;
+	bufferlen *= psf->sf.channels ;
+
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : (int) len ;
+		convert (ptr + total, buffer, writecount, psf->norm_float) ;
+		if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount/psf->sf.channels))
+			thiswrite = writecount ;
+		else
+			break ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+
+		len -= thiswrite ;
+		} ;
+
+	return total ;
+} /* flac_write_f2flac */
+
+static void
+f2flac8_clip_array (const float *src, FLAC__int32 *dest, int count, int normalize)
+{	float normfact, scaled_value ;
+
+	normfact = normalize ? (8.0 * 0x10) : 1.0 ;
+
+	while (--count >= 0)
+	{	scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7F))
+		{	dest [count] = 0x7F ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10))
+		{	dest [count] = 0x80 ;
+			continue ;
+			} ;
+		dest [count] = lrintf (scaled_value) ;
+		} ;
+
+	return ;
+} /* f2flac8_clip_array */
+
+static void
+f2flac16_clip_array (const float *src, FLAC__int32 *dest, int count, int normalize)
+{
+  float normfact, scaled_value ;
+
+  normfact = normalize ? (8.0 * 0x1000) : 1.0 ;
+
+  while (--count >= 0) {
+    scaled_value = src [count] * normfact ;
+    if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFF)) {
+      dest [count] = 0x7FFF ;
+      continue ;
+    }
+    if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x1000)) {
+      dest [count] = 0x8000 ;
+      continue ;
+    }
+    dest [count] = lrintf (scaled_value) ;
+  }
+} /* f2flac16_clip_array */
+
+static void
+f2flac24_clip_array (const float *src, FLAC__int32 *dest, int count, int normalize)
+{	float normfact, scaled_value ;
+
+	normfact = normalize ? (8.0 * 0x100000) : 1.0 ;
+
+	while (--count >= 0)
+	{	scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFF))
+		{	dest [count] = 0x7FFFFF ;
+			continue ;
+			} ;
+
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x100000))
+		{	dest [count] = 0x800000 ;
+			continue ;
+			}
+		dest [count] = lrintf (scaled_value) ;
+		} ;
+
+	return ;
+} /* f2flac24_clip_array */
+
+static void
+f2flac8_array (const float *src, FLAC__int32 *dest, int count, int normalize)
+{	float normfact = normalize ? (1.0 * 0x7F) : 1.0 ;
+
+	while (--count >= 0)
+		dest [count] = lrintf (src [count] * normfact) ;
+} /* f2flac8_array */
+
+static void
+f2flac16_array (const float *src, FLAC__int32 *dest, int count, int normalize)
+{	float normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ;
+
+	while (--count >= 0)
+		dest [count] = lrintf (src [count] * normfact) ;
+} /* f2flac16_array */
+
+static void
+f2flac24_array (const float *src, FLAC__int32 *dest, int count, int normalize)
+{	float normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ;
+
+	while (--count >= 0)
+		dest [count] = lrintf (src [count] * normfact) ;
+} /* f2flac24_array */
+
+static sf_count_t
+flac_write_d2flac (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+	void (*convert) (const double *, FLAC__int32 *, int, int) ;
+	int bufferlen, writecount, thiswrite ;
+	sf_count_t	total = 0 ;
+	FLAC__int32* buffer = pflac->encbuffer ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_S8 :
+			convert = (psf->add_clipping) ? d2flac8_clip_array : d2flac8_array ;
+			break ;
+		case SF_FORMAT_PCM_16 :
+			convert = (psf->add_clipping) ? d2flac16_clip_array : d2flac16_array ;
+			break ;
+		case SF_FORMAT_PCM_24 :
+			convert = (psf->add_clipping) ? d2flac24_clip_array : d2flac24_array ;
+			break ;
+		default :
+			return -1 ;
+		} ;
+
+	bufferlen = ENC_BUFFER_SIZE / (sizeof (FLAC__int32) * psf->sf.channels) ;
+	bufferlen *= psf->sf.channels ;
+
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : (int) len ;
+		convert (ptr + total, buffer, writecount, psf->norm_double) ;
+		if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount/psf->sf.channels))
+			thiswrite = writecount ;
+		else
+			break ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+
+		len -= thiswrite ;
+		} ;
+
+	return total ;
+} /* flac_write_d2flac */
+
+static void
+d2flac8_clip_array (const double *src, FLAC__int32 *dest, int count, int normalize)
+{	double normfact, scaled_value ;
+
+	normfact = normalize ? (8.0 * 0x10) : 1.0 ;
+
+	while (--count >= 0)
+	{	scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7F))
+		{	dest [count] = 0x7F ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10))
+		{	dest [count] = 0x80 ;
+			continue ;
+			} ;
+		dest [count] = lrint (scaled_value) ;
+		} ;
+
+	return ;
+} /* d2flac8_clip_array */
+
+static void
+d2flac16_clip_array (const double *src, FLAC__int32 *dest, int count, int normalize)
+{	double normfact, scaled_value ;
+
+	normfact = normalize ? (8.0 * 0x1000) : 1.0 ;
+
+	while (--count >= 0)
+	{	scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFF))
+		{	dest [count] = 0x7FFF ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x1000))
+		{	dest [count] = 0x8000 ;
+			continue ;
+			} ;
+		dest [count] = lrint (scaled_value) ;
+		} ;
+
+	return ;
+} /* d2flac16_clip_array */
+
+static void
+d2flac24_clip_array (const double *src, FLAC__int32 *dest, int count, int normalize)
+{	double normfact, scaled_value ;
+
+	normfact = normalize ? (8.0 * 0x100000) : 1.0 ;
+
+	while (--count >= 0)
+	{	scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFF))
+		{	dest [count] = 0x7FFFFF ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x100000))
+		{	dest [count] = 0x800000 ;
+			continue ;
+			} ;
+		dest [count] = lrint (scaled_value) ;
+		} ;
+
+	return ;
+} /* d2flac24_clip_array */
+
+static void
+d2flac8_array (const double *src, FLAC__int32 *dest, int count, int normalize)
+{	double normfact = normalize ? (1.0 * 0x7F) : 1.0 ;
+
+	while (--count >= 0)
+		dest [count] = lrint (src [count] * normfact) ;
+} /* d2flac8_array */
+
+static void
+d2flac16_array (const double *src, FLAC__int32 *dest, int count, int normalize)
+{	double normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ;
+
+	while (--count >= 0)
+		dest [count] = lrint (src [count] * normfact) ;
+} /* d2flac16_array */
+
+static void
+d2flac24_array (const double *src, FLAC__int32 *dest, int count, int normalize)
+{	double normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ;
+
+	while (--count >= 0)
+		dest [count] = lrint (src [count] * normfact) ;
+} /* d2flac24_array */
+
+static sf_count_t
+flac_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t offset)
+{	FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
+
+	if (pflac == NULL)
+		return 0 ;
+
+	if (psf->dataoffset < 0)
+	{	psf->error = SFE_BAD_SEEK ;
+		return ((sf_count_t) -1) ;
+		} ;
+
+	pflac->frame = NULL ;
+
+	if (psf->file.mode == SFM_READ)
+	{	FLAC__uint64 position ;
+		if (FLAC__stream_decoder_seek_absolute (pflac->fsd, offset))
+		{	FLAC__stream_decoder_get_decode_position (pflac->fsd, &position) ;
+			return offset ;
+			} ;
+
+		return ((sf_count_t) -1) ;
+		} ;
+
+	/* Seeking in write mode not yet supported. */
+	psf->error = SFE_BAD_SEEK ;
+
+	return ((sf_count_t) -1) ;
+} /* flac_seek */
+
+#else /* HAVE_EXTERNAL_LIBS */
+
+int
+flac_open	(SF_PRIVATE *psf)
+{
+	psf_log_printf (psf, "This version of libsndfile was compiled without FLAC support.\n") ;
+	return SFE_UNIMPLEMENTED ;
+} /* flac_open */
+
+#endif
diff --git a/jni/libsndfile-1.0.25/src/flac.lo b/jni/libsndfile-1.0.25/src/flac.lo
new file mode 100644
index 0000000..6ef7d5e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/flac.lo
@@ -0,0 +1,12 @@
+# flac.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/flac.o'
+
+# Name of the non-PIC object
+non_pic_object='flac.o'
+
diff --git a/jni/libsndfile-1.0.25/src/flac.o b/jni/libsndfile-1.0.25/src/flac.o
new file mode 100644
index 0000000..81d07fd
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/flac.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/float32.c b/jni/libsndfile-1.0.25/src/float32.c
new file mode 100644
index 0000000..4a87cef
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/float32.c
@@ -0,0 +1,996 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<stdlib.h>
+#include	<string.h>
+#include	<limits.h>
+#include	<math.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+#if CPU_IS_LITTLE_ENDIAN
+	#define FLOAT32_READ	float32_le_read
+	#define FLOAT32_WRITE	float32_le_write
+#elif CPU_IS_BIG_ENDIAN
+	#define FLOAT32_READ	float32_be_read
+	#define FLOAT32_WRITE	float32_be_write
+#endif
+
+/*--------------------------------------------------------------------------------------------
+**	Processor floating point capabilities. float32_get_capability () returns one of the
+**	latter four values.
+*/
+
+enum
+{	FLOAT_UNKNOWN		= 0x00,
+	FLOAT_CAN_RW_LE		= 0x12,
+	FLOAT_CAN_RW_BE		= 0x23,
+	FLOAT_BROKEN_LE		= 0x34,
+	FLOAT_BROKEN_BE		= 0x45
+} ;
+
+/*--------------------------------------------------------------------------------------------
+**	Prototypes for private functions.
+*/
+
+static sf_count_t	host_read_f2s	(SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	host_read_f2i	(SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	host_read_f	(SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	host_read_f2d	(SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t	host_write_s2f	(SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t	host_write_i2f	(SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t	host_write_f	(SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t	host_write_d2f	(SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+static void		float32_peak_update	(SF_PRIVATE *psf, const float *buffer, int count, sf_count_t indx) ;
+
+static sf_count_t	replace_read_f2s	(SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	replace_read_f2i	(SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	replace_read_f	(SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	replace_read_f2d	(SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t	replace_write_s2f	(SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t	replace_write_i2f	(SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t	replace_write_f	(SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t	replace_write_d2f	(SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+static	void	bf2f_array (float *buffer, int count) ;
+static	void	f2bf_array (float *buffer, int count) ;
+
+static int		float32_get_capability	(SF_PRIVATE *psf) ;
+
+/*--------------------------------------------------------------------------------------------
+**	Exported functions.
+*/
+
+int
+float32_init	(SF_PRIVATE *psf)
+{	static int float_caps ;
+
+	float_caps = float32_get_capability (psf) ;
+
+	psf->blockwidth = sizeof (float) * psf->sf.channels ;
+
+	if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR)
+	{	switch (psf->endian + float_caps)
+		{	case (SF_ENDIAN_BIG + FLOAT_CAN_RW_BE) :
+					psf->data_endswap = SF_FALSE ;
+					psf->read_short		= host_read_f2s ;
+					psf->read_int		= host_read_f2i ;
+					psf->read_float		= host_read_f ;
+					psf->read_double	= host_read_f2d ;
+					break ;
+
+			case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_LE) :
+					psf->data_endswap = SF_FALSE ;
+					psf->read_short		= host_read_f2s ;
+					psf->read_int		= host_read_f2i ;
+					psf->read_float		= host_read_f ;
+					psf->read_double	= host_read_f2d ;
+					break ;
+
+			case (SF_ENDIAN_BIG + FLOAT_CAN_RW_LE) :
+					psf->data_endswap = SF_TRUE ;
+					psf->read_short		= host_read_f2s ;
+					psf->read_int		= host_read_f2i ;
+					psf->read_float		= host_read_f ;
+					psf->read_double	= host_read_f2d ;
+					break ;
+
+			case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_BE) :
+					psf->data_endswap = SF_TRUE ;
+					psf->read_short		= host_read_f2s ;
+					psf->read_int		= host_read_f2i ;
+					psf->read_float		= host_read_f ;
+					psf->read_double	= host_read_f2d ;
+					break ;
+
+			/* When the CPU is not IEEE compatible. */
+			case (SF_ENDIAN_BIG + FLOAT_BROKEN_LE) :
+					psf->data_endswap = SF_TRUE ;
+					psf->read_short		= replace_read_f2s ;
+					psf->read_int		= replace_read_f2i ;
+					psf->read_float		= replace_read_f ;
+					psf->read_double	= replace_read_f2d ;
+					break ;
+
+			case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_LE) :
+					psf->data_endswap = SF_FALSE ;
+					psf->read_short		= replace_read_f2s ;
+					psf->read_int		= replace_read_f2i ;
+					psf->read_float		= replace_read_f ;
+					psf->read_double	= replace_read_f2d ;
+					break ;
+
+			case (SF_ENDIAN_BIG + FLOAT_BROKEN_BE) :
+					psf->data_endswap = SF_FALSE ;
+					psf->read_short		= replace_read_f2s ;
+					psf->read_int		= replace_read_f2i ;
+					psf->read_float		= replace_read_f ;
+					psf->read_double	= replace_read_f2d ;
+					break ;
+
+			case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_BE) :
+					psf->data_endswap = SF_TRUE ;
+					psf->read_short		= replace_read_f2s ;
+					psf->read_int		= replace_read_f2i ;
+					psf->read_float		= replace_read_f ;
+					psf->read_double	= replace_read_f2d ;
+					break ;
+
+			default : break ;
+			} ;
+		} ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	switch (psf->endian + float_caps)
+		{	case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_LE) :
+					psf->data_endswap = SF_FALSE ;
+					psf->write_short	= host_write_s2f ;
+					psf->write_int		= host_write_i2f ;
+					psf->write_float	= host_write_f ;
+					psf->write_double	= host_write_d2f ;
+					break ;
+
+			case (SF_ENDIAN_BIG + FLOAT_CAN_RW_BE) :
+					psf->data_endswap = SF_FALSE ;
+					psf->write_short	= host_write_s2f ;
+					psf->write_int		= host_write_i2f ;
+					psf->write_float	= host_write_f ;
+					psf->write_double	= host_write_d2f ;
+					break ;
+
+			case (SF_ENDIAN_BIG + FLOAT_CAN_RW_LE) :
+					psf->data_endswap = SF_TRUE ;
+					psf->write_short	= host_write_s2f ;
+					psf->write_int		= host_write_i2f ;
+					psf->write_float	= host_write_f ;
+					psf->write_double	= host_write_d2f ;
+					break ;
+
+			case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_BE) :
+					psf->data_endswap = SF_TRUE ;
+					psf->write_short	= host_write_s2f ;
+					psf->write_int		= host_write_i2f ;
+					psf->write_float	= host_write_f ;
+					psf->write_double	= host_write_d2f ;
+					break ;
+
+			/* When the CPU is not IEEE compatible. */
+			case (SF_ENDIAN_BIG + FLOAT_BROKEN_LE) :
+					psf->data_endswap = SF_TRUE ;
+					psf->write_short	= replace_write_s2f ;
+					psf->write_int		= replace_write_i2f ;
+					psf->write_float	= replace_write_f ;
+					psf->write_double	= replace_write_d2f ;
+					break ;
+
+			case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_LE) :
+					psf->data_endswap = SF_FALSE ;
+					psf->write_short	= replace_write_s2f ;
+					psf->write_int		= replace_write_i2f ;
+					psf->write_float	= replace_write_f ;
+					psf->write_double	= replace_write_d2f ;
+					break ;
+
+			case (SF_ENDIAN_BIG + FLOAT_BROKEN_BE) :
+					psf->data_endswap = SF_FALSE ;
+					psf->write_short	= replace_write_s2f ;
+					psf->write_int		= replace_write_i2f ;
+					psf->write_float	= replace_write_f ;
+					psf->write_double	= replace_write_d2f ;
+					break ;
+
+			case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_BE) :
+					psf->data_endswap = SF_TRUE ;
+					psf->write_short	= replace_write_s2f ;
+					psf->write_int		= replace_write_i2f ;
+					psf->write_float	= replace_write_f ;
+					psf->write_double	= replace_write_d2f ;
+					break ;
+
+			default : break ;
+			} ;
+		} ;
+
+	if (psf->filelength > psf->dataoffset)
+	{	psf->datalength = (psf->dataend > 0) ? psf->dataend - psf->dataoffset :
+							psf->filelength - psf->dataoffset ;
+		}
+	else
+		psf->datalength = 0 ;
+
+	psf->sf.frames = psf->blockwidth > 0 ? psf->datalength / psf->blockwidth : 0 ;
+
+	return 0 ;
+} /* float32_init */
+
+float
+float32_be_read (unsigned char *cptr)
+{	int		exponent, mantissa, negative ;
+	float	fvalue ;
+
+	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 *= pow (2.0, exponent) ;
+	else if (exponent < 0)
+		fvalue /= pow (2.0, abs (exponent)) ;
+
+	return fvalue ;
+} /* float32_be_read */
+
+float
+float32_le_read (unsigned char *cptr)
+{	int		exponent, mantissa, negative ;
+	float	fvalue ;
+
+	negative = cptr [3] & 0x80 ;
+	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 (negative)
+		fvalue *= -1 ;
+
+	if (exponent > 0)
+		fvalue *= pow (2.0, exponent) ;
+	else if (exponent < 0)
+		fvalue /= pow (2.0, abs (exponent)) ;
+
+	return fvalue ;
+} /* float32_le_read */
+
+void
+float32_le_write (float in, unsigned char *out)
+{	int		exponent, mantissa, negative = 0 ;
+
+	memset (out, 0, sizeof (int)) ;
+
+	if (fabs (in) < 1e-30)
+		return ;
+
+	if (in < 0.0)
+	{	in *= -1.0 ;
+		negative = 1 ;
+		} ;
+
+	in = frexp (in, &exponent) ;
+
+	exponent += 126 ;
+
+	in *= (float) 0x1000000 ;
+	mantissa = (((int) in) & 0x7FFFFF) ;
+
+	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 ;
+
+	return ;
+} /* float32_le_write */
+
+void
+float32_be_write (float in, unsigned char *out)
+{	int		exponent, mantissa, negative = 0 ;
+
+	memset (out, 0, sizeof (int)) ;
+
+	if (fabs (in) < 1e-30)
+		return ;
+
+	if (in < 0.0)
+	{	in *= -1.0 ;
+		negative = 1 ;
+		} ;
+
+	in = frexp (in, &exponent) ;
+
+	exponent += 126 ;
+
+	in *= (float) 0x1000000 ;
+	mantissa = (((int) in) & 0x7FFFFF) ;
+
+	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_be_write */
+
+/*==============================================================================================
+**	Private functions.
+*/
+
+static void
+float32_peak_update	(SF_PRIVATE *psf, const float *buffer, int count, sf_count_t indx)
+{	int 	chan ;
+	int		k, 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_info->peaks [chan].value)
+		{	psf->peak_info->peaks [chan].value = fmaxval ;
+			psf->peak_info->peaks [chan].position = psf->write_current + indx + (position / psf->sf.channels) ;
+			} ;
+		} ;
+
+	return ;
+} /* float32_peak_update */
+
+static int
+float32_get_capability	(SF_PRIVATE *psf)
+{	union
+	{	float			f ;
+		int				i ;
+		unsigned char	c [4] ;
+	} data ;
+
+	data.f = (float) 1.23456789 ; /* Some abitrary value. */
+
+	if (! psf->ieee_replace)
+	{	/* 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. */
+	psf_log_printf (psf, "Using IEEE replacement code for float.\n") ;
+
+	return (CPU_IS_LITTLE_ENDIAN) ? FLOAT_BROKEN_LE : FLOAT_BROKEN_BE ;
+} /* float32_get_capability */
+
+/*=======================================================================================
+*/
+
+static void
+f2s_array (const float *src, int count, short *dest, float scale)
+{
+	while (--count >= 0)
+	{	dest [count] = lrintf (scale * src [count]) ;
+		} ;
+} /* f2s_array */
+
+static void
+f2s_clip_array (const float *src, int count, short *dest, float scale)
+{	while (--count >= 0)
+	{	float tmp = scale * src [count] ;
+
+		if (CPU_CLIPS_POSITIVE == 0 && tmp > 32767.0)
+			dest [count] = SHRT_MAX ;
+		else if (CPU_CLIPS_NEGATIVE == 0 && tmp < -32768.0)
+			dest [count] = SHRT_MIN ;
+		else
+			dest [count] = lrintf (tmp) ;
+		} ;
+} /* f2s_clip_array */
+
+static inline void
+f2i_array (const float *src, int count, int *dest, float scale)
+{	while (--count >= 0)
+	{	dest [count] = lrintf (scale * src [count]) ;
+		} ;
+} /* f2i_array */
+
+static inline void
+f2i_clip_array (const float *src, int count, int *dest, float scale)
+{	while (--count >= 0)
+	{	float tmp = scale * src [count] ;
+
+		if (CPU_CLIPS_POSITIVE == 0 && tmp > (1.0 * INT_MAX))
+			dest [count] = INT_MAX ;
+		else if (CPU_CLIPS_NEGATIVE == 0 && tmp < (-1.0 * INT_MAX))
+			dest [count] = INT_MIN ;
+		else
+			dest [count] = lrintf (tmp) ;
+		} ;
+} /* f2i_clip_array */
+
+static inline void
+f2d_array (const float *src, int count, double *dest)
+{	while (--count >= 0)
+	{	dest [count] = src [count] ;
+		} ;
+} /* f2d_array */
+
+static inline void
+s2f_array (const short *src, float *dest, int count, float scale)
+{	while (--count >= 0)
+	{	dest [count] = scale * src [count] ;
+		} ;
+} /* s2f_array */
+
+static inline void
+i2f_array (const int *src, float *dest, int count, float scale)
+{	while (--count >= 0)
+	{	dest [count] = scale * src [count] ;
+		} ;
+} /* i2f_array */
+
+static inline void
+d2f_array (const double *src, float *dest, int count)
+{	while (--count >= 0)
+	{	dest [count] = src [count] ;
+		} ;
+} /* d2f_array */
+
+/*----------------------------------------------------------------------------------------------
+*/
+
+static sf_count_t
+host_read_f2s	(SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	void		(*convert) (const float *, int, short *, float) ;
+	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	float		scale ;
+
+	convert = (psf->add_clipping) ? f2s_clip_array : f2s_array ;
+	bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+	scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+
+/* Fix me : Need lef2s_array */
+		if (psf->data_endswap == SF_TRUE)
+			endswap_int_array (psf->u.ibuf, bufferlen) ;
+
+		convert (psf->u.fbuf, readcount, ptr + total, scale) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* host_read_f2s */
+
+static sf_count_t
+host_read_f2i	(SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	void		(*convert) (const float *, int, int *, float) ;
+	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	float		scale ;
+
+	convert = (psf->add_clipping) ? f2i_clip_array : f2i_array ;
+	bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+	scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFFFFFF / psf->float_max ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_int_array (psf->u.ibuf, bufferlen) ;
+
+		convert (psf->u.fbuf, readcount, ptr + total, scale) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* host_read_f2i */
+
+static sf_count_t
+host_read_f	(SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	if (psf->data_endswap != SF_TRUE)
+		return psf_fread (ptr, sizeof (float), len, psf) ;
+
+	bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+
+		endswap_int_copy ((int*) (ptr + total), psf->u.ibuf, readcount) ;
+
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* host_read_f */
+
+static sf_count_t
+host_read_f2d	(SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_int_array (psf->u.ibuf, bufferlen) ;
+
+/* Fix me : Need lef2d_array */
+		f2d_array (psf->u.fbuf, readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* host_read_f2d */
+
+static sf_count_t
+host_write_s2f	(SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+	float		scale ;
+
+/* Erik */
+	scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / 0x8000 ;
+	bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		s2f_array (ptr + total, psf->u.fbuf, bufferlen, scale) ;
+
+		if (psf->peak_info)
+			float32_peak_update (psf, psf->u.fbuf, bufferlen, total / psf->sf.channels) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_int_array (psf->u.ibuf, bufferlen) ;
+
+		writecount = psf_fwrite (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* host_write_s2f */
+
+static sf_count_t
+host_write_i2f	(SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+	float		scale ;
+
+	scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / (8.0 * 0x10000000) ;
+	bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		i2f_array (ptr + total, psf->u.fbuf, bufferlen, scale) ;
+
+		if (psf->peak_info)
+			float32_peak_update (psf, psf->u.fbuf, bufferlen, total / psf->sf.channels) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_int_array (psf->u.ibuf, bufferlen) ;
+
+		writecount = psf_fwrite (psf->u.fbuf, sizeof (float) , bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* host_write_i2f */
+
+static sf_count_t
+host_write_f	(SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	if (psf->peak_info)
+		float32_peak_update (psf, ptr, len, 0) ;
+
+	if (psf->data_endswap != SF_TRUE)
+		return psf_fwrite (ptr, sizeof (float), len, psf) ;
+
+	bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+
+		endswap_int_copy (psf->u.ibuf, (const int*) (ptr + total), bufferlen) ;
+
+		writecount = psf_fwrite (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* host_write_f */
+
+static sf_count_t
+host_write_d2f	(SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+
+		d2f_array (ptr + total, psf->u.fbuf, bufferlen) ;
+
+		if (psf->peak_info)
+			float32_peak_update (psf, psf->u.fbuf, bufferlen, total / psf->sf.channels) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_int_array (psf->u.ibuf, bufferlen) ;
+
+		writecount = psf_fwrite (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* host_write_d2f */
+
+/*=======================================================================================
+*/
+
+static sf_count_t
+replace_read_f2s	(SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	float		scale ;
+
+	bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+	scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_int_array (psf->u.ibuf, bufferlen) ;
+
+		bf2f_array (psf->u.fbuf, bufferlen) ;
+
+		f2s_array (psf->u.fbuf, readcount, ptr + total, scale) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* replace_read_f2s */
+
+static sf_count_t
+replace_read_f2i	(SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	float		scale ;
+
+	bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+	scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_int_array (psf->u.ibuf, bufferlen) ;
+
+		bf2f_array (psf->u.fbuf, bufferlen) ;
+
+		f2i_array (psf->u.fbuf, readcount, ptr + total, scale) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* replace_read_f2i */
+
+static sf_count_t
+replace_read_f	(SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	/* FIX THIS */
+
+	bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_int_array (psf->u.ibuf, bufferlen) ;
+
+		bf2f_array (psf->u.fbuf, bufferlen) ;
+
+		memcpy (ptr + total, psf->u.fbuf, bufferlen * sizeof (float)) ;
+
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* replace_read_f */
+
+static sf_count_t
+replace_read_f2d	(SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_int_array (psf->u.ibuf, bufferlen) ;
+
+		bf2f_array (psf->u.fbuf, bufferlen) ;
+
+		f2d_array (psf->u.fbuf, readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* replace_read_f2d */
+
+static sf_count_t
+replace_write_s2f	(SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+	float		scale ;
+
+	scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / 0x8000 ;
+	bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		s2f_array (ptr + total, psf->u.fbuf, bufferlen, scale) ;
+
+		if (psf->peak_info)
+			float32_peak_update (psf, psf->u.fbuf, bufferlen, total / psf->sf.channels) ;
+
+		f2bf_array (psf->u.fbuf, bufferlen) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_int_array (psf->u.ibuf, bufferlen) ;
+
+		writecount = psf_fwrite (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* replace_write_s2f */
+
+static sf_count_t
+replace_write_i2f	(SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+	float		scale ;
+
+	scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / (8.0 * 0x10000000) ;
+	bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		i2f_array (ptr + total, psf->u.fbuf, bufferlen, scale) ;
+
+		if (psf->peak_info)
+			float32_peak_update (psf, psf->u.fbuf, bufferlen, total / psf->sf.channels) ;
+
+		f2bf_array (psf->u.fbuf, bufferlen) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_int_array (psf->u.ibuf, bufferlen) ;
+
+		writecount = psf_fwrite (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* replace_write_i2f */
+
+static sf_count_t
+replace_write_f	(SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	/* FIX THIS */
+	if (psf->peak_info)
+		float32_peak_update (psf, ptr, len, 0) ;
+
+	bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+
+		memcpy (psf->u.fbuf, ptr + total, bufferlen * sizeof (float)) ;
+
+		f2bf_array (psf->u.fbuf, bufferlen) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_int_array (psf->u.ibuf, bufferlen) ;
+
+		writecount = psf_fwrite (psf->u.fbuf, sizeof (float) , bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* replace_write_f */
+
+static sf_count_t
+replace_write_d2f	(SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.fbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		d2f_array (ptr + total, psf->u.fbuf, bufferlen) ;
+
+		if (psf->peak_info)
+			float32_peak_update (psf, psf->u.fbuf, bufferlen, total / psf->sf.channels) ;
+
+		f2bf_array (psf->u.fbuf, bufferlen) ;
+
+		if (psf->data_endswap == SF_TRUE)
+			endswap_int_array (psf->u.ibuf, bufferlen) ;
+
+		writecount = psf_fwrite (psf->u.fbuf, sizeof (float), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* replace_write_d2f */
+
+/*----------------------------------------------------------------------------------------------
+*/
+
+static void
+bf2f_array (float *buffer, int count)
+{	while (--count >= 0)
+	{	buffer [count] = FLOAT32_READ ((unsigned char *) (buffer + count)) ;
+		} ;
+} /* bf2f_array */
+
+static void
+f2bf_array (float *buffer, int count)
+{	while (--count >= 0)
+	{	FLOAT32_WRITE (buffer [count], (unsigned char*) (buffer + count)) ;
+		} ;
+} /* f2bf_array */
+
diff --git a/jni/libsndfile-1.0.25/src/float32.lo b/jni/libsndfile-1.0.25/src/float32.lo
new file mode 100644
index 0000000..e01f2cc
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/float32.lo
@@ -0,0 +1,12 @@
+# float32.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/float32.o'
+
+# Name of the non-PIC object
+non_pic_object='float32.o'
+
diff --git a/jni/libsndfile-1.0.25/src/float32.o b/jni/libsndfile-1.0.25/src/float32.o
new file mode 100644
index 0000000..881c0af
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/float32.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/g72x.c b/jni/libsndfile-1.0.25/src/g72x.c
new file mode 100644
index 0000000..99729d3
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/g72x.c
@@ -0,0 +1,604 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "sndfile.h"
+#include "sfendian.h"
+#include "common.h"
+#include "G72x/g72x.h"
+
+/* This struct is private to the G72x code. */
+struct g72x_state ;
+typedef struct g72x_state G72x_STATE ;
+
+typedef struct
+{	/* Private data. Don't mess with it. */
+	struct g72x_state * private ;
+
+	/* Public data. Read only. */
+	int				blocksize, samplesperblock, bytesperblock ;
+
+	/* Public data. Read and write. */
+	int				blocks_total, block_curr, sample_curr ;
+	unsigned char	block	[G72x_BLOCK_SIZE] ;
+	short			samples	[G72x_BLOCK_SIZE] ;
+} G72x_PRIVATE ;
+
+static	int	psf_g72x_decode_block (SF_PRIVATE *psf, G72x_PRIVATE *pg72x) ;
+static	int	psf_g72x_encode_block (SF_PRIVATE *psf, G72x_PRIVATE *pg72x) ;
+
+static	sf_count_t	g72x_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static	sf_count_t	g72x_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static	sf_count_t	g72x_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static	sf_count_t	g72x_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static	sf_count_t	g72x_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static	sf_count_t	g72x_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static	sf_count_t	g72x_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static	sf_count_t	g72x_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+static	sf_count_t g72x_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+
+static	int	g72x_close (SF_PRIVATE *psf) ;
+
+
+/*============================================================================================
+** WAV G721 Reader initialisation function.
+*/
+
+int
+g72x_init (SF_PRIVATE * psf)
+{	G72x_PRIVATE	*pg72x ;
+	int	bitspersample, bytesperblock, codec ;
+
+	if (psf->codec_data != NULL)
+	{	psf_log_printf (psf, "*** psf->codec_data is not NULL.\n") ;
+		return SFE_INTERNAL ;
+		} ;
+
+	psf->sf.seekable = SF_FALSE ;
+
+	if (psf->sf.channels != 1)
+		return SFE_G72X_NOT_MONO ;
+
+	if ((pg72x = calloc (1, sizeof (G72x_PRIVATE))) == NULL)
+		return SFE_MALLOC_FAILED ;
+
+	psf->codec_data = (void*) pg72x ;
+
+	pg72x->block_curr = 0 ;
+	pg72x->sample_curr = 0 ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_G721_32 :
+				codec = G721_32_BITS_PER_SAMPLE ;
+				bytesperblock = G721_32_BYTES_PER_BLOCK ;
+				bitspersample = G721_32_BITS_PER_SAMPLE ;
+				break ;
+
+		case SF_FORMAT_G723_24:
+				codec = G723_24_BITS_PER_SAMPLE ;
+				bytesperblock = G723_24_BYTES_PER_BLOCK ;
+				bitspersample = G723_24_BITS_PER_SAMPLE ;
+				break ;
+
+		case SF_FORMAT_G723_40:
+				codec = G723_40_BITS_PER_SAMPLE ;
+				bytesperblock = G723_40_BYTES_PER_BLOCK ;
+				bitspersample = G723_40_BITS_PER_SAMPLE ;
+				break ;
+
+		default : return SFE_UNIMPLEMENTED ;
+		} ;
+
+	psf->blockwidth = psf->bytewidth = 1 ;
+
+	psf->filelength = psf_get_filelen (psf) ;
+	if (psf->filelength < psf->dataoffset)
+		psf->filelength = psf->dataoffset ;
+
+	psf->datalength = psf->filelength - psf->dataoffset ;
+	if (psf->dataend > 0)
+		psf->datalength -= psf->filelength - psf->dataend ;
+
+	if (psf->file.mode == SFM_READ)
+	{	pg72x->private = g72x_reader_init (codec, &(pg72x->blocksize), &(pg72x->samplesperblock)) ;
+		if (pg72x->private == NULL)
+			return SFE_MALLOC_FAILED ;
+
+		pg72x->bytesperblock = bytesperblock ;
+
+		psf->read_short		= g72x_read_s ;
+		psf->read_int		= g72x_read_i ;
+		psf->read_float		= g72x_read_f ;
+		psf->read_double	= g72x_read_d ;
+
+	 	psf->seek = g72x_seek ;
+
+		if (psf->datalength % pg72x->blocksize)
+		{	psf_log_printf (psf, "*** Odd psf->datalength (%D) should be a multiple of %d\n", psf->datalength, pg72x->blocksize) ;
+			pg72x->blocks_total = (psf->datalength / pg72x->blocksize) + 1 ;
+			}
+		else
+			pg72x->blocks_total = psf->datalength / pg72x->blocksize ;
+
+		psf->sf.frames = pg72x->blocks_total * pg72x->samplesperblock ;
+
+		psf_g72x_decode_block (psf, pg72x) ;
+		}
+	else if (psf->file.mode == SFM_WRITE)
+	{	pg72x->private = g72x_writer_init (codec, &(pg72x->blocksize), &(pg72x->samplesperblock)) ;
+		if (pg72x->private == NULL)
+			return SFE_MALLOC_FAILED ;
+
+		pg72x->bytesperblock = bytesperblock ;
+
+		psf->write_short	= g72x_write_s ;
+		psf->write_int		= g72x_write_i ;
+		psf->write_float	= g72x_write_f ;
+		psf->write_double	= g72x_write_d ;
+
+		if (psf->datalength % pg72x->blocksize)
+			pg72x->blocks_total = (psf->datalength / pg72x->blocksize) + 1 ;
+		else
+			pg72x->blocks_total = psf->datalength / pg72x->blocksize ;
+
+		if (psf->datalength > 0)
+			psf->sf.frames = (8 * psf->datalength) / bitspersample ;
+
+		if ((psf->sf.frames * bitspersample) / 8 != psf->datalength)
+			psf_log_printf (psf, "*** Warning : weird psf->datalength.\n") ;
+		} ;
+
+	psf->codec_close	= g72x_close ;
+
+	return 0 ;
+} /* g72x_init */
+
+/*============================================================================================
+** G721 Read Functions.
+*/
+
+static int
+psf_g72x_decode_block (SF_PRIVATE *psf, G72x_PRIVATE *pg72x)
+{	int	k ;
+
+	pg72x->block_curr ++ ;
+	pg72x->sample_curr = 0 ;
+
+	if (pg72x->block_curr > pg72x->blocks_total)
+	{	memset (pg72x->samples, 0, G72x_BLOCK_SIZE * sizeof (short)) ;
+		return 1 ;
+		} ;
+
+	if ((k = psf_fread (pg72x->block, 1, pg72x->bytesperblock, psf)) != pg72x->bytesperblock)
+		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pg72x->bytesperblock) ;
+
+	pg72x->blocksize = k ;
+	g72x_decode_block (pg72x->private, pg72x->block, pg72x->samples) ;
+
+	return 1 ;
+} /* psf_g72x_decode_block */
+
+static int
+g72x_read_block (SF_PRIVATE *psf, G72x_PRIVATE *pg72x, short *ptr, int len)
+{	int	count, total = 0, indx = 0 ;
+
+	while (indx < len)
+	{	if (pg72x->block_curr > pg72x->blocks_total)
+		{	memset (&(ptr [indx]), 0, (len - indx) * sizeof (short)) ;
+			return total ;
+			} ;
+
+		if (pg72x->sample_curr >= pg72x->samplesperblock)
+			psf_g72x_decode_block (psf, pg72x) ;
+
+		count = pg72x->samplesperblock - pg72x->sample_curr ;
+		count = (len - indx > count) ? count : len - indx ;
+
+		memcpy (&(ptr [indx]), &(pg72x->samples [pg72x->sample_curr]), count * sizeof (short)) ;
+		indx += count ;
+		pg72x->sample_curr += count ;
+		total = indx ;
+		} ;
+
+	return total ;
+} /* g72x_read_block */
+
+static sf_count_t
+g72x_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	G72x_PRIVATE 	*pg72x ;
+	int			readcount, count ;
+	sf_count_t	total = 0 ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	pg72x = (G72x_PRIVATE*) psf->codec_data ;
+
+	while (len > 0)
+	{	readcount = (len > 0x10000000) ? 0x10000000 : (int) len ;
+
+		count = g72x_read_block (psf, pg72x, ptr, readcount) ;
+
+		total += count ;
+		len -= count ;
+
+		if (count != readcount)
+			break ;
+		} ;
+
+	return total ;
+} /* g72x_read_s */
+
+static sf_count_t
+g72x_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	G72x_PRIVATE *pg72x ;
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	sf_count_t	total = 0 ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	pg72x = (G72x_PRIVATE*) psf->codec_data ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = g72x_read_block (psf, pg72x, sptr, readcount) ;
+
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = sptr [k] << 16 ;
+
+		total += count ;
+		len -= readcount ;
+		if (count != readcount)
+			break ;
+		} ;
+
+	return total ;
+} /* g72x_read_i */
+
+static sf_count_t
+g72x_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	G72x_PRIVATE *pg72x ;
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	sf_count_t	total = 0 ;
+	float 		normfact ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	pg72x = (G72x_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = g72x_read_block (psf, pg72x, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = normfact * sptr [k] ;
+
+		total += count ;
+		len -= readcount ;
+		if (count != readcount)
+			break ;
+		} ;
+
+	return total ;
+} /* g72x_read_f */
+
+static sf_count_t
+g72x_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	G72x_PRIVATE *pg72x ;
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	sf_count_t	total = 0 ;
+	double		normfact ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	pg72x = (G72x_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = g72x_read_block (psf, pg72x, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = normfact * (double) (sptr [k]) ;
+
+		total += count ;
+		len -= readcount ;
+		if (count != readcount)
+			break ;
+		} ;
+
+	return total ;
+} /* g72x_read_d */
+
+static sf_count_t
+g72x_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t UNUSED (offset))
+{
+	psf_log_printf (psf, "seek unsupported\n") ;
+
+	/*	No simple solution. To do properly, would need to seek
+	**	to start of file and decode everything up to seek position.
+	**	Maybe implement SEEK_SET to 0 only?
+	*/
+	return 0 ;
+
+/*
+**		G72x_PRIVATE	*pg72x ;
+**		int			newblock, newsample, sample_curr ;
+**
+**		if (psf->codec_data == NULL)
+**			return 0 ;
+**		pg72x = (G72x_PRIVATE*) psf->codec_data ;
+**
+**		if (! (psf->datalength && psf->dataoffset))
+**		{	psf->error = SFE_BAD_SEEK ;
+**			return	PSF_SEEK_ERROR ;
+**			} ;
+**
+**		sample_curr = (8 * psf->datalength) / G721_32_BITS_PER_SAMPLE ;
+**
+**		switch (whence)
+**		{	case SEEK_SET :
+**					if (offset < 0 || offset > sample_curr)
+**					{	psf->error = SFE_BAD_SEEK ;
+**						return	PSF_SEEK_ERROR ;
+**						} ;
+**					newblock  = offset / pg72x->samplesperblock ;
+**					newsample = offset % pg72x->samplesperblock ;
+**					break ;
+**
+**			case SEEK_CUR :
+**					if (psf->current + offset < 0 || psf->current + offset > sample_curr)
+**					{	psf->error = SFE_BAD_SEEK ;
+**						return	PSF_SEEK_ERROR ;
+**						} ;
+**					newblock  = (8 * (psf->current + offset)) / pg72x->samplesperblock ;
+**					newsample = (8 * (psf->current + offset)) % pg72x->samplesperblock ;
+**					break ;
+**
+**			case SEEK_END :
+**					if (offset > 0 || sample_curr + offset < 0)
+**					{	psf->error = SFE_BAD_SEEK ;
+**						return	PSF_SEEK_ERROR ;
+**						} ;
+**					newblock  = (sample_curr + offset) / pg72x->samplesperblock ;
+**					newsample = (sample_curr + offset) % pg72x->samplesperblock ;
+**					break ;
+**
+**			default :
+**					psf->error = SFE_BAD_SEEK ;
+**					return	PSF_SEEK_ERROR ;
+**			} ;
+**
+**		if (psf->file.mode == SFM_READ)
+**		{	psf_fseek (psf, psf->dataoffset + newblock * pg72x->blocksize, SEEK_SET) ;
+**			pg72x->block_curr  = newblock ;
+**			psf_g72x_decode_block (psf, pg72x) ;
+**			pg72x->sample_curr = newsample ;
+**			}
+**		else
+**		{	/+* What to do about write??? *+/
+**			psf->error = SFE_BAD_SEEK ;
+**			return	PSF_SEEK_ERROR ;
+**			} ;
+**
+**		psf->current = newblock * pg72x->samplesperblock + newsample ;
+**		return psf->current ;
+**
+*/
+} /* g72x_seek */
+
+/*==========================================================================================
+** G72x Write Functions.
+*/
+
+static int
+psf_g72x_encode_block (SF_PRIVATE *psf, G72x_PRIVATE *pg72x)
+{	int k ;
+
+	/* Encode the samples. */
+	g72x_encode_block (pg72x->private, pg72x->samples, pg72x->block) ;
+
+	/* Write the block to disk. */
+	if ((k = psf_fwrite (pg72x->block, 1, pg72x->blocksize, psf)) != pg72x->blocksize)
+		psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pg72x->blocksize) ;
+
+	pg72x->sample_curr = 0 ;
+	pg72x->block_curr ++ ;
+
+	/* Set samples to zero for next block. */
+	memset (pg72x->samples, 0, G72x_BLOCK_SIZE * sizeof (short)) ;
+
+	return 1 ;
+} /* psf_g72x_encode_block */
+
+static int
+g72x_write_block (SF_PRIVATE *psf, G72x_PRIVATE *pg72x, const short *ptr, int len)
+{	int	count, total = 0, indx = 0 ;
+
+	while (indx < len)
+	{	count = pg72x->samplesperblock - pg72x->sample_curr ;
+
+		if (count > len - indx)
+			count = len - indx ;
+
+		memcpy (&(pg72x->samples [pg72x->sample_curr]), &(ptr [indx]), count * sizeof (short)) ;
+		indx += count ;
+		pg72x->sample_curr += count ;
+		total = indx ;
+
+		if (pg72x->sample_curr >= pg72x->samplesperblock)
+			psf_g72x_encode_block (psf, pg72x) ;
+		} ;
+
+	return total ;
+} /* g72x_write_block */
+
+static sf_count_t
+g72x_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	G72x_PRIVATE 	*pg72x ;
+	int			writecount, count ;
+	sf_count_t	total = 0 ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	pg72x = (G72x_PRIVATE*) psf->codec_data ;
+
+	while (len > 0)
+	{	writecount = (len > 0x10000000) ? 0x10000000 : (int) len ;
+
+		count = g72x_write_block (psf, pg72x, ptr, writecount) ;
+
+		total += count ;
+		len -= count ;
+		if (count != writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* g72x_write_s */
+
+static sf_count_t
+g72x_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	G72x_PRIVATE *pg72x ;
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	sf_count_t	total = 0 ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	pg72x = (G72x_PRIVATE*) psf->codec_data ;
+
+	sptr = psf->u.sbuf ;
+	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] = ptr [total + k] >> 16 ;
+		count = g72x_write_block (psf, pg72x, sptr, writecount) ;
+
+		total += count ;
+		len -= writecount ;
+		if (count != writecount)
+			break ;
+		} ;
+	return total ;
+} /* g72x_write_i */
+
+static sf_count_t
+g72x_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	G72x_PRIVATE *pg72x ;
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	sf_count_t	total = 0 ;
+	float		normfact ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	pg72x = (G72x_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x8000) : 1.0 ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = lrintf (normfact * ptr [total + k]) ;
+		count = g72x_write_block (psf, pg72x, sptr, writecount) ;
+
+		total += count ;
+		len -= writecount ;
+		if (count != writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* g72x_write_f */
+
+static sf_count_t
+g72x_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	G72x_PRIVATE *pg72x ;
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	sf_count_t	total = 0 ;
+	double		normfact ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	pg72x = (G72x_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x8000) : 1.0 ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = lrint (normfact * ptr [total + k]) ;
+		count = g72x_write_block (psf, pg72x, sptr, writecount) ;
+
+		total += count ;
+		len -= writecount ;
+		if (count != writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* g72x_write_d */
+
+static int
+g72x_close (SF_PRIVATE *psf)
+{	G72x_PRIVATE *pg72x ;
+
+	pg72x = (G72x_PRIVATE*) psf->codec_data ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	/*	If a block has been partially assembled, write it out
+		**	as the final block.
+		*/
+
+		if (pg72x->sample_curr && pg72x->sample_curr < G72x_BLOCK_SIZE)
+			psf_g72x_encode_block (psf, pg72x) ;
+
+		if (psf->write_header)
+			psf->write_header (psf, SF_FALSE) ;
+		} ;
+
+	/* Only free the pointer allocated by g72x_(reader|writer)_init. */
+	free (pg72x->private) ;
+
+	return 0 ;
+} /* g72x_close */
+
diff --git a/jni/libsndfile-1.0.25/src/g72x.lo b/jni/libsndfile-1.0.25/src/g72x.lo
new file mode 100644
index 0000000..74e215f
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/g72x.lo
@@ -0,0 +1,12 @@
+# g72x.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/g72x.o'
+
+# Name of the non-PIC object
+non_pic_object='g72x.o'
+
diff --git a/jni/libsndfile-1.0.25/src/g72x.o b/jni/libsndfile-1.0.25/src/g72x.o
new file mode 100644
index 0000000..c98ba3a
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/g72x.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/gsm610.c b/jni/libsndfile-1.0.25/src/gsm610.c
new file mode 100644
index 0000000..b16594e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/gsm610.c
@@ -0,0 +1,621 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "sndfile.h"
+#include "sfendian.h"
+#include "common.h"
+#include "wav_w64.h"
+#include "GSM610/gsm.h"
+
+#define	GSM610_BLOCKSIZE		33
+#define	GSM610_SAMPLES			160
+
+typedef struct gsm610_tag
+{	int				blocks ;
+	int				blockcount, samplecount ;
+	int				samplesperblock, blocksize ;
+
+	int				(*decode_block)	(SF_PRIVATE *psf, struct gsm610_tag *pgsm610) ;
+	int				(*encode_block)	(SF_PRIVATE *psf, struct gsm610_tag *pgsm610) ;
+
+	short			samples [WAV_W64_GSM610_SAMPLES] ;
+	unsigned char	block [WAV_W64_GSM610_BLOCKSIZE] ;
+
+	/* Damn I hate typedef-ed pointers; yes, gsm is a pointer type. */
+	gsm				gsm_data ;
+} GSM610_PRIVATE ;
+
+static sf_count_t	gsm610_read_s	(SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	gsm610_read_i	(SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	gsm610_read_f	(SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	gsm610_read_d	(SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t	gsm610_write_s	(SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t	gsm610_write_i	(SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t	gsm610_write_f	(SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t	gsm610_write_d	(SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+static	int gsm610_read_block	(SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, int len) ;
+static	int gsm610_write_block	(SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, const short *ptr, int len) ;
+
+static	int	gsm610_decode_block	(SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) ;
+static	int	gsm610_encode_block	(SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) ;
+
+static	int	gsm610_wav_decode_block	(SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) ;
+static	int	gsm610_wav_encode_block	(SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) ;
+
+static sf_count_t	gsm610_seek	(SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+
+static int	gsm610_close	(SF_PRIVATE *psf) ;
+
+/*============================================================================================
+** WAV GSM610 initialisation function.
+*/
+
+int
+gsm610_init	(SF_PRIVATE *psf)
+{	GSM610_PRIVATE	*pgsm610 ;
+	int		true_flag = 1 ;
+
+	if (psf->codec_data != NULL)
+	{	psf_log_printf (psf, "*** psf->codec_data is not NULL.\n") ;
+		return SFE_INTERNAL ;
+		} ;
+
+	if (psf->file.mode == SFM_RDWR)
+		return SFE_BAD_MODE_RW ;
+
+	psf->sf.seekable = SF_FALSE ;
+
+	if ((pgsm610 = calloc (1, sizeof (GSM610_PRIVATE))) == NULL)
+		return SFE_MALLOC_FAILED ;
+
+	psf->codec_data = pgsm610 ;
+
+	memset (pgsm610, 0, sizeof (GSM610_PRIVATE)) ;
+
+/*============================================================
+
+Need separate gsm_data structs for encode and decode.
+
+============================================================*/
+
+	if ((pgsm610->gsm_data = gsm_create ()) == NULL)
+		return SFE_MALLOC_FAILED ;
+
+	switch (SF_CONTAINER (psf->sf.format))
+	{	case SF_FORMAT_WAV :
+		case SF_FORMAT_WAVEX :
+		case SF_FORMAT_W64 :
+			gsm_option (pgsm610->gsm_data, GSM_OPT_WAV49, &true_flag) ;
+
+			pgsm610->encode_block = gsm610_wav_encode_block ;
+			pgsm610->decode_block = gsm610_wav_decode_block ;
+
+			pgsm610->samplesperblock = WAV_W64_GSM610_SAMPLES ;
+			pgsm610->blocksize = WAV_W64_GSM610_BLOCKSIZE ;
+			break ;
+
+		case SF_FORMAT_AIFF :
+		case SF_FORMAT_RAW :
+			pgsm610->encode_block = gsm610_encode_block ;
+			pgsm610->decode_block = gsm610_decode_block ;
+
+			pgsm610->samplesperblock = GSM610_SAMPLES ;
+			pgsm610->blocksize = GSM610_BLOCKSIZE ;
+			break ;
+
+		default :
+			return SFE_INTERNAL ;
+			break ;
+		} ;
+
+	if (psf->file.mode == SFM_READ)
+	{	if (psf->datalength % pgsm610->blocksize == 0)
+			pgsm610->blocks = psf->datalength / pgsm610->blocksize ;
+		else if (psf->datalength % pgsm610->blocksize == 1 && pgsm610->blocksize == GSM610_BLOCKSIZE)
+		{	/*
+			**	Weird AIFF specific case.
+			**	AIFF chunks must be at an even offset from the start of file and
+			**	GSM610_BLOCKSIZE is odd which can result in an odd length SSND
+			**	chunk. The SSND chunk then gets padded on write which means that
+			**	when it is read the datalength is too big by 1.
+			*/
+			pgsm610->blocks = psf->datalength / pgsm610->blocksize ;
+			}
+		else
+		{	psf_log_printf (psf, "*** Warning : data chunk seems to be truncated.\n") ;
+			pgsm610->blocks = psf->datalength / pgsm610->blocksize + 1 ;
+			} ;
+
+		psf->sf.frames = pgsm610->samplesperblock * pgsm610->blocks ;
+
+		psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+
+		pgsm610->decode_block (psf, pgsm610) ;	/* Read first block. */
+
+		psf->read_short		= gsm610_read_s ;
+		psf->read_int		= gsm610_read_i ;
+		psf->read_float		= gsm610_read_f ;
+		psf->read_double	= gsm610_read_d ;
+		} ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	pgsm610->blockcount = 0 ;
+		pgsm610->samplecount = 0 ;
+
+		psf->write_short	= gsm610_write_s ;
+		psf->write_int		= gsm610_write_i ;
+		psf->write_float	= gsm610_write_f ;
+		psf->write_double	= gsm610_write_d ;
+		} ;
+
+	psf->codec_close = gsm610_close ;
+
+	psf->seek = gsm610_seek ;
+
+	psf->filelength = psf_get_filelen (psf) ;
+	psf->datalength = psf->filelength - psf->dataoffset ;
+
+	return 0 ;
+} /* gsm610_init */
+
+/*============================================================================================
+** GSM 6.10 Read Functions.
+*/
+
+static int
+gsm610_wav_decode_block	(SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610)
+{	int	k ;
+
+	pgsm610->blockcount ++ ;
+	pgsm610->samplecount = 0 ;
+
+	if (pgsm610->blockcount > pgsm610->blocks)
+	{	memset (pgsm610->samples, 0, WAV_W64_GSM610_SAMPLES * sizeof (short)) ;
+		return 1 ;
+		} ;
+
+	if ((k = psf_fread (pgsm610->block, 1, WAV_W64_GSM610_BLOCKSIZE, psf)) != WAV_W64_GSM610_BLOCKSIZE)
+		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, WAV_W64_GSM610_BLOCKSIZE) ;
+
+	if (gsm_decode (pgsm610->gsm_data, pgsm610->block, pgsm610->samples) < 0)
+	{	psf_log_printf (psf, "Error from WAV gsm_decode() on frame : %d\n", pgsm610->blockcount) ;
+		return 0 ;
+		} ;
+
+	if (gsm_decode (pgsm610->gsm_data, pgsm610->block + (WAV_W64_GSM610_BLOCKSIZE + 1) / 2, pgsm610->samples + WAV_W64_GSM610_SAMPLES / 2) < 0)
+	{	psf_log_printf (psf, "Error from WAV gsm_decode() on frame : %d.5\n", pgsm610->blockcount) ;
+		return 0 ;
+		} ;
+
+	return 1 ;
+} /* gsm610_wav_decode_block */
+
+static int
+gsm610_decode_block	(SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610)
+{	int	k ;
+
+	pgsm610->blockcount ++ ;
+	pgsm610->samplecount = 0 ;
+
+	if (pgsm610->blockcount > pgsm610->blocks)
+	{	memset (pgsm610->samples, 0, GSM610_SAMPLES * sizeof (short)) ;
+		return 1 ;
+		} ;
+
+	if ((k = psf_fread (pgsm610->block, 1, GSM610_BLOCKSIZE, psf)) != 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_log_printf (psf, "Error from standard gsm_decode() on frame : %d\n", pgsm610->blockcount) ;
+		return 0 ;
+		} ;
+
+	return 1 ;
+} /* gsm610_decode_block */
+
+static int
+gsm610_read_block	(SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, int len)
+{	int	count, total = 0, indx = 0 ;
+
+	while (indx < len)
+	{	if (pgsm610->blockcount >= pgsm610->blocks && pgsm610->samplecount >= pgsm610->samplesperblock)
+		{	memset (&(ptr [indx]), 0, (len - indx) * sizeof (short)) ;
+			return total ;
+			} ;
+
+		if (pgsm610->samplecount >= pgsm610->samplesperblock)
+			pgsm610->decode_block (psf, pgsm610) ;
+
+		count = pgsm610->samplesperblock - pgsm610->samplecount ;
+		count = (len - indx > count) ? count : len - indx ;
+
+		memcpy (&(ptr [indx]), &(pgsm610->samples [pgsm610->samplecount]), count * sizeof (short)) ;
+		indx += count ;
+		pgsm610->samplecount += count ;
+		total = indx ;
+		} ;
+
+	return total ;
+} /* gsm610_read_block */
+
+static sf_count_t
+gsm610_read_s	(SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	GSM610_PRIVATE 	*pgsm610 ;
+	int			readcount, count ;
+	sf_count_t	total = 0 ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->codec_data ;
+
+	while (len > 0)
+	{	readcount = (len > 0x10000000) ? 0x1000000 : (int) len ;
+
+		count = gsm610_read_block (psf, pgsm610, ptr, readcount) ;
+
+		total += count ;
+		len -= count ;
+
+		if (count != readcount)
+			break ;
+		} ;
+
+	return total ;
+} /* gsm610_read_s */
+
+static sf_count_t
+gsm610_read_i	(SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	GSM610_PRIVATE *pgsm610 ;
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	sf_count_t	total = 0 ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->codec_data ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = gsm610_read_block (psf, pgsm610, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = sptr [k] << 16 ;
+
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* gsm610_read_i */
+
+static sf_count_t
+gsm610_read_f	(SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	GSM610_PRIVATE *pgsm610 ;
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	sf_count_t	total = 0 ;
+	float		normfact ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = gsm610_read_block (psf, pgsm610, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = normfact * sptr [k] ;
+
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* gsm610_read_f */
+
+static sf_count_t
+gsm610_read_d	(SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	GSM610_PRIVATE *pgsm610 ;
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	sf_count_t	total = 0 ;
+	double		normfact ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->codec_data ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = gsm610_read_block (psf, pgsm610, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = normfact * sptr [k] ;
+
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* gsm610_read_d */
+
+static sf_count_t
+gsm610_seek	(SF_PRIVATE *psf, int UNUSED (mode), sf_count_t offset)
+{	GSM610_PRIVATE *pgsm610 ;
+	int			newblock, newsample ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->codec_data ;
+
+	if (psf->dataoffset < 0)
+	{	psf->error = SFE_BAD_SEEK ;
+		return	PSF_SEEK_ERROR ;
+		} ;
+
+	if (offset == 0)
+	{	int true_flag = 1 ;
+
+		psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+		pgsm610->blockcount = 0 ;
+
+		gsm_init (pgsm610->gsm_data) ;
+		if ((SF_CONTAINER (psf->sf.format)) == SF_FORMAT_WAV ||
+				(SF_CONTAINER (psf->sf.format)) == SF_FORMAT_W64)
+			gsm_option (pgsm610->gsm_data, GSM_OPT_WAV49, &true_flag) ;
+
+		pgsm610->decode_block (psf, pgsm610) ;
+		pgsm610->samplecount = 0 ;
+		return 0 ;
+		} ;
+
+	if (offset < 0 || offset > pgsm610->blocks * pgsm610->samplesperblock)
+	{	psf->error = SFE_BAD_SEEK ;
+		return	PSF_SEEK_ERROR ;
+		} ;
+
+	newblock	= offset / pgsm610->samplesperblock ;
+	newsample	= offset % pgsm610->samplesperblock ;
+
+	if (psf->file.mode == SFM_READ)
+	{	if (psf->read_current != newblock * pgsm610->samplesperblock + newsample)
+		{	psf_fseek (psf, psf->dataoffset + newblock * pgsm610->samplesperblock, SEEK_SET) ;
+			pgsm610->blockcount = newblock ;
+			pgsm610->decode_block (psf, pgsm610) ;
+			pgsm610->samplecount = newsample ;
+			} ;
+
+		return newblock * pgsm610->samplesperblock + newsample ;
+		} ;
+
+	/* What to do about write??? */
+	psf->error = SFE_BAD_SEEK ;
+	return	PSF_SEEK_ERROR ;
+} /* gsm610_seek */
+
+/*==========================================================================================
+** GSM 6.10 Write Functions.
+*/
+
+static int
+gsm610_encode_block	(SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610)
+{	int k ;
+
+	/* Encode the samples. */
+	gsm_encode (pgsm610->gsm_data, pgsm610->samples, pgsm610->block) ;
+
+	/* Write the block to disk. */
+	if ((k = psf_fwrite (pgsm610->block, 1, GSM610_BLOCKSIZE, psf)) != GSM610_BLOCKSIZE)
+		psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, GSM610_BLOCKSIZE) ;
+
+	pgsm610->samplecount = 0 ;
+	pgsm610->blockcount ++ ;
+
+	/* Set samples to zero for next block. */
+	memset (pgsm610->samples, 0, WAV_W64_GSM610_SAMPLES * sizeof (short)) ;
+
+	return 1 ;
+} /* gsm610_encode_block */
+
+static int
+gsm610_wav_encode_block	(SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610)
+{	int k ;
+
+	/* Encode the samples. */
+	gsm_encode (pgsm610->gsm_data, pgsm610->samples, pgsm610->block) ;
+	gsm_encode (pgsm610->gsm_data, pgsm610->samples+WAV_W64_GSM610_SAMPLES/2, pgsm610->block+WAV_W64_GSM610_BLOCKSIZE/2) ;
+
+	/* Write the block to disk. */
+	if ((k = psf_fwrite (pgsm610->block, 1, WAV_W64_GSM610_BLOCKSIZE, psf)) != WAV_W64_GSM610_BLOCKSIZE)
+		psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, WAV_W64_GSM610_BLOCKSIZE) ;
+
+	pgsm610->samplecount = 0 ;
+	pgsm610->blockcount ++ ;
+
+	/* Set samples to zero for next block. */
+	memset (pgsm610->samples, 0, WAV_W64_GSM610_SAMPLES * sizeof (short)) ;
+
+	return 1 ;
+} /* gsm610_wav_encode_block */
+
+static int
+gsm610_write_block	(SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, const short *ptr, int len)
+{	int		count, total = 0, indx = 0 ;
+
+	while (indx < len)
+	{	count = pgsm610->samplesperblock - pgsm610->samplecount ;
+
+		if (count > len - indx)
+			count = len - indx ;
+
+		memcpy (&(pgsm610->samples [pgsm610->samplecount]), &(ptr [indx]), count * sizeof (short)) ;
+		indx += count ;
+		pgsm610->samplecount += count ;
+		total = indx ;
+
+		if (pgsm610->samplecount >= pgsm610->samplesperblock)
+			pgsm610->encode_block (psf, pgsm610) ;
+		} ;
+
+	return total ;
+} /* gsm610_write_block */
+
+static sf_count_t
+gsm610_write_s	(SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	GSM610_PRIVATE 	*pgsm610 ;
+	int			writecount, count ;
+	sf_count_t	total = 0 ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->codec_data ;
+
+	while (len > 0)
+	{	writecount = (len > 0x10000000) ? 0x10000000 : (int) len ;
+
+		count = gsm610_write_block (psf, pgsm610, ptr, writecount) ;
+
+		total += count ;
+		len -= count ;
+
+		if (count != writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* gsm610_write_s */
+
+static sf_count_t
+gsm610_write_i	(SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	GSM610_PRIVATE *pgsm610 ;
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	sf_count_t	total = 0 ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->codec_data ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = ptr [total + k] >> 16 ;
+		count = gsm610_write_block (psf, pgsm610, sptr, writecount) ;
+
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* gsm610_write_i */
+
+static sf_count_t
+gsm610_write_f	(SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	GSM610_PRIVATE *pgsm610 ;
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	sf_count_t	total = 0 ;
+	float		normfact ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = lrintf (normfact * ptr [total + k]) ;
+		count = gsm610_write_block (psf, pgsm610, sptr, writecount) ;
+
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* gsm610_write_f */
+
+static sf_count_t
+gsm610_write_d	(SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	GSM610_PRIVATE *pgsm610 ;
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	sf_count_t	total = 0 ;
+	double		normfact ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = lrint (normfact * ptr [total + k]) ;
+		count = gsm610_write_block (psf, pgsm610, sptr, writecount) ;
+
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* gsm610_write_d */
+
+static int
+gsm610_close	(SF_PRIVATE *psf)
+{	GSM610_PRIVATE *pgsm610 ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+
+	pgsm610 = (GSM610_PRIVATE*) psf->codec_data ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	/*	If a block has been partially assembled, write it out
+		**	as the final block.
+		*/
+
+		if (pgsm610->samplecount && pgsm610->samplecount < pgsm610->samplesperblock)
+			pgsm610->encode_block (psf, pgsm610) ;
+		} ;
+
+	if (pgsm610->gsm_data)
+		gsm_destroy (pgsm610->gsm_data) ;
+
+	return 0 ;
+} /* gsm610_close */
+
diff --git a/jni/libsndfile-1.0.25/src/gsm610.lo b/jni/libsndfile-1.0.25/src/gsm610.lo
new file mode 100644
index 0000000..42b2b56
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/gsm610.lo
@@ -0,0 +1,12 @@
+# gsm610.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/gsm610.o'
+
+# Name of the non-PIC object
+non_pic_object='gsm610.o'
+
diff --git a/jni/libsndfile-1.0.25/src/gsm610.o b/jni/libsndfile-1.0.25/src/gsm610.o
new file mode 100644
index 0000000..6ac2e2b
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/gsm610.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/htk.c b/jni/libsndfile-1.0.25/src/htk.c
new file mode 100644
index 0000000..25390f1
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/htk.c
@@ -0,0 +1,226 @@
+/*
+** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+/*------------------------------------------------------------------------------
+** Macros to handle big/little endian issues.
+*/
+
+#define	SFE_HTK_BAD_FILE_LEN 	1666
+#define	SFE_HTK_NOT_WAVEFORM	1667
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static	int		htk_close		(SF_PRIVATE *psf) ;
+
+static int		htk_write_header (SF_PRIVATE *psf, int calc_length) ;
+static int		htk_read_header (SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+htk_open	(SF_PRIVATE *psf)
+{	int		subformat ;
+	int		error = 0 ;
+
+	if (psf->is_pipe)
+		return SFE_HTK_NO_PIPE ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = htk_read_header (psf)))
+			return error ;
+		} ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_HTK)
+			return	SFE_BAD_OPEN_FORMAT ;
+
+		psf->endian = SF_ENDIAN_BIG ;
+
+		if (htk_write_header (psf, SF_FALSE))
+			return psf->error ;
+
+		psf->write_header = htk_write_header ;
+		} ;
+
+	psf->container_close = htk_close ;
+
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+	switch (subformat)
+	{	case SF_FORMAT_PCM_16 :	/* 16-bit linear PCM. */
+				error = pcm_init (psf) ;
+				break ;
+
+		default : break ;
+		} ;
+
+	return error ;
+} /* htk_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+htk_close	(SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+		htk_write_header (psf, SF_TRUE) ;
+
+	return 0 ;
+} /* htk_close */
+
+static int
+htk_write_header (SF_PRIVATE *psf, int calc_length)
+{	sf_count_t	current ;
+	int			sample_count, sample_period ;
+
+	current = psf_ftell (psf) ;
+
+	if (calc_length)
+		psf->filelength = psf_get_filelen (psf) ;
+
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	psf_fseek (psf, 0, SEEK_SET) ;
+
+	if (psf->filelength > 12)
+		sample_count = (psf->filelength - 12) / 2 ;
+	else
+		sample_count = 0 ;
+
+	sample_period = 10000000 / psf->sf.samplerate ;
+
+	psf_binheader_writef (psf, "E444", sample_count, sample_period, 0x20000) ;
+
+	/* Header construction complete so write it out. */
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+
+	if (psf->error)
+		return psf->error ;
+
+	psf->dataoffset = psf->headindex ;
+
+	if (current > 0)
+		psf_fseek (psf, current, SEEK_SET) ;
+
+	return psf->error ;
+} /* htk_write_header */
+
+/*
+** Found the following info in a comment block within Bill Schottstaedt's
+** sndlib library.
+**
+** HTK format files consist of a contiguous sequence of samples preceded by a
+** header. Each sample is a vector of either 2-byte integers or 4-byte floats.
+** 2-byte integers are used for compressed forms as described below and for
+** vector quantised data as described later in section 5.11. HTK format data
+** files can also be used to store speech waveforms as described in section 5.8.
+**
+** The HTK file format header is 12 bytes long and contains the following data
+**   nSamples   -- number of samples in file (4-byte integer)
+**   sampPeriod -- sample period in 100ns units (4-byte integer)
+**   sampSize   -- number of bytes per sample (2-byte integer)
+**   parmKind   -- a code indicating the sample kind (2-byte integer)
+**
+** The parameter kind  consists of a 6 bit code representing the basic
+** parameter kind plus additional bits for each of the possible qualifiers.
+** The basic parameter kind codes are
+**
+**  0    WAVEFORM    sampled waveform
+**  1    LPC         linear prediction filter coefficients
+**  2    LPREFC      linear prediction reflection coefficients
+**  3    LPCEPSTRA   LPC cepstral coefficients
+**  4    LPDELCEP    LPC cepstra plus delta coefficients
+**  5    IREFC       LPC reflection coef in 16 bit integer format
+**  6    MFCC        mel-frequency cepstral coefficients
+**  7    FBANK       log mel-filter bank channel outputs
+**  8    MELSPEC     linear mel-filter bank channel outputs
+**  9    USER        user defined sample kind
+**  10   DISCRETE    vector quantised data
+**
+** and the bit-encoding for the qualifiers (in octal) is
+**   _E   000100      has energy
+**   _N   000200      absolute energy suppressed
+**   _D   000400      has delta coefficients
+**   _A   001000      has acceleration coefficients
+**   _C   002000      is compressed
+**   _Z   004000      has zero mean static coef.
+**   _K   010000      has CRC checksum
+**   _O   020000      has 0'th cepstral coef.
+*/
+
+static int
+htk_read_header (SF_PRIVATE *psf)
+{	int		sample_count, sample_period, marker ;
+
+	psf_binheader_readf (psf, "pE444", 0, &sample_count, &sample_period, &marker) ;
+
+	if (2 * sample_count + 12 != psf->filelength)
+		return SFE_HTK_BAD_FILE_LEN ;
+
+	if (marker != 0x20000)
+		return SFE_HTK_NOT_WAVEFORM ;
+
+	psf->sf.channels = 1 ;
+
+	if (sample_period > 0)
+	{	psf->sf.samplerate = 10000000 / sample_period ;
+		psf_log_printf (psf, "HTK Waveform file\n  Sample Count  : %d\n  Sample Period : %d => %d Hz\n",
+					sample_count, sample_period, psf->sf.samplerate) ;
+		}
+	else
+	{	psf->sf.samplerate = 16000 ;
+		psf_log_printf (psf, "HTK Waveform file\n  Sample Count  : %d\n  Sample Period : %d (should be > 0) => Guessed sample rate %d Hz\n",
+					sample_count, sample_period, psf->sf.samplerate) ;
+		} ;
+
+	psf->sf.format = SF_FORMAT_HTK | SF_FORMAT_PCM_16 ;
+	psf->bytewidth = 2 ;
+
+	/* HTK always has a 12 byte header. */
+	psf->dataoffset = 12 ;
+	psf->endian = SF_ENDIAN_BIG ;
+
+	psf->datalength = psf->filelength - psf->dataoffset ;
+
+	psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+
+	if (! psf->sf.frames && psf->blockwidth)
+		psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ;
+
+	return 0 ;
+} /* htk_read_header */
+
diff --git a/jni/libsndfile-1.0.25/src/htk.lo b/jni/libsndfile-1.0.25/src/htk.lo
new file mode 100644
index 0000000..97cd723
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/htk.lo
@@ -0,0 +1,12 @@
+# htk.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/htk.o'
+
+# Name of the non-PIC object
+non_pic_object='htk.o'
+
diff --git a/jni/libsndfile-1.0.25/src/htk.o b/jni/libsndfile-1.0.25/src/htk.o
new file mode 100644
index 0000000..0799a95
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/htk.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/id3.c b/jni/libsndfile-1.0.25/src/id3.c
new file mode 100644
index 0000000..a1a189e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/id3.c
@@ -0,0 +1,52 @@
+/*
+** Copyright (C) 2010-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+int
+id3_skip (SF_PRIVATE * psf)
+{	unsigned char	buf [10] ;
+
+	memset (buf, 0, sizeof (buf)) ;
+	psf_binheader_readf (psf, "pb", 0, buf, 10) ;
+
+	if (buf [0] == 'I' && buf [1] == 'D' && buf [2] == '3')
+	{	int	offset = buf [6] & 0x7f ;
+		offset = (offset << 7) | (buf [7] & 0x7f) ;
+		offset = (offset << 7) | (buf [8] & 0x7f) ;
+		offset = (offset << 7) | (buf [9] & 0x7f) ;
+
+		psf_binheader_readf (psf, "j", make_size_t (offset)) ;
+
+		psf_log_printf (psf, "ID3 length : %d\n--------------------\n", offset) ;
+
+		psf->fileoffset = 10 + offset ;
+		return 1 ;
+		} ;
+
+	return 0 ;
+} /* id3_skip */
diff --git a/jni/libsndfile-1.0.25/src/id3.lo b/jni/libsndfile-1.0.25/src/id3.lo
new file mode 100644
index 0000000..1a2f7a9
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/id3.lo
@@ -0,0 +1,12 @@
+# id3.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/id3.o'
+
+# Name of the non-PIC object
+non_pic_object='id3.o'
+
diff --git a/jni/libsndfile-1.0.25/src/id3.o b/jni/libsndfile-1.0.25/src/id3.o
new file mode 100644
index 0000000..217eda4
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/id3.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/ima_adpcm.c b/jni/libsndfile-1.0.25/src/ima_adpcm.c
new file mode 100644
index 0000000..b0763ea
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ima_adpcm.c
@@ -0,0 +1,946 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<stdlib.h>
+#include	<string.h>
+#include	<math.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+typedef struct IMA_ADPCM_PRIVATE_tag
+{	int 			(*decode_block) (SF_PRIVATE *psf, struct IMA_ADPCM_PRIVATE_tag *pima) ;
+	int 			(*encode_block) (SF_PRIVATE *psf, struct IMA_ADPCM_PRIVATE_tag *pima) ;
+
+	int				channels, blocksize, samplesperblock, blocks ;
+	int				blockcount, samplecount ;
+	int				previous [2] ;
+	int				stepindx [2] ;
+	unsigned char	*block ;
+	short			*samples ;
+#if HAVE_FLEXIBLE_ARRAY
+	short			data	[] ; /* ISO C99 struct flexible array. */
+#else
+	short			data	[0] ; /* This is a hack and might not work. */
+#endif
+} IMA_ADPCM_PRIVATE ;
+
+/*============================================================================================
+** Predefined IMA ADPCM data.
+*/
+
+static int ima_indx_adjust [16] =
+{	-1, -1, -1, -1,		/* +0 - +3, decrease the step size */
+     2,  4,  6,  8,     /* +4 - +7, increase the step size */
+    -1, -1, -1, -1,		/* -0 - -3, decrease the step size */
+     2,  4,  6,  8,		/* -4 - -7, increase the step size */
+} ;
+
+static int ima_step_size [89] =
+{	7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
+	50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230,
+	253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963,
+	1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327,
+	3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442,
+	11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794,
+	32767
+} ;
+
+static int ima_reader_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ;
+static int ima_writer_init (SF_PRIVATE *psf, int blockalign) ;
+
+static int ima_read_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len) ;
+static int ima_write_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, const short *ptr, int len) ;
+
+static sf_count_t ima_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t ima_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t ima_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t ima_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t ima_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t ima_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t ima_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t ima_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+static sf_count_t	ima_seek	(SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+
+static int	ima_close	(SF_PRIVATE *psf) ;
+
+static int wav_w64_ima_decode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ;
+static int wav_w64_ima_encode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ;
+
+/*-static int aiff_ima_reader_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ;-*/
+static int aiff_ima_decode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ;
+static int aiff_ima_encode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ;
+
+
+static inline int
+clamp_ima_step_index (int indx)
+{	if (indx < 0)
+		return 0 ;
+	if (indx >= ARRAY_LEN (ima_step_size))
+		return ARRAY_LEN (ima_step_size) - 1 ;
+
+	return indx ;
+} /* clamp_ima_step_index */
+
+/*============================================================================================
+** IMA ADPCM Reader initialisation function.
+*/
+
+int
+wav_w64_ima_init (SF_PRIVATE *psf, int blockalign, int samplesperblock)
+{	int error ;
+
+	if (psf->codec_data != NULL)
+	{	psf_log_printf (psf, "*** psf->codec_data is not NULL.\n") ;
+		return SFE_INTERNAL ;
+		} ;
+
+	if (psf->file.mode == SFM_RDWR)
+		return SFE_BAD_MODE_RW ;
+
+	if (psf->file.mode == SFM_READ)
+		if ((error = ima_reader_init (psf, blockalign, samplesperblock)))
+			return error ;
+
+	if (psf->file.mode == SFM_WRITE)
+		if ((error = ima_writer_init (psf, blockalign)))
+			return error ;
+
+	psf->codec_close = ima_close ;
+	psf->seek = ima_seek ;
+
+	return 0 ;
+} /* wav_w64_ima_init */
+
+int
+aiff_ima_init (SF_PRIVATE *psf, int blockalign, int samplesperblock)
+{	int error ;
+
+	if (psf->file.mode == SFM_RDWR)
+		return SFE_BAD_MODE_RW ;
+
+	if (psf->file.mode == SFM_READ)
+		if ((error = ima_reader_init (psf, blockalign, samplesperblock)))
+			return error ;
+
+	if (psf->file.mode == SFM_WRITE)
+		if ((error = ima_writer_init (psf, blockalign)))
+			return error ;
+
+	psf->codec_close = ima_close ;
+
+	return 0 ;
+} /* aiff_ima_init */
+
+static int
+ima_close	(SF_PRIVATE *psf)
+{	IMA_ADPCM_PRIVATE *pima ;
+
+	pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	/*	If a block has been partially assembled, write it out
+		**	as the final block.
+		*/
+		if (pima->samplecount && pima->samplecount < pima->samplesperblock)
+			pima->encode_block (psf, pima) ;
+
+		psf->sf.frames = pima->samplesperblock * pima->blockcount / psf->sf.channels ;
+		} ;
+
+	return 0 ;
+} /* ima_close */
+
+/*============================================================================================
+** IMA ADPCM Read Functions.
+*/
+
+static int
+ima_reader_init (SF_PRIVATE *psf, int blockalign, int samplesperblock)
+{	IMA_ADPCM_PRIVATE	*pima ;
+	int		pimasize, count ;
+
+	if (psf->file.mode != SFM_READ)
+		return SFE_BAD_MODE_RW ;
+
+	pimasize = sizeof (IMA_ADPCM_PRIVATE) + blockalign * psf->sf.channels + 3 * psf->sf.channels * samplesperblock ;
+
+	if (! (pima = calloc (1, pimasize)))
+		return SFE_MALLOC_FAILED ;
+
+	psf->codec_data = (void*) pima ;
+
+	pima->samples	= pima->data ;
+	pima->block		= (unsigned char*) (pima->data + samplesperblock * psf->sf.channels) ;
+
+	pima->channels			= psf->sf.channels ;
+	pima->blocksize			= blockalign ;
+	pima->samplesperblock	= samplesperblock ;
+
+	psf->filelength = psf_get_filelen (psf) ;
+	psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset :
+							psf->filelength - psf->dataoffset ;
+
+    if (pima->blocksize == 0)
+	{	psf_log_printf (psf, "*** Error : pima->blocksize should not be zero.\n") ;
+		return SFE_INTERNAL ;
+		} ;
+
+	if (psf->datalength % pima->blocksize)
+		pima->blocks = psf->datalength / pima->blocksize + 1 ;
+	else
+		pima->blocks = psf->datalength / pima->blocksize ;
+
+	switch (SF_CONTAINER (psf->sf.format))
+	{	case SF_FORMAT_WAV :
+		case SF_FORMAT_W64 :
+				count = 2 * (pima->blocksize - 4 * pima->channels) / pima->channels + 1 ;
+
+				if (pima->samplesperblock != count)
+				{	psf_log_printf (psf, "*** Error : samplesperblock should be %d.\n", count) ;
+					return SFE_INTERNAL ;
+					} ;
+
+				pima->decode_block = wav_w64_ima_decode_block ;
+
+				psf->sf.frames = pima->samplesperblock * pima->blocks ;
+				break ;
+
+		case SF_FORMAT_AIFF :
+				psf_log_printf (psf, "still need to check block count\n") ;
+				pima->decode_block = aiff_ima_decode_block ;
+				psf->sf.frames = pima->samplesperblock * pima->blocks / pima->channels ;
+				break ;
+
+		default :
+				psf_log_printf (psf, "ima_reader_init: bad psf->sf.format\n") ;
+				return SFE_INTERNAL ;
+		} ;
+
+	pima->decode_block (psf, pima) ;	/* Read first block. */
+
+	psf->read_short		= ima_read_s ;
+	psf->read_int		= ima_read_i ;
+	psf->read_float		= ima_read_f ;
+	psf->read_double	= ima_read_d ;
+
+	return 0 ;
+} /* ima_reader_init */
+
+static int
+aiff_ima_decode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima)
+{	unsigned char *blockdata ;
+	int		chan, k, diff, bytecode, predictor ;
+	short	step, stepindx, *sampledata ;
+
+static int count = 0 ;
+count ++ ;
+
+	pima->blockcount += pima->channels ;
+	pima->samplecount = 0 ;
+
+	if (pima->blockcount > pima->blocks)
+	{	memset (pima->samples, 0, pima->samplesperblock * pima->channels * sizeof (short)) ;
+		return 1 ;
+		} ;
+
+	if ((k = psf_fread (pima->block, 1, pima->blocksize * pima->channels, psf)) != pima->blocksize * pima->channels)
+		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pima->blocksize) ;
+
+	/* Read and check the block header. */
+	for (chan = 0 ; chan < pima->channels ; chan++)
+	{	blockdata = pima->block + chan * 34 ;
+		sampledata = pima->samples + chan ;
+
+		predictor = (blockdata [0] << 8) | (blockdata [1] & 0x80) ;
+
+		stepindx = blockdata [1] & 0x7F ;
+		stepindx = clamp_ima_step_index (stepindx) ;
+
+		/*
+		**	Pull apart the packed 4 bit samples and store them in their
+		**	correct sample positions.
+		*/
+		for (k = 0 ; k < pima->blocksize - 2 ; k++)
+		{	bytecode = blockdata [k + 2] ;
+			sampledata [pima->channels * (2 * k + 0)] = bytecode & 0xF ;
+			sampledata [pima->channels * (2 * k + 1)] = (bytecode >> 4) & 0xF ;
+			} ;
+
+		/* Decode the encoded 4 bit samples. */
+		for (k = 0 ; k < pima->samplesperblock ; k ++)
+		{	step = ima_step_size [stepindx] ;
+
+			bytecode = pima->samples [pima->channels * k + chan] ;
+
+			stepindx += ima_indx_adjust [bytecode] ;
+			stepindx = clamp_ima_step_index (stepindx) ;
+
+			diff = step >> 3 ;
+			if (bytecode & 1)	diff += step >> 2 ;
+			if (bytecode & 2)	diff += step >> 1 ;
+			if (bytecode & 4)	diff += step ;
+			if (bytecode & 8)	diff = -diff ;
+
+			predictor += diff ;
+			if (predictor < -32768)
+				predictor = -32768 ;
+			else if (predictor > 32767)
+				predictor = 32767 ;
+
+			pima->samples [pima->channels * k + chan] = predictor ;
+			} ;
+		} ;
+
+	return 1 ;
+} /* aiff_ima_decode_block */
+
+static int
+aiff_ima_encode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima)
+{	int		chan, k, step, diff, vpdiff, blockindx, indx ;
+	short	bytecode, mask ;
+
+	/* Encode the block header. */
+	for (chan = 0 ; chan < pima->channels ; chan ++)
+	{	blockindx = chan * pima->blocksize ;
+
+		pima->block [blockindx] = (pima->samples [chan] >> 8) & 0xFF ;
+		pima->block [blockindx + 1] = (pima->samples [chan] & 0x80) + (pima->stepindx [chan] & 0x7F) ;
+
+		pima->previous [chan] = pima->samples [chan] ;
+		} ;
+
+	/* Encode second and later samples for every block as a 4 bit value. */
+	for (k = pima->channels ; k < (pima->samplesperblock * pima->channels) ; k ++)
+	{	chan = (pima->channels > 1) ? (k % 2) : 0 ;
+
+		diff = pima->samples [k] - pima->previous [chan] ;
+
+		bytecode = 0 ;
+		step = ima_step_size [pima->stepindx [chan]] ;
+		vpdiff = step >> 3 ;
+		if (diff < 0)
+		{	bytecode = 8 ;
+			diff = -diff ;
+			} ;
+		mask = 4 ;
+		while (mask)
+		{	if (diff >= step)
+			{	bytecode |= mask ;
+				diff -= step ;
+				vpdiff += step ;
+				} ;
+			step >>= 1 ;
+			mask >>= 1 ;
+			} ;
+
+		if (bytecode & 8)
+			pima->previous [chan] -= vpdiff ;
+		else
+			pima->previous [chan] += vpdiff ;
+
+		if (pima->previous [chan] > 32767)
+			pima->previous [chan] = 32767 ;
+		else if (pima->previous [chan] < -32768)
+			pima->previous [chan] = -32768 ;
+
+		pima->stepindx [chan] += ima_indx_adjust [bytecode] ;
+
+		pima->stepindx [chan] = clamp_ima_step_index (pima->stepindx [chan]) ;
+		pima->samples [k] = bytecode ;
+		} ;
+
+	/* Pack the 4 bit encoded samples. */
+
+	for (chan = 0 ; chan < pima->channels ; chan ++)
+	{	for (indx = pima->channels ; indx < pima->channels * pima->samplesperblock ; indx += 2 * pima->channels)
+		{	blockindx = chan * pima->blocksize + 2 + indx / 2 ;
+
+			pima->block [blockindx] = pima->samples [indx] & 0x0F ;
+			pima->block [blockindx] |= (pima->samples [indx + chan] << 4) & 0xF0 ;
+			} ;
+		} ;
+
+	/* Write the block to disk. */
+
+	if ((k = psf_fwrite (pima->block, 1, pima->channels * pima->blocksize, psf)) != pima->channels * pima->blocksize)
+		psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pima->channels * pima->blocksize) ;
+
+	memset (pima->samples, 0, pima->channels * pima->samplesperblock * sizeof (short)) ;
+	pima->samplecount = 0 ;
+	pima->blockcount ++ ;
+
+	return 1 ;
+} /* aiff_ima_encode_block */
+
+static int
+wav_w64_ima_decode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima)
+{	int		chan, k, predictor, blockindx, indx, indxstart, diff ;
+	short	step, bytecode, stepindx [2] ;
+
+	pima->blockcount ++ ;
+	pima->samplecount = 0 ;
+
+	if (pima->blockcount > pima->blocks)
+	{	memset (pima->samples, 0, pima->samplesperblock * pima->channels * sizeof (short)) ;
+		return 1 ;
+		} ;
+
+	if ((k = psf_fread (pima->block, 1, pima->blocksize, psf)) != pima->blocksize)
+		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pima->blocksize) ;
+
+	/* Read and check the block header. */
+
+	for (chan = 0 ; chan < pima->channels ; chan++)
+	{	predictor = pima->block [chan*4] | (pima->block [chan*4+1] << 8) ;
+		if (predictor & 0x8000)
+			predictor -= 0x10000 ;
+
+		stepindx [chan] = pima->block [chan*4+2] ;
+		stepindx [chan] = clamp_ima_step_index (stepindx [chan]) ;
+
+
+		if (pima->block [chan*4+3] != 0)
+			psf_log_printf (psf, "IMA ADPCM synchronisation error.\n") ;
+
+		pima->samples [chan] = predictor ;
+		} ;
+
+	/*
+	**	Pull apart the packed 4 bit samples and store them in their
+	**	correct sample positions.
+	*/
+
+	blockindx = 4 * pima->channels ;
+
+	indxstart = pima->channels ;
+	while (blockindx < pima->blocksize)
+	{	for (chan = 0 ; chan < pima->channels ; chan++)
+		{	indx = indxstart + chan ;
+			for (k = 0 ; k < 4 ; k++)
+			{	bytecode = pima->block [blockindx++] ;
+				pima->samples [indx] = bytecode & 0x0F ;
+				indx += pima->channels ;
+				pima->samples [indx] = (bytecode >> 4) & 0x0F ;
+				indx += pima->channels ;
+				} ;
+			} ;
+		indxstart += 8 * pima->channels ;
+		} ;
+
+	/* Decode the encoded 4 bit samples. */
+
+	for (k = pima->channels ; k < (pima->samplesperblock * pima->channels) ; k ++)
+	{	chan = (pima->channels > 1) ? (k % 2) : 0 ;
+
+		bytecode = pima->samples [k] & 0xF ;
+
+		step = ima_step_size [stepindx [chan]] ;
+		predictor = pima->samples [k - pima->channels] ;
+
+		diff = step >> 3 ;
+		if (bytecode & 1)
+			diff += step >> 2 ;
+		if (bytecode & 2)
+			diff += step >> 1 ;
+		if (bytecode & 4)
+			diff += step ;
+		if (bytecode & 8)
+			diff = -diff ;
+
+		predictor += diff ;
+
+		if (predictor > 32767)
+			predictor = 32767 ;
+		else if (predictor < -32768)
+			predictor = -32768 ;
+
+		stepindx [chan] += ima_indx_adjust [bytecode] ;
+		stepindx [chan] = clamp_ima_step_index (stepindx [chan]) ;
+
+		pima->samples [k] = predictor ;
+		} ;
+
+	return 1 ;
+} /* wav_w64_ima_decode_block */
+
+static int
+wav_w64_ima_encode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima)
+{	int		chan, k, step, diff, vpdiff, blockindx, indx, indxstart ;
+	short	bytecode, mask ;
+
+	/* Encode the block header. */
+	for (chan = 0 ; chan < pima->channels ; chan++)
+	{	pima->block [chan*4]	= pima->samples [chan] & 0xFF ;
+		pima->block [chan*4+1]	= (pima->samples [chan] >> 8) & 0xFF ;
+
+		pima->block [chan*4+2] = pima->stepindx [chan] ;
+		pima->block [chan*4+3] = 0 ;
+
+		pima->previous [chan] = pima->samples [chan] ;
+		} ;
+
+	/* Encode the samples as 4 bit. */
+
+	for (k = pima->channels ; k < (pima->samplesperblock * pima->channels) ; k ++)
+	{	chan = (pima->channels > 1) ? (k % 2) : 0 ;
+
+		diff = pima->samples [k] - pima->previous [chan] ;
+
+		bytecode = 0 ;
+		step = ima_step_size [pima->stepindx [chan]] ;
+		vpdiff = step >> 3 ;
+		if (diff < 0)
+		{	bytecode = 8 ;
+			diff = -diff ;
+			} ;
+		mask = 4 ;
+		while (mask)
+		{	if (diff >= step)
+			{	bytecode |= mask ;
+				diff -= step ;
+				vpdiff += step ;
+				} ;
+			step >>= 1 ;
+			mask >>= 1 ;
+			} ;
+
+		if (bytecode & 8)
+			pima->previous [chan] -= vpdiff ;
+		else
+			pima->previous [chan] += vpdiff ;
+
+		if (pima->previous [chan] > 32767)
+			pima->previous [chan] = 32767 ;
+		else if (pima->previous [chan] < -32768)
+			pima->previous [chan] = -32768 ;
+
+		pima->stepindx [chan] += ima_indx_adjust [bytecode] ;
+		pima->stepindx [chan] = clamp_ima_step_index (pima->stepindx [chan]) ;
+
+		pima->samples [k] = bytecode ;
+		} ;
+
+	/* Pack the 4 bit encoded samples. */
+
+	blockindx = 4 * pima->channels ;
+
+	indxstart = pima->channels ;
+	while (blockindx < pima->blocksize)
+	{	for (chan = 0 ; chan < pima->channels ; chan++)
+		{	indx = indxstart + chan ;
+			for (k = 0 ; k < 4 ; k++)
+			{	pima->block [blockindx] = pima->samples [indx] & 0x0F ;
+				indx += pima->channels ;
+				pima->block [blockindx] |= (pima->samples [indx] << 4) & 0xF0 ;
+				indx += pima->channels ;
+				blockindx ++ ;
+				} ;
+			} ;
+		indxstart += 8 * pima->channels ;
+		} ;
+
+	/* Write the block to disk. */
+
+	if ((k = psf_fwrite (pima->block, 1, pima->blocksize, psf)) != 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 ;
+	pima->blockcount ++ ;
+
+	return 1 ;
+} /* wav_w64_ima_encode_block */
+
+static int
+ima_read_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len)
+{	int		count, total = 0, indx = 0 ;
+
+	while (indx < len)
+	{	if (pima->blockcount >= pima->blocks && pima->samplecount >= pima->samplesperblock)
+		{	memset (&(ptr [indx]), 0, (size_t) ((len - indx) * sizeof (short))) ;
+			return total ;
+			} ;
+
+		if (pima->samplecount >= pima->samplesperblock)
+			pima->decode_block (psf, pima) ;
+
+		count = (pima->samplesperblock - pima->samplecount) * pima->channels ;
+		count = (len - indx > count) ? count : len - indx ;
+
+		memcpy (&(ptr [indx]), &(pima->samples [pima->samplecount * pima->channels]), count * sizeof (short)) ;
+		indx += count ;
+		pima->samplecount += count / pima->channels ;
+		total = indx ;
+		} ;
+
+	return total ;
+} /* ima_read_block */
+
+static sf_count_t
+ima_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	IMA_ADPCM_PRIVATE 	*pima ;
+	int			readcount, count ;
+	sf_count_t	total = 0 ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
+
+	while (len > 0)
+	{	readcount = (len > 0x10000000) ? 0x10000000 : (int) len ;
+
+		count = ima_read_block (psf, pima, ptr, readcount) ;
+
+		total += count ;
+		len -= count ;
+		if (count != readcount)
+			break ;
+		} ;
+
+	return total ;
+} /* ima_read_s */
+
+static sf_count_t
+ima_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	IMA_ADPCM_PRIVATE *pima ;
+	short		*sptr ;
+	int			k, bufferlen, readcount, count ;
+	sf_count_t	total = 0 ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : (int) len ;
+		count = ima_read_block (psf, pima, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = ((int) sptr [k]) << 16 ;
+		total += count ;
+		len -= readcount ;
+		if (count != readcount)
+			break ;
+		} ;
+
+	return total ;
+} /* ima_read_i */
+
+static sf_count_t
+ima_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	IMA_ADPCM_PRIVATE *pima ;
+	short		*sptr ;
+	int			k, bufferlen, readcount, count ;
+	sf_count_t	total = 0 ;
+	float		normfact ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : (int) len ;
+		count = ima_read_block (psf, pima, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = normfact * (float) (sptr [k]) ;
+		total += count ;
+		len -= readcount ;
+		if (count != readcount)
+			break ;
+		} ;
+
+	return total ;
+} /* ima_read_f */
+
+static sf_count_t
+ima_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	IMA_ADPCM_PRIVATE *pima ;
+	short		*sptr ;
+	int			k, bufferlen, readcount, count ;
+	sf_count_t	total = 0 ;
+	double 		normfact ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : (int) len ;
+		count = ima_read_block (psf, pima, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = normfact * (double) (sptr [k]) ;
+		total += count ;
+		len -= readcount ;
+		if (count != readcount)
+			break ;
+		} ;
+
+	return total ;
+} /* ima_read_d */
+
+static sf_count_t
+ima_seek (SF_PRIVATE *psf, int mode, sf_count_t offset)
+{	IMA_ADPCM_PRIVATE *pima ;
+	int			newblock, newsample ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
+
+	if (psf->datalength < 0 || psf->dataoffset < 0)
+	{	psf->error = SFE_BAD_SEEK ;
+		return PSF_SEEK_ERROR ;
+		} ;
+
+	if (offset == 0)
+	{	psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+		pima->blockcount = 0 ;
+		pima->decode_block (psf, pima) ;
+		pima->samplecount = 0 ;
+		return 0 ;
+		} ;
+
+	if (offset < 0 || offset > pima->blocks * pima->samplesperblock)
+	{	psf->error = SFE_BAD_SEEK ;
+		return	PSF_SEEK_ERROR ;
+		} ;
+
+	newblock	= offset / pima->samplesperblock ;
+	newsample	= offset % pima->samplesperblock ;
+
+	if (mode == SFM_READ)
+	{	psf_fseek (psf, psf->dataoffset + newblock * pima->blocksize, SEEK_SET) ;
+		pima->blockcount = newblock ;
+		pima->decode_block (psf, pima) ;
+		pima->samplecount = newsample ;
+		}
+	else
+	{	/* What to do about write??? */
+		psf->error = SFE_BAD_SEEK ;
+		return	PSF_SEEK_ERROR ;
+		} ;
+
+	return newblock * pima->samplesperblock + newsample ;
+} /* ima_seek */
+
+/*==========================================================================================
+** IMA ADPCM Write Functions.
+*/
+
+static int
+ima_writer_init (SF_PRIVATE *psf, int blockalign)
+{	IMA_ADPCM_PRIVATE	*pima ;
+	int					samplesperblock ;
+	unsigned int 		pimasize ;
+
+	if (psf->file.mode != SFM_WRITE)
+		return SFE_BAD_MODE_RW ;
+
+	samplesperblock = 2 * (blockalign - 4 * psf->sf.channels) / psf->sf.channels + 1 ;
+
+	pimasize = sizeof (IMA_ADPCM_PRIVATE) + blockalign + 3 * psf->sf.channels * samplesperblock ;
+
+	if ((pima = calloc (1, pimasize)) == NULL)
+		return SFE_MALLOC_FAILED ;
+
+	psf->codec_data = (void*) pima ;
+
+	pima->channels			= psf->sf.channels ;
+	pima->blocksize			= blockalign ;
+	pima->samplesperblock	= samplesperblock ;
+
+	pima->block		= (unsigned char*) pima->data ;
+	pima->samples	= (short*) (pima->data + blockalign) ;
+
+	pima->samplecount = 0 ;
+
+	switch (SF_CONTAINER (psf->sf.format))
+	{	case SF_FORMAT_WAV :
+		case SF_FORMAT_W64 :
+				pima->encode_block = wav_w64_ima_encode_block ;
+				break ;
+
+		case SF_FORMAT_AIFF :
+				pima->encode_block = aiff_ima_encode_block ;
+				break ;
+
+		default :
+				psf_log_printf (psf, "ima_reader_init: bad psf->sf.format\n") ;
+				return SFE_INTERNAL ;
+		} ;
+
+	psf->write_short	= ima_write_s ;
+	psf->write_int		= ima_write_i ;
+	psf->write_float	= ima_write_f ;
+	psf->write_double	= ima_write_d ;
+
+	return 0 ;
+} /* ima_writer_init */
+
+/*==========================================================================================
+*/
+
+static int
+ima_write_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, const short *ptr, int len)
+{	int		count, total = 0, indx = 0 ;
+
+	while (indx < len)
+	{	count = (pima->samplesperblock - pima->samplecount) * pima->channels ;
+
+		if (count > len - indx)
+			count = len - indx ;
+
+		memcpy (&(pima->samples [pima->samplecount * pima->channels]), &(ptr [total]), count * sizeof (short)) ;
+		indx += count ;
+		pima->samplecount += count / pima->channels ;
+		total = indx ;
+
+		if (pima->samplecount >= pima->samplesperblock)
+			pima->encode_block (psf, pima) ;
+		} ;
+
+	return total ;
+} /* ima_write_block */
+
+static sf_count_t
+ima_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	IMA_ADPCM_PRIVATE 	*pima ;
+	int			writecount, count ;
+	sf_count_t	total = 0 ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
+
+	while (len)
+	{	writecount = (len > 0x10000000) ? 0x10000000 : (int) len ;
+
+		count = ima_write_block (psf, pima, ptr, writecount) ;
+
+		total += count ;
+		len -= count ;
+		if (count != writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* ima_write_s */
+
+static sf_count_t
+ima_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	IMA_ADPCM_PRIVATE *pima ;
+	short		*sptr ;
+	int			k, bufferlen, writecount, count ;
+	sf_count_t	total = 0 ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : (int) len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = ptr [total + k] >> 16 ;
+		count = ima_write_block (psf, pima, sptr, writecount) ;
+		total += count ;
+		len -= writecount ;
+		if (count != writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* ima_write_i */
+
+static sf_count_t
+ima_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	IMA_ADPCM_PRIVATE *pima ;
+	short		*sptr ;
+	int			k, bufferlen, writecount, count ;
+	sf_count_t	total = 0 ;
+	float		normfact ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : (int) len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = lrintf (normfact * ptr [total + k]) ;
+		count = ima_write_block (psf, pima, sptr, writecount) ;
+		total += count ;
+		len -= writecount ;
+		if (count != writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* ima_write_f */
+
+static sf_count_t
+ima_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	IMA_ADPCM_PRIVATE *pima ;
+	short		*sptr ;
+	int			k, bufferlen, writecount, count ;
+	sf_count_t	total = 0 ;
+	double 		normfact ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : (int) len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = lrint (normfact * ptr [total + k]) ;
+		count = ima_write_block (psf, pima, sptr, writecount) ;
+		total += count ;
+		len -= writecount ;
+		if (count != writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* ima_write_d */
+
diff --git a/jni/libsndfile-1.0.25/src/ima_adpcm.lo b/jni/libsndfile-1.0.25/src/ima_adpcm.lo
new file mode 100644
index 0000000..b4af66a
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ima_adpcm.lo
@@ -0,0 +1,12 @@
+# ima_adpcm.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/ima_adpcm.o'
+
+# Name of the non-PIC object
+non_pic_object='ima_adpcm.o'
+
diff --git a/jni/libsndfile-1.0.25/src/ima_adpcm.o b/jni/libsndfile-1.0.25/src/ima_adpcm.o
new file mode 100644
index 0000000..625862c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ima_adpcm.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/ima_oki_adpcm.c b/jni/libsndfile-1.0.25/src/ima_oki_adpcm.c
new file mode 100644
index 0000000..399d2e4
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ima_oki_adpcm.c
@@ -0,0 +1,297 @@
+/*
+** Copyright (C) 2007-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (c) 2007 <robs@users.sourceforge.net>
+**
+** This library is free software; you can redistribute it and/or modify it
+** under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or (at
+** your option) any later version.
+**
+** This library 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 library.  If not, write to the Free Software Foundation,
+** Fifth Floor, 51 Franklin Street, Boston, MA 02111-1301, USA.
+*/
+
+/* ADPCM: IMA, OKI <==> 16-bit PCM. */
+
+#include "sfconfig.h"
+
+#include <string.h>
+
+/* Set up for libsndfile environment: */
+#include "common.h"
+
+#include "ima_oki_adpcm.h"
+
+#define MIN_SAMPLE	-0x8000
+#define MAX_SAMPLE	0x7fff
+
+static int const ima_steps [] =	/* ~16-bit precision */
+{	7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
+	50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230,
+	253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963,
+	1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327,
+	3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442,
+	11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794,
+	32767
+} ;
+
+static int const oki_steps [] =	/* ~12-bit precision */
+{	256, 272, 304, 336, 368, 400, 448, 496, 544, 592, 656, 720, 800, 880, 960,
+	1056, 1168, 1280, 1408, 1552, 1712, 1888, 2080, 2288, 2512, 2768, 3040, 3344,
+	3680, 4048, 4464, 4912, 5392, 5936, 6528, 7184, 7904, 8704, 9568, 10528,
+	11584, 12736, 14016, 15408, 16960, 18656, 20512, 22576, 24832
+} ;
+
+static int const step_changes [] = { -1, -1, -1, -1, 2, 4, 6, 8 } ;
+
+void
+ima_oki_adpcm_init (IMA_OKI_ADPCM * state, IMA_OKI_ADPCM_TYPE type)
+{
+	memset (state, 0, sizeof (*state)) ;
+
+	if (type == IMA_OKI_ADPCM_TYPE_IMA)
+	{	state->max_step_index = ARRAY_LEN (ima_steps) - 1 ;
+		state->steps = ima_steps ;
+		state->mask = (~0) ;
+		}
+	else
+	{	state->max_step_index = ARRAY_LEN (oki_steps) - 1 ;
+		state->steps = oki_steps ;
+		state->mask = (~0) << 4 ;
+		} ;
+
+} /* ima_oki_adpcm_init */
+
+
+int
+adpcm_decode (IMA_OKI_ADPCM * state, int code)
+{	int s ;
+
+	s = ((code & 7) << 1) | 1 ;
+	s = ((state->steps [state->step_index] * s) >> 3) & state->mask ;
+
+	if (code & 8)
+    	s = -s ;
+	s += state->last_output ;
+
+	if (s < MIN_SAMPLE || s > MAX_SAMPLE)
+	{	int grace ;
+
+		grace = (state->steps [state->step_index] >> 3) & state->mask ;
+
+		if (s < MIN_SAMPLE - grace || s > MAX_SAMPLE + grace)
+			state->errors ++ ;
+
+		s = s < MIN_SAMPLE ? MIN_SAMPLE : MAX_SAMPLE ;
+		} ;
+
+	state->step_index += step_changes [code & 7] ;
+	state->step_index = SF_MIN (SF_MAX (state->step_index, 0), state->max_step_index) ;
+	state->last_output = s ;
+
+	return s ;
+} /* adpcm_decode */
+
+int
+adpcm_encode (IMA_OKI_ADPCM * state, int sample)
+{	int delta, sign = 0, code ;
+
+	delta = sample - state->last_output ;
+
+	if (delta < 0)
+	{	sign = 8 ;
+		delta = -delta ;
+		} ;
+
+	code = 4 * delta / state->steps [state->step_index] ;
+	code = sign | SF_MIN (code, 7) ;
+	adpcm_decode (state, code) ; /* Update encoder state */
+
+	return code ;
+} /* adpcm_encode */
+
+
+void
+ima_oki_adpcm_decode_block	(IMA_OKI_ADPCM * state)
+{	unsigned char code ;
+	int k ;
+
+	for (k = 0 ; k < state->code_count ; k++)
+	{	code = state->codes [k] ;
+		state->pcm [2 * k] = adpcm_decode (state, code >> 4) ;
+		state->pcm [2 * k + 1] = adpcm_decode (state, code) ;
+		} ;
+
+	state->pcm_count = 2 * k ;
+} /* ima_oki_adpcm_decode_block */
+
+
+void
+ima_oki_adpcm_encode_block (IMA_OKI_ADPCM * state)
+{	unsigned char code ;
+	int k ;
+
+	/*
+	**	The codec expects an even number of input samples.
+	**
+	**	Samples should always be passed in even length blocks. If the last block to
+	**	be encoded is odd length, extend that block by one zero valued sample.
+	*/
+	if (state->pcm_count % 2 == 1)
+		state->pcm [state->pcm_count ++] = 0 ;
+
+	for (k = 0 ; k < state->pcm_count / 2 ; k++)
+	{	code = adpcm_encode (state, state->pcm [2 * k]) << 4 ;
+		code |= adpcm_encode (state, state->pcm [2 * k + 1]) ;
+		state->codes [k] = code ;
+		} ;
+
+	state->code_count = k ;
+} /* ima_oki_adpcm_encode_block */
+
+
+#ifdef TEST
+
+static const unsigned char test_codes [] =
+{	0x08, 0x08, 0x04, 0x7f, 0x72, 0xf7, 0x9f, 0x7c, 0xd7, 0xbc, 0x7a, 0xa7, 0xb8,
+	0x4b, 0x0b, 0x38, 0xf6, 0x9d, 0x7a, 0xd7, 0xbc, 0x7a, 0xd7, 0xa8, 0x6c, 0x81,
+	0x98, 0xe4, 0x0e, 0x7a, 0xd7, 0x9e, 0x7b, 0xc7, 0xab, 0x7a, 0x85, 0xc0, 0xb3,
+	0x8f, 0x58, 0xd7, 0xad, 0x7a, 0xd7, 0xad, 0x7a, 0x87, 0xd0, 0x2b, 0x0e, 0x48,
+	0xd7, 0xad, 0x78, 0xf7, 0xbc, 0x7a, 0xb7, 0xa8, 0x4b, 0x88, 0x18, 0xd5, 0x8d,
+	0x6a, 0xa4, 0x98, 0x08, 0x00, 0x80, 0x88,
+} ;
+
+static const short test_pcm [] =
+{	32, 0, 32, 0, 32, 320, 880, -336, 2304, 4192, -992, 10128, 5360, -16352,
+	30208, 2272, -31872, 14688, -7040, -32432, 14128, -1392, -15488, 22960,
+	1232, -1584, 21488, -240, 2576, -15360, 960, -1152, -30032, 10320, 1008,
+	-30032, 16528, 1008, -30032, 16528, -5200, -30592, 15968, 448, -30592,
+	15968, 448, -2368, 30960, 3024, -80, 8384, 704, -1616, -29168, -1232, 1872,
+	-32768, 13792, -1728, -32768, 13792, 4480, -32192, 14368, -7360, -32752,
+	13808, -1712, -21456, 16992, 1472, -1344, 26848, -1088, 2016, -17728, 208,
+	-2112, -32768, 1376, -1728, -32768, 13792, -1728, -32768, 13792, -1728,
+	-32768, 13792, -1728, -32768, 13792, -1728, -4544, 32767, -1377, 1727,
+	15823, -2113, 207, -27345, 591, -2513, -32768, 13792, -1728, -32768, 13792,
+	10688, -31632, 14928, -6800, -32192, 14368, -1152, -20896, 17552, 2032,
+	-784, 22288, 560, -2256, -4816, 2176, 64, -21120, 9920, 6816, -24224, 16128,
+	608, -13488, 9584, 272, -2544, 16, -2304, -192, 1728, -16, 1568, 128, -1184,
+} ;
+
+
+static void
+test_oki_adpcm (void)
+{
+	IMA_OKI_ADPCM adpcm ;
+	unsigned char code ;
+	int i, j ;
+
+	printf ("    Testing encoder          : ") ;
+	fflush (stdout) ;
+
+	ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ;
+	for (i = 0 ; i < ARRAY_LEN (test_codes) ; i++)
+		for (j = 0, code = test_codes [i] ; j < 2 ; j++, code <<= 4)
+			if (adpcm_decode (&adpcm, code >> 4) != test_pcm [2 * i + j])
+			{	printf ("\n\nFail at i = %d, j = %d.\n\n", i, j) ;
+				exit (1) ;
+				} ;
+
+	puts ("ok") ;
+
+	printf ("    Testing decoder          : ") ;
+	fflush (stdout) ;
+
+	ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ;
+	for (i = 0 ; i < ARRAY_LEN (test_pcm) ; i += j)
+	{	code = adpcm_encode (&adpcm, test_pcm [i]) ;
+		code = (code << 4) | adpcm_encode (&adpcm, test_pcm [i + 1]) ;
+		if (code != test_codes [i / 2])
+			{	printf ("\n\nFail at i = %d, %d should be %d\n\n", i, code, test_codes [i / 2]) ;
+				exit (1) ;
+				} ;
+		} ;
+
+	puts ("ok") ;
+} /* test_oki_adpcm */
+
+static void
+test_oki_adpcm_block (void)
+{
+	IMA_OKI_ADPCM adpcm ;
+	int k ;
+
+	if (ARRAY_LEN (adpcm.pcm) < ARRAY_LEN (test_pcm))
+	{	printf ("\n\nLine %d : ARRAY_LEN (adpcm->pcm) > ARRAY_LEN (test_pcm) (%d > %d).\n\n", __LINE__, ARRAY_LEN (adpcm.pcm), ARRAY_LEN (test_pcm)) ;
+		exit (1) ;
+		} ;
+
+	if (ARRAY_LEN (adpcm.codes) < ARRAY_LEN (test_codes))
+	{	printf ("\n\nLine %d : ARRAY_LEN (adcodes->codes) > ARRAY_LEN (test_codes).n", __LINE__) ;
+		exit (1) ;
+		} ;
+
+	printf ("    Testing block encoder    : ") ;
+	fflush (stdout) ;
+
+	ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ;
+
+	memcpy (adpcm.pcm, test_pcm, sizeof (adpcm.pcm [0]) * ARRAY_LEN (test_pcm)) ;
+	adpcm.pcm_count = ARRAY_LEN (test_pcm) ;
+	adpcm.code_count = 13 ;
+
+	ima_oki_adpcm_encode_block (&adpcm) ;
+
+	if (adpcm.code_count * 2 != ARRAY_LEN (test_pcm))
+	{	printf ("\n\nLine %d : %d * 2 != %d\n\n", __LINE__, adpcm.code_count * 2, ARRAY_LEN (test_pcm)) ;
+		exit (1) ;
+		} ;
+
+	for (k = 0 ; k < ARRAY_LEN (test_codes) ; k++)
+		if (adpcm.codes [k] != test_codes [k])
+		{	printf ("\n\nLine %d : Fail at k = %d, %d should be %d\n\n", __LINE__, k, adpcm.codes [k], test_codes [k]) ;
+			exit (1) ;
+			} ;
+
+	puts ("ok") ;
+
+	printf ("    Testing block decoder    : ") ;
+	fflush (stdout) ;
+
+	ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ;
+
+	memcpy (adpcm.codes, test_codes, sizeof (adpcm.codes [0]) * ARRAY_LEN (test_codes)) ;
+	adpcm.code_count = ARRAY_LEN (test_codes) ;
+	adpcm.pcm_count = 13 ;
+
+	ima_oki_adpcm_decode_block (&adpcm) ;
+
+	if (adpcm.pcm_count != 2 * ARRAY_LEN (test_codes))
+	{	printf ("\n\nLine %d : %d * 2 != %d\n\n", __LINE__, adpcm.pcm_count, 2 * ARRAY_LEN (test_codes)) ;
+		exit (1) ;
+		} ;
+
+	for (k = 0 ; k < ARRAY_LEN (test_pcm) ; k++)
+		if (adpcm.pcm [k] != test_pcm [k])
+		{	printf ("\n\nLine %d : Fail at i = %d, %d should be %d.\n\n", __LINE__, k, adpcm.pcm [k], test_pcm [k]) ;
+			exit (1) ;
+			} ;
+
+	puts ("ok") ;
+} /* test_oki_adpcm_block */
+
+int
+main (void)
+{
+	test_oki_adpcm () ;
+	test_oki_adpcm_block () ;
+
+	return 0 ;
+} /* main */
+
+#endif
diff --git a/jni/libsndfile-1.0.25/src/ima_oki_adpcm.h b/jni/libsndfile-1.0.25/src/ima_oki_adpcm.h
new file mode 100644
index 0000000..86241e7
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ima_oki_adpcm.h
@@ -0,0 +1,54 @@
+/*
+** Copyright (C) 2007-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (c) 2007 <robs@users.sourceforge.net>
+**
+** This library is free software; you can redistribute it and/or modify it
+** under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or (at
+** your option) any later version.
+**
+** This library 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 library.  If not, write to the Free Software Foundation,
+** Fifth Floor, 51 Franklin Street, Boston, MA 02111-1301, USA.
+*/
+
+/* ADPCM: IMA, OKI <==> 16-bit PCM. */
+
+
+#define		IMA_OKI_ADPCM_CODE_LEN	256
+#define		IMA_OKI_ADPCM_PCM_LEN	(IMA_OKI_ADPCM_CODE_LEN *2)
+
+typedef struct
+{
+	/* private: */
+	int mask ;
+	int last_output ;
+	int step_index ;
+	int max_step_index ;
+	int const * steps ;
+
+	/* public: */
+	int errors ;
+	int	code_count, pcm_count ;
+
+	unsigned char	codes [IMA_OKI_ADPCM_CODE_LEN] ;
+	short 			pcm [IMA_OKI_ADPCM_PCM_LEN] ;
+} IMA_OKI_ADPCM ;
+
+typedef enum
+{	IMA_OKI_ADPCM_TYPE_IMA,
+	IMA_OKI_ADPCM_TYPE_OKI
+} IMA_OKI_ADPCM_TYPE ;
+
+void ima_oki_adpcm_init		(IMA_OKI_ADPCM * state, IMA_OKI_ADPCM_TYPE type) ;
+
+int	adpcm_decode	(IMA_OKI_ADPCM * state, int /* 0..15 */ code) ;
+int	adpcm_encode	(IMA_OKI_ADPCM * state, int /* -32768..32767 */ sample) ;
+
+void	ima_oki_adpcm_decode_block	(IMA_OKI_ADPCM * state) ;
+void	ima_oki_adpcm_encode_block	(IMA_OKI_ADPCM * state) ;
diff --git a/jni/libsndfile-1.0.25/src/ima_oki_adpcm.lo b/jni/libsndfile-1.0.25/src/ima_oki_adpcm.lo
new file mode 100644
index 0000000..2d2b4d5
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ima_oki_adpcm.lo
@@ -0,0 +1,12 @@
+# ima_oki_adpcm.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/ima_oki_adpcm.o'
+
+# Name of the non-PIC object
+non_pic_object='ima_oki_adpcm.o'
+
diff --git a/jni/libsndfile-1.0.25/src/ima_oki_adpcm.o b/jni/libsndfile-1.0.25/src/ima_oki_adpcm.o
new file mode 100644
index 0000000..b0c6fbd
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ima_oki_adpcm.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/interleave.c b/jni/libsndfile-1.0.25/src/interleave.c
new file mode 100644
index 0000000..ca9d7b4
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/interleave.c
@@ -0,0 +1,300 @@
+/*
+** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfendian.h"
+
+#include	<stdlib.h>
+
+#include	"sndfile.h"
+#include	"common.h"
+
+#define		INTERLEAVE_CHANNELS		6
+
+typedef struct
+{	double	buffer [SF_BUFFER_LEN / sizeof (double)] ;
+
+	sf_count_t		channel_len ;
+
+	sf_count_t		(*read_short)	(SF_PRIVATE*, short *ptr, sf_count_t len) ;
+	sf_count_t		(*read_int)	(SF_PRIVATE*, int *ptr, sf_count_t len) ;
+	sf_count_t		(*read_float)	(SF_PRIVATE*, float *ptr, sf_count_t len) ;
+	sf_count_t		(*read_double)	(SF_PRIVATE*, double *ptr, sf_count_t len) ;
+
+} INTERLEAVE_DATA ;
+
+
+
+static sf_count_t	interleave_read_short	(SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	interleave_read_int	(SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	interleave_read_float	(SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	interleave_read_double	(SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t	interleave_seek	(SF_PRIVATE*, int mode, sf_count_t samples_from_start) ;
+
+
+
+
+int
+interleave_init	(SF_PRIVATE *psf)
+{	INTERLEAVE_DATA *pdata ;
+
+	if (psf->file.mode != SFM_READ)
+		return SFE_INTERLEAVE_MODE ;
+
+	if (psf->interleave)
+	{	psf_log_printf (psf, "*** Weird, already have interleave.\n") ;
+		return 666 ;
+		} ;
+
+	/* Free this in sf_close() function. */
+	if (! (pdata = malloc (sizeof (INTERLEAVE_DATA))))
+		return SFE_MALLOC_FAILED ;
+
+puts ("interleave_init") ;
+
+	psf->interleave = pdata ;
+
+	/* Save the existing methods. */
+	pdata->read_short	= psf->read_short ;
+	pdata->read_int		= psf->read_int ;
+	pdata->read_float	= psf->read_float ;
+	pdata->read_double	= psf->read_double ;
+
+	pdata->channel_len = psf->sf.frames * psf->bytewidth ;
+
+	/* Insert our new methods. */
+	psf->read_short		= interleave_read_short ;
+	psf->read_int		= interleave_read_int ;
+	psf->read_float		= interleave_read_float ;
+	psf->read_double	= interleave_read_double ;
+
+	psf->seek = interleave_seek ;
+
+	return 0 ;
+} /* pcm_interleave_init */
+
+/*------------------------------------------------------------------------------
+*/
+
+static sf_count_t
+interleave_read_short	(SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	INTERLEAVE_DATA *pdata ;
+	sf_count_t	offset, templen ;
+	int			chan, count, k ;
+	short		*inptr, *outptr ;
+
+	if (! (pdata = psf->interleave))
+		return 0 ;
+
+	inptr = (short*) pdata->buffer ;
+
+	for (chan = 0 ; chan < psf->sf.channels ; chan++)
+	{	outptr = ptr + chan ;
+
+		offset = psf->dataoffset + chan * psf->bytewidth * psf->read_current ;
+
+		if (psf_fseek (psf, offset, SEEK_SET) != offset)
+		{	psf->error = SFE_INTERLEAVE_SEEK ;
+			return 0 ;
+			} ;
+
+		templen = len / psf->sf.channels ;
+
+		while (templen > 0)
+		{	if (templen > SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (short))
+				count = SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (short) ;
+			else
+				count = (int) templen ;
+
+			if (pdata->read_short (psf, inptr, count) != count)
+			{	psf->error = SFE_INTERLEAVE_READ ;
+				return 0 ;
+				} ;
+
+			for (k = 0 ; k < count ; k++)
+			{	*outptr = inptr [k] ;
+				outptr += psf->sf.channels ;
+				} ;
+
+			templen -= count ;
+			} ;
+		} ;
+
+	return len ;
+} /* interleave_read_short */
+
+static sf_count_t
+interleave_read_int	(SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	INTERLEAVE_DATA *pdata ;
+	sf_count_t	offset, templen ;
+	int			chan, count, k ;
+	int		*inptr, *outptr ;
+
+	if (! (pdata = psf->interleave))
+		return 0 ;
+
+	inptr = (int*) pdata->buffer ;
+
+	for (chan = 0 ; chan < psf->sf.channels ; chan++)
+	{	outptr = ptr + chan ;
+
+		offset = psf->dataoffset + chan * psf->bytewidth * psf->read_current ;
+
+		if (psf_fseek (psf, offset, SEEK_SET) != offset)
+		{	psf->error = SFE_INTERLEAVE_SEEK ;
+			return 0 ;
+			} ;
+
+		templen = len / psf->sf.channels ;
+
+		while (templen > 0)
+		{	if (templen > SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (int))
+				count = SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (int) ;
+			else
+				count = (int) templen ;
+
+			if (pdata->read_int (psf, inptr, count) != count)
+			{	psf->error = SFE_INTERLEAVE_READ ;
+				return 0 ;
+				} ;
+
+			for (k = 0 ; k < count ; k++)
+			{	*outptr = inptr [k] ;
+				outptr += psf->sf.channels ;
+				} ;
+
+			templen -= count ;
+			} ;
+		} ;
+
+	return len ;
+} /* interleave_read_int */
+
+static sf_count_t
+interleave_read_float	(SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	INTERLEAVE_DATA *pdata ;
+	sf_count_t	offset, templen ;
+	int			chan, count, k ;
+	float		*inptr, *outptr ;
+
+	if (! (pdata = psf->interleave))
+		return 0 ;
+
+	inptr = (float*) pdata->buffer ;
+
+	for (chan = 0 ; chan < psf->sf.channels ; chan++)
+	{	outptr = ptr + chan ;
+
+		offset = psf->dataoffset + pdata->channel_len * chan + psf->read_current * psf->bytewidth ;
+
+/*-printf ("chan : %d     read_current : %6lld    offset : %6lld\n", chan, psf->read_current, offset) ;-*/
+
+		if (psf_fseek (psf, offset, SEEK_SET) != offset)
+		{	psf->error = SFE_INTERLEAVE_SEEK ;
+/*-puts ("interleave_seek error") ; exit (1) ;-*/
+			return 0 ;
+			} ;
+
+		templen = len / psf->sf.channels ;
+
+		while (templen > 0)
+		{	if (templen > SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (float))
+				count = SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (float) ;
+			else
+				count = (int) templen ;
+
+			if (pdata->read_float (psf, inptr, count) != count)
+			{	psf->error = SFE_INTERLEAVE_READ ;
+/*-puts ("interleave_read error") ; exit (1) ;-*/
+				return 0 ;
+				} ;
+
+			for (k = 0 ; k < count ; k++)
+			{	*outptr = inptr [k] ;
+				outptr += psf->sf.channels ;
+				} ;
+
+			templen -= count ;
+			} ;
+		} ;
+
+	return len ;
+} /* interleave_read_float */
+
+static sf_count_t
+interleave_read_double	(SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	INTERLEAVE_DATA *pdata ;
+	sf_count_t	offset, templen ;
+	int			chan, count, k ;
+	double		*inptr, *outptr ;
+
+	if (! (pdata = psf->interleave))
+		return 0 ;
+
+	inptr = (double*) pdata->buffer ;
+
+	for (chan = 0 ; chan < psf->sf.channels ; chan++)
+	{	outptr = ptr + chan ;
+
+		offset = psf->dataoffset + chan * psf->bytewidth * psf->read_current ;
+
+		if (psf_fseek (psf, offset, SEEK_SET) != offset)
+		{	psf->error = SFE_INTERLEAVE_SEEK ;
+			return 0 ;
+			} ;
+
+		templen = len / psf->sf.channels ;
+
+		while (templen > 0)
+		{	if (templen > SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (double))
+				count = SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (double) ;
+			else
+				count = (int) templen ;
+
+			if (pdata->read_double (psf, inptr, count) != count)
+			{	psf->error = SFE_INTERLEAVE_READ ;
+				return 0 ;
+				} ;
+
+			for (k = 0 ; k < count ; k++)
+			{	*outptr = inptr [k] ;
+				outptr += psf->sf.channels ;
+				} ;
+
+			templen -= count ;
+			} ;
+		} ;
+
+	return len ;
+} /* interleave_read_double */
+
+/*------------------------------------------------------------------------------
+*/
+
+static sf_count_t
+interleave_seek	(SF_PRIVATE *psf, int mode, sf_count_t samples_from_start)
+{	psf = psf ;	mode = mode ;
+
+	/*
+	** Do nothing here. This is a place holder to prevent the default
+	** seek function from being called.
+	*/
+
+	return samples_from_start ;
+} /* interleave_seek */
+
diff --git a/jni/libsndfile-1.0.25/src/interleave.lo b/jni/libsndfile-1.0.25/src/interleave.lo
new file mode 100644
index 0000000..0d5eeae
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/interleave.lo
@@ -0,0 +1,12 @@
+# interleave.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/interleave.o'
+
+# Name of the non-PIC object
+non_pic_object='interleave.o'
+
diff --git a/jni/libsndfile-1.0.25/src/interleave.o b/jni/libsndfile-1.0.25/src/interleave.o
new file mode 100644
index 0000000..222cab4
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/interleave.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/ircam.c b/jni/libsndfile-1.0.25/src/ircam.c
new file mode 100644
index 0000000..4aa1173
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ircam.c
@@ -0,0 +1,322 @@
+/*
+** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+
+#include	"sndfile.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_BE_MASK		(MAKE_MARKER (0xFF, 0xFF, 0x00, 0xFF))
+#define IRCAM_BE_MARKER		(MAKE_MARKER (0x64, 0xA3, 0x00, 0x00))
+
+#define IRCAM_LE_MASK		(MAKE_MARKER (0xFF, 0x00, 0xFF, 0xFF))
+#define IRCAM_LE_MARKER		(MAKE_MARKER (0x00, 0x00, 0xA3, 0x64))
+
+#define IRCAM_02B_MARKER	(MAKE_MARKER (0x64, 0xA3, 0x02, 0x00))
+#define IRCAM_03L_MARKER	(MAKE_MARKER (0x64, 0xA3, 0x03, 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, int calc_length) ;
+static	int		ircam_read_header	(SF_PRIVATE *psf) ;
+
+static	int		get_encoding (int subformat) ;
+
+static	const char*	get_encoding_str (int encoding) ;
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+ircam_open	(SF_PRIVATE *psf)
+{	int		subformat ;
+	int		error = SFE_NO_ERROR ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = ircam_read_header (psf)))
+			return error ;
+		} ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_IRCAM)
+			return	SFE_BAD_OPEN_FORMAT ;
+
+		psf->endian = SF_ENDIAN (psf->sf.format) ;
+		if (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU)
+			psf->endian = (CPU_IS_BIG_ENDIAN) ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ;
+
+	 	psf->dataoffset = IRCAM_DATA_OFFSET ;
+
+		if ((error = ircam_write_header (psf, SF_FALSE)))
+			return error ;
+
+		psf->write_header = ircam_write_header ;
+		} ;
+
+	psf->container_close = ircam_close ;
+
+	switch (subformat)
+	{	case SF_FORMAT_ULAW :		/* 8-bit Ulaw encoding. */
+				error = ulaw_init (psf) ;
+				break ;
+
+		case SF_FORMAT_ALAW :		/* 8-bit Alaw encoding. */
+				error = alaw_init (psf) ;
+				break ;
+
+		case SF_FORMAT_PCM_16 :	/* 16-bit linear PCM. */
+		case SF_FORMAT_PCM_32 :	/* 32-bit linear PCM. */
+				error = pcm_init (psf) ;
+				break ;
+
+		case SF_FORMAT_FLOAT :	/* 32-bit linear PCM. */
+				error = float32_init (psf) ;
+				break ;
+
+		default : break ;
+		} ;
+
+	return error ;
+} /* ircam_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+ircam_read_header	(SF_PRIVATE *psf)
+{	unsigned int	marker, encoding ;
+	float			samplerate ;
+	int				error = SFE_NO_ERROR ;
+
+	psf_binheader_readf (psf, "epmf44", 0, &marker, &samplerate, &(psf->sf.channels), &encoding) ;
+
+	if (((marker & IRCAM_BE_MASK) != IRCAM_BE_MARKER) && ((marker & IRCAM_LE_MASK) != IRCAM_LE_MARKER))
+	{	psf_log_printf (psf, "marker: 0x%X\n", marker) ;
+		return SFE_IRCAM_NO_MARKER ;
+		} ;
+
+	psf->endian = SF_ENDIAN_LITTLE ;
+
+	if (psf->sf.channels > 256)
+	{	psf_binheader_readf (psf, "Epmf44", 0, &marker, &samplerate, &(psf->sf.channels), &encoding) ;
+
+		/* Sanity checking for endian-ness detection. */
+		if (psf->sf.channels > 256)
+		{	psf_log_printf (psf, "marker: 0x%X\n", marker) ;
+			return SFE_IRCAM_BAD_CHANNELS ;
+			} ;
+
+		psf->endian = SF_ENDIAN_BIG ;
+		} ;
+
+	psf_log_printf (psf, "marker: 0x%X\n", marker) ;
+
+	psf->sf.samplerate = (int) samplerate ;
+
+	psf_log_printf (psf, "  Sample Rate : %d\n"
+						 "  Channels    : %d\n"
+						 "  Encoding    : %X => %s\n", psf->sf.samplerate, psf->sf.channels, encoding, get_encoding_str (encoding)) ;
+
+	switch (encoding)
+	{	case IRCAM_PCM_16 :
+				psf->bytewidth = 2 ;
+				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+
+				psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_16 ;
+				break ;
+
+		case IRCAM_PCM_32 :
+				psf->bytewidth = 4 ;
+				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+
+				psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_32 ;
+				break ;
+
+		case IRCAM_FLOAT :
+				psf->bytewidth = 4 ;
+				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+
+				psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_FLOAT ;
+				break ;
+
+		case IRCAM_ALAW :
+				psf->bytewidth = 1 ;
+				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+
+				psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_ALAW ;
+				break ;
+
+		case IRCAM_ULAW :
+				psf->bytewidth = 1 ;
+				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+
+				psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_ULAW ;
+				break ;
+
+		default :
+				error = SFE_IRCAM_UNKNOWN_FORMAT ;
+				break ;
+		} ;
+
+	if (psf->endian == SF_ENDIAN_BIG)
+		psf->sf.format |= SF_ENDIAN_BIG ;
+	else
+		psf->sf.format |= SF_ENDIAN_LITTLE ;
+
+	if (error)
+		return error ;
+
+	psf->dataoffset = IRCAM_DATA_OFFSET ;
+	psf->datalength = psf->filelength - psf->dataoffset ;
+
+	if (psf->sf.frames == 0 && psf->blockwidth)
+		psf->sf.frames = psf->datalength / psf->blockwidth ;
+
+	psf_log_printf (psf, "  Samples     : %d\n", psf->sf.frames) ;
+
+	psf_binheader_readf (psf, "p", IRCAM_DATA_OFFSET) ;
+
+	return 0 ;
+} /* ircam_read_header */
+
+static int
+ircam_close	(SF_PRIVATE *psf)
+{
+	psf_log_printf (psf, "close\n") ;
+
+	return 0 ;
+} /* ircam_close */
+
+static int
+ircam_write_header (SF_PRIVATE *psf, int UNUSED (calc_length))
+{	int			encoding ;
+	float		samplerate ;
+	sf_count_t	current ;
+
+	if (psf->pipeoffset > 0)
+		return 0 ;
+
+	current = psf_ftell (psf) ;
+
+	/* This also sets psf->endian. */
+	encoding = get_encoding (SF_CODEC (psf->sf.format)) ;
+
+	if (encoding == 0)
+		return SFE_BAD_OPEN_FORMAT ;
+
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+
+	if (psf->is_pipe == SF_FALSE)
+		psf_fseek (psf, 0, SEEK_SET) ;
+
+	samplerate = psf->sf.samplerate ;
+
+	switch (psf->endian)
+	{	case SF_ENDIAN_BIG :
+			psf_binheader_writef (psf, "Emf", IRCAM_02B_MARKER, samplerate) ;
+			psf_binheader_writef (psf, "E44", psf->sf.channels, encoding) ;
+			break ;
+
+		case SF_ENDIAN_LITTLE :
+			psf_binheader_writef (psf, "emf", IRCAM_03L_MARKER, samplerate) ;
+			psf_binheader_writef (psf, "e44", psf->sf.channels, encoding) ;
+			break ;
+
+		default : return SFE_BAD_OPEN_FORMAT ;
+		} ;
+
+	psf_binheader_writef (psf, "z", (size_t) (IRCAM_DATA_OFFSET - psf->headindex)) ;
+
+	/* Header construction complete so write it out. */
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+
+	if (psf->error)
+		return psf->error ;
+
+	if (current > 0)
+		psf_fseek (psf, current, SEEK_SET) ;
+
+	return psf->error ;
+} /* ircam_write_header */
+
+static int
+get_encoding (int subformat)
+{	switch (subformat)
+	{	case SF_FORMAT_PCM_16 :	return IRCAM_PCM_16 ;
+		case SF_FORMAT_PCM_32 :	return IRCAM_PCM_32 ;
+
+		case SF_FORMAT_FLOAT :	return IRCAM_FLOAT ;
+
+		case SF_FORMAT_ULAW :	return IRCAM_ULAW ;
+		case SF_FORMAT_ALAW :	return IRCAM_ALAW ;
+
+		default : break ;
+		} ;
+
+	return 0 ;
+} /* get_encoding */
+
+static const 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 */
+
diff --git a/jni/libsndfile-1.0.25/src/ircam.lo b/jni/libsndfile-1.0.25/src/ircam.lo
new file mode 100644
index 0000000..e7ab61c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ircam.lo
@@ -0,0 +1,12 @@
+# ircam.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/ircam.o'
+
+# Name of the non-PIC object
+non_pic_object='ircam.o'
+
diff --git a/jni/libsndfile-1.0.25/src/ircam.o b/jni/libsndfile-1.0.25/src/ircam.o
new file mode 100644
index 0000000..d802633
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ircam.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/libcommon.la b/jni/libsndfile-1.0.25/src/libcommon.la
new file mode 100644
index 0000000..669e825
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/libcommon.la
@@ -0,0 +1,41 @@
+# libcommon.la - a libtool library file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname=''
+
+# Names of this library.
+library_names=''
+
+# The name of the static archive.
+old_library='libcommon.a'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags=''
+
+# Libraries that this one depends upon.
+dependency_libs=' -lm'
+
+# Names of additional weak libraries provided by this library
+weak_library_names=''
+
+# Version information for libcommon.
+current=
+age=
+revision=
+
+# Is this an already installed library?
+installed=no
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=no
+
+# Files to dlopen/dlpreopen
+dlopen=''
+dlpreopen=''
+
+# Directory that this library needs to be installed in:
+libdir=''
diff --git a/jni/libsndfile-1.0.25/src/libsndfile-1.def b/jni/libsndfile-1.0.25/src/libsndfile-1.def
new file mode 100644
index 0000000..93cab02
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/libsndfile-1.def
@@ -0,0 +1,41 @@
+; Auto-generated by create_symbols_file.py
+
+LIBRARY libsndfile-1.dll
+EXPORTS
+
+sf_command           @1
+sf_open              @2
+sf_close             @3
+sf_seek              @4
+sf_error             @7
+sf_perror            @8
+sf_error_str         @9
+sf_error_number      @10
+sf_format_check      @11
+sf_read_raw          @16
+sf_readf_short       @17
+sf_readf_int         @18
+sf_readf_float       @19
+sf_readf_double      @20
+sf_read_short        @21
+sf_read_int          @22
+sf_read_float        @23
+sf_read_double       @24
+sf_write_raw         @32
+sf_writef_short      @33
+sf_writef_int        @34
+sf_writef_float      @35
+sf_writef_double     @36
+sf_write_short       @37
+sf_write_int         @38
+sf_write_float       @39
+sf_write_double      @40
+sf_strerror          @50
+sf_get_string        @60
+sf_set_string        @61
+sf_version_string    @68
+sf_open_fd           @70
+sf_wchar_open        @71
+sf_open_virtual      @80
+sf_write_sync        @90
+
diff --git a/jni/libsndfile-1.0.25/src/libsndfile.la b/jni/libsndfile-1.0.25/src/libsndfile.la
new file mode 100644
index 0000000..8be9d07
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/libsndfile.la
@@ -0,0 +1,41 @@
+# libsndfile.la - a libtool library file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='libsndfile.so.1'
+
+# Names of this library.
+library_names='libsndfile.so.1.0.25 libsndfile.so.1 libsndfile.so'
+
+# The name of the static archive.
+old_library='libsndfile.a'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags=''
+
+# Libraries that this one depends upon.
+dependency_libs=' -lFLAC -lvorbisenc -lvorbis -logg -lm'
+
+# Names of additional weak libraries provided by this library
+weak_library_names=''
+
+# Version information for libsndfile.
+current=1
+age=0
+revision=25
+
+# Is this an already installed library?
+installed=no
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=no
+
+# Files to dlopen/dlpreopen
+dlopen=''
+dlpreopen=''
+
+# Directory that this library needs to be installed in:
+libdir='/usr/local/lib'
diff --git a/jni/libsndfile-1.0.25/src/macbinary3.c b/jni/libsndfile-1.0.25/src/macbinary3.c
new file mode 100644
index 0000000..184cc18
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/macbinary3.c
@@ -0,0 +1,45 @@
+/*
+** Copyright (C) 2003-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdlib.h>
+#include	<string.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+#if (OS_IS_MACOSX == 1)
+
+int
+macbinary3_open (SF_PRIVATE * UNUSED (psf))
+{
+	return 0 ;
+} /* macbinary3_open */
+
+#else
+
+int
+macbinary3_open (SF_PRIVATE * UNUSED (psf))
+{
+	return 0 ;
+} /* macbinary3_open */
+
+#endif /* OS_IS_MACOSX */
+
diff --git a/jni/libsndfile-1.0.25/src/macbinary3.lo b/jni/libsndfile-1.0.25/src/macbinary3.lo
new file mode 100644
index 0000000..e72957d
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/macbinary3.lo
@@ -0,0 +1,12 @@
+# macbinary3.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/macbinary3.o'
+
+# Name of the non-PIC object
+non_pic_object='macbinary3.o'
+
diff --git a/jni/libsndfile-1.0.25/src/macbinary3.o b/jni/libsndfile-1.0.25/src/macbinary3.o
new file mode 100644
index 0000000..c982704
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/macbinary3.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/macos.c b/jni/libsndfile-1.0.25/src/macos.c
new file mode 100644
index 0000000..5f6c531
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/macos.c
@@ -0,0 +1,51 @@
+/*
+** Copyright (C) 2003-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdlib.h>
+#include	<string.h>
+#include	<sys/stat.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+#define	STR_MARKER	MAKE_MARKER ('S', 'T', 'R', ' ')
+
+int
+macos_guess_file_type (SF_PRIVATE * psf, const char *filename)
+{	static char rsrc_name [1024] ;
+	struct stat statbuf ;
+
+	snprintf (rsrc_name, sizeof (rsrc_name), "%s/rsrc", filename) ;
+
+	/* If there is no resource fork, just return. */
+	if (stat (rsrc_name, &statbuf) != 0)
+	{	psf_log_printf (psf, "No resource fork.\n") ;
+		return 0 ;
+		} ;
+
+	if (statbuf.st_size == 0)
+	{	psf_log_printf (psf, "Have zero size resource fork.\n") ;
+		return 0 ;
+		} ;
+
+	return 0 ;
+} /* macos_guess_file_type */
+
diff --git a/jni/libsndfile-1.0.25/src/macos.lo b/jni/libsndfile-1.0.25/src/macos.lo
new file mode 100644
index 0000000..4bfed34
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/macos.lo
@@ -0,0 +1,12 @@
+# macos.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/macos.o'
+
+# Name of the non-PIC object
+non_pic_object='macos.o'
+
diff --git a/jni/libsndfile-1.0.25/src/macos.o b/jni/libsndfile-1.0.25/src/macos.o
new file mode 100644
index 0000000..b89e5f0
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/macos.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/make-static-lib-hidden-privates.sh b/jni/libsndfile-1.0.25/src/make-static-lib-hidden-privates.sh
new file mode 100755
index 0000000..5bfd485
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/make-static-lib-hidden-privates.sh
@@ -0,0 +1,14 @@
+#!/bin/bash -e
+
+# This script takes a static library and removes all non-public symbols.
+# Ie, it makes a static lib whose symbols are far less likely to clash with
+# the symbols of another shared or static library.
+
+grep sf_ Symbols.gnu-binutils | sed -e "s/[ ;]//g" > Symbols.static
+
+ld -r --whole-archive .libs/libsndfile.a -o libsndfile_a.o
+
+objcopy --keep-global-symbols=Symbols.static libsndfile_a.o libsndfile.o
+
+rm -f libsndfile.a
+ar cru libsndfile.a libsndfile.o
diff --git a/jni/libsndfile-1.0.25/src/mat4.c b/jni/libsndfile-1.0.25/src/mat4.c
new file mode 100644
index 0000000..3471e34
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/mat4.c
@@ -0,0 +1,389 @@
+/*
+** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+#include	<math.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+/*------------------------------------------------------------------------------
+** Information on how to decode and encode this file was obtained in a PDF
+** file which I found on http://www.wotsit.org/.
+** Also did a lot of testing with GNU Octave but do not have access to
+** Matlab (tm) and so could not test it there.
+*/
+
+/*------------------------------------------------------------------------------
+** Macros to handle big/little endian issues.
+*/
+
+#define MAT4_BE_DOUBLE	(MAKE_MARKER (0, 0, 0x03, 0xE8))
+#define MAT4_LE_DOUBLE	(MAKE_MARKER (0, 0, 0, 0))
+
+#define MAT4_BE_FLOAT	(MAKE_MARKER (0, 0, 0x03, 0xF2))
+#define MAT4_LE_FLOAT	(MAKE_MARKER (0x0A, 0, 0, 0))
+
+#define MAT4_BE_PCM_32	(MAKE_MARKER (0, 0, 0x03, 0xFC))
+#define MAT4_LE_PCM_32	(MAKE_MARKER (0x14, 0, 0, 0))
+
+#define MAT4_BE_PCM_16	(MAKE_MARKER (0, 0, 0x04, 0x06))
+#define MAT4_LE_PCM_16	(MAKE_MARKER (0x1E, 0, 0, 0))
+
+/* Can't see any reason to ever implement this. */
+#define MAT4_BE_PCM_U8	(MAKE_MARKER (0, 0, 0x04, 0x1A))
+#define MAT4_LE_PCM_U8	(MAKE_MARKER (0x32, 0, 0, 0))
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static	int		mat4_close		(SF_PRIVATE *psf) ;
+
+static	int 	mat4_format_to_encoding	(int format, int endian) ;
+
+static int		mat4_write_header (SF_PRIVATE *psf, int calc_length) ;
+static int		mat4_read_header (SF_PRIVATE *psf) ;
+
+static const char * mat4_marker_to_str (int marker) ;
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+mat4_open	(SF_PRIVATE *psf)
+{	int		subformat, error = 0 ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = mat4_read_header (psf)))
+			return error ;
+		} ;
+
+	if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_MAT4)
+		return	SFE_BAD_OPEN_FORMAT ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	if (psf->is_pipe)
+			return SFE_NO_PIPE_WRITE ;
+
+		psf->endian = SF_ENDIAN (psf->sf.format) ;
+		if (CPU_IS_LITTLE_ENDIAN && (psf->endian == SF_ENDIAN_CPU || psf->endian == 0))
+			psf->endian = SF_ENDIAN_LITTLE ;
+		else if (CPU_IS_BIG_ENDIAN && (psf->endian == SF_ENDIAN_CPU || psf->endian == 0))
+			psf->endian = SF_ENDIAN_BIG ;
+
+		if ((error = mat4_write_header (psf, SF_FALSE)))
+			return error ;
+
+		psf->write_header = mat4_write_header ;
+		} ;
+
+	psf->container_close = mat4_close ;
+
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+	switch (subformat)
+	{	case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_32 :
+				error = pcm_init (psf) ;
+				break ;
+
+		case SF_FORMAT_FLOAT :
+				error = float32_init (psf) ;
+				break ;
+
+		case SF_FORMAT_DOUBLE :
+				error = double64_init (psf) ;
+				break ;
+
+		default : break ;
+		} ;
+
+	if (error)
+		return error ;
+
+	return error ;
+} /* mat4_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+mat4_close	(SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+		mat4_write_header (psf, SF_TRUE) ;
+
+	return 0 ;
+} /* mat4_close */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+mat4_write_header (SF_PRIVATE *psf, int calc_length)
+{	sf_count_t	current ;
+	int			encoding ;
+	double		samplerate ;
+
+	current = psf_ftell (psf) ;
+
+	if (calc_length)
+	{	psf->filelength = psf_get_filelen (psf) ;
+
+		psf->datalength = psf->filelength - psf->dataoffset ;
+		if (psf->dataend)
+			psf->datalength -= psf->filelength - psf->dataend ;
+
+		psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+		} ;
+
+	encoding = mat4_format_to_encoding (SF_CODEC (psf->sf.format), psf->endian) ;
+
+	if (encoding == -1)
+		return SFE_BAD_OPEN_FORMAT ;
+
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	psf_fseek (psf, 0, SEEK_SET) ;
+
+	/* Need sample rate as a double for writing to the header. */
+	samplerate = psf->sf.samplerate ;
+
+	if (psf->endian == SF_ENDIAN_BIG)
+	{	psf_binheader_writef (psf, "Em444", MAT4_BE_DOUBLE, 1, 1, 0) ;
+		psf_binheader_writef (psf, "E4bd", 11, "samplerate", make_size_t (11), samplerate) ;
+		psf_binheader_writef (psf, "tEm484", encoding, psf->sf.channels, psf->sf.frames, 0) ;
+		psf_binheader_writef (psf, "E4b", 9, "wavedata", make_size_t (9)) ;
+		}
+	else if (psf->endian == SF_ENDIAN_LITTLE)
+	{	psf_binheader_writef (psf, "em444", MAT4_LE_DOUBLE, 1, 1, 0) ;
+		psf_binheader_writef (psf, "e4bd", 11, "samplerate", make_size_t (11), samplerate) ;
+		psf_binheader_writef (psf, "tem484", encoding, psf->sf.channels, psf->sf.frames, 0) ;
+		psf_binheader_writef (psf, "e4b", 9, "wavedata", make_size_t (9)) ;
+		}
+	else
+		return SFE_BAD_OPEN_FORMAT ;
+
+	/* Header construction complete so write it out. */
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+
+	if (psf->error)
+		return psf->error ;
+
+	psf->dataoffset = psf->headindex ;
+
+	if (current > 0)
+		psf_fseek (psf, current, SEEK_SET) ;
+
+	return psf->error ;
+} /* mat4_write_header */
+
+static int
+mat4_read_header (SF_PRIVATE *psf)
+{	int		marker, rows, cols, imag ;
+	unsigned namesize ;
+	double	value ;
+	const char *marker_str ;
+	char	name [64] ;
+
+	psf_binheader_readf (psf, "pm", 0, &marker) ;
+
+	/* MAT4 file must start with a double for the samplerate. */
+	if (marker == MAT4_BE_DOUBLE)
+	{	psf->endian = psf->rwf_endian = SF_ENDIAN_BIG ;
+		marker_str = "big endian double" ;
+		}
+	else if (marker == MAT4_LE_DOUBLE)
+	{	psf->endian = psf->rwf_endian = SF_ENDIAN_LITTLE ;
+		marker_str = "little endian double" ;
+		}
+	else
+		return SFE_UNIMPLEMENTED ;
+
+	psf_log_printf (psf, "GNU Octave 2.0 / MATLAB v4.2 format\nMarker : %s\n", marker_str) ;
+
+	psf_binheader_readf (psf, "444", &rows, &cols, &imag) ;
+
+	psf_log_printf (psf, " Rows  : %d\n Cols  : %d\n Imag  : %s\n", rows, cols, imag ? "True" : "False") ;
+
+	psf_binheader_readf (psf, "4", &namesize) ;
+
+	if (namesize >= SIGNED_SIZEOF (name))
+		return SFE_MAT4_BAD_NAME ;
+
+	psf_binheader_readf (psf, "b", name, namesize) ;
+	name [namesize] = 0 ;
+
+	psf_log_printf (psf, " Name  : %s\n", name) ;
+
+	psf_binheader_readf (psf, "d", &value) ;
+
+	snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), " Value : %f\n", value) ;
+	psf_log_printf (psf, psf->u.cbuf) ;
+
+	if ((rows != 1) || (cols != 1))
+		return SFE_MAT4_NO_SAMPLERATE ;
+
+	psf->sf.samplerate = lrint (value) ;
+
+	/* Now write out the audio data. */
+
+	psf_binheader_readf (psf, "m", &marker) ;
+
+	psf_log_printf (psf, "Marker : %s\n", mat4_marker_to_str (marker)) ;
+
+	psf_binheader_readf (psf, "444", &rows, &cols, &imag) ;
+
+	psf_log_printf (psf, " Rows  : %d\n Cols  : %d\n Imag  : %s\n", rows, cols, imag ? "True" : "False") ;
+
+	psf_binheader_readf (psf, "4", &namesize) ;
+
+	if (namesize >= SIGNED_SIZEOF (name))
+		return SFE_MAT4_BAD_NAME ;
+
+	psf_binheader_readf (psf, "b", name, namesize) ;
+	name [namesize] = 0 ;
+
+	psf_log_printf (psf, " Name  : %s\n", name) ;
+
+	psf->dataoffset = psf_ftell (psf) ;
+
+	if (rows == 0 && cols == 0)
+	{	psf_log_printf (psf, "*** Error : zero channel count.\n") ;
+		return SFE_CHANNEL_COUNT_ZERO ;
+		} ;
+
+	psf->sf.channels	= rows ;
+	psf->sf.frames		= cols ;
+
+	psf->sf.format = psf->endian | SF_FORMAT_MAT4 ;
+	switch (marker)
+	{	case MAT4_BE_DOUBLE :
+		case MAT4_LE_DOUBLE :
+				psf->sf.format |= SF_FORMAT_DOUBLE ;
+				psf->bytewidth = 8 ;
+				break ;
+
+		case MAT4_BE_FLOAT :
+		case MAT4_LE_FLOAT :
+				psf->sf.format |= SF_FORMAT_FLOAT ;
+				psf->bytewidth = 4 ;
+				break ;
+
+		case MAT4_BE_PCM_32	:
+		case MAT4_LE_PCM_32	:
+				psf->sf.format |= SF_FORMAT_PCM_32 ;
+				psf->bytewidth = 4 ;
+				break ;
+
+		case MAT4_BE_PCM_16	:
+		case MAT4_LE_PCM_16	:
+				psf->sf.format |= SF_FORMAT_PCM_16 ;
+				psf->bytewidth = 2 ;
+				break ;
+
+		default :
+				psf_log_printf (psf, "*** Error : Bad marker %08X\n", marker) ;
+				return SFE_UNIMPLEMENTED ;
+		} ;
+
+	if ((psf->filelength - psf->dataoffset) < psf->sf.channels * psf->sf.frames * psf->bytewidth)
+	{	psf_log_printf (psf, "*** File seems to be truncated. %D <--> %D\n",
+				psf->filelength - psf->dataoffset, psf->sf.channels * psf->sf.frames * psf->bytewidth) ;
+		}
+	else if ((psf->filelength - psf->dataoffset) > psf->sf.channels * psf->sf.frames * psf->bytewidth)
+		psf->dataend = psf->dataoffset + rows * cols * psf->bytewidth ;
+
+	psf->datalength = psf->filelength - psf->dataoffset - psf->dataend ;
+
+	psf->sf.sections = 1 ;
+
+	return 0 ;
+} /* mat4_read_header */
+
+static int
+mat4_format_to_encoding (int format, int endian)
+{
+	switch (format | endian)
+	{	case (SF_FORMAT_PCM_16 | SF_ENDIAN_BIG) :
+				return MAT4_BE_PCM_16 ;
+
+		case (SF_FORMAT_PCM_16 | SF_ENDIAN_LITTLE) :
+				return MAT4_LE_PCM_16 ;
+
+		case (SF_FORMAT_PCM_32 | SF_ENDIAN_BIG) :
+				return MAT4_BE_PCM_32 ;
+
+		case (SF_FORMAT_PCM_32 | SF_ENDIAN_LITTLE) :
+				return MAT4_LE_PCM_32 ;
+
+		case (SF_FORMAT_FLOAT | SF_ENDIAN_BIG) :
+				return MAT4_BE_FLOAT ;
+
+		case (SF_FORMAT_FLOAT | SF_ENDIAN_LITTLE) :
+				return MAT4_LE_FLOAT ;
+
+		case (SF_FORMAT_DOUBLE | SF_ENDIAN_BIG) :
+				return MAT4_BE_DOUBLE ;
+
+		case (SF_FORMAT_DOUBLE | SF_ENDIAN_LITTLE) :
+				return MAT4_LE_DOUBLE ;
+
+		default : break ;
+		} ;
+
+	return -1 ;
+} /* mat4_format_to_encoding */
+
+static const char *
+mat4_marker_to_str (int marker)
+{	static char str [32] ;
+
+	switch (marker)
+	{
+		case MAT4_BE_PCM_16	:	return "big endian 16 bit PCM" ;
+		case MAT4_LE_PCM_16	:	return "little endian 16 bit PCM" ;
+
+		case MAT4_BE_PCM_32	:	return "big endian 32 bit PCM" ;
+		case MAT4_LE_PCM_32	:	return "little endian 32 bit PCM" ;
+
+
+		case MAT4_BE_FLOAT :	return "big endian float" ;
+		case MAT4_LE_FLOAT :	return "big endian float" ;
+
+		case MAT4_BE_DOUBLE	:	return "big endian double" ;
+		case MAT4_LE_DOUBLE	:	return "little endian double" ;
+		} ;
+
+	/* This is a little unsafe but is really only for debugging. */
+	str [sizeof (str) - 1] = 0 ;
+	snprintf (str, sizeof (str) - 1, "%08X", marker) ;
+	return str ;
+} /* mat4_marker_to_str */
+
diff --git a/jni/libsndfile-1.0.25/src/mat4.lo b/jni/libsndfile-1.0.25/src/mat4.lo
new file mode 100644
index 0000000..fc6e63f
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/mat4.lo
@@ -0,0 +1,12 @@
+# mat4.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/mat4.o'
+
+# Name of the non-PIC object
+non_pic_object='mat4.o'
+
diff --git a/jni/libsndfile-1.0.25/src/mat4.o b/jni/libsndfile-1.0.25/src/mat4.o
new file mode 100644
index 0000000..9ac45c8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/mat4.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/mat5.c b/jni/libsndfile-1.0.25/src/mat5.c
new file mode 100644
index 0000000..338477e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/mat5.c
@@ -0,0 +1,501 @@
+/*
+** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+#include	<math.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+/*------------------------------------------------------------------------------
+** Information on how to decode and encode this file was obtained in a PDF
+** file which I found on http://www.wotsit.org/.
+** Also did a lot of testing with GNU Octave but do not have access to
+** Matlab (tm) and so could not test it there.
+*/
+
+/*------------------------------------------------------------------------------
+** Macros to handle big/little endian issues.
+*/
+
+#define MATL_MARKER	(MAKE_MARKER ('M', 'A', 'T', 'L'))
+
+#define IM_MARKER	(('I' << 8) + 'M')
+#define MI_MARKER	(('M' << 8) + 'I')
+
+/*------------------------------------------------------------------------------
+** Enums and typedefs.
+*/
+
+enum
+{	MAT5_TYPE_SCHAR			= 0x1,
+	MAT5_TYPE_UCHAR			= 0x2,
+	MAT5_TYPE_INT16			= 0x3,
+	MAT5_TYPE_UINT16		= 0x4,
+	MAT5_TYPE_INT32			= 0x5,
+	MAT5_TYPE_UINT32		= 0x6,
+	MAT5_TYPE_FLOAT			= 0x7,
+	MAT5_TYPE_DOUBLE		= 0x9,
+	MAT5_TYPE_ARRAY			= 0xE,
+
+	MAT5_TYPE_COMP_USHORT	= 0x00020004,
+	MAT5_TYPE_COMP_UINT		= 0x00040006
+} ;
+
+typedef struct
+{	sf_count_t	size ;
+	int			rows, cols ;
+	char		name [32] ;
+} MAT5_MATRIX ;
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static int		mat5_close		(SF_PRIVATE *psf) ;
+
+static int		mat5_write_header (SF_PRIVATE *psf, int calc_length) ;
+static int		mat5_read_header (SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+mat5_open	(SF_PRIVATE *psf)
+{	int		subformat, error = 0 ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = mat5_read_header (psf)))
+			return error ;
+		} ;
+
+	if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_MAT5)
+		return	SFE_BAD_OPEN_FORMAT ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	if (psf->is_pipe)
+			return SFE_NO_PIPE_WRITE ;
+
+		psf->endian = SF_ENDIAN (psf->sf.format) ;
+		if (CPU_IS_LITTLE_ENDIAN && (psf->endian == SF_ENDIAN_CPU || psf->endian == 0))
+			psf->endian = SF_ENDIAN_LITTLE ;
+		else if (CPU_IS_BIG_ENDIAN && (psf->endian == SF_ENDIAN_CPU || psf->endian == 0))
+			psf->endian = SF_ENDIAN_BIG ;
+
+		if ((error = mat5_write_header (psf, SF_FALSE)))
+			return error ;
+
+		psf->write_header = mat5_write_header ;
+		} ;
+
+	psf->container_close = mat5_close ;
+
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+	switch (subformat)
+	{	case SF_FORMAT_PCM_U8 :
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_32 :
+				error = pcm_init (psf) ;
+				break ;
+
+		case SF_FORMAT_FLOAT :
+				error = float32_init (psf) ;
+				break ;
+
+		case SF_FORMAT_DOUBLE :
+				error = double64_init (psf) ;
+				break ;
+
+		default : break ;
+		} ;
+
+	return error ;
+} /* mat5_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+mat5_close	(SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+		mat5_write_header (psf, SF_TRUE) ;
+
+	return 0 ;
+} /* mat5_close */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+mat5_write_header (SF_PRIVATE *psf, int calc_length)
+{	static const char	*filename = "MATLAB 5.0 MAT-file, written by " PACKAGE "-" VERSION ", " ;
+	static const char	*sr_name = "samplerate\0\0\0\0\0\0\0\0\0\0\0" ;
+	static const char	*wd_name = "wavedata\0" ;
+	sf_count_t	current, datasize ;
+	int			encoding ;
+
+	current = psf_ftell (psf) ;
+
+	if (calc_length)
+	{	psf_fseek (psf, 0, SEEK_END) ;
+		psf->filelength = psf_ftell (psf) ;
+		psf_fseek (psf, 0, SEEK_SET) ;
+
+		psf->datalength = psf->filelength - psf->dataoffset ;
+		if (psf->dataend)
+			psf->datalength -= psf->filelength - psf->dataend ;
+
+		psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+		} ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_U8 :
+				encoding = MAT5_TYPE_UCHAR ;
+				break ;
+
+		case SF_FORMAT_PCM_16 :
+				encoding = MAT5_TYPE_INT16 ;
+				break ;
+
+		case SF_FORMAT_PCM_32 :
+				encoding = MAT5_TYPE_INT32 ;
+				break ;
+
+		case SF_FORMAT_FLOAT :
+				encoding = MAT5_TYPE_FLOAT ;
+				break ;
+
+		case SF_FORMAT_DOUBLE :
+				encoding = MAT5_TYPE_DOUBLE ;
+				break ;
+
+		default :
+				return SFE_BAD_OPEN_FORMAT ;
+		} ;
+
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	psf_fseek (psf, 0, SEEK_SET) ;
+
+	psf_get_date_str (psf->u.cbuf, sizeof (psf->u.scbuf)) ;
+	psf_binheader_writef (psf, "bb", filename, strlen (filename), psf->u.cbuf, strlen (psf->u.cbuf) + 1) ;
+
+	memset (psf->u.scbuf, ' ', 124 - psf->headindex) ;
+	psf_binheader_writef (psf, "b", psf->u.scbuf, make_size_t (124 - psf->headindex)) ;
+
+	psf->rwf_endian = psf->endian ;
+
+	if (psf->rwf_endian == SF_ENDIAN_BIG)
+		psf_binheader_writef (psf, "2b", 0x0100, "MI", make_size_t (2)) ;
+	else
+		psf_binheader_writef (psf, "2b", 0x0100, "IM", make_size_t (2)) ;
+
+	psf_binheader_writef (psf, "444444", MAT5_TYPE_ARRAY, 64, MAT5_TYPE_UINT32, 8, 6, 0) ;
+	psf_binheader_writef (psf, "4444", MAT5_TYPE_INT32, 8, 1, 1) ;
+	psf_binheader_writef (psf, "44b", MAT5_TYPE_SCHAR, strlen (sr_name), sr_name, make_size_t (16)) ;
+
+	if (psf->sf.samplerate > 0xFFFF)
+		psf_binheader_writef (psf, "44", MAT5_TYPE_COMP_UINT, psf->sf.samplerate) ;
+	else
+	{	unsigned short samplerate = psf->sf.samplerate ;
+
+		psf_binheader_writef (psf, "422", MAT5_TYPE_COMP_USHORT, samplerate, 0) ;
+		} ;
+
+	datasize = psf->sf.frames * psf->sf.channels * psf->bytewidth ;
+
+	psf_binheader_writef (psf, "t484444", MAT5_TYPE_ARRAY, datasize + 64, MAT5_TYPE_UINT32, 8, 6, 0) ;
+	psf_binheader_writef (psf, "t4448", MAT5_TYPE_INT32, 8, psf->sf.channels, psf->sf.frames) ;
+	psf_binheader_writef (psf, "44b", MAT5_TYPE_SCHAR, strlen (wd_name), wd_name, strlen (wd_name)) ;
+
+	datasize = psf->sf.frames * psf->sf.channels * psf->bytewidth ;
+	if (datasize > 0x7FFFFFFF)
+		datasize = 0x7FFFFFFF ;
+
+	psf_binheader_writef (psf, "t48", encoding, datasize) ;
+
+	/* Header construction complete so write it out. */
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+
+	if (psf->error)
+		return psf->error ;
+
+	psf->dataoffset = psf->headindex ;
+
+	if (current > 0)
+		psf_fseek (psf, current, SEEK_SET) ;
+
+	return psf->error ;
+} /* mat5_write_header */
+
+static int
+mat5_read_header (SF_PRIVATE *psf)
+{	char	name [32] ;
+	short	version, endian ;
+	int		type, flags1, flags2, rows, cols ;
+	unsigned size ;
+
+	psf_binheader_readf (psf, "pb", 0, psf->u.cbuf, 124) ;
+
+	psf->u.scbuf [125] = 0 ;
+
+	if (strlen (psf->u.cbuf) >= 124)
+		return SFE_UNIMPLEMENTED ;
+
+	if (strstr (psf->u.cbuf, "MATLAB 5.0 MAT-file") == psf->u.cbuf)
+		psf_log_printf (psf, "%s\n", psf->u.scbuf) ;
+
+
+	psf_binheader_readf (psf, "E22", &version, &endian) ;
+
+	if (endian == MI_MARKER)
+	{	psf->endian = psf->rwf_endian = SF_ENDIAN_BIG ;
+		if (CPU_IS_LITTLE_ENDIAN) version = ENDSWAP_SHORT (version) ;
+		}
+	else if (endian == IM_MARKER)
+	{	psf->endian = psf->rwf_endian = SF_ENDIAN_LITTLE ;
+		if (CPU_IS_BIG_ENDIAN) version = ENDSWAP_SHORT (version) ;
+		}
+	else
+		return SFE_MAT5_BAD_ENDIAN ;
+
+	if ((CPU_IS_LITTLE_ENDIAN && endian == IM_MARKER) ||
+			(CPU_IS_BIG_ENDIAN && endian == MI_MARKER))
+		version = ENDSWAP_SHORT (version) ;
+
+	psf_log_printf (psf, "Version : 0x%04X\n", version) ;
+	psf_log_printf (psf, "Endian  : 0x%04X => %s\n", endian,
+				(psf->endian == SF_ENDIAN_LITTLE) ? "Little" : "Big") ;
+
+	/*========================================================*/
+	psf_binheader_readf (psf, "44", &type, &size) ;
+	psf_log_printf (psf, "Block\n Type : %X    Size : %d\n", type, size) ;
+
+	if (type != MAT5_TYPE_ARRAY)
+		return SFE_MAT5_NO_BLOCK ;
+
+	psf_binheader_readf (psf, "44", &type, &size) ;
+	psf_log_printf (psf, "    Type : %X    Size : %d\n", type, size) ;
+
+	if (type != MAT5_TYPE_UINT32)
+		return SFE_MAT5_NO_BLOCK ;
+
+	psf_binheader_readf (psf, "44", &flags1, &flags2) ;
+	psf_log_printf (psf, "    Flg1 : %X    Flg2 : %d\n", flags1, flags2) ;
+
+	psf_binheader_readf (psf, "44", &type, &size) ;
+	psf_log_printf (psf, "    Type : %X    Size : %d\n", type, size) ;
+
+	if (type != MAT5_TYPE_INT32)
+		return SFE_MAT5_NO_BLOCK ;
+
+	psf_binheader_readf (psf, "44", &rows, &cols) ;
+	psf_log_printf (psf, "    Rows : %X    Cols : %d\n", rows, cols) ;
+
+	if (rows != 1 || cols != 1)
+		return SFE_MAT5_SAMPLE_RATE ;
+
+	psf_binheader_readf (psf, "4", &type) ;
+
+	if (type == MAT5_TYPE_SCHAR)
+	{	psf_binheader_readf (psf, "4", &size) ;
+		psf_log_printf (psf, "    Type : %X    Size : %d\n", type, size) ;
+		if (size > SIGNED_SIZEOF (name) - 1)
+		{	psf_log_printf (psf, "Error : Bad name length.\n") ;
+			return SFE_MAT5_NO_BLOCK ;
+			} ;
+
+		psf_binheader_readf (psf, "bj", name, size, (8 - (size % 8)) % 8) ;
+		name [size] = 0 ;
+		}
+	else if ((type & 0xFFFF) == MAT5_TYPE_SCHAR)
+	{	size = type >> 16 ;
+		if (size > 4)
+		{	psf_log_printf (psf, "Error : Bad name length.\n") ;
+			return SFE_MAT5_NO_BLOCK ;
+			} ;
+
+		psf_log_printf (psf, "    Type : %X\n", type) ;
+		psf_binheader_readf (psf, "4", &name) ;
+		name [size] = 0 ;
+		}
+	else
+		return SFE_MAT5_NO_BLOCK ;
+
+	psf_log_printf (psf, "    Name : %s\n", name) ;
+
+	/*-----------------------------------------*/
+
+	psf_binheader_readf (psf, "44", &type, &size) ;
+
+	switch (type)
+	{	case MAT5_TYPE_DOUBLE :
+				{	double	samplerate ;
+
+					psf_binheader_readf (psf, "d", &samplerate) ;
+					snprintf (name, sizeof (name), "%f\n", samplerate) ;
+					psf_log_printf (psf, "    Val  : %s\n", name) ;
+
+					psf->sf.samplerate = lrint (samplerate) ;
+					} ;
+				break ;
+
+		case MAT5_TYPE_COMP_USHORT :
+				{	unsigned short samplerate ;
+
+					psf_binheader_readf (psf, "j2j", -4, &samplerate, 2) ;
+					psf_log_printf (psf, "    Val  : %u\n", samplerate) ;
+					psf->sf.samplerate = samplerate ;
+					}
+				break ;
+
+		case MAT5_TYPE_COMP_UINT :
+				psf_log_printf (psf, "    Val  : %u\n", size) ;
+				psf->sf.samplerate = size ;
+				break ;
+
+		default :
+			psf_log_printf (psf, "    Type : %X    Size : %d  ***\n", type, size) ;
+			return SFE_MAT5_SAMPLE_RATE ;
+		} ;
+
+	/*-----------------------------------------*/
+
+
+	psf_binheader_readf (psf, "44", &type, &size) ;
+	psf_log_printf (psf, " Type : %X    Size : %d\n", type, size) ;
+
+	if (type != MAT5_TYPE_ARRAY)
+		return SFE_MAT5_NO_BLOCK ;
+
+	psf_binheader_readf (psf, "44", &type, &size) ;
+	psf_log_printf (psf, "    Type : %X    Size : %d\n", type, size) ;
+
+	if (type != MAT5_TYPE_UINT32)
+		return SFE_MAT5_NO_BLOCK ;
+
+	psf_binheader_readf (psf, "44", &flags1, &flags2) ;
+	psf_log_printf (psf, "    Flg1 : %X    Flg2 : %d\n", flags1, flags2) ;
+
+	psf_binheader_readf (psf, "44", &type, &size) ;
+	psf_log_printf (psf, "    Type : %X    Size : %d\n", type, size) ;
+
+	if (type != MAT5_TYPE_INT32)
+		return SFE_MAT5_NO_BLOCK ;
+
+	psf_binheader_readf (psf, "44", &rows, &cols) ;
+	psf_log_printf (psf, "    Rows : %X    Cols : %d\n", rows, cols) ;
+
+	psf_binheader_readf (psf, "4", &type) ;
+
+	if (type == MAT5_TYPE_SCHAR)
+	{	psf_binheader_readf (psf, "4", &size) ;
+		psf_log_printf (psf, "    Type : %X    Size : %d\n", type, size) ;
+		if (size > SIGNED_SIZEOF (name) - 1)
+		{	psf_log_printf (psf, "Error : Bad name length.\n") ;
+			return SFE_MAT5_NO_BLOCK ;
+			} ;
+
+		psf_binheader_readf (psf, "bj", name, size, (8 - (size % 8)) % 8) ;
+		name [size] = 0 ;
+		}
+	else if ((type & 0xFFFF) == MAT5_TYPE_SCHAR)
+	{	size = type >> 16 ;
+		if (size > 4)
+		{	psf_log_printf (psf, "Error : Bad name length.\n") ;
+			return SFE_MAT5_NO_BLOCK ;
+			} ;
+
+		psf_log_printf (psf, "    Type : %X\n", type) ;
+		psf_binheader_readf (psf, "4", &name) ;
+		name [size] = 0 ;
+		}
+	else
+		return SFE_MAT5_NO_BLOCK ;
+
+	psf_log_printf (psf, "    Name : %s\n", name) ;
+
+	psf_binheader_readf (psf, "44", &type, &size) ;
+	psf_log_printf (psf, "    Type : %X    Size : %d\n", type, size) ;
+
+	/*++++++++++++++++++++++++++++++++++++++++++++++++++*/
+
+	if (rows == 0 && cols == 0)
+	{	psf_log_printf (psf, "*** Error : zero channel count.\n") ;
+		return SFE_CHANNEL_COUNT_ZERO ;
+		} ;
+
+	psf->sf.channels	= rows ;
+	psf->sf.frames		= cols ;
+
+	psf->sf.format = psf->endian | SF_FORMAT_MAT5 ;
+
+	switch (type)
+	{	case MAT5_TYPE_DOUBLE :
+				psf_log_printf (psf, "Data type : double\n") ;
+				psf->sf.format |= SF_FORMAT_DOUBLE ;
+				psf->bytewidth = 8 ;
+				break ;
+
+		case MAT5_TYPE_FLOAT :
+				psf_log_printf (psf, "Data type : float\n") ;
+				psf->sf.format |= SF_FORMAT_FLOAT ;
+				psf->bytewidth = 4 ;
+				break ;
+
+		case MAT5_TYPE_INT32 :
+				psf_log_printf (psf, "Data type : 32 bit PCM\n") ;
+				psf->sf.format |= SF_FORMAT_PCM_32 ;
+				psf->bytewidth = 4 ;
+				break ;
+
+		case MAT5_TYPE_INT16 :
+				psf_log_printf (psf, "Data type : 16 bit PCM\n") ;
+				psf->sf.format |= SF_FORMAT_PCM_16 ;
+				psf->bytewidth = 2 ;
+				break ;
+
+		case MAT5_TYPE_UCHAR :
+				psf_log_printf (psf, "Data type : unsigned 8 bit PCM\n") ;
+				psf->sf.format |= SF_FORMAT_PCM_U8 ;
+				psf->bytewidth = 1 ;
+				break ;
+
+		default :
+				psf_log_printf (psf, "*** Error : Bad marker %08X\n", type) ;
+				return SFE_UNIMPLEMENTED ;
+		} ;
+
+	psf->dataoffset = psf_ftell (psf) ;
+	psf->datalength = psf->filelength - psf->dataoffset ;
+
+	return 0 ;
+} /* mat5_read_header */
+
diff --git a/jni/libsndfile-1.0.25/src/mat5.lo b/jni/libsndfile-1.0.25/src/mat5.lo
new file mode 100644
index 0000000..ac3bc67
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/mat5.lo
@@ -0,0 +1,12 @@
+# mat5.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/mat5.o'
+
+# Name of the non-PIC object
+non_pic_object='mat5.o'
+
diff --git a/jni/libsndfile-1.0.25/src/mat5.o b/jni/libsndfile-1.0.25/src/mat5.o
new file mode 100644
index 0000000..1b9939a
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/mat5.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/mpc2k.c b/jni/libsndfile-1.0.25/src/mpc2k.c
new file mode 100644
index 0000000..0170f7c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/mpc2k.c
@@ -0,0 +1,204 @@
+/*
+** Copyright (C) 2008-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "sndfile.h"
+#include "sfendian.h"
+#include "common.h"
+
+/*
+**	Info from Olivier Tristan <o.tristan@ultimatesoundbank.com>
+**
+**	HEADER
+**	2 magic bytes: 1 and 4.
+**	17 char for the name of the sample.
+**	3 bytes: level, tune and channels (0 for channels is mono while 1 is stereo)
+**	4 uint32: sampleStart, loopEnd, sampleFrames and loopLength
+**	1 byte: loopMode (0 no loop, 1 forward looping)
+**	1 byte: number of beat in loop
+**	1 uint16: sampleRate
+**
+**	DATA
+**	Data are always non compressed 16 bits interleaved
+*/
+
+#define HEADER_LENGTH		42	/* Sum of above data fields. */
+#define HEADER_NAME_LEN		17	/* Length of name string. */
+
+#define	SFE_MPC_NO_MARKER	666
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static	int		mpc2k_close		(SF_PRIVATE *psf) ;
+
+static int		mpc2k_write_header (SF_PRIVATE *psf, int calc_length) ;
+static int		mpc2k_read_header (SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+mpc2k_open	(SF_PRIVATE *psf)
+{	int		error = 0 ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = mpc2k_read_header (psf)))
+			return error ;
+		} ;
+
+	if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_MPC2K)
+		return	SFE_BAD_OPEN_FORMAT ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	if (mpc2k_write_header (psf, SF_FALSE))
+			return psf->error ;
+
+		psf->write_header = mpc2k_write_header ;
+		} ;
+
+	psf->container_close = mpc2k_close ;
+
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+	error = pcm_init (psf) ;
+
+	return error ;
+} /* mpc2k_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+mpc2k_close	(SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+		mpc2k_write_header (psf, SF_TRUE) ;
+
+	return 0 ;
+} /* mpc2k_close */
+
+static int
+mpc2k_write_header (SF_PRIVATE *psf, int calc_length)
+{	char sample_name [HEADER_NAME_LEN + 1] ;
+	sf_count_t	current ;
+
+	if (psf->pipeoffset > 0)
+		return 0 ;
+
+	current = psf_ftell (psf) ;
+
+	if (calc_length)
+	{	psf->filelength = psf_get_filelen (psf) ;
+
+		psf->dataoffset = HEADER_LENGTH ;
+		psf->datalength = psf->filelength - psf->dataoffset ;
+
+		psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+		} ;
+
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+
+	/*
+	** Only attempt to seek if we are not writng to a pipe. If we are
+	** writing to a pipe we shouldn't be here anyway.
+	*/
+	if (psf->is_pipe == SF_FALSE)
+		psf_fseek (psf, 0, SEEK_SET) ;
+
+	snprintf (sample_name, sizeof (sample_name), "%s                    ", psf->file.name.c) ;
+
+	psf_binheader_writef (psf, "e11b", 1, 4, sample_name, make_size_t (HEADER_NAME_LEN)) ;
+	psf_binheader_writef (psf, "e111", 100, 0, (psf->sf.channels - 1) & 1) ;
+	psf_binheader_writef (psf, "et4888", 0, psf->sf.frames, psf->sf.frames, psf->sf.frames) ;
+	psf_binheader_writef (psf, "e112", 0, 1, (uint16_t) psf->sf.samplerate) ;
+
+	/* Always 16 bit little endian data. */
+	psf->bytewidth = 2 ;
+	psf->endian = SF_ENDIAN_LITTLE ;
+
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+
+	if (psf->error)
+		return psf->error ;
+
+	psf->dataoffset = psf->headindex ;
+
+	if (current > 0)
+		psf_fseek (psf, current, SEEK_SET) ;
+
+	return psf->error ;
+} /* mpc2k_write_header */
+
+static int
+mpc2k_read_header (SF_PRIVATE *psf)
+{	char sample_name [HEADER_NAME_LEN + 1] ;
+	unsigned char bytes [4] ;
+	uint32_t sample_start, loop_end, sample_frames, loop_length ;
+	uint16_t sample_rate ;
+
+	psf_binheader_readf (psf, "pebb", 0, bytes, 2, sample_name, make_size_t (HEADER_NAME_LEN)) ;
+
+	if (bytes [0] != 1 || bytes [1] != 4)
+		return SFE_MPC_NO_MARKER ;
+
+	sample_name [HEADER_NAME_LEN] = 0 ;
+
+	psf_log_printf (psf, "MPC2000\n  Name         : %s\n", sample_name) ;
+
+	psf_binheader_readf (psf, "eb4444", bytes, 3, &sample_start, &loop_end, &sample_frames, &loop_length) ;
+
+	psf->sf.channels = bytes [2] ? 2 : 1 ;
+
+	psf_log_printf (psf, "  Level        : %d\n  Tune         : %d\n  Stereo       : %s\n", bytes [0], bytes [1], bytes [2] ? "Yes" : "No") ;
+
+	psf_log_printf (psf, "  Sample start : %d\n  Loop end     : %d\n  Frames       : %d\n  Length       : %d\n", sample_start, loop_end, sample_frames, loop_length) ;
+
+	psf_binheader_readf (psf, "eb2", bytes, 2, &sample_rate) ;
+
+	psf_log_printf (psf, "  Loop mode    : %s\n  Beats        : %d\n  Sample rate  : %d\nEnd\n", bytes [0] ? "None" : "Fwd", bytes [1], sample_rate) ;
+
+	psf->sf.samplerate = sample_rate ;
+
+	psf->sf.format = SF_FORMAT_MPC2K | SF_FORMAT_PCM_16 ;
+
+	psf->dataoffset = psf_ftell (psf) ;
+
+	/* Always 16 bit little endian data. */
+	psf->bytewidth = 2 ;
+	psf->endian = SF_ENDIAN_LITTLE ;
+
+	psf->datalength = psf->filelength - psf->dataoffset ;
+	psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+	psf->sf.frames = psf->datalength / psf->blockwidth ;
+
+	psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ;
+
+	return 0 ;
+} /* mpc2k_read_header */
+
diff --git a/jni/libsndfile-1.0.25/src/mpc2k.lo b/jni/libsndfile-1.0.25/src/mpc2k.lo
new file mode 100644
index 0000000..817bdc4
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/mpc2k.lo
@@ -0,0 +1,12 @@
+# mpc2k.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/mpc2k.o'
+
+# Name of the non-PIC object
+non_pic_object='mpc2k.o'
+
diff --git a/jni/libsndfile-1.0.25/src/mpc2k.o b/jni/libsndfile-1.0.25/src/mpc2k.o
new file mode 100644
index 0000000..a71b685
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/mpc2k.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/ms_adpcm.c b/jni/libsndfile-1.0.25/src/ms_adpcm.c
new file mode 100644
index 0000000..7d04f85
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ms_adpcm.c
@@ -0,0 +1,834 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<stdlib.h>
+#include	<string.h>
+#include	<math.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+#include	"wav_w64.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
+{	int				channels, blocksize, samplesperblock, blocks, dataremaining ;
+	int				blockcount ;
+	sf_count_t		samplecount ;
+	short			*samples ;
+	unsigned char	*block ;
+#if HAVE_FLEXIBLE_ARRAY
+	short			dummydata [] ; /* ISO C99 struct flexible array. */
+#else
+	short			dummydata [0] ; /* This is a hack an might not work. */
+#endif
+} MSADPCM_PRIVATE ;
+
+/*============================================================================================
+** MS ADPCM static data and functions.
+*/
+
+static int AdaptationTable [] =
+{	230, 230, 230, 230, 307, 409, 512, 614,
+	768, 614, 512, 409, 307, 230, 230, 230
+} ;
+
+/* TODO : The first 7 coef's are are always hardcode and must
+   appear in the actual WAVE file.  They should be read in
+   in case a sound program added extras to the list. */
+
+static int AdaptCoeff1 [MSADPCM_ADAPT_COEFF_COUNT] =
+{	256, 512, 0, 192, 240, 460, 392
+} ;
+
+static int AdaptCoeff2 [MSADPCM_ADAPT_COEFF_COUNT] =
+{	0, -256, 0, 64, 0, -208, -232
+} ;
+
+/*============================================================================================
+**	MS ADPCM Block Layout.
+**	======================
+**	Block is usually 256, 512 or 1024 bytes depending on sample rate.
+**	For a mono file, the block is laid out as follows:
+**		byte	purpose
+**		0		block predictor [0..6]
+**		1,2		initial idelta (positive)
+**		3,4		sample 1
+**		5,6		sample 0
+**		7..n	packed bytecodes
+**
+**	For a stereo file, the block is laid out as follows:
+**		byte	purpose
+**		0		block predictor [0..6] for left channel
+**		1		block predictor [0..6] for right channel
+**		2,3		initial idelta (positive) for left channel
+**		4,5		initial idelta (positive) for right channel
+**		6,7		sample 1 for left channel
+**		8,9		sample 1 for right channel
+**		10,11	sample 0 for left channel
+**		12,13	sample 0 for right channel
+**		14..n	packed bytecodes
+*/
+
+/*============================================================================================
+** Static functions.
+*/
+
+static	int	msadpcm_decode_block	(SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) ;
+static sf_count_t msadpcm_read_block	(SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len) ;
+
+static	int	msadpcm_encode_block	(SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) ;
+static sf_count_t msadpcm_write_block	(SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, const short *ptr, int len) ;
+
+static sf_count_t	msadpcm_read_s	(SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	msadpcm_read_i	(SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	msadpcm_read_f	(SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	msadpcm_read_d	(SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t	msadpcm_write_s	(SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t	msadpcm_write_i	(SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t	msadpcm_write_f	(SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t	msadpcm_write_d	(SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+static sf_count_t msadpcm_seek	(SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+static	int	msadpcm_close	(SF_PRIVATE *psf) ;
+
+static	void	choose_predictor (unsigned int channels, short *data, int *bpred, int *idelta) ;
+
+/*============================================================================================
+** MS ADPCM Read Functions.
+*/
+
+int
+wav_w64_msadpcm_init	(SF_PRIVATE *psf, int blockalign, int samplesperblock)
+{	MSADPCM_PRIVATE	*pms ;
+	unsigned int	pmssize ;
+	int				count ;
+
+	if (psf->codec_data != NULL)
+	{	psf_log_printf (psf, "*** psf->codec_data is not NULL.\n") ;
+		return SFE_INTERNAL ;
+		} ;
+
+	if (psf->file.mode == SFM_WRITE)
+		samplesperblock = 2 + 2 * (blockalign - 7 * psf->sf.channels) / psf->sf.channels ;
+
+	pmssize = sizeof (MSADPCM_PRIVATE) + blockalign + 3 * psf->sf.channels * samplesperblock ;
+
+	if (! (psf->codec_data = calloc (1, pmssize)))
+		return SFE_MALLOC_FAILED ;
+	pms = (MSADPCM_PRIVATE*) psf->codec_data ;
+
+	pms->samples	= pms->dummydata ;
+	pms->block		= (unsigned char*) (pms->dummydata + psf->sf.channels * samplesperblock) ;
+
+	pms->channels	= psf->sf.channels ;
+	pms->blocksize	= blockalign ;
+	pms->samplesperblock = samplesperblock ;
+
+	if (pms->blocksize == 0)
+	{	psf_log_printf (psf, "*** Error : pms->blocksize should not be zero.\n") ;
+		return SFE_INTERNAL ;
+		} ;
+
+	if (psf->file.mode == SFM_READ)
+	{	pms->dataremaining	 = psf->datalength ;
+
+		if (psf->datalength % pms->blocksize)
+			pms->blocks = psf->datalength / pms->blocksize + 1 ;
+		else
+			pms->blocks = psf->datalength / pms->blocksize ;
+
+		count = 2 * (pms->blocksize - 6 * pms->channels) / pms->channels ;
+		if (pms->samplesperblock != count)
+		{	psf_log_printf (psf, "*** Error : samplesperblock should be %d.\n", count) ;
+			return SFE_INTERNAL ;
+			} ;
+
+		psf->sf.frames = (psf->datalength / pms->blocksize) * pms->samplesperblock ;
+
+		psf_log_printf (psf, " bpred   idelta\n") ;
+
+		msadpcm_decode_block (psf, pms) ;
+
+		psf->read_short		= msadpcm_read_s ;
+		psf->read_int		= msadpcm_read_i ;
+		psf->read_float		= msadpcm_read_f ;
+		psf->read_double	= msadpcm_read_d ;
+		} ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	pms->samples = pms->dummydata ;
+
+		pms->samplecount = 0 ;
+
+		psf->write_short	= msadpcm_write_s ;
+		psf->write_int		= msadpcm_write_i ;
+		psf->write_float	= msadpcm_write_f ;
+		psf->write_double	= msadpcm_write_d ;
+		} ;
+
+	psf->codec_close = msadpcm_close ;
+	psf->seek = msadpcm_seek ;
+
+	return 0 ;
+} /* wav_w64_msadpcm_init */
+
+static int
+msadpcm_decode_block	(SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
+{	int		chan, k, blockindx, sampleindx ;
+	short	bytecode, bpred [2], chan_idelta [2] ;
+
+    int predict ;
+    int current ;
+    int idelta ;
+
+	pms->blockcount ++ ;
+	pms->samplecount = 0 ;
+
+	if (pms->blockcount > pms->blocks)
+	{	memset (pms->samples, 0, pms->samplesperblock * pms->channels) ;
+		return 1 ;
+		} ;
+
+	if ((k = psf_fread (pms->block, 1, pms->blocksize, psf)) != pms->blocksize)
+		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pms->blocksize) ;
+
+	/* Read and check the block header. */
+
+	if (pms->channels == 1)
+	{	bpred [0] = pms->block [0] ;
+
+		if (bpred [0] >= 7)
+			psf_log_printf (psf, "MS ADPCM synchronisation error (%d).\n", bpred [0]) ;
+
+		chan_idelta [0] = pms->block [1] | (pms->block [2] << 8) ;
+		chan_idelta [1] = 0 ;
+
+		psf_log_printf (psf, "(%d) (%d)\n", bpred [0], chan_idelta [0]) ;
+
+		pms->samples [1] = pms->block [3] | (pms->block [4] << 8) ;
+		pms->samples [0] = pms->block [5] | (pms->block [6] << 8) ;
+		blockindx = 7 ;
+		}
+	else
+	{	bpred [0] = pms->block [0] ;
+		bpred [1] = pms->block [1] ;
+
+		if (bpred [0] >= 7 || bpred [1] >= 7)
+			psf_log_printf (psf, "MS ADPCM synchronisation error (%d %d).\n", bpred [0], bpred [1]) ;
+
+		chan_idelta [0] = pms->block [2] | (pms->block [3] << 8) ;
+		chan_idelta [1] = pms->block [4] | (pms->block [5] << 8) ;
+
+		psf_log_printf (psf, "(%d, %d) (%d, %d)\n", bpred [0], bpred [1], chan_idelta [0], chan_idelta [1]) ;
+
+		pms->samples [2] = pms->block [6] | (pms->block [7] << 8) ;
+		pms->samples [3] = pms->block [8] | (pms->block [9] << 8) ;
+
+		pms->samples [0] = pms->block [10] | (pms->block [11] << 8) ;
+		pms->samples [1] = pms->block [12] | (pms->block [13] << 8) ;
+
+		blockindx = 14 ;
+		} ;
+
+	/*--------------------------------------------------------
+	This was left over from a time when calculations were done
+	as ints rather than shorts. Keep this around as a reminder
+	in case I ever find a file which decodes incorrectly.
+
+    if (chan_idelta [0] & 0x8000)
+		chan_idelta [0] -= 0x10000 ;
+    if (chan_idelta [1] & 0x8000)
+		chan_idelta [1] -= 0x10000 ;
+	--------------------------------------------------------*/
+
+	/* Pull apart the packed 4 bit samples and store them in their
+	** correct sample positions.
+	*/
+
+	sampleindx = 2 * pms->channels ;
+	while (blockindx < pms->blocksize)
+	{	bytecode = pms->block [blockindx++] ;
+  		pms->samples [sampleindx++] = (bytecode >> 4) & 0x0F ;
+		pms->samples [sampleindx++] = bytecode & 0x0F ;
+		} ;
+
+	/* Decode the encoded 4 bit samples. */
+
+	for (k = 2 * pms->channels ; k < (pms->samplesperblock * pms->channels) ; k ++)
+	{	chan = (pms->channels > 1) ? (k % 2) : 0 ;
+
+		bytecode = pms->samples [k] & 0xF ;
+
+		/* Compute next Adaptive Scale Factor (ASF) */
+		idelta = chan_idelta [chan] ;
+		chan_idelta [chan] = (AdaptationTable [bytecode] * idelta) >> 8 ;	/* => / 256 => FIXED_POINT_ADAPTATION_BASE == 256 */
+		if (chan_idelta [chan] < 16)
+			chan_idelta [chan] = 16 ;
+		if (bytecode & 0x8)
+			bytecode -= 0x10 ;
+
+    	predict = ((pms->samples [k - pms->channels] * AdaptCoeff1 [bpred [chan]])
+					+ (pms->samples [k - 2 * pms->channels] * AdaptCoeff2 [bpred [chan]])) >> 8 ; /* => / 256 => FIXED_POINT_COEFF_BASE == 256 */
+		current = (bytecode * idelta) + predict ;
+
+		if (current > 32767)
+			current = 32767 ;
+		else if (current < -32768)
+			current = -32768 ;
+
+		pms->samples [k] = current ;
+		} ;
+
+	return 1 ;
+} /* msadpcm_decode_block */
+
+static sf_count_t
+msadpcm_read_block	(SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len)
+{	int	count, total = 0, indx = 0 ;
+
+	while (indx < len)
+	{	if (pms->blockcount >= pms->blocks && pms->samplecount >= pms->samplesperblock)
+		{	memset (&(ptr [indx]), 0, (size_t) ((len - indx) * sizeof (short))) ;
+			return total ;
+			} ;
+
+		if (pms->samplecount >= pms->samplesperblock)
+			msadpcm_decode_block (psf, pms) ;
+
+		count = (pms->samplesperblock - pms->samplecount) * pms->channels ;
+		count = (len - indx > count) ? count : len - indx ;
+
+		memcpy (&(ptr [indx]), &(pms->samples [pms->samplecount * pms->channels]), count * sizeof (short)) ;
+		indx += count ;
+		pms->samplecount += count / pms->channels ;
+		total = indx ;
+		} ;
+
+	return total ;
+} /* msadpcm_read_block */
+
+static sf_count_t
+msadpcm_read_s	(SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	MSADPCM_PRIVATE 	*pms ;
+	int			readcount, count ;
+	sf_count_t	total = 0 ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->codec_data ;
+
+	while (len > 0)
+	{	readcount = (len > 0x10000000) ? 0x10000000 : (int) len ;
+
+		count = msadpcm_read_block (psf, pms, ptr, readcount) ;
+
+		total += count ;
+		len -= count ;
+		if (count != readcount)
+			break ;
+		} ;
+
+	return total ;
+} /* msadpcm_read_s */
+
+static sf_count_t
+msadpcm_read_i	(SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	MSADPCM_PRIVATE *pms ;
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	sf_count_t	total = 0 ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->codec_data ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = msadpcm_read_block (psf, pms, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = sptr [k] << 16 ;
+		total += count ;
+		len -= readcount ;
+		if (count != readcount)
+			break ;
+		} ;
+	return total ;
+} /* msadpcm_read_i */
+
+static sf_count_t
+msadpcm_read_f	(SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	MSADPCM_PRIVATE *pms ;
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	sf_count_t	total = 0 ;
+	float		normfact ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = msadpcm_read_block (psf, pms, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = normfact * (float) (sptr [k]) ;
+		total += count ;
+		len -= readcount ;
+		if (count != readcount)
+			break ;
+		} ;
+	return total ;
+} /* msadpcm_read_f */
+
+static sf_count_t
+msadpcm_read_d	(SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	MSADPCM_PRIVATE *pms ;
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	sf_count_t	total = 0 ;
+	double 		normfact ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->codec_data ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = msadpcm_read_block (psf, pms, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = normfact * (double) (sptr [k]) ;
+		total += count ;
+		len -= readcount ;
+		if (count != readcount)
+			break ;
+		} ;
+	return total ;
+} /* msadpcm_read_d */
+
+static sf_count_t
+msadpcm_seek	(SF_PRIVATE *psf, int mode, sf_count_t offset)
+{	MSADPCM_PRIVATE *pms ;
+	int			newblock, newsample ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->codec_data ;
+
+	if (psf->datalength < 0 || psf->dataoffset < 0)
+	{	psf->error = SFE_BAD_SEEK ;
+		return	PSF_SEEK_ERROR ;
+		} ;
+
+	if (offset == 0)
+	{	psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+		pms->blockcount = 0 ;
+		msadpcm_decode_block (psf, pms) ;
+		pms->samplecount = 0 ;
+		return 0 ;
+		} ;
+
+	if (offset < 0 || offset > pms->blocks * pms->samplesperblock)
+	{	psf->error = SFE_BAD_SEEK ;
+		return	PSF_SEEK_ERROR ;
+		} ;
+
+	newblock	= offset / pms->samplesperblock ;
+	newsample	= offset % pms->samplesperblock ;
+
+	if (mode == SFM_READ)
+	{	psf_fseek (psf, psf->dataoffset + newblock * pms->blocksize, SEEK_SET) ;
+		pms->blockcount = newblock ;
+		msadpcm_decode_block (psf, pms) ;
+		pms->samplecount = newsample ;
+		}
+	else
+	{	/* What to do about write??? */
+		psf->error = SFE_BAD_SEEK ;
+		return	PSF_SEEK_ERROR ;
+		} ;
+
+	return newblock * pms->samplesperblock + newsample ;
+} /* msadpcm_seek */
+
+/*==========================================================================================
+** MS ADPCM Write Functions.
+*/
+
+void
+msadpcm_write_adapt_coeffs	(SF_PRIVATE *psf)
+{	int k ;
+
+	for (k = 0 ; k < MSADPCM_ADAPT_COEFF_COUNT ; k++)
+		psf_binheader_writef (psf, "22", AdaptCoeff1 [k], AdaptCoeff2 [k]) ;
+} /* msadpcm_write_adapt_coeffs */
+
+/*==========================================================================================
+*/
+
+static int
+msadpcm_encode_block	(SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
+{	unsigned int	blockindx ;
+	unsigned char	byte ;
+	int				chan, k, predict, bpred [2], idelta [2], errordelta, newsamp ;
+
+	choose_predictor (pms->channels, pms->samples, bpred, idelta) ;
+
+	/* Write the block header. */
+
+	if (pms->channels == 1)
+	{	pms->block [0]	= bpred [0] ;
+		pms->block [1]	= idelta [0] & 0xFF ;
+		pms->block [2]	= idelta [0] >> 8 ;
+		pms->block [3]	= pms->samples [1] & 0xFF ;
+		pms->block [4]	= pms->samples [1] >> 8 ;
+		pms->block [5]	= pms->samples [0] & 0xFF ;
+		pms->block [6]	= pms->samples [0] >> 8 ;
+
+		blockindx = 7 ;
+		byte = 0 ;
+
+		/* Encode the samples as 4 bit. */
+
+		for (k = 2 ; k < pms->samplesperblock ; k++)
+		{	predict = (pms->samples [k-1] * AdaptCoeff1 [bpred [0]] + pms->samples [k-2] * AdaptCoeff2 [bpred [0]]) >> 8 ;
+			errordelta = (pms->samples [k] - predict) / idelta [0] ;
+			if (errordelta < -8)
+				errordelta = -8 ;
+			else if (errordelta > 7)
+				errordelta = 7 ;
+			newsamp = predict + (idelta [0] * errordelta) ;
+			if (newsamp > 32767)
+				newsamp = 32767 ;
+			else if (newsamp < -32768)
+				newsamp = -32768 ;
+			if (errordelta < 0)
+				errordelta += 0x10 ;
+
+			byte = (byte << 4) | (errordelta & 0xF) ;
+			if (k % 2)
+			{	pms->block [blockindx++] = byte ;
+				byte = 0 ;
+				} ;
+
+			idelta [0] = (idelta [0] * AdaptationTable [errordelta]) >> 8 ;
+			if (idelta [0] < 16)
+				idelta [0] = 16 ;
+			pms->samples [k] = newsamp ;
+			} ;
+		}
+	else
+	{	/* Stereo file. */
+		pms->block [0]	= bpred [0] ;
+		pms->block [1]	= bpred [1] ;
+
+		pms->block [2]	= idelta [0] & 0xFF ;
+		pms->block [3]	= idelta [0] >> 8 ;
+		pms->block [4]	= idelta [1] & 0xFF ;
+		pms->block [5]	= idelta [1] >> 8 ;
+
+		pms->block [6]	= pms->samples [2] & 0xFF ;
+		pms->block [7]	= pms->samples [2] >> 8 ;
+		pms->block [8]	= pms->samples [3] & 0xFF ;
+		pms->block [9]	= pms->samples [3] >> 8 ;
+
+		pms->block [10]	= pms->samples [0] & 0xFF ;
+		pms->block [11]	= pms->samples [0] >> 8 ;
+		pms->block [12]	= pms->samples [1] & 0xFF ;
+		pms->block [13]	= pms->samples [1] >> 8 ;
+
+		blockindx = 14 ;
+		byte = 0 ;
+		chan = 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)
+				errordelta = 7 ;
+			newsamp = predict + (idelta [chan] * errordelta) ;
+			if (newsamp > 32767)
+				newsamp = 32767 ;
+			else if (newsamp < -32768)
+				newsamp = -32768 ;
+			if (errordelta < 0)
+				errordelta += 0x10 ;
+
+			byte = (byte << 4) | (errordelta & 0xF) ;
+
+			if (chan)
+			{	pms->block [blockindx++] = byte ;
+				byte = 0 ;
+				} ;
+
+			idelta [chan] = (idelta [chan] * AdaptationTable [errordelta]) >> 8 ;
+			if (idelta [chan] < 16)
+				idelta [chan] = 16 ;
+			pms->samples [k] = newsamp ;
+			} ;
+		} ;
+
+	/* Write the block to disk. */
+
+	if ((k = psf_fwrite (pms->block, 1, pms->blocksize, psf)) != pms->blocksize)
+		psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pms->blocksize) ;
+
+	memset (pms->samples, 0, pms->samplesperblock * sizeof (short)) ;
+
+	pms->blockcount ++ ;
+	pms->samplecount = 0 ;
+
+	return 1 ;
+} /* msadpcm_encode_block */
+
+static sf_count_t
+msadpcm_write_block	(SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, const short *ptr, int len)
+{	int		count, total = 0, indx = 0 ;
+
+	while (indx < len)
+	{	count = (pms->samplesperblock - pms->samplecount) * pms->channels ;
+
+		if (count > len - indx)
+			count = len - indx ;
+
+		memcpy (&(pms->samples [pms->samplecount * pms->channels]), &(ptr [total]), count * sizeof (short)) ;
+		indx += count ;
+		pms->samplecount += count / pms->channels ;
+		total = indx ;
+
+		if (pms->samplecount >= pms->samplesperblock)
+			msadpcm_encode_block (psf, pms) ;
+		} ;
+
+	return total ;
+} /* msadpcm_write_block */
+
+static sf_count_t
+msadpcm_write_s	(SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	MSADPCM_PRIVATE *pms ;
+	int			writecount, count ;
+	sf_count_t	total = 0 ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->codec_data ;
+
+	while (len > 0)
+	{	writecount = (len > 0x10000000) ? 0x10000000 : (int) len ;
+
+		count = msadpcm_write_block (psf, pms, ptr, writecount) ;
+
+		total += count ;
+		len -= count ;
+		if (count != writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* msadpcm_write_s */
+
+static sf_count_t
+msadpcm_write_i	(SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	MSADPCM_PRIVATE *pms ;
+	short		*sptr ;
+	int			k, bufferlen, writecount, count ;
+	sf_count_t	total = 0 ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->codec_data ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = ptr [total + k] >> 16 ;
+		count = msadpcm_write_block (psf, pms, sptr, writecount) ;
+		total += count ;
+		len -= writecount ;
+		if (count != writecount)
+			break ;
+		} ;
+	return total ;
+} /* msadpcm_write_i */
+
+static sf_count_t
+msadpcm_write_f	(SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	MSADPCM_PRIVATE *pms ;
+	short		*sptr ;
+	int			k, bufferlen, writecount, count ;
+	sf_count_t	total = 0 ;
+	float		normfact ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = lrintf (normfact * ptr [total + k]) ;
+		count = msadpcm_write_block (psf, pms, sptr, writecount) ;
+		total += count ;
+		len -= writecount ;
+		if (count != writecount)
+			break ;
+		} ;
+	return total ;
+} /* msadpcm_write_f */
+
+static sf_count_t
+msadpcm_write_d	(SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	MSADPCM_PRIVATE *pms ;
+	short		*sptr ;
+	int			k, bufferlen, writecount, count ;
+	sf_count_t	total = 0 ;
+	double 		normfact ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->codec_data ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = lrint (normfact * ptr [total + k]) ;
+		count = msadpcm_write_block (psf, pms, sptr, writecount) ;
+		total += count ;
+		len -= writecount ;
+		if (count != writecount)
+			break ;
+		} ;
+	return total ;
+} /* msadpcm_write_d */
+
+/*========================================================================================
+*/
+
+static int
+msadpcm_close	(SF_PRIVATE *psf)
+{	MSADPCM_PRIVATE *pms ;
+
+	pms = (MSADPCM_PRIVATE*) psf->codec_data ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	/*  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_encode_block (psf, pms) ;
+		} ;
+
+	return 0 ;
+} /* msadpcm_close */
+
+/*========================================================================================
+** Static functions.
+*/
+
+/*----------------------------------------------------------------------------------------
+**	Choosing the block predictor.
+**	Each block requires a predictor and an idelta for each channel.
+**	The predictor is in the range [0..6] which is an indx into the	two AdaptCoeff tables.
+**	The predictor is chosen by trying all of the possible predictors on a small set of
+**	samples at the beginning of the block. The predictor with the smallest average
+**	abs (idelta) is chosen as the best predictor for this block.
+**	The value of idelta is chosen to to give a 4 bit code value of +/- 4 (approx. half the
+**	max. code value). If the average abs (idelta) is zero, the sixth predictor is chosen.
+**	If the value of idelta is less then 16 it is set to 16.
+**
+**	Microsoft uses an IDELTA_COUNT (number of sample pairs used to choose best predictor)
+**	value of 3. The best possible results would be obtained by using all the samples to
+**	choose the predictor.
+*/
+
+#define		IDELTA_COUNT	3
+
+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++)
+	{	best_bpred = best_idelta = 0 ;
+
+		for (bpred = 0 ; bpred < 7 ; bpred++)
+		{	idelta_sum = 0 ;
+			for (k = 2 ; k < 2 + IDELTA_COUNT ; k++)
+				idelta_sum += abs (data [k * channels] - ((data [(k - 1) * channels] * AdaptCoeff1 [bpred] + data [(k - 2) * channels] * AdaptCoeff2 [bpred]) >> 8)) ;
+			idelta_sum /= (4 * IDELTA_COUNT) ;
+
+			if (bpred == 0 || idelta_sum < best_idelta)
+			{	best_bpred = bpred ;
+				best_idelta = idelta_sum ;
+				} ;
+
+			if (! idelta_sum)
+			{	best_bpred = bpred ;
+				best_idelta = 16 ;
+				break ;
+				} ;
+
+			} ; /* for bpred ... */
+		if (best_idelta < 16)
+			best_idelta = 16 ;
+
+		block_pred [chan]	= best_bpred ;
+		idelta [chan]		= best_idelta ;
+		} ;
+
+	return ;
+} /* choose_predictor */
+
diff --git a/jni/libsndfile-1.0.25/src/ms_adpcm.lo b/jni/libsndfile-1.0.25/src/ms_adpcm.lo
new file mode 100644
index 0000000..83e5601
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ms_adpcm.lo
@@ -0,0 +1,12 @@
+# ms_adpcm.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/ms_adpcm.o'
+
+# Name of the non-PIC object
+non_pic_object='ms_adpcm.o'
+
diff --git a/jni/libsndfile-1.0.25/src/ms_adpcm.o b/jni/libsndfile-1.0.25/src/ms_adpcm.o
new file mode 100644
index 0000000..1a95e3c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ms_adpcm.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/nist.c b/jni/libsndfile-1.0.25/src/nist.c
new file mode 100644
index 0000000..cd3afac
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/nist.c
@@ -0,0 +1,377 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/*
+**	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	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+/*------------------------------------------------------------------------------
+*/
+
+#define	NIST_HEADER_LENGTH	1024
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static	int	nist_close	(SF_PRIVATE *psf) ;
+static	int nist_write_header	(SF_PRIVATE *psf, int calc_length) ;
+static	int nist_read_header	(SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------
+*/
+
+int
+nist_open	(SF_PRIVATE *psf)
+{	int error ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = nist_read_header (psf)))
+			return error ;
+		} ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	if (psf->is_pipe)
+			return SFE_NO_PIPE_WRITE ;
+
+		if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_NIST)
+			return	SFE_BAD_OPEN_FORMAT ;
+
+		psf->endian = SF_ENDIAN (psf->sf.format) ;
+		if (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU)
+			psf->endian = (CPU_IS_BIG_ENDIAN) ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ;
+
+		psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+		psf->sf.frames = 0 ;
+
+		if ((error = nist_write_header (psf, SF_FALSE)))
+			return error ;
+
+		psf->write_header = nist_write_header ;
+		} ;
+
+	psf->container_close = nist_close ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_S8 :
+				error = pcm_init (psf) ;
+				break ;
+
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_24 :
+		case SF_FORMAT_PCM_32 :
+				error = pcm_init (psf) ;
+				break ;
+
+		case SF_FORMAT_ULAW :
+				error = ulaw_init (psf) ;
+				break ;
+
+		case SF_FORMAT_ALAW :
+				error = alaw_init (psf) ;
+				break ;
+
+		default : error = SFE_UNIMPLEMENTED ;
+				break ;
+		} ;
+
+	return error ;
+} /* nist_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static char bad_header [] =
+{	'N', 'I', 'S', 'T', '_', '1', 'A', 0x0d, 0x0a,
+	' ', ' ', ' ', '1', '0', '2', '4', 0x0d, 0x0a,
+	0
+} ;
+
+	static int
+nist_read_header (SF_PRIVATE *psf)
+{	char	*psf_header ;
+	int		bitwidth = 0, count, encoding ;
+	unsigned bytes = 0 ;
+	char 	str [64], *cptr ;
+	long	samples ;
+
+	psf_header = psf->u.cbuf ;
+
+	if (sizeof (psf->header) <= NIST_HEADER_LENGTH)
+		return SFE_INTERNAL ;
+
+	/* Go to start of file and read in the whole header. */
+	psf_binheader_readf (psf, "pb", 0, psf_header, NIST_HEADER_LENGTH) ;
+
+	/* Header is a string, so make sure it is null terminated. */
+	psf_header [NIST_HEADER_LENGTH] = 0 ;
+
+	/* Now trim the header after the end marker. */
+	if ((cptr = strstr (psf_header, "end_head")))
+	{	cptr += strlen ("end_head") + 1 ;
+		cptr [0] = 0 ;
+		} ;
+
+	if (strstr (psf_header, bad_header) == psf_header)
+		return SFE_NIST_CRLF_CONVERISON ;
+
+	/* Make sure its a NIST file. */
+	if (strstr (psf_header, "NIST_1A\n") != psf_header)
+	{	psf_log_printf (psf, "Not a NIST file.\n") ;
+		return SFE_NIST_BAD_HEADER ;
+		} ;
+
+	if (sscanf (psf_header, "NIST_1A\n%d\n", &count) == 1)
+		psf->dataoffset = count ;
+	else
+	{	psf_log_printf (psf, "*** Suspicious header length.\n") ;
+		psf->dataoffset = NIST_HEADER_LENGTH ;
+		} ;
+
+	/* Determine sample encoding, start by assuming PCM. */
+	encoding = SF_FORMAT_PCM_U8 ;
+	if ((cptr = strstr (psf_header, "sample_coding -s")))
+	{	sscanf (cptr, "sample_coding -s%d %63s", &count, str) ;
+
+		if (strcmp (str, "pcm") == 0)
+		{	/* Correct this later when we find out the bitwidth. */
+			encoding = SF_FORMAT_PCM_U8 ;
+			}
+		else if (strcmp (str, "alaw") == 0)
+			encoding = SF_FORMAT_ALAW ;
+		else if ((strcmp (str, "ulaw") == 0) || (strcmp (str, "mu-law") == 0))
+			encoding = SF_FORMAT_ULAW ;
+		else
+		{	psf_log_printf (psf, "*** Unknown encoding : %s\n", str) ;
+			encoding = 0 ;
+			} ;
+		} ;
+
+	if ((cptr = strstr (psf_header, "channel_count -i ")) != NULL)
+		sscanf (cptr, "channel_count -i %d", &(psf->sf.channels)) ;
+
+	if ((cptr = strstr (psf_header, "sample_rate -i ")) != NULL)
+		sscanf (cptr, "sample_rate -i %d", &(psf->sf.samplerate)) ;
+
+	if ((cptr = strstr (psf_header, "sample_count -i ")) != NULL)
+	{	sscanf (cptr, "sample_count -i %ld", &samples) ;
+		psf->sf.frames = samples ;
+		} ;
+
+	if ((cptr = strstr (psf_header, "sample_n_bytes -i ")) != NULL)
+		sscanf (cptr, "sample_n_bytes -i %d", &(psf->bytewidth)) ;
+
+	/* Default endian-ness (for 8 bit, u-law, A-law. */
+	psf->endian = (CPU_IS_BIG_ENDIAN) ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ;
+
+	/* This is where we figure out endian-ness. */
+	if ((cptr = strstr (psf_header, "sample_byte_format -s"))
+		&& sscanf (cptr, "sample_byte_format -s%u %8s", &bytes, str) == 2)
+	{
+		if (bytes != strlen (str))
+			psf_log_printf (psf, "Weird sample_byte_format : strlen '%s' != %d\n", str, bytes) ;
+
+		if (bytes > 1)
+		{	if (psf->bytewidth == 0)
+				psf->bytewidth = bytes ;
+			else if (psf->bytewidth - bytes != 0)
+			{	psf_log_printf (psf, "psf->bytewidth (%d) != bytes (%d)\n", psf->bytewidth, bytes) ;
+				return SFE_NIST_BAD_ENCODING ;
+				} ;
+
+			if (strcmp (str, "01") == 0)
+				psf->endian = SF_ENDIAN_LITTLE ;
+			else if (strcmp (str, "10") == 0)
+				psf->endian = SF_ENDIAN_BIG ;
+			else
+			{	psf_log_printf (psf, "Weird endian-ness : %s\n", str) ;
+				return SFE_NIST_BAD_ENCODING ;
+				} ;
+			} ;
+
+		psf->sf.format |= psf->endian ;
+		} ;
+
+	if ((cptr = strstr (psf_header, "sample_sig_bits -i ")))
+		sscanf (cptr, "sample_sig_bits -i %d", &bitwidth) ;
+
+	if (strstr (psf_header, "channels_interleaved -s5 FALSE"))
+	{	psf_log_printf (psf, "Non-interleaved data unsupported.\n", str) ;
+		return SFE_NIST_BAD_ENCODING ;
+		} ;
+
+	psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+	psf->datalength = psf->filelength - psf->dataoffset ;
+
+	psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+
+	if (encoding == SF_FORMAT_PCM_U8)
+	{	switch (psf->bytewidth)
+		{	case 1 :
+					psf->sf.format |= SF_FORMAT_PCM_S8 ;
+					break ;
+
+			case 2 :
+					psf->sf.format |= SF_FORMAT_PCM_16 ;
+					break ;
+
+			case 3 :
+					psf->sf.format |= SF_FORMAT_PCM_24 ;
+					break ;
+
+			case 4 :
+					psf->sf.format |= SF_FORMAT_PCM_32 ;
+					break ;
+
+			default : break ;
+			} ;
+		}
+	else if (encoding != 0)
+		psf->sf.format |= encoding ;
+	else
+		return SFE_UNIMPLEMENTED ;
+
+	/* Sanitize psf->sf.format. */
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_ULAW :
+		case SF_FORMAT_ALAW :
+		case SF_FORMAT_PCM_U8 :
+			/* Blank out endian bits. */
+			psf->sf.format = SF_FORMAT_NIST | SF_CODEC (psf->sf.format) ;
+			break ;
+
+		default :
+			break ;
+		} ;
+
+	return 0 ;
+} /* nist_read_header */
+
+static int
+nist_close	(SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+		nist_write_header (psf, SF_TRUE) ;
+
+	return 0 ;
+} /* nist_close */
+
+/*=========================================================================
+*/
+
+static int
+nist_write_header (SF_PRIVATE *psf, int calc_length)
+{	const char	*end_str ;
+	long		samples ;
+	sf_count_t	current ;
+
+	current = psf_ftell (psf) ;
+
+	if (calc_length)
+	{	psf->filelength = psf_get_filelen (psf) ;
+
+		psf->datalength = psf->filelength - psf->dataoffset ;
+
+		if (psf->dataend)
+			psf->datalength -= psf->filelength - psf->dataend ;
+
+		if (psf->bytewidth > 0)
+			psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+		} ;
+
+	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->headindex = 0 ;
+
+	psf_fseek (psf, 0, SEEK_SET) ;
+
+	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) ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_S8 :
+				psf_asciiheader_printf (psf, "sample_coding -s3 pcm\n") ;
+				psf_asciiheader_printf (psf, "sample_n_bytes -i 1\n"
+											"sample_sig_bits -i 8\n") ;
+				break ;
+
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_24 :
+		case SF_FORMAT_PCM_32 :
+				psf_asciiheader_printf (psf, "sample_n_bytes -i %d\n", psf->bytewidth) ;
+				psf_asciiheader_printf (psf, "sample_sig_bits -i %d\n", psf->bytewidth * 8) ;
+				psf_asciiheader_printf (psf, "sample_coding -s3 pcm\n"
+								"sample_byte_format -s%d %s\n", psf->bytewidth, end_str) ;
+				break ;
+
+		case SF_FORMAT_ALAW :
+				psf_asciiheader_printf (psf, "sample_coding -s4 alaw\n") ;
+				psf_asciiheader_printf (psf, "sample_n_bytes -s1 1\n") ;
+				break ;
+
+		case SF_FORMAT_ULAW :
+				psf_asciiheader_printf (psf, "sample_coding -s4 ulaw\n") ;
+				psf_asciiheader_printf (psf, "sample_n_bytes -s1 1\n") ;
+				break ;
+
+		default : return SFE_UNIMPLEMENTED ;
+		} ;
+
+	psf->dataoffset = NIST_HEADER_LENGTH ;
+
+	/* Fix this */
+	samples = psf->sf.frames ;
+	psf_asciiheader_printf (psf, "sample_count -i %ld\n", samples) ;
+	psf_asciiheader_printf (psf, "end_head\n") ;
+
+	/* Zero fill to dataoffset. */
+	psf_binheader_writef (psf, "z", (size_t) (NIST_HEADER_LENGTH - psf->headindex)) ;
+
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+
+	if (psf->error)
+		return psf->error ;
+
+	if (current > 0)
+		psf_fseek (psf, current, SEEK_SET) ;
+
+	return psf->error ;
+} /* nist_write_header */
+
diff --git a/jni/libsndfile-1.0.25/src/nist.lo b/jni/libsndfile-1.0.25/src/nist.lo
new file mode 100644
index 0000000..772b9aa
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/nist.lo
@@ -0,0 +1,12 @@
+# nist.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/nist.o'
+
+# Name of the non-PIC object
+non_pic_object='nist.o'
+
diff --git a/jni/libsndfile-1.0.25/src/nist.o b/jni/libsndfile-1.0.25/src/nist.o
new file mode 100644
index 0000000..2303003
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/nist.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/ogg.c b/jni/libsndfile-1.0.25/src/ogg.c
new file mode 100644
index 0000000..d868fdb
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ogg.c
@@ -0,0 +1,250 @@
+/*
+** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2007 John ffitch
+**
+** This program is free software ; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation ; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY ; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program ; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+#include <math.h>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "sndfile.h"
+#include "sfendian.h"
+#include "common.h"
+
+#if HAVE_EXTERNAL_LIBS
+
+#include <ogg/ogg.h>
+
+#include "ogg.h"
+
+static int	ogg_close (SF_PRIVATE *psf) ;
+static int	ogg_stream_classify (SF_PRIVATE *psf, OGG_PRIVATE * odata) ;
+static int	ogg_page_classify (SF_PRIVATE * psf, const ogg_page * og) ;
+
+int
+ogg_open (SF_PRIVATE *psf)
+{	OGG_PRIVATE* odata = calloc (1, sizeof (OGG_PRIVATE)) ;
+	sf_count_t pos = psf_ftell (psf) ;
+	int	error = 0 ;
+
+	psf->container_data = odata ;
+	psf->container_close = ogg_close ;
+
+	if (psf->file.mode == SFM_RDWR)
+		return SFE_BAD_MODE_RW ;
+
+	if (psf->file.mode == SFM_READ)
+		if ((error = ogg_stream_classify (psf, odata)) != 0)
+			return error ;
+
+	/* Reset everything to an initial state. */
+	ogg_sync_clear (&odata->osync) ;
+	ogg_stream_clear (&odata->ostream) ;
+	psf_fseek (psf, pos, SEEK_SET) ;
+
+	switch (psf->sf.format)
+	{	case SF_FORMAT_OGG | SF_FORMAT_VORBIS :
+			return ogg_vorbis_open (psf) ;
+
+		case SF_FORMAT_OGGFLAC :
+			free (psf->container_data) ;
+			psf->container_data = NULL ;
+			psf->container_close = NULL ;
+			return flac_open (psf) ;
+
+#if ENABLE_EXPERIMENTAL_CODE
+		case SF_FORMAT_OGG | SF_FORMAT_SPEEX :
+			return ogg_speex_open (psf) ;
+
+		case SF_FORMAT_OGG | SF_FORMAT_PCM_16 :
+		case SF_FORMAT_OGG | SF_FORMAT_PCM_24 :
+			return ogg_pcm_open (psf) ;
+#endif
+
+		default :
+			break ;
+		} ;
+
+	psf_log_printf (psf, "%s : mode should be SFM_READ or SFM_WRITE.\n", __func__) ;
+	return SFE_INTERNAL ;
+} /* ogg_open */
+
+
+static int
+ogg_close (SF_PRIVATE *psf)
+{	OGG_PRIVATE* odata = psf->container_data ;
+
+	ogg_sync_clear (&odata->osync) ;
+	ogg_stream_clear (&odata->ostream) ;
+
+	return 0 ;
+} /* ogg_close */
+
+static int
+ogg_stream_classify (SF_PRIVATE *psf, OGG_PRIVATE* odata)
+{	char *buffer ;
+	int	 bytes, nn ;
+
+	/* Call this here so it only gets called once, so no memory is leaked. */
+	ogg_sync_init (&odata->osync) ;
+
+	odata->eos = 0 ;
+
+	/* Weird stuff happens if these aren't called. */
+	ogg_stream_reset (&odata->ostream) ;
+	ogg_sync_reset (&odata->osync) ;
+
+	/*
+	**	Grab some data at the head of the stream.  We want the first page
+	**	(which is guaranteed to be small and only contain the Vorbis
+	**	stream initial header) We need the first page to get the stream
+	**	serialno.
+	*/
+
+	/* Expose the buffer */
+	buffer = ogg_sync_buffer (&odata->osync, 4096L) ;
+
+	/* Grab the part of the header that has already been read. */
+	memcpy (buffer, psf->header, psf->headindex) ;
+	bytes = psf->headindex ;
+
+	/* Submit a 4k block to libvorbis' Ogg layer */
+	bytes += psf_fread (buffer + psf->headindex, 1, 4096 - psf->headindex, psf) ;
+	ogg_sync_wrote (&odata->osync, bytes) ;
+
+	/* Get the first page. */
+	if ((nn = ogg_sync_pageout (&odata->osync, &odata->opage)) != 1)
+	{
+		/* Have we simply run out of data?  If so, we're done. */
+		if (bytes < 4096)
+			return 0 ;
+
+		/* Error case.  Must not be Vorbis data */
+		psf_log_printf (psf, "Input does not appear to be an Ogg bitstream.\n") ;
+		return SFE_MALFORMED_FILE ;
+		} ;
+
+	/*
+	**	Get the serial number and set up the rest of decode.
+	**	Serialno first ; use it to set up a logical stream.
+	*/
+	ogg_stream_clear (&odata->ostream) ;
+	ogg_stream_init (&odata->ostream, ogg_page_serialno (&odata->opage)) ;
+
+	if (ogg_stream_pagein (&odata->ostream, &odata->opage) < 0)
+	{	/* Error ; stream version mismatch perhaps. */
+		psf_log_printf (psf, "Error reading first page of Ogg bitstream data\n") ;
+		return SFE_MALFORMED_FILE ;
+		} ;
+
+	if (ogg_stream_packetout (&odata->ostream, &odata->opacket) != 1)
+	{	/* No page? must not be vorbis. */
+		psf_log_printf (psf, "Error reading initial header packet.\n") ;
+		return SFE_MALFORMED_FILE ;
+		} ;
+
+	odata->codec = ogg_page_classify (psf, &odata->opage) ;
+
+	switch (odata->codec)
+	{	case OGG_VORBIS :
+			psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ;
+			return 0 ;
+
+		case OGG_FLAC :
+		case OGG_FLAC0 :
+			psf->sf.format = SF_FORMAT_OGGFLAC ;
+			return 0 ;
+
+		case OGG_SPEEX :
+			psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_SPEEX ;
+			return 0 ;
+
+		case OGG_PCM :
+			psf_log_printf (psf, "Detected Ogg/PCM data. This is not supported yet.\n") ;
+			return SFE_UNIMPLEMENTED ;
+
+		default :
+			break ;
+		} ;
+
+	psf_log_printf (psf, "This Ogg bitstream contains some uknown data type.\n") ;
+	return SFE_UNIMPLEMENTED ;
+} /* ogg_stream_classify */
+
+/*==============================================================================
+*/
+
+static struct
+{	const char *str, *name ;
+	int len, codec ;
+} codec_lookup [] =
+{	{	"Annodex",		"Annodex",	8, OGG_ANNODEX },
+	{	"AnxData",		"AnxData",	7, OGG_ANXDATA },
+	{	"\177FLAC",		"Flac1",	5, OGG_FLAC },
+	{	"fLaC",			"Flac0",	4, OGG_FLAC0 },
+	{	"PCM     ",		"PCM",		8, OGG_PCM },
+	{	"Speex",		"Speex",	5, OGG_SPEEX },
+	{	"\001vorbis",	"Vorbis",	7, OGG_VORBIS },
+} ;
+
+static int
+ogg_page_classify (SF_PRIVATE * psf, const ogg_page * og)
+{	int k, len ;
+
+	for (k = 0 ; k < ARRAY_LEN (codec_lookup) ; k++)
+	{	if (codec_lookup [k].len > og->body_len)
+			continue ;
+
+		if (memcmp (og->body, codec_lookup [k].str, codec_lookup [k].len) == 0)
+		{	psf_log_printf (psf, "Ogg stream data : %s\n", codec_lookup [k].name) ;
+			psf_log_printf (psf, "Stream serialno : %010D\n", (int64_t) ogg_page_serialno (og)) ;
+			return codec_lookup [k].codec ;
+			} ;
+		} ;
+
+	len = og->body_len < 8 ? og->body_len : 8 ;
+
+	psf_log_printf (psf, "Ogg_stream data : '") ;
+	for (k = 0 ; k < len ; k++)
+		psf_log_printf (psf, "%c", isprint (og->body [k]) ? og->body [k] : '.') ;
+	psf_log_printf (psf, "'     ") ;
+	for (k = 0 ; k < len ; k++)
+		psf_log_printf (psf, " %02x", og->body [k] & 0xff) ;
+	psf_log_printf (psf, "\n") ;
+
+	return 0 ;
+} /* ogg_page_classify */
+
+#else /* HAVE_EXTERNAL_LIBS */
+
+int
+ogg_open	(SF_PRIVATE *psf)
+{
+	psf_log_printf (psf, "This version of libsndfile was compiled without Ogg/Vorbis support.\n") ;
+	return SFE_UNIMPLEMENTED ;
+} /* ogg_open */
+
+#endif
diff --git a/jni/libsndfile-1.0.25/src/ogg.h b/jni/libsndfile-1.0.25/src/ogg.h
new file mode 100644
index 0000000..88544bb
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ogg.h
@@ -0,0 +1,52 @@
+/*
+** Copyright (C) 2008-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software ; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation ; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY ; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program ; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#ifndef SF_SRC_OGG_H
+
+enum
+{	OGG_ANNODEX = 300,
+	OGG_ANXDATA,
+	OGG_FLAC,
+	OGG_FLAC0,
+	OGG_PCM,
+	OGG_SPEEX,
+	OGG_VORBIS,
+} ;
+
+typedef struct
+{	/* Sync and verify incoming physical bitstream */
+	ogg_sync_state osync ;
+	/* Take physical pages, weld into a logical stream of packets */
+	ogg_stream_state ostream ;
+	/* One Ogg bitstream page.  Vorbis packets are inside */
+	ogg_page opage ;
+	/* One raw packet of data for decode */
+	ogg_packet opacket ;
+	int eos ;
+	int codec ;
+} OGG_PRIVATE ;
+
+
+#define readint(buf, base) (((buf [base + 3] << 24) & 0xff000000) | \
+								((buf [base + 2] <<16) & 0xff0000) | \
+								((buf [base + 1] << 8) & 0xff00) | \
+								(buf [base] & 0xff))
+
+
+
+#endif /* SF_SRC_OGG_H */
diff --git a/jni/libsndfile-1.0.25/src/ogg.lo b/jni/libsndfile-1.0.25/src/ogg.lo
new file mode 100644
index 0000000..1ba578f
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ogg.lo
@@ -0,0 +1,12 @@
+# ogg.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/ogg.o'
+
+# Name of the non-PIC object
+non_pic_object='ogg.o'
+
diff --git a/jni/libsndfile-1.0.25/src/ogg.o b/jni/libsndfile-1.0.25/src/ogg.o
new file mode 100644
index 0000000..6a6ae49
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ogg.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/ogg_pcm.c b/jni/libsndfile-1.0.25/src/ogg_pcm.c
new file mode 100644
index 0000000..eb6a53e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ogg_pcm.c
@@ -0,0 +1,164 @@
+/*
+** Copyright (C) 2008-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software ; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation ; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY ; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program ; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+#include <math.h>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "sndfile.h"
+#include "sfendian.h"
+#include "common.h"
+
+#if (ENABLE_EXPERIMENTAL_CODE && HAVE_EXTERNAL_LIBS)
+
+#include <ogg/ogg.h>
+
+#include "ogg.h"
+
+typedef struct
+{	int32_t serialno ;
+
+
+	void * state ;
+} OPCM_PRIVATE ;
+
+static int	opcm_read_header (SF_PRIVATE * psf) ;
+static int	opcm_close (SF_PRIVATE *psf) ;
+
+int
+ogg_pcm_open (SF_PRIVATE *psf)
+{	OGG_PRIVATE* odata = psf->container_data ;
+	OPCM_PRIVATE* opcm = calloc (1, sizeof (OPCM_PRIVATE)) ;
+	int	error = 0 ;
+
+	if (odata == NULL)
+	{	psf_log_printf (psf, "%s : odata is NULL???\n", __func__) ;
+		return SFE_INTERNAL ;
+		} ;
+
+	psf->codec_data = opcm ;
+	if (opcm == NULL)
+		return SFE_MALLOC_FAILED ;
+
+	if (psf->file.mode == SFM_RDWR)
+		return SFE_BAD_MODE_RW ;
+
+	if (psf->file.mode == SFM_READ)
+	{	/* Call this here so it only gets called once, so no memory is leaked. */
+		ogg_sync_init (&odata->osync) ;
+
+		if ((error = opcm_read_header (psf)))
+			return error ;
+
+#if 0
+		psf->read_short		= opcm_read_s ;
+		psf->read_int		= opcm_read_i ;
+		psf->read_float		= opcm_read_f ;
+		psf->read_double	= opcm_read_d ;
+		psf->sf.frames		= opcm_length (psf) ;
+#endif
+		} ;
+
+	psf->codec_close = opcm_close ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{
+#if 0
+		/* Set the default opcm quality here. */
+		vdata->quality = 0.4 ;
+
+		psf->write_header	= opcm_write_header ;
+		psf->write_short	= opcm_write_s ;
+		psf->write_int		= opcm_write_i ;
+		psf->write_float	= opcm_write_f ;
+		psf->write_double	= opcm_write_d ;
+#endif
+
+		psf->sf.frames = SF_COUNT_MAX ; /* Unknown really */
+		psf->str_flags = SF_STR_ALLOW_START ;
+		} ;
+
+	psf->bytewidth = 1 ;
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+#if 0
+	psf->seek = opcm_seek ;
+	psf->command = opcm_command ;
+#endif
+
+	/* FIXME, FIXME, FIXME : Hack these here for now and correct later. */
+	psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_SPEEX ;
+	psf->sf.sections = 1 ;
+
+	psf->datalength = 1 ;
+	psf->dataoffset = 0 ;
+	/* End FIXME. */
+
+	return error ;
+} /* ogg_pcm_open */
+
+static int
+opcm_read_header (SF_PRIVATE * UNUSED (psf))
+{
+	return 0 ;
+} /* opcm_read_header */
+
+static int
+opcm_close (SF_PRIVATE * UNUSED (psf))
+{
+
+
+	return 0 ;
+} /* opcm_close */
+
+
+
+/*
+encoded_speex_frames = (frames_per_packet * Packets)
+                     = 1 * 272
+                     = 272
+
+audio_samples = encoded_speex_frames * frame_size
+              = 272 * 640
+              = 174080
+
+duration = audio_samples / rate
+         = 174080 / 44100
+         = 3.947
+*/
+
+#else /* ENABLE_EXPERIMENTAL_CODE && HAVE_EXTERNAL_LIBS */
+
+int
+ogg_pcm_open (SF_PRIVATE *psf)
+{
+	psf_log_printf (psf, "This version of libsndfile was compiled without Ogg/Speex support.\n") ;
+	return SFE_UNIMPLEMENTED ;
+} /* ogg_pcm_open */
+
+#endif
diff --git a/jni/libsndfile-1.0.25/src/ogg_pcm.lo b/jni/libsndfile-1.0.25/src/ogg_pcm.lo
new file mode 100644
index 0000000..0a17fad
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ogg_pcm.lo
@@ -0,0 +1,12 @@
+# ogg_pcm.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/ogg_pcm.o'
+
+# Name of the non-PIC object
+non_pic_object='ogg_pcm.o'
+
diff --git a/jni/libsndfile-1.0.25/src/ogg_pcm.o b/jni/libsndfile-1.0.25/src/ogg_pcm.o
new file mode 100644
index 0000000..9e47c55
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ogg_pcm.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/ogg_speex.c b/jni/libsndfile-1.0.25/src/ogg_speex.c
new file mode 100644
index 0000000..f0ebb62
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ogg_speex.c
@@ -0,0 +1,425 @@
+/*
+** Copyright (C) 2008-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software ; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation ; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY ; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program ; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+#include <math.h>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "sndfile.h"
+#include "sfendian.h"
+#include "common.h"
+
+#if (ENABLE_EXPERIMENTAL_CODE && HAVE_EXTERNAL_LIBS)
+
+#include <ogg/ogg.h>
+
+#include <speex/speex.h>
+#include <speex/speex_stereo.h>
+#include <speex/speex_header.h>
+#include <speex/speex_callbacks.h>
+
+#include "ogg.h"
+
+#define	OGG_SPX_READ_SIZE	200
+
+typedef struct
+{	SpeexBits bits ;
+
+	int32_t serialno ;
+
+	int frame_size, granule_frame_size, nframes ;
+	int force_mode ;
+
+	SpeexStereoState stereo ;
+	SpeexHeader header ;
+
+	void * state ;
+} SPX_PRIVATE ;
+
+static int	spx_read_header (SF_PRIVATE * psf) ;
+static int	spx_close (SF_PRIVATE *psf) ;
+static void *spx_header_read (SF_PRIVATE * psf, ogg_packet *op, spx_int32_t enh_enabled, int force_mode) ;
+static void spx_print_comments (const char *comments, int length) ;
+
+int
+ogg_speex_open (SF_PRIVATE *psf)
+{	OGG_PRIVATE* odata = psf->container_data ;
+	SPX_PRIVATE* spx = calloc (1, sizeof (SPX_PRIVATE)) ;
+	int	error = 0 ;
+
+	if (odata == NULL)
+	{	psf_log_printf (psf, "%s : odata is NULL???\n", __func__) ;
+		return SFE_INTERNAL ;
+		} ;
+
+	psf->codec_data = spx ;
+	if (spx == NULL)
+		return SFE_MALLOC_FAILED ;
+
+	if (psf->file.mode == SFM_RDWR)
+		return SFE_BAD_MODE_RW ;
+
+	if (psf->file.mode == SFM_READ)
+	{	/* Call this here so it only gets called once, so no memory is leaked. */
+		ogg_sync_init (&odata->osync) ;
+
+		if ((error = spx_read_header (psf)))
+			return error ;
+
+#if 0
+		psf->read_short		= spx_read_s ;
+		psf->read_int		= spx_read_i ;
+		psf->read_float		= spx_read_f ;
+		psf->read_double	= spx_read_d ;
+		psf->sf.frames		= spx_length (psf) ;
+#endif
+		} ;
+
+	psf->codec_close = spx_close ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{
+#if 0
+		/* Set the default spx quality here. */
+		vdata->quality = 0.4 ;
+
+		psf->write_header	= spx_write_header ;
+		psf->write_short	= spx_write_s ;
+		psf->write_int		= spx_write_i ;
+		psf->write_float	= spx_write_f ;
+		psf->write_double	= spx_write_d ;
+#endif
+
+		psf->sf.frames = SF_COUNT_MAX ; /* Unknown really */
+		psf->str_flags = SF_STR_ALLOW_START ;
+		} ;
+
+	psf->bytewidth = 1 ;
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+#if 0
+	psf->seek = spx_seek ;
+	psf->command = spx_command ;
+#endif
+
+	/* FIXME, FIXME, FIXME : Hack these here for now and correct later. */
+	psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_SPEEX ;
+	psf->sf.sections = 1 ;
+
+	psf->datalength = 1 ;
+	psf->dataoffset = 0 ;
+	/* End FIXME. */
+
+	return error ;
+} /* ogg_speex_open */
+
+#define le_short (x)	(x)
+
+static int
+spx_read_header (SF_PRIVATE * psf)
+{	static SpeexStereoState STEREO_INIT = SPEEX_STEREO_STATE_INIT ;
+
+	OGG_PRIVATE* odata = psf->container_data ;
+	SPX_PRIVATE* spx = psf->codec_data ;
+
+	ogg_int64_t page_granule = 0 ;
+	int stream_init = 0 ;
+	int	page_nb_packets = 0 ;
+	int packet_count = 0 ;
+	int enh_enabled = 1 ;
+	int force_mode = -1 ;
+	char * data ;
+	int nb_read ;
+	int lookahead ;
+
+printf ("%s %d\n", __func__, __LINE__) ;
+
+	psf_log_printf (psf, "Speex header\n") ;
+	odata->eos = 0 ;
+
+	/* Reset ogg stuff which has already been used in src/ogg.c. */
+	ogg_stream_reset (&odata->ostream) ;
+	ogg_sync_reset (&odata->osync) ;
+
+	/* Seek to start of stream. */
+	psf_fseek (psf, 0, SEEK_SET) ;
+
+	/* Initialize. */
+	ogg_sync_init (&odata->osync) ;
+	speex_bits_init (&spx->bits) ;
+
+	/* Set defaults. */
+	psf->sf.channels = -1 ;
+	psf->sf.samplerate = 0 ;
+	spx->stereo = STEREO_INIT ;
+
+	/* Get a pointer to the ogg buffer and read data into it. */
+	data = ogg_sync_buffer (&odata->osync, OGG_SPX_READ_SIZE) ;
+	nb_read = psf_fread (data, 1, OGG_SPX_READ_SIZE, psf) ;
+	ogg_sync_wrote (&odata->osync, nb_read) ;
+
+	/* Now we chew on Ogg packets. */
+	while (ogg_sync_pageout (&odata->osync, &odata->opage) == 1)
+	{	if (stream_init == 0)
+		{	ogg_stream_init (&odata->ostream, ogg_page_serialno (&odata->opage)) ;
+			stream_init = 1 ;
+			} ;
+
+		if (ogg_page_serialno (&odata->opage) != odata->ostream.serialno)
+		{	/* so all streams are read. */
+			ogg_stream_reset_serialno (&odata->ostream, ogg_page_serialno (&odata->opage)) ;
+			} ;
+
+		/*Add page to the bitstream*/
+		ogg_stream_pagein (&odata->ostream, &odata->opage) ;
+		page_granule = ogg_page_granulepos (&odata->opage) ;
+		page_nb_packets = ogg_page_packets (&odata->opage) ;
+
+		/*Extract all available packets*/
+		while (odata->eos == 0 && ogg_stream_packetout (&odata->ostream, &odata->opacket) == 1)
+		{	if (odata->opacket.bytes >= 8 && memcmp (odata->opacket.packet, "Speex   ", 8) == 0)
+			{	spx->serialno = odata->ostream.serialno ;
+				} ;
+
+			if (spx->serialno == -1 || odata->ostream.serialno != spx->serialno)
+				break ;
+
+			if (packet_count == 0)
+			{	spx->state = spx_header_read (psf, &odata->opacket, enh_enabled, force_mode) ;
+				if (! spx->state)
+					break ;
+
+				speex_decoder_ctl (spx->state, SPEEX_GET_LOOKAHEAD, &lookahead) ;
+				if (spx->nframes == 0)
+					spx->nframes = 1 ;
+				}
+			else if (packet_count == 1)
+			{	spx_print_comments ((const char*) odata->opacket.packet, odata->opacket.bytes) ;
+				}
+			else if (packet_count < 2 + spx->header.extra_headers)
+			{	/* Ignore extra headers */
+				}
+			packet_count ++ ;
+			} ;
+		} ;
+
+	psf_log_printf (psf, "End\n") ;
+
+	psf_log_printf (psf, "packet_count %d\n", packet_count) ;
+	psf_log_printf (psf, "page_nb_packets %d\n", page_nb_packets) ;
+	psf_log_printf (psf, "page_granule %lld\n", page_granule) ;
+
+	return 0 ;
+} /* spx_read_header */
+
+static int
+spx_close (SF_PRIVATE *psf)
+{	SPX_PRIVATE* spx = psf->codec_data ;
+
+	if (spx->state)
+		speex_decoder_destroy (spx->state) ;
+
+	if (spx)
+		speex_bits_destroy (&spx->bits) ;
+
+	return 0 ;
+} /* spx_close */
+
+
+
+static void *
+spx_header_read (SF_PRIVATE * psf, ogg_packet *op, spx_int32_t enh_enabled, int force_mode)
+{	SPX_PRIVATE* spx = psf->codec_data ;
+	void *st ;
+	const SpeexMode *mode ;
+	SpeexHeader *tmp_header ;
+	int modeID ;
+	SpeexCallback callback ;
+
+	tmp_header = speex_packet_to_header ((char*) op->packet, op->bytes) ;
+	if (tmp_header == NULL)
+	{	psf_log_printf (psf, "Cannot read Speex header\n") ;
+		return NULL ;
+		} ;
+
+	memcpy (&spx->header, tmp_header, sizeof (spx->header)) ;
+	free (tmp_header) ;
+	tmp_header = NULL ;
+
+	if (spx->header.mode >= SPEEX_NB_MODES || spx->header.mode < 0)
+	{	psf_log_printf (psf, "Mode number %d does not (yet/any longer) exist in this version\n", spx->header.mode) ;
+		return NULL ;
+		} ;
+
+	modeID = spx->header.mode ;
+	if (force_mode != -1)
+		modeID = force_mode ;
+
+	mode = speex_lib_get_mode (modeID) ;
+
+	if (spx->header.speex_version_id > 1)
+	{	psf_log_printf (psf, "This file was encoded with Speex bit-stream version %d, which I don't know how to decode\n", spx->header.speex_version_id) ;
+		return NULL ;
+		} ;
+
+	if (mode->bitstream_version < spx->header.mode_bitstream_version)
+	{	psf_log_printf (psf, "The file was encoded with a newer version of Speex. You need to upgrade in order to play it.\n") ;
+		return NULL ;
+		} ;
+
+	if (mode->bitstream_version > spx->header.mode_bitstream_version)
+	{	psf_log_printf (psf, "The file was encoded with an older version of Speex. You would need to downgrade the version in order to play it.\n") ;
+		return NULL ;
+		} ;
+
+	st = speex_decoder_init (mode) ;
+	if (!st)
+	{	psf_log_printf (psf, "Decoder initialization failed.\n") ;
+		return NULL ;
+		} ;
+
+	speex_decoder_ctl (st, SPEEX_SET_ENH, &enh_enabled) ;
+	speex_decoder_ctl (st, SPEEX_GET_FRAME_SIZE, &spx->frame_size) ;
+	spx->granule_frame_size = spx->frame_size ;
+
+	if (!psf->sf.samplerate)
+		psf->sf.samplerate = spx->header.rate ;
+	/* Adjust rate if --force-* options are used */
+	if (force_mode!=-1)
+	{	if (spx->header.mode < force_mode)
+		{	psf->sf.samplerate <<= (force_mode - spx->header.mode) ;
+			spx->granule_frame_size >>= (force_mode - spx->header.mode) ;
+			} ;
+		if (spx->header.mode > force_mode)
+		{	psf->sf.samplerate >>= (spx->header.mode - force_mode) ;
+			spx->granule_frame_size <<= (spx->header.mode - force_mode) ;
+			} ;
+		} ;
+
+	speex_decoder_ctl (st, SPEEX_SET_SAMPLING_RATE, &psf->sf.samplerate) ;
+
+	spx->nframes = spx->header.frames_per_packet ;
+
+	if (psf->sf.channels == -1)
+		psf->sf.channels = spx->header.nb_channels ;
+
+	if (! (psf->sf.channels == 1))
+	{	psf->sf.channels = 2 ;
+		callback.callback_id = SPEEX_INBAND_STEREO ;
+		callback.func = speex_std_stereo_request_handler ;
+		callback.data = &spx->stereo ;
+		speex_decoder_ctl (st, SPEEX_SET_HANDLER, &callback) ;
+		} ;
+
+	spx->header.speex_version [sizeof (spx->header.speex_version) - 1] = 0 ;
+
+	psf_log_printf (psf, "  Encoder ver   : %s\n  Frames/packet : %d\n",
+					spx->header.speex_version, spx->header.frames_per_packet) ;
+
+	if (spx->header.bitrate > 0)
+		psf_log_printf (psf, "  Bit rate	  : %d\n", spx->header.bitrate) ;
+
+	psf_log_printf (psf, "  Sample rate   : %d\n  Mode		  : %s\n  VBR		   : %s\n  Channels	  : %d\n",
+					psf->sf.samplerate, mode->modeName, (spx->header.vbr ? "yes" : "no"), psf->sf.channels) ;
+
+	psf_log_printf (psf, "  Extra headers : %d\n", spx->header.extra_headers) ;
+
+	return st ;
+} /* spx_header_read */
+
+
+static void
+spx_print_comments (const char *c, int length)
+{
+	const char *end ;
+	int len, i, nb_fields ;
+
+printf ("%s %d\n", __func__, __LINE__) ;
+	if (length<8)
+	{	fprintf (stderr, "Invalid/corrupted comments\n") ;
+		return ;
+		}
+	end = c + length ;
+	len = readint (c, 0) ;
+	c += 4 ;
+	if (len < 0 || c + len > end)
+	{	fprintf (stderr, "Invalid/corrupted comments\n") ;
+		return ;
+		}
+	(void) fwrite (c, 1, len, stderr) ;
+	c += len ;
+	fprintf (stderr, "\n") ;
+	if (c + 4 > end)
+	{	fprintf (stderr, "Invalid/corrupted comments\n") ;
+		return ;
+		}
+	nb_fields = readint (c, 0) ;
+	c += 4 ;
+	for (i = 0 ; i < nb_fields ; i++)
+	{	if (c+4>end)
+		{	fprintf (stderr, "Invalid/corrupted comments\n") ;
+			return ;
+			} ;
+		len = readint (c, 0) ;
+		c += 4 ;
+		if (len < 0 || c + len > end)
+		{	fprintf (stderr, "Invalid/corrupted comments\n") ;
+			return ;
+			}
+		(void) fwrite (c, 1, len, stderr) ;
+		c += len ;
+		fprintf (stderr, "\n") ;
+		} ;
+	return ;
+} /* spx_print_comments */
+
+
+/*
+encoded_speex_frames = (frames_per_packet * Packets)
+					 = 1 * 272
+					 = 272
+
+audio_samples = encoded_speex_frames * frame_size
+			  = 272 * 640
+			  = 174080
+
+duration = audio_samples / rate
+		 = 174080 / 44100
+		 = 3.947
+*/
+
+#else /* ENABLE_EXPERIMENTAL_CODE && HAVE_EXTERNAL_LIBS */
+
+int
+ogg_speex_open (SF_PRIVATE *psf)
+{
+	psf_log_printf (psf, "This version of libsndfile was compiled without Ogg/Speex support.\n") ;
+	return SFE_UNIMPLEMENTED ;
+} /* ogg_speex_open */
+
+#endif
diff --git a/jni/libsndfile-1.0.25/src/ogg_speex.lo b/jni/libsndfile-1.0.25/src/ogg_speex.lo
new file mode 100644
index 0000000..aecd450
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ogg_speex.lo
@@ -0,0 +1,12 @@
+# ogg_speex.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/ogg_speex.o'
+
+# Name of the non-PIC object
+non_pic_object='ogg_speex.o'
+
diff --git a/jni/libsndfile-1.0.25/src/ogg_speex.o b/jni/libsndfile-1.0.25/src/ogg_speex.o
new file mode 100644
index 0000000..7a8f9a2
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ogg_speex.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/ogg_vorbis.c b/jni/libsndfile-1.0.25/src/ogg_vorbis.c
new file mode 100644
index 0000000..99223cd
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ogg_vorbis.c
@@ -0,0 +1,1142 @@
+/*
+** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2002-2005 Michael Smith <msmith@xiph.org>
+** Copyright (C) 2007 John ffitch
+**
+** 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.
+*/
+
+/*
+**  Much of this code is based on the examples in libvorbis from the
+** XIPHOPHORUS Company http://www.xiph.org/ which has a BSD-style Licence
+** Copyright (c) 2002, Xiph.org Foundation
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions
+** are met:
+**
+** - Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+**
+** - Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in the
+** documentation and/or other materials provided with the distribution.
+**
+** - Neither the name of the Xiph.org Foundation nor the names of its
+** contributors may be used to endorse or promote products derived from
+** this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION
+** OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE,
+** DATA, OR PROFITS ; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+#include <math.h>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "sndfile.h"
+#include "sfendian.h"
+#include "common.h"
+
+#if HAVE_EXTERNAL_LIBS
+
+#include <ogg/ogg.h>
+#include <vorbis/codec.h>
+#include <vorbis/vorbisenc.h>
+
+#include "ogg.h"
+
+typedef int convert_func (int, void *, int, int, float **) ;
+
+static int	vorbis_read_header (SF_PRIVATE *psf, int log_data) ;
+static int	vorbis_write_header (SF_PRIVATE *psf, int calc_length) ;
+static int	vorbis_close (SF_PRIVATE *psf) ;
+static int	vorbis_command (SF_PRIVATE *psf, int command, void *data, int datasize) ;
+static sf_count_t	vorbis_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+static sf_count_t	vorbis_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	vorbis_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	vorbis_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	vorbis_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	vorbis_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t	vorbis_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t	vorbis_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t	vorbis_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+static sf_count_t	vorbis_read_sample (SF_PRIVATE *psf, void *ptr, sf_count_t lens, convert_func *transfn) ;
+static sf_count_t	vorbis_length (SF_PRIVATE *psf) ;
+
+typedef struct
+{	int id ;
+	const char *name ;
+} STR_PAIRS ;
+
+static STR_PAIRS vorbis_metatypes [] =
+{	{	SF_STR_TITLE,		"Title" },
+	{	SF_STR_COPYRIGHT,	"Copyright" },
+	{	SF_STR_SOFTWARE,	"Software" },
+	{	SF_STR_ARTIST,		"Artist" },
+	{	SF_STR_COMMENT,		"Comment" },
+	{	SF_STR_DATE,		"Date" },
+	{	SF_STR_ALBUM,		"Album" },
+	{	SF_STR_LICENSE,		"License" },
+} ;
+
+typedef struct
+{	/* Count current location */
+	sf_count_t loc ;
+	/* Struct that stores all the static vorbis bitstream settings */
+	vorbis_info	vinfo ;
+	/* Struct that stores all the bitstream user comments */
+	vorbis_comment vcomment ;
+	/* Ventral working state for the packet->PCM decoder */
+	vorbis_dsp_state vdsp ;
+	/* Local working space for packet->PCM decode */
+	vorbis_block vblock ;
+
+	/* Encoding quality in range [0.0, 1.0]. */
+	double quality ;
+} VORBIS_PRIVATE ;
+
+static int
+vorbis_read_header (SF_PRIVATE *psf, int log_data)
+{
+	OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ;
+	VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;
+	char *buffer ;
+	int	 bytes ;
+	int i, nn ;
+
+	odata->eos = 0 ;
+
+	/* Weird stuff happens if these aren't called. */
+	ogg_stream_reset (&odata->ostream) ;
+	ogg_sync_reset (&odata->osync) ;
+
+	/*
+	**	Grab some data at the head of the stream.  We want the first page
+	**	(which is guaranteed to be small and only contain the Vorbis
+	**	stream initial header) We need the first page to get the stream
+	**	serialno.
+	*/
+
+	/* Expose the buffer */
+	buffer = ogg_sync_buffer (&odata->osync, 4096L) ;
+
+	/* Grab the part of the header that has already been read. */
+	memcpy (buffer, psf->header, psf->headindex) ;
+	bytes = psf->headindex ;
+
+	/* Submit a 4k block to libvorbis' Ogg layer */
+	bytes += psf_fread (buffer + psf->headindex, 1, 4096 - psf->headindex, psf) ;
+	ogg_sync_wrote (&odata->osync, bytes) ;
+
+	/* Get the first page. */
+	if ((nn = ogg_sync_pageout (&odata->osync, &odata->opage)) != 1)
+	{
+		/* Have we simply run out of data?  If so, we're done. */
+		if (bytes < 4096)
+			return 0 ;
+
+		/* Error case.  Must not be Vorbis data */
+		psf_log_printf (psf, "Input does not appear to be an Ogg bitstream.\n") ;
+		return SFE_MALFORMED_FILE ;
+		} ;
+
+	/*
+	**	Get the serial number and set up the rest of decode.
+	**	Serialno first ; use it to set up a logical stream.
+	*/
+	ogg_stream_clear (&odata->ostream) ;
+	ogg_stream_init (&odata->ostream, ogg_page_serialno (&odata->opage)) ;
+
+	if (ogg_stream_pagein (&odata->ostream, &odata->opage) < 0)
+	{	/* Error ; stream version mismatch perhaps. */
+		psf_log_printf (psf, "Error reading first page of Ogg bitstream data\n") ;
+		return SFE_MALFORMED_FILE ;
+		} ;
+
+	if (ogg_stream_packetout (&odata->ostream, &odata->opacket) != 1)
+	{	/* No page? must not be vorbis. */
+		psf_log_printf (psf, "Error reading initial header packet.\n") ;
+		return SFE_MALFORMED_FILE ;
+		} ;
+
+	/*
+	**	This function (vorbis_read_header) gets called multiple times, so the OGG
+	**	and vorbis structs have to be cleared every time we pass through to
+	**	prevent memory leaks.
+	*/
+	vorbis_block_clear (&vdata->vblock) ;
+	vorbis_dsp_clear (&vdata->vdsp) ;
+	vorbis_comment_clear (&vdata->vcomment) ;
+	vorbis_info_clear (&vdata->vinfo) ;
+
+	/*
+	**	Extract the initial header from the first page and verify that the
+	**	Ogg bitstream is in fact Vorbis data.
+	**
+	**	I handle the initial header first instead of just having the code
+	**	read all three Vorbis headers at once because reading the initial
+	**	header is an easy way to identify a Vorbis bitstream and it's
+	**	useful to see that functionality seperated out.
+	*/
+	vorbis_info_init (&vdata->vinfo) ;
+	vorbis_comment_init (&vdata->vcomment) ;
+
+	if (vorbis_synthesis_headerin (&vdata->vinfo, &vdata->vcomment, &odata->opacket) < 0)
+	{	/* Error case ; not a vorbis header. */
+		psf_log_printf (psf, "Found Vorbis in stream header, but vorbis_synthesis_headerin failed.\n") ;
+		return SFE_MALFORMED_FILE ;
+		} ;
+
+	/*
+	**	Common Ogg metadata fields?
+	**	TITLE, VERSION, ALBUM, TRACKNUMBER, ARTIST, PERFORMER, COPYRIGHT, LICENSE,
+	**	ORGANIZATION, DESCRIPTION, GENRE, DATE, LOCATION, CONTACT, ISRC,
+	*/
+
+	if (log_data)
+	{	int k ;
+
+		for (k = 0 ; k < ARRAY_LEN (vorbis_metatypes) ; k++)
+		{	char *dd ;
+
+			dd = vorbis_comment_query (&vdata->vcomment, vorbis_metatypes [k].name, 0) ;
+			if (dd == NULL)
+				continue ;
+			psf_store_string (psf, vorbis_metatypes [k].id, dd) ;
+			} ;
+		} ;
+
+	/*
+	**	At this point, we're sure we're Vorbis.	We've set up the logical (Ogg)
+	**	bitstream decoder. Get the comment and codebook headers and set up the
+	**	Vorbis decoder.
+	**
+	**	The next two packets in order are the comment and codebook headers.
+	**	They're likely large and may span multiple pages.  Thus we reead
+	**	and submit data until we get our two pacakets, watching that no
+	**	pages are missing.  If a page is missing, error out ; losing a
+	**	header page is the only place where missing data is fatal.
+	*/
+
+	i = 0 ;			 /* Count of number of packets read */
+	while (i < 2)
+	{	int result = ogg_sync_pageout (&odata->osync, &odata->opage) ;
+		if (result == 0)
+		{	/* Need more data */
+			buffer = ogg_sync_buffer (&odata->osync, 4096) ;
+			bytes = psf_fread (buffer, 1, 4096, psf) ;
+
+			if (bytes == 0 && i < 2)
+			{	psf_log_printf (psf, "End of file before finding all Vorbis headers!\n") ;
+				return SFE_MALFORMED_FILE ;
+				} ;
+			nn = ogg_sync_wrote (&odata->osync, bytes) ;
+			}
+		else if (result == 1)
+		{	/*
+			**	Don't complain about missing or corrupt data yet. We'll
+			**	catch it at the packet output phase.
+			**
+			**	We can ignore any errors here as they'll also become apparent
+			**	at packetout.
+			*/
+			nn = ogg_stream_pagein (&odata->ostream, &odata->opage) ;
+			while (i < 2)
+			{	result = ogg_stream_packetout (&odata->ostream, &odata->opacket) ;
+				if (result == 0)
+					break ;
+				if (result < 0)
+				{	/*	Uh oh ; data at some point was corrupted or missing!
+					**	We can't tolerate that in a header. Die. */
+					psf_log_printf (psf, "Corrupt secondary header.	Exiting.\n") ;
+					return SFE_MALFORMED_FILE ;
+					} ;
+
+				vorbis_synthesis_headerin (&vdata->vinfo, &vdata->vcomment, &odata->opacket) ;
+				i++ ;
+				} ;
+			} ;
+		} ;
+
+	if (log_data)
+	{	int printed_metadata_msg = 0 ;
+		int k ;
+
+		psf_log_printf (psf, "Bitstream is %d channel, %D Hz\n", vdata->vinfo.channels, vdata->vinfo.rate) ;
+		psf_log_printf (psf, "Encoded by : %s\n", vdata->vcomment.vendor) ;
+
+		/* Throw the comments plus a few lines about the bitstream we're decoding. */
+		for (k = 0 ; k < ARRAY_LEN (vorbis_metatypes) ; k++)
+		{	char *dd ;
+
+			dd = vorbis_comment_query (&vdata->vcomment, vorbis_metatypes [k].name, 0) ;
+			if (dd == NULL)
+				continue ;
+
+			if (printed_metadata_msg == 0)
+			{	psf_log_printf (psf, "Metadata :\n") ;
+				printed_metadata_msg = 1 ;
+				} ;
+
+			psf_store_string (psf, vorbis_metatypes [k].id, dd) ;
+			psf_log_printf (psf, "  %-10s : %s\n", vorbis_metatypes [k].name, dd) ;
+			} ;
+
+		psf_log_printf (psf, "End\n") ;
+		} ;
+
+	psf->sf.samplerate	= vdata->vinfo.rate ;
+	psf->sf.channels	= vdata->vinfo.channels ;
+	psf->sf.format		= SF_FORMAT_OGG | SF_FORMAT_VORBIS ;
+
+	/*	OK, got and parsed all three headers. Initialize the Vorbis
+	**	packet->PCM decoder.
+	**	Central decode state. */
+	vorbis_synthesis_init (&vdata->vdsp, &vdata->vinfo) ;
+
+	/*	Local state for most of the decode so multiple block decodes can
+	**	proceed in parallel. We could init multiple vorbis_block structures
+	**	for vd here. */
+	vorbis_block_init (&vdata->vdsp, &vdata->vblock) ;
+
+	vdata->loc = 0 ;
+
+	return 0 ;
+} /* vorbis_read_header */
+
+static int
+vorbis_write_header (SF_PRIVATE *psf, int UNUSED (calc_length))
+{
+	OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ;
+	VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;
+	int k, ret ;
+
+	vorbis_info_init (&vdata->vinfo) ;
+
+	/* The style of encoding should be selectable here, VBR quality mode. */
+	ret = vorbis_encode_init_vbr (&vdata->vinfo, psf->sf.channels, psf->sf.samplerate, vdata->quality) ;
+
+#if 0
+	ret = vorbis_encode_init (&vdata->vinfo, psf->sf.channels, psf->sf.samplerate, -1, 128000, -1) ; /* average bitrate mode */
+	ret = ( vorbis_encode_setup_managed (&vdata->vinfo, psf->sf.channels,
+						 psf->sf.samplerate, -1, 128000, -1) ||
+		vorbis_encode_ctl (&vdata->vinfo, OV_ECTL_RATEMANAGE_AVG, NULL) ||
+		vorbis_encode_setup_init (&vdata->vinfo)) ;
+#endif
+	if (ret)
+		return SFE_BAD_OPEN_FORMAT ;
+
+	vdata->loc = 0 ;
+
+	/* add a comment */
+	vorbis_comment_init (&vdata->vcomment) ;
+
+	vorbis_comment_add_tag (&vdata->vcomment, "ENCODER", "libsndfile") ;
+	for (k = 0 ; k < SF_MAX_STRINGS ; k++)
+	{	const char * name ;
+
+		if (psf->strings [k].type == 0)
+			break ;
+
+		switch (psf->strings [k].type)
+		{	case SF_STR_TITLE :		name = "TITLE" ; break ;
+			case SF_STR_COPYRIGHT : name = "COPYRIGHT" ; break ;
+			case SF_STR_SOFTWARE :	name = "SOFTWARE" ; break ;
+			case SF_STR_ARTIST :	name = "ARTIST" ; break ;
+			case SF_STR_COMMENT :	name = "COMMENT" ; break ;
+			case SF_STR_DATE :		name = "DATE" ; break ;
+			case SF_STR_ALBUM :		name = "ALBUM" ; break ;
+			case SF_STR_LICENSE :	name = "LICENSE" ; break ;
+			default : continue ;
+			} ;
+
+		vorbis_comment_add_tag (&vdata->vcomment, name, psf->strings [k].str) ;
+		} ;
+
+	/* set up the analysis state and auxiliary encoding storage */
+	vorbis_analysis_init (&vdata->vdsp, &vdata->vinfo) ;
+	vorbis_block_init (&vdata->vdsp, &vdata->vblock) ;
+
+	/*
+	**	Set up our packet->stream encoder.
+	**	Pick a random serial number ; that way we can more likely build
+	**	chained streams just by concatenation.
+	*/
+
+	ogg_stream_init (&odata->ostream, psf_rand_int32 ()) ;
+
+	/* Vorbis streams begin with three headers ; the initial header (with
+	   most of the codec setup parameters) which is mandated by the Ogg
+	   bitstream spec.  The second header holds any comment fields.	 The
+	   third header holds the bitstream codebook.  We merely need to
+	   make the headers, then pass them to libvorbis one at a time ;
+	   libvorbis handles the additional Ogg bitstream constraints */
+
+	{	ogg_packet header ;
+		ogg_packet header_comm ;
+		ogg_packet header_code ;
+		int result ;
+
+		vorbis_analysis_headerout (&vdata->vdsp, &vdata->vcomment, &header, &header_comm, &header_code) ;
+		ogg_stream_packetin (&odata->ostream, &header) ; /* automatically placed in its own page */
+		ogg_stream_packetin (&odata->ostream, &header_comm) ;
+		ogg_stream_packetin (&odata->ostream, &header_code) ;
+
+		/* This ensures the actual
+		 * audio data will start on a new page, as per spec
+		 */
+		while ((result = ogg_stream_flush (&odata->ostream, &odata->opage)) != 0)
+		{	psf_fwrite (odata->opage.header, 1, odata->opage.header_len, psf) ;
+			psf_fwrite (odata->opage.body, 1, odata->opage.body_len, psf) ;
+			} ;
+	}
+
+	return 0 ;
+} /* vorbis_write_header */
+
+static int
+vorbis_close (SF_PRIVATE *psf)
+{	OGG_PRIVATE* odata = psf->container_data ;
+	VORBIS_PRIVATE *vdata = psf->codec_data ;
+
+	if (odata == NULL || vdata == NULL)
+		return 0 ;
+
+	/*	Clean up this logical bitstream ; before exit we shuld see if we're
+	**	followed by another [chained]. */
+
+	if (psf->file.mode == SFM_WRITE)
+	{
+		if (psf->write_current <= 0)
+			vorbis_write_header (psf, 0) ;
+
+		vorbis_analysis_wrote (&vdata->vdsp, 0) ;
+		while (vorbis_analysis_blockout (&vdata->vdsp, &vdata->vblock) == 1)
+		{
+
+		/* analysis, assume we want to use bitrate management */
+			vorbis_analysis (&vdata->vblock, NULL) ;
+			vorbis_bitrate_addblock (&vdata->vblock) ;
+
+			while (vorbis_bitrate_flushpacket (&vdata->vdsp, &odata->opacket))
+			{	/* weld the packet into the bitstream */
+				ogg_stream_packetin (&odata->ostream, &odata->opacket) ;
+
+				/* write out pages (if any) */
+				while (!odata->eos)
+				{	int result = ogg_stream_pageout (&odata->ostream, &odata->opage) ;
+					if (result == 0) break ;
+					psf_fwrite (odata->opage.header, 1, odata->opage.header_len, psf) ;
+					psf_fwrite (odata->opage.body, 1, odata->opage.body_len, psf) ;
+
+		/* this could be set above, but for illustrative purposes, I do
+		   it here (to show that vorbis does know where the stream ends) */
+
+					if (ogg_page_eos (&odata->opage)) odata->eos = 1 ;
+				}
+			}
+		}
+	}
+
+	/* ogg_page and ogg_packet structs always point to storage in
+	   libvorbis.  They are never freed or manipulated directly */
+
+	vorbis_block_clear (&vdata->vblock) ;
+	vorbis_dsp_clear (&vdata->vdsp) ;
+	vorbis_comment_clear (&vdata->vcomment) ;
+	vorbis_info_clear (&vdata->vinfo) ;
+
+	return 0 ;
+} /* vorbis_close */
+
+int
+ogg_vorbis_open (SF_PRIVATE *psf)
+{	OGG_PRIVATE* odata = psf->container_data ;
+	VORBIS_PRIVATE* vdata = calloc (1, sizeof (VORBIS_PRIVATE)) ;
+	int	error = 0 ;
+
+	if (odata == NULL)
+	{	psf_log_printf (psf, "%s : odata is NULL???\n", __func__) ;
+		return SFE_INTERNAL ;
+		} ;
+
+	psf->codec_data = vdata ;
+
+	if (psf->file.mode == SFM_RDWR)
+		return SFE_BAD_MODE_RW ;
+
+	psf_log_printf (psf, "Vorbis library version : %s\n", vorbis_version_string ()) ;
+
+	if (psf->file.mode == SFM_READ)
+	{	/* Call this here so it only gets called once, so no memory is leaked. */
+		ogg_sync_init (&odata->osync) ;
+
+		if ((error = vorbis_read_header (psf, 1)))
+			return error ;
+
+		psf->read_short		= vorbis_read_s ;
+		psf->read_int		= vorbis_read_i ;
+		psf->read_float		= vorbis_read_f ;
+		psf->read_double	= vorbis_read_d ;
+		psf->sf.frames		= vorbis_length (psf) ;
+		} ;
+
+	psf->codec_close = vorbis_close ;
+	if (psf->file.mode == SFM_WRITE)
+	{
+		/* Set the default vorbis quality here. */
+		vdata->quality = 0.4 ;
+
+		psf->write_header	= vorbis_write_header ;
+		psf->write_short	= vorbis_write_s ;
+		psf->write_int		= vorbis_write_i ;
+		psf->write_float	= vorbis_write_f ;
+		psf->write_double	= vorbis_write_d ;
+
+		psf->sf.frames = SF_COUNT_MAX ; /* Unknown really */
+		psf->str_flags = SF_STR_ALLOW_START ;
+		} ;
+
+	psf->bytewidth = 1 ;
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+	psf->seek = vorbis_seek ;
+	psf->command = vorbis_command ;
+
+	/* FIXME, FIXME, FIXME : Hack these here for now and correct later. */
+	psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ;
+	psf->sf.sections = 1 ;
+
+	psf->datalength = 1 ;
+	psf->dataoffset = 0 ;
+	/* End FIXME. */
+
+	return error ;
+} /* ogg_vorbis_open */
+
+static int
+vorbis_command (SF_PRIVATE *psf, int command, void * data, int datasize)
+{	VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;
+
+	switch (command)
+	{	case SFC_SET_VBR_ENCODING_QUALITY :
+			if (data == NULL || datasize != sizeof (double))
+				return SF_FALSE ;
+
+			if (psf->have_written)
+				return SF_FALSE ;
+
+			vdata->quality = *((double *) data) ;
+
+			/* Clip range. */
+			vdata->quality = SF_MAX (0.0, SF_MIN (1.0, vdata->quality)) ;
+
+			psf_log_printf (psf, "%s : Setting SFC_SET_VBR_ENCODING_QUALITY to %f.\n", __func__, vdata->quality) ;
+			return SF_TRUE ;
+
+		default :
+			return SF_FALSE ;
+		} ;
+
+	return SF_FALSE ;
+} /* vorbis_command */
+
+static int
+vorbis_rnull (int samples, void *UNUSED (vptr), int UNUSED (off) , int channels, float **UNUSED (pcm))
+{
+	return samples * channels ;
+} /* vorbis_rnull */
+
+static int
+vorbis_rshort (int samples, void *vptr, int off, int channels, float **pcm)
+{
+	short *ptr = (short*) vptr + off ;
+	int i = 0, j, n ;
+	for (j = 0 ; j < samples ; j++)
+		for (n = 0 ; n < channels ; n++)
+			ptr [i++] = lrintf (pcm [n][j] * 32767.0f) ;
+	return i ;
+} /* vorbis_rshort */
+
+static int
+vorbis_rint (int samples, void *vptr, int off, int channels, float **pcm)
+{
+	int *ptr = (int*) vptr + off ;
+	int i = 0, j, n ;
+
+	for (j = 0 ; j < samples ; j++)
+		for (n = 0 ; n < channels ; n++)
+			ptr [i++] = lrintf (pcm [n][j] * 2147483647.0f) ;
+	return i ;
+} /* vorbis_rint */
+
+static int
+vorbis_rfloat (int samples, void *vptr, int off, int channels, float **pcm)
+{
+	float *ptr = (float*) vptr + off ;
+	int i = 0, j, n ;
+	for (j = 0 ; j < samples ; j++)
+		for (n = 0 ; n < channels ; n++)
+			ptr [i++] = pcm [n][j] ;
+	return i ;
+} /* vorbis_rfloat */
+
+static int
+vorbis_rdouble (int samples, void *vptr, int off, int channels, float **pcm)
+{
+	double *ptr = (double*) vptr + off ;
+	int i = 0, j, n ;
+	for (j = 0 ; j < samples ; j++)
+		for (n = 0 ; n < channels ; n++)
+			ptr [i++] = pcm [n][j] ;
+	return i ;
+} /* vorbis_rdouble */
+
+
+static sf_count_t
+vorbis_read_sample (SF_PRIVATE *psf, void *ptr, sf_count_t lens, convert_func *transfn)
+{
+	VORBIS_PRIVATE *vdata = psf->codec_data ;
+	OGG_PRIVATE *odata = psf->container_data ;
+	int len, samples, i = 0 ;
+	float **pcm ;
+
+	len = lens / psf->sf.channels ;
+
+	while ((samples = vorbis_synthesis_pcmout (&vdata->vdsp, &pcm)) > 0)
+	{	if (samples > len) samples = len ;
+		i += transfn (samples, ptr, i, psf->sf.channels, pcm) ;
+		len -= samples ;
+		/* tell libvorbis how many samples we actually consumed */
+		vorbis_synthesis_read (&vdata->vdsp, samples) ;
+		vdata->loc += samples ;
+		if (len == 0)
+			return i ; /* Is this necessary */
+	}
+	goto start0 ;		 /* Jump into the nasty nest */
+	while (len > 0 && !odata->eos)
+	{
+		while (len > 0 && !odata->eos)
+		{	int result = ogg_sync_pageout (&odata->osync, &odata->opage) ;
+			if (result == 0) break ; /* need more data */
+			if (result < 0)
+			{	/* missing or corrupt data at this page position */
+				psf_log_printf (psf, "Corrupt or missing data in bitstream ; continuing...\n") ;
+				}
+			else
+			{	/* can safely ignore errors at this point */
+				ogg_stream_pagein (&odata->ostream, &odata->opage) ;
+			start0:
+				while (1)
+				{	result = ogg_stream_packetout (&odata->ostream, &odata->opacket) ;
+					if (result == 0)
+						break ; /* need more data */
+					if (result < 0)
+					{	/* missing or corrupt data at this page position */
+						/* no reason to complain ; already complained above */
+						}
+					else
+					{	/* we have a packet.	Decode it */
+						if (vorbis_synthesis (&vdata->vblock, &odata->opacket) == 0) /* test for success! */
+							vorbis_synthesis_blockin (&vdata->vdsp, &vdata->vblock) ;
+		  /*
+		  **pcm is a multichannel float vector.	 In stereo, for
+		  example, pcm [0] is left, and pcm [1] is right.	 samples is
+		  the size of each channel.	 Convert the float values
+		  (-1.<=range<=1.) to whatever PCM format and write it out */
+
+						while ((samples = vorbis_synthesis_pcmout (&vdata->vdsp, &pcm)) > 0)
+						{	if (samples>len) samples = len ;
+							i += transfn (samples, ptr, i, psf->sf.channels, pcm) ;
+							len -= samples ;
+							/* tell libvorbis how many samples we actually consumed */
+							vorbis_synthesis_read (&vdata->vdsp, samples) ;
+							vdata->loc += samples ;
+							if (len == 0)
+								return i ; /* Is this necessary */
+							} ;
+					}
+				}
+				if (ogg_page_eos (&odata->opage)) odata->eos = 1 ;
+			}
+		}
+		if (!odata->eos)
+		{	char *buffer ;
+			int bytes ;
+			buffer = ogg_sync_buffer (&odata->osync, 4096) ;
+			bytes = psf_fread (buffer, 1, 4096, psf) ;
+			ogg_sync_wrote (&odata->osync, bytes) ;
+			if (bytes == 0) odata->eos = 1 ;
+		}
+	}
+	return i ;
+} /* vorbis_read_sample */
+
+static sf_count_t
+vorbis_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t lens)
+{	return vorbis_read_sample (psf, (void*) ptr, lens, vorbis_rshort) ;
+} /* vorbis_read_s */
+
+static sf_count_t
+vorbis_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t lens)
+{	return vorbis_read_sample (psf, (void*) ptr, lens, vorbis_rint) ;
+} /* vorbis_read_i */
+
+static sf_count_t
+vorbis_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t lens)
+{	return vorbis_read_sample (psf, (void*) ptr, lens, vorbis_rfloat) ;
+} /* vorbis_read_f */
+
+static sf_count_t
+vorbis_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t lens)
+{	return vorbis_read_sample (psf, (void*) ptr, lens, vorbis_rdouble) ;
+} /* vorbis_read_d */
+
+/*==============================================================================
+*/
+
+static void
+vorbis_write_samples (SF_PRIVATE *psf, OGG_PRIVATE *odata, VORBIS_PRIVATE *vdata, int in_frames)
+{
+	vorbis_analysis_wrote (&vdata->vdsp, in_frames) ;
+
+	/*
+	**	Vorbis does some data preanalysis, then divvies up blocks for
+	**	more involved (potentially parallel) processing. Get a single
+	**	block for encoding now.
+	*/
+	while (vorbis_analysis_blockout (&vdata->vdsp, &vdata->vblock) == 1)
+	{
+		/* analysis, assume we want to use bitrate management */
+		vorbis_analysis (&vdata->vblock, NULL) ;
+		vorbis_bitrate_addblock (&vdata->vblock) ;
+
+		while (vorbis_bitrate_flushpacket (&vdata->vdsp, &odata->opacket))
+		{
+			/* weld the packet into the bitstream */
+			ogg_stream_packetin (&odata->ostream, &odata->opacket) ;
+
+			/* write out pages (if any) */
+			while (!odata->eos)
+			{	int result = ogg_stream_pageout (&odata->ostream, &odata->opage) ;
+				if (result == 0)
+					break ;
+				psf_fwrite (odata->opage.header, 1, odata->opage.header_len, psf) ;
+				psf_fwrite (odata->opage.body, 1, odata->opage.body_len, psf) ;
+
+				/*	This could be set above, but for illustrative purposes, I do
+				**	it here (to show that vorbis does know where the stream ends) */
+				if (ogg_page_eos (&odata->opage))
+					odata->eos = 1 ;
+				} ;
+			} ;
+		} ;
+
+	vdata->loc += in_frames ;
+} /* vorbis_write_data */
+
+
+static sf_count_t
+vorbis_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t lens)
+{
+	int i, m, j = 0 ;
+	OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ;
+	VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;
+	int in_frames = lens / psf->sf.channels ;
+	float **buffer = vorbis_analysis_buffer (&vdata->vdsp, in_frames) ;
+	for (i = 0 ; i < in_frames ; i++)
+		for (m = 0 ; m < psf->sf.channels ; m++)
+			buffer [m][i] = (float) (ptr [j++]) / 32767.0f ;
+
+	vorbis_write_samples (psf, odata, vdata, in_frames) ;
+
+	return lens ;
+} /* vorbis_write_s */
+
+static sf_count_t
+vorbis_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t lens)
+{	int i, m, j = 0 ;
+	OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ;
+	VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;
+	int in_frames = lens / psf->sf.channels ;
+	float **buffer = vorbis_analysis_buffer (&vdata->vdsp, in_frames) ;
+	for (i = 0 ; i < in_frames ; i++)
+		for (m = 0 ; m < psf->sf.channels ; m++)
+			buffer [m][i] = (float) (ptr [j++]) / 2147483647.0f ;
+
+	vorbis_write_samples (psf, odata, vdata, in_frames) ;
+
+	return lens ;
+} /* vorbis_write_i */
+
+static sf_count_t
+vorbis_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t lens)
+{	int i, m, j = 0 ;
+	OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ;
+	VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;
+	int in_frames = lens / psf->sf.channels ;
+	float **buffer = vorbis_analysis_buffer (&vdata->vdsp, in_frames) ;
+	for (i = 0 ; i < in_frames ; i++)
+		for (m = 0 ; m < psf->sf.channels ; m++)
+			buffer [m][i] = ptr [j++] ;
+
+	vorbis_write_samples (psf, odata, vdata, in_frames) ;
+
+	return lens ;
+} /* vorbis_write_f */
+
+static sf_count_t
+vorbis_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t lens)
+{	int i, m, j = 0 ;
+	OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ;
+	VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;
+	int in_frames = lens / psf->sf.channels ;
+	float **buffer = vorbis_analysis_buffer (&vdata->vdsp, in_frames) ;
+	for (i = 0 ; i < in_frames ; i++)
+		for (m = 0 ; m < psf->sf.channels ; m++)
+			buffer [m][i] = (float) ptr [j++] ;
+
+	vorbis_write_samples (psf, odata, vdata, in_frames) ;
+
+	return lens ;
+} /* vorbis_write_d */
+
+static sf_count_t
+vorbis_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t offset)
+{
+	OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ;
+	VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;
+
+	if (odata == NULL || vdata == NULL)
+		return 0 ;
+
+	if (offset < 0)
+	{	psf->error = SFE_BAD_SEEK ;
+		return ((sf_count_t) -1) ;
+		} ;
+
+	if (psf->file.mode == SFM_READ)
+	{	sf_count_t target = offset - vdata->loc ;
+
+		if (target < 0)
+		{	/* 12 to allow for OggS bit */
+			psf_fseek (psf, 12, SEEK_SET) ;
+			vorbis_read_header (psf, 0) ; /* Reset state */
+			target = offset ;
+			} ;
+
+		while (target > 0)
+		{	sf_count_t m = target > 4096 ? 4096 : target ;
+
+			/*
+			**	Need to multiply by channels here because the seek is done in
+			**	terms of frames and the read function is done in terms of
+			**	samples.
+			*/
+			vorbis_read_sample (psf, (void *) NULL, m * psf->sf.channels, vorbis_rnull) ;
+
+			target -= m ;
+			} ;
+
+		return vdata->loc ;
+		} ;
+
+	return 0 ;
+} /* vorbis_seek */
+
+/*==============================================================================
+**	Most of the following code was snipped from Mike Smith's ogginfo utility
+**	which is part of vorbis-tools.
+**	Vorbis tools is released under the GPL but Mike has kindly allowed the
+**	following to be relicensed as LGPL for libsndfile.
+*/
+
+typedef struct
+{
+	int isillegal ;
+	int shownillegal ;
+	int isnew ;
+	int end ;
+
+	uint32_t serial ; /* must be 32 bit unsigned */
+	ogg_stream_state ostream ;
+
+	vorbis_info vinfo ;
+	vorbis_comment vcomment ;
+	sf_count_t lastgranulepos ;
+	int doneheaders ;
+} stream_processor ;
+
+typedef struct
+{
+	stream_processor *streams ;
+	int allocated ;
+	int used ;
+	int in_headers ;
+} stream_set ;
+
+static stream_set *
+create_stream_set (void)
+{	stream_set *set = calloc (1, sizeof (stream_set)) ;
+
+	set->streams = calloc (5, sizeof (stream_processor)) ;
+	set->allocated = 5 ;
+	set->used = 0 ;
+
+	return set ;
+} /* create_stream_set */
+
+static void
+vorbis_end (stream_processor *stream, sf_count_t * len)
+{	*len += stream->lastgranulepos ;
+	vorbis_comment_clear (&stream->vcomment) ;
+	vorbis_info_clear (&stream->vinfo) ;
+} /* vorbis_end */
+
+static void
+free_stream_set (stream_set *set, sf_count_t * len)
+{	int i ;
+
+	for (i = 0 ; i < set->used ; i++)
+	{	if (!set->streams [i].end)
+			vorbis_end (&set->streams [i], len) ;
+		ogg_stream_clear (&set->streams [i].ostream) ;
+		} ;
+
+	free (set->streams) ;
+	free (set) ;
+} /* free_stream_set */
+
+static int
+streams_open (stream_set *set)
+{	int i, res = 0 ;
+
+	for (i = 0 ; i < set->used ; i++)
+		if (!set->streams [i].end)
+			res ++ ;
+	return res ;
+} /* streams_open */
+
+static stream_processor *
+find_stream_processor (stream_set *set, ogg_page *page)
+{	uint32_t serial = ogg_page_serialno (page) ;
+	int i, invalid = 0 ;
+
+	stream_processor *stream ;
+
+	for (i = 0 ; i < set->used ; i++)
+	{
+		if (serial == set->streams [i].serial)
+		{	/* We have a match! */
+			stream = & (set->streams [i]) ;
+
+			set->in_headers = 0 ;
+			/* if we have detected EOS, then this can't occur here. */
+			if (stream->end)
+			{	stream->isillegal = 1 ;
+				return stream ;
+				}
+
+			stream->isnew = 0 ;
+			stream->end = ogg_page_eos (page) ;
+			stream->serial = serial ;
+			return stream ;
+			} ;
+		} ;
+
+	/* If there are streams open, and we've reached the end of the
+	** headers, then we can't be starting a new stream.
+	** XXX: might this sometimes catch ok streams if EOS flag is missing,
+	** but the stream is otherwise ok?
+	*/
+	if (streams_open (set) && !set->in_headers)
+		invalid = 1 ;
+
+	set->in_headers = 1 ;
+
+	if (set->allocated < set->used)
+		stream = &set->streams [set->used] ;
+	else
+	{	set->allocated += 5 ;
+		set->streams = realloc (set->streams, sizeof (stream_processor) * set->allocated) ;
+		stream = &set->streams [set->used] ;
+		} ;
+
+	set->used++ ;
+
+	stream->isnew = 1 ;
+	stream->isillegal = invalid ;
+
+	{
+		int res ;
+		ogg_packet packet ;
+
+		/* We end up processing the header page twice, but that's ok. */
+		ogg_stream_init (&stream->ostream, serial) ;
+		ogg_stream_pagein (&stream->ostream, page) ;
+		res = ogg_stream_packetout (&stream->ostream, &packet) ;
+		if (res <= 0)
+			return NULL ;
+		else if (packet.bytes >= 7 && memcmp (packet.packet, "\x01vorbis", 7) == 0)
+		{
+			stream->lastgranulepos = 0 ;
+			vorbis_comment_init (&stream->vcomment) ;
+			vorbis_info_init (&stream->vinfo) ;
+			} ;
+
+		res = ogg_stream_packetout (&stream->ostream, &packet) ;
+
+		/* re-init, ready for processing */
+		ogg_stream_clear (&stream->ostream) ;
+		ogg_stream_init (&stream->ostream, serial) ;
+	}
+
+	stream->end = ogg_page_eos (page) ;
+	stream->serial = serial ;
+
+	return stream ;
+} /* find_stream_processor */
+
+static int
+vorbis_length_get_next_page (SF_PRIVATE *psf, ogg_sync_state * osync, ogg_page *page)
+{	static const int CHUNK_SIZE = 4500 ;
+
+	while (ogg_sync_pageout (osync, page) <= 0)
+	{	char * buffer = ogg_sync_buffer (osync, CHUNK_SIZE) ;
+		int bytes = psf_fread (buffer, 1, 4096, psf) ;
+
+		if (bytes <= 0)
+		{	ogg_sync_wrote (osync, 0) ;
+			return 0 ;
+			} ;
+
+		ogg_sync_wrote (osync, bytes) ;
+		} ;
+
+	return 1 ;
+} /* vorbis_length_get_next_page */
+
+static sf_count_t
+vorbis_length_aux (SF_PRIVATE * psf)
+{
+	ogg_sync_state osync ;
+	ogg_page page ;
+	sf_count_t len = 0 ;
+	stream_set *processors ;
+
+	processors = create_stream_set () ;
+	if (processors == NULL)
+		return 0 ;	// out of memory?
+
+	ogg_sync_init (&osync) ;
+
+	while (vorbis_length_get_next_page (psf, &osync, &page))
+	{
+		stream_processor *p = find_stream_processor (processors, &page) ;
+
+		if (!p)
+		{	len = 0 ;
+			break ;
+			} ;
+
+		if (p->isillegal && !p->shownillegal)
+		{
+			p->shownillegal = 1 ;
+			/* If it's a new stream, we want to continue processing this page
+			** anyway to suppress additional spurious errors
+			*/
+			if (!p->isnew) continue ;
+			} ;
+
+		if (!p->isillegal)
+		{	ogg_packet packet ;
+			int header = 0 ;
+
+			ogg_stream_pagein (&p->ostream, &page) ;
+			if (p->doneheaders < 3)
+				header = 1 ;
+
+			while (ogg_stream_packetout (&p->ostream, &packet) > 0)
+			{
+				if (p->doneheaders < 3)
+				{	if (vorbis_synthesis_headerin (&p->vinfo, &p->vcomment, &packet) < 0)
+						continue ;
+					p->doneheaders ++ ;
+					} ;
+				} ;
+			if (!header)
+			{	sf_count_t gp = ogg_page_granulepos (&page) ;
+				if (gp > 0) p->lastgranulepos = gp ;
+				} ;
+			if (p->end)
+			{	vorbis_end (p, &len) ;
+				p->isillegal = 1 ;
+				} ;
+			} ;
+		} ;
+
+	ogg_sync_clear (&osync) ;
+	free_stream_set (processors, &len) ;
+
+	return len ;
+} /* vorbis_length_aux */
+
+static sf_count_t
+vorbis_length (SF_PRIVATE *psf)
+{	sf_count_t length ;
+	int error ;
+
+	if (psf->sf.seekable == 0)
+		return SF_COUNT_MAX ;
+
+	psf_fseek (psf, 0, SEEK_SET) ;
+	length = vorbis_length_aux (psf) ;
+
+	psf_fseek (psf, 12, SEEK_SET) ;
+	if ((error = vorbis_read_header (psf, 0)) != 0)
+		psf->error = error ;
+
+	return length ;
+} /* vorbis_length */
+
+#else /* HAVE_EXTERNAL_LIBS */
+
+int
+ogg_vorbis_open	(SF_PRIVATE *psf)
+{
+	psf_log_printf (psf, "This version of libsndfile was compiled without Ogg/Vorbis support.\n") ;
+	return SFE_UNIMPLEMENTED ;
+} /* ogg_vorbis_open */
+
+#endif
diff --git a/jni/libsndfile-1.0.25/src/ogg_vorbis.lo b/jni/libsndfile-1.0.25/src/ogg_vorbis.lo
new file mode 100644
index 0000000..93ebfed
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ogg_vorbis.lo
@@ -0,0 +1,12 @@
+# ogg_vorbis.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/ogg_vorbis.o'
+
+# Name of the non-PIC object
+non_pic_object='ogg_vorbis.o'
+
diff --git a/jni/libsndfile-1.0.25/src/ogg_vorbis.o b/jni/libsndfile-1.0.25/src/ogg_vorbis.o
new file mode 100644
index 0000000..2bb4942
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ogg_vorbis.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/paf.c b/jni/libsndfile-1.0.25/src/paf.c
new file mode 100644
index 0000000..7c7d527
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/paf.c
@@ -0,0 +1,832 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
+
+#include "sndfile.h"
+#include "sfendian.h"
+#include "common.h"
+
+/*------------------------------------------------------------------------------
+** Macros to handle big/little endian issues.
+*/
+
+#define FAP_MARKER	(MAKE_MARKER ('f', 'a', 'p', ' '))
+#define PAF_MARKER	(MAKE_MARKER (' ', 'p', 'a', 'f'))
+
+/*------------------------------------------------------------------------------
+** Other defines.
+*/
+
+#define	PAF_HEADER_LENGTH 			2048
+
+#define	PAF24_SAMPLES_PER_BLOCK		10
+#define	PAF24_BLOCK_SIZE			32
+
+/*------------------------------------------------------------------------------
+** Typedefs.
+*/
+
+typedef	struct
+{	int	version ;
+	int	endianness ;
+    int	samplerate ;
+    int	format ;
+	int	channels ;
+	int	source ;
+} PAF_FMT ;
+
+typedef struct
+{	int				max_blocks, channels, samplesperblock, blocksize ;
+	int				read_block, write_block, read_count, write_count ;
+	sf_count_t		sample_count ;
+	int				*samples ;
+	unsigned char	*block ;
+#if HAVE_FLEXIBLE_ARRAY
+	int				data [] ; /* ISO C99 struct flexible array. */
+#else
+	int				data [1] ; /* This is a hack and may not work. */
+#endif
+} PAF24_PRIVATE ;
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static int paf24_init (SF_PRIVATE *psf) ;
+
+static int	paf_read_header	(SF_PRIVATE *psf) ;
+static int	paf_write_header (SF_PRIVATE *psf, int calc_length) ;
+
+static sf_count_t paf24_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t paf24_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t paf24_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t paf24_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t paf24_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t paf24_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t paf24_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t paf24_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+static sf_count_t paf24_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+
+enum
+{	PAF_PCM_16 = 0,
+	PAF_PCM_24 = 1,
+	PAF_PCM_S8 = 2
+} ;
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+paf_open	(SF_PRIVATE *psf)
+{	int		subformat, error, endian ;
+
+ 	psf->dataoffset = PAF_HEADER_LENGTH ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = paf_read_header (psf)))
+			return error ;
+		} ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_PAF)
+			return	SFE_BAD_OPEN_FORMAT ;
+
+		endian = SF_ENDIAN (psf->sf.format) ;
+
+		/* PAF is by default big endian. */
+		psf->endian = SF_ENDIAN_BIG ;
+
+		if (endian == SF_ENDIAN_LITTLE || (CPU_IS_LITTLE_ENDIAN && (endian == SF_ENDIAN_CPU)))
+			psf->endian = SF_ENDIAN_LITTLE ;
+
+		if ((error = paf_write_header (psf, SF_FALSE)))
+			return error ;
+
+		psf->write_header = paf_write_header ;
+		} ;
+
+	switch (subformat)
+	{	case SF_FORMAT_PCM_S8 :
+					psf->bytewidth = 1 ;
+					error = pcm_init (psf) ;
+					break ;
+
+		case SF_FORMAT_PCM_16 :
+					psf->bytewidth = 2 ;
+					error = pcm_init (psf) ;
+					break ;
+
+		case SF_FORMAT_PCM_24 :
+					/* No bytewidth because of whacky 24 bit encoding. */
+					error = paf24_init (psf) ;
+					break ;
+
+		default : return SFE_PAF_UNKNOWN_FORMAT ;
+		} ;
+
+	return error ;
+} /* paf_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+paf_read_header	(SF_PRIVATE *psf)
+{	PAF_FMT		paf_fmt ;
+	int			marker ;
+
+	if (psf->filelength < PAF_HEADER_LENGTH)
+		return SFE_PAF_SHORT_HEADER ;
+
+	memset (&paf_fmt, 0, sizeof (paf_fmt)) ;
+	psf_binheader_readf (psf, "pm", 0, &marker) ;
+
+	psf_log_printf (psf, "Signature   : '%M'\n", marker) ;
+
+	if (marker == PAF_MARKER)
+	{	psf_binheader_readf (psf, "E444444", &(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, "e444444", &(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_log_printf (psf, "*** Bad version number. should be zero.\n") ;
+		return SFE_PAF_VERSION ;
+		} ;
+
+	psf_log_printf (psf, "Sample Rate : %d\n", paf_fmt.samplerate) ;
+	psf_log_printf (psf, "Channels    : %d\n", paf_fmt.channels) ;
+
+	psf_log_printf (psf, "Endianness  : %d => ", paf_fmt.endianness) ;
+	if (paf_fmt.endianness)
+	{	psf_log_printf (psf, "Little\n", paf_fmt.endianness) ;
+		psf->endian = SF_ENDIAN_LITTLE ;
+		}
+	else
+	{	psf_log_printf (psf, "Big\n", paf_fmt.endianness) ;
+		psf->endian = SF_ENDIAN_BIG ;
+		} ;
+
+	if (paf_fmt.channels > SF_MAX_CHANNELS)
+		return SFE_PAF_BAD_CHANNELS ;
+
+	psf->datalength = psf->filelength - psf->dataoffset ;
+
+	psf_binheader_readf (psf, "p", (int) psf->dataoffset) ;
+
+	psf->sf.samplerate	= paf_fmt.samplerate ;
+	psf->sf.channels 	= paf_fmt.channels ;
+
+	/* Only fill in type major. */
+	psf->sf.format = SF_FORMAT_PAF ;
+
+	psf_log_printf (psf, "Format      : %d => ", paf_fmt.format) ;
+
+	/* PAF is by default big endian. */
+	psf->sf.format |= paf_fmt.endianness ? SF_ENDIAN_LITTLE : SF_ENDIAN_BIG ;
+
+	switch (paf_fmt.format)
+	{	case PAF_PCM_S8 :
+					psf_log_printf (psf, "8 bit linear PCM\n") ;
+					psf->bytewidth = 1 ;
+
+					psf->sf.format |= SF_FORMAT_PCM_S8 ;
+
+					psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+					psf->sf.frames = psf->datalength / psf->blockwidth ;
+					break ;
+
+		case PAF_PCM_16 :
+					psf_log_printf (psf, "16 bit linear PCM\n") ;
+					psf->bytewidth = 2 ;
+
+					psf->sf.format |= SF_FORMAT_PCM_16 ;
+
+					psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+					psf->sf.frames = psf->datalength / psf->blockwidth ;
+					break ;
+
+		case PAF_PCM_24 :
+					psf_log_printf (psf, "24 bit linear PCM\n") ;
+					psf->bytewidth = 3 ;
+
+					psf->sf.format |= SF_FORMAT_PCM_24 ;
+
+					psf->blockwidth = 0 ;
+					psf->sf.frames = PAF24_SAMPLES_PER_BLOCK * psf->datalength /
+											(PAF24_BLOCK_SIZE * psf->sf.channels) ;
+					break ;
+
+		default :	psf_log_printf (psf, "Unknown\n") ;
+					return SFE_PAF_UNKNOWN_FORMAT ;
+					break ;
+		} ;
+
+	psf_log_printf (psf, "Source      : %d => ", paf_fmt.source) ;
+
+	switch (paf_fmt.source)
+	{	case 1 : psf_log_printf (psf, "Analog Recording\n") ;
+					break ;
+		case 2 : psf_log_printf (psf, "Digital Transfer\n") ;
+					break ;
+		case 3 : psf_log_printf (psf, "Multi-track Mixdown\n") ;
+					break ;
+		case 5 : psf_log_printf (psf, "Audio Resulting From DSP Processing\n") ;
+					break ;
+		default : psf_log_printf (psf, "Unknown\n") ;
+					break ;
+		} ;
+
+	return 0 ;
+} /* paf_read_header */
+
+static int
+paf_write_header (SF_PRIVATE *psf, int UNUSED (calc_length))
+{	int			paf_format ;
+
+	/* PAF header already written so no need to re-write. */
+	if (psf_ftell (psf) >= PAF_HEADER_LENGTH)
+		return 0 ;
+
+	psf->dataoffset = PAF_HEADER_LENGTH ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_S8 :
+					paf_format = PAF_PCM_S8 ;
+					break ;
+
+		case SF_FORMAT_PCM_16 :
+					paf_format = PAF_PCM_16 ;
+					break ;
+
+		case SF_FORMAT_PCM_24 :
+					paf_format = PAF_PCM_24 ;
+					break ;
+
+		default : return SFE_PAF_UNKNOWN_FORMAT ;
+		} ;
+
+	/* 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, "Em444", PAF_MARKER, 0, 0, psf->sf.samplerate) ;
+		/* format, channels, source */
+		psf_binheader_writef (psf, "E444", paf_format, psf->sf.channels, 0) ;
+		}
+	else if (psf->endian == SF_ENDIAN_LITTLE)
+	{	/* Marker, version, endianness, samplerate */
+		psf_binheader_writef (psf, "em444", FAP_MARKER, 0, 1, psf->sf.samplerate) ;
+		/* format, channels, source */
+		psf_binheader_writef (psf, "e444", paf_format, psf->sf.channels, 0) ;
+		} ;
+
+	/* Zero fill to dataoffset. */
+	psf_binheader_writef (psf, "z", (size_t) (psf->dataoffset - psf->headindex)) ;
+
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+
+	return psf->error ;
+} /* paf_write_header */
+
+/*===============================================================================
+**	24 bit PAF files have a really weird encoding.
+**  For a mono file, 10 samples (each being 3 bytes) are packed into a 32 byte
+**	block. The 8 ints in this 32 byte block are then endian swapped (as ints)
+**	if necessary before being written to disk.
+**  For a stereo file, blocks of 10 samples from the same channel are encoded
+**  into 32 bytes as for the mono case. The 32 byte blocks are then interleaved
+**	on disk.
+**	Reading has to reverse the above process :-).
+**	Weird!!!
+**
+**	The code below attempts to gain efficiency while maintaining readability.
+*/
+
+static int paf24_read_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24) ;
+static int paf24_write_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24) ;
+static int paf24_close (SF_PRIVATE *psf) ;
+
+
+static int
+paf24_init (SF_PRIVATE *psf)
+{	PAF24_PRIVATE	*ppaf24 ;
+	int	paf24size ;
+
+	paf24size = sizeof (PAF24_PRIVATE) + psf->sf.channels *
+					(PAF24_BLOCK_SIZE + PAF24_SAMPLES_PER_BLOCK * sizeof (int)) ;
+
+	/*
+	**	Not exatly sure why this needs to be here but the tests
+	**	fail without it.
+	*/
+	psf->last_op = 0 ;
+
+	if (! (psf->codec_data = calloc (1, paf24size)))
+		return SFE_MALLOC_FAILED ;
+
+	ppaf24 = (PAF24_PRIVATE*) psf->codec_data ;
+
+	ppaf24->channels	= psf->sf.channels ;
+	ppaf24->samples		= ppaf24->data ;
+	ppaf24->block		= (unsigned char*) (ppaf24->data + PAF24_SAMPLES_PER_BLOCK * ppaf24->channels) ;
+
+	ppaf24->blocksize = PAF24_BLOCK_SIZE * ppaf24->channels ;
+	ppaf24->samplesperblock = PAF24_SAMPLES_PER_BLOCK ;
+
+	if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR)
+	{	paf24_read_block (psf, ppaf24) ;	/* Read first block. */
+
+		psf->read_short		= paf24_read_s ;
+		psf->read_int		= paf24_read_i ;
+		psf->read_float		= paf24_read_f ;
+		psf->read_double	= paf24_read_d ;
+		} ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	psf->write_short	= paf24_write_s ;
+		psf->write_int		= paf24_write_i ;
+		psf->write_float	= paf24_write_f ;
+		psf->write_double	= paf24_write_d ;
+		} ;
+
+	psf->seek	= paf24_seek ;
+	psf->container_close	= paf24_close ;
+
+	psf->filelength = psf_get_filelen (psf) ;
+	psf->datalength = psf->filelength - psf->dataoffset ;
+
+	if (psf->datalength % PAF24_BLOCK_SIZE)
+	{	if (psf->file.mode == SFM_READ)
+			psf_log_printf (psf, "*** Warning : file seems to be truncated.\n") ;
+		ppaf24->max_blocks = psf->datalength / ppaf24->blocksize + 1 ;
+		}
+	else
+		ppaf24->max_blocks = psf->datalength / ppaf24->blocksize ;
+
+	ppaf24->read_block = 0 ;
+	if (psf->file.mode == SFM_RDWR)
+		ppaf24->write_block = ppaf24->max_blocks ;
+	else
+		ppaf24->write_block = 0 ;
+
+	psf->sf.frames = ppaf24->samplesperblock * ppaf24->max_blocks ;
+	ppaf24->sample_count = psf->sf.frames ;
+
+	return 0 ;
+} /* paf24_init */
+
+static sf_count_t
+paf24_seek (SF_PRIVATE *psf, int mode, sf_count_t offset)
+{	PAF24_PRIVATE	*ppaf24 ;
+	int				newblock, newsample ;
+
+	if (psf->codec_data == NULL)
+	{	psf->error = SFE_INTERNAL ;
+		return PSF_SEEK_ERROR ;
+		} ;
+
+	ppaf24 = (PAF24_PRIVATE*) psf->codec_data ;
+
+	if (mode == SFM_READ && ppaf24->write_count > 0)
+		paf24_write_block (psf, ppaf24) ;
+
+	newblock	= offset / ppaf24->samplesperblock ;
+	newsample	= offset % ppaf24->samplesperblock ;
+
+	switch (mode)
+	{	case SFM_READ :
+				if (psf->last_op == SFM_WRITE && ppaf24->write_count)
+					paf24_write_block (psf, ppaf24) ;
+
+				psf_fseek (psf, psf->dataoffset + newblock * ppaf24->blocksize, SEEK_SET) ;
+				ppaf24->read_block = newblock ;
+				paf24_read_block (psf, ppaf24) ;
+				ppaf24->read_count = newsample ;
+				break ;
+
+		case SFM_WRITE :
+				if (offset > ppaf24->sample_count)
+				{	psf->error = SFE_BAD_SEEK ;
+					return PSF_SEEK_ERROR ;
+					} ;
+
+				if (psf->last_op == SFM_WRITE && ppaf24->write_count)
+					paf24_write_block (psf, ppaf24) ;
+
+				psf_fseek (psf, psf->dataoffset + newblock * ppaf24->blocksize, SEEK_SET) ;
+				ppaf24->write_block = newblock ;
+				paf24_read_block (psf, ppaf24) ;
+				ppaf24->write_count = newsample ;
+				break ;
+
+		default :
+				psf->error = SFE_BAD_SEEK ;
+				return PSF_SEEK_ERROR ;
+		} ;
+
+	return newblock * ppaf24->samplesperblock + newsample ;
+} /* paf24_seek */
+
+static int
+paf24_close (SF_PRIVATE *psf)
+{	PAF24_PRIVATE *ppaf24 ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+
+	ppaf24 = (PAF24_PRIVATE*) psf->codec_data ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	if (ppaf24->write_count > 0)
+			paf24_write_block (psf, ppaf24) ;
+		} ;
+
+	return 0 ;
+} /* paf24_close */
+
+/*---------------------------------------------------------------------------
+*/
+static int
+paf24_read_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24)
+{	int				k, channel ;
+	unsigned char	*cptr ;
+
+	ppaf24->read_block ++ ;
+	ppaf24->read_count = 0 ;
+
+	if (ppaf24->read_block * ppaf24->samplesperblock > ppaf24->sample_count)
+	{	memset (ppaf24->samples, 0, ppaf24->samplesperblock * ppaf24->channels) ;
+		return 1 ;
+		} ;
+
+	/* Read the block. */
+	if ((k = psf_fread (ppaf24->block, 1, ppaf24->blocksize, psf)) != ppaf24->blocksize)
+		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, ppaf24->blocksize) ;
+
+
+	if (CPU_IS_LITTLE_ENDIAN)
+	{	/* Do endian swapping if necessary. */
+		if (psf->endian == SF_ENDIAN_BIG)
+			endswap_int_array 	(ppaf24->data, 8 * ppaf24->channels) ;
+
+		/* Unpack block. */
+		for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++)
+		{	channel = k % ppaf24->channels ;
+			cptr = ppaf24->block + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ;
+			ppaf24->samples [k] = (cptr [0] << 8) | (cptr [1] << 16) | (cptr [2] << 24) ;
+			} ;
+		}
+	else
+	{	/* Do endian swapping if necessary. */
+		if (psf->endian == SF_ENDIAN_BIG)
+			endswap_int_array 	(ppaf24->data, 8 * ppaf24->channels) ;
+
+		/* Unpack block. */
+		for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++)
+		{	channel = k % ppaf24->channels ;
+			cptr = ppaf24->block + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ;
+			ppaf24->samples [k] = (cptr [0] << 8) | (cptr [1] << 16) | (cptr [2] << 24) ;
+			} ;
+		} ;
+
+	return 1 ;
+} /* paf24_read_block */
+
+static int
+paf24_read (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, int *ptr, int len)
+{	int	count, total = 0 ;
+
+	while (total < len)
+	{	if (ppaf24->read_block * ppaf24->samplesperblock >= ppaf24->sample_count)
+		{	memset (&(ptr [total]), 0, (len - total) * sizeof (int)) ;
+			return total ;
+			} ;
+
+		if (ppaf24->read_count >= ppaf24->samplesperblock)
+			paf24_read_block (psf, ppaf24) ;
+
+		count = (ppaf24->samplesperblock - ppaf24->read_count) * ppaf24->channels ;
+		count = (len - total > count) ? count : len - total ;
+
+		memcpy (&(ptr [total]), &(ppaf24->samples [ppaf24->read_count * ppaf24->channels]), count * sizeof (int)) ;
+		total += count ;
+		ppaf24->read_count += count / ppaf24->channels ;
+		} ;
+
+	return total ;
+} /* paf24_read */
+
+static sf_count_t
+paf24_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	PAF24_PRIVATE 	*ppaf24 ;
+	int				*iptr ;
+	int				k, bufferlen, readcount, count ;
+	sf_count_t		total = 0 ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	ppaf24 = (PAF24_PRIVATE*) psf->codec_data ;
+
+	iptr = psf->u.ibuf ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = paf24_read (psf, ppaf24, iptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = iptr [k] >> 16 ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* paf24_read_s */
+
+static sf_count_t
+paf24_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	PAF24_PRIVATE *ppaf24 ;
+	int				total ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	ppaf24 = (PAF24_PRIVATE*) psf->codec_data ;
+
+	total = paf24_read (psf, ppaf24, ptr, len) ;
+
+	return total ;
+} /* paf24_read_i */
+
+static sf_count_t
+paf24_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	PAF24_PRIVATE 	*ppaf24 ;
+	int				*iptr ;
+	int				k, bufferlen, readcount, count ;
+	sf_count_t		total = 0 ;
+	float			normfact ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	ppaf24 = (PAF24_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? (1.0 / 0x80000000) : (1.0 / 0x100) ;
+
+	iptr = psf->u.ibuf ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = paf24_read (psf, ppaf24, iptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = normfact * iptr [k] ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* paf24_read_f */
+
+static sf_count_t
+paf24_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	PAF24_PRIVATE 	*ppaf24 ;
+	int				*iptr ;
+	int				k, bufferlen, readcount, count ;
+	sf_count_t		total = 0 ;
+	double 			normfact ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	ppaf24 = (PAF24_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? (1.0 / 0x80000000) : (1.0 / 0x100) ;
+
+	iptr = psf->u.ibuf ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = paf24_read (psf, ppaf24, iptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = normfact * iptr [k] ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* paf24_read_d */
+
+/*---------------------------------------------------------------------------
+*/
+
+static int
+paf24_write_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24)
+{	int				k, nextsample, channel ;
+	unsigned char	*cptr ;
+
+	/* First pack block. */
+
+	if (CPU_IS_LITTLE_ENDIAN)
+	{	for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++)
+		{	channel = k % ppaf24->channels ;
+			cptr = ppaf24->block + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ;
+			nextsample = ppaf24->samples [k] >> 8 ;
+			cptr [0] = nextsample ;
+			cptr [1] = nextsample >> 8 ;
+			cptr [2] = nextsample >> 16 ;
+			} ;
+
+		/* Do endian swapping if necessary. */
+		if (psf->endian == SF_ENDIAN_BIG)
+			endswap_int_array (ppaf24->data, 8 * ppaf24->channels) ;
+		}
+	else if (CPU_IS_BIG_ENDIAN)
+	{	/* This is correct. */
+		for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++)
+		{	channel = k % ppaf24->channels ;
+			cptr = ppaf24->block + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ;
+			nextsample = ppaf24->samples [k] >> 8 ;
+			cptr [0] = nextsample ;
+			cptr [1] = nextsample >> 8 ;
+			cptr [2] = nextsample >> 16 ;
+			} ;
+		if (psf->endian == SF_ENDIAN_BIG)
+			endswap_int_array (ppaf24->data, 8 * ppaf24->channels) ;
+		} ;
+
+	/* Write block to disk. */
+	if ((k = psf_fwrite (ppaf24->block, 1, ppaf24->blocksize, psf)) != ppaf24->blocksize)
+		psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, ppaf24->blocksize) ;
+
+	if (ppaf24->sample_count < ppaf24->write_block * ppaf24->samplesperblock + ppaf24->write_count)
+		ppaf24->sample_count = ppaf24->write_block * ppaf24->samplesperblock + ppaf24->write_count ;
+
+	if (ppaf24->write_count == ppaf24->samplesperblock)
+	{	ppaf24->write_block ++ ;
+		ppaf24->write_count = 0 ;
+		} ;
+
+	return 1 ;
+} /* paf24_write_block */
+
+static int
+paf24_write (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, const int *ptr, int len)
+{	int		count, total = 0 ;
+
+	while (total < len)
+	{	count = (ppaf24->samplesperblock - ppaf24->write_count) * ppaf24->channels ;
+
+		if (count > len - total)
+			count = len - total ;
+
+		memcpy (&(ppaf24->samples [ppaf24->write_count * ppaf24->channels]), &(ptr [total]), count * sizeof (int)) ;
+		total += count ;
+		ppaf24->write_count += count / ppaf24->channels ;
+
+		if (ppaf24->write_count >= ppaf24->samplesperblock)
+			paf24_write_block (psf, ppaf24) ;
+		} ;
+
+	return total ;
+} /* paf24_write */
+
+static sf_count_t
+paf24_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	PAF24_PRIVATE 	*ppaf24 ;
+	int				*iptr ;
+	int				k, bufferlen, writecount = 0, count ;
+	sf_count_t		total = 0 ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	ppaf24 = (PAF24_PRIVATE*) psf->codec_data ;
+
+	iptr = psf->u.ibuf ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			iptr [k] = ptr [total + k] << 16 ;
+		count = paf24_write (psf, ppaf24, iptr, writecount) ;
+		total += count ;
+		len -= writecount ;
+		if (count != writecount)
+			break ;
+		} ;
+	return total ;
+} /* paf24_write_s */
+
+static sf_count_t
+paf24_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	PAF24_PRIVATE 	*ppaf24 ;
+	int				writecount, count ;
+	sf_count_t		total = 0 ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	ppaf24 = (PAF24_PRIVATE*) psf->codec_data ;
+
+	while (len > 0)
+	{	writecount = (len > 0x10000000) ? 0x10000000 : (int) len ;
+
+		count = paf24_write (psf, ppaf24, ptr, writecount) ;
+
+		total += count ;
+		len -= count ;
+		if (count != writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* paf24_write_i */
+
+static sf_count_t
+paf24_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	PAF24_PRIVATE 	*ppaf24 ;
+	int				*iptr ;
+	int				k, bufferlen, writecount = 0, count ;
+	sf_count_t		total = 0 ;
+	float			normfact ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	ppaf24 = (PAF24_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFFFFFF) : (1.0 / 0x100) ;
+
+	iptr = psf->u.ibuf ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			iptr [k] = lrintf (normfact * ptr [total + k]) ;
+		count = paf24_write (psf, ppaf24, iptr, writecount) ;
+		total += count ;
+		len -= writecount ;
+		if (count != writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* paf24_write_f */
+
+static sf_count_t
+paf24_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	PAF24_PRIVATE 	*ppaf24 ;
+	int				*iptr ;
+	int				k, bufferlen, writecount = 0, count ;
+	sf_count_t		total = 0 ;
+	double			normfact ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	ppaf24 = (PAF24_PRIVATE*) psf->codec_data ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFFFFFF) : (1.0 / 0x100) ;
+
+	iptr = psf->u.ibuf ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			iptr [k] = lrint (normfact * ptr [total+k]) ;
+		count = paf24_write (psf, ppaf24, iptr, writecount) ;
+		total += count ;
+		len -= writecount ;
+		if (count != writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* paf24_write_d */
+
diff --git a/jni/libsndfile-1.0.25/src/paf.lo b/jni/libsndfile-1.0.25/src/paf.lo
new file mode 100644
index 0000000..edc7319
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/paf.lo
@@ -0,0 +1,12 @@
+# paf.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/paf.o'
+
+# Name of the non-PIC object
+non_pic_object='paf.o'
+
diff --git a/jni/libsndfile-1.0.25/src/paf.o b/jni/libsndfile-1.0.25/src/paf.o
new file mode 100644
index 0000000..08aa5b6
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/paf.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/pcm.c b/jni/libsndfile-1.0.25/src/pcm.c
new file mode 100644
index 0000000..ec450bc
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/pcm.c
@@ -0,0 +1,2901 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include <math.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+/* Need to be able to handle 3 byte (24 bit) integers. So defined a
+** type and use SIZEOF_TRIBYTE instead of (tribyte).
+*/
+
+typedef	void	tribyte ;
+
+#define	SIZEOF_TRIBYTE	3
+
+static sf_count_t	pcm_read_sc2s	(SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_uc2s	(SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bes2s	(SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_les2s	(SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bet2s	(SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_let2s	(SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bei2s	(SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_lei2s	(SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+
+static sf_count_t	pcm_read_sc2i	(SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_uc2i	(SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bes2i	(SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_les2i	(SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bet2i	(SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_let2i	(SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bei2i	(SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_lei2i	(SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+
+static sf_count_t	pcm_read_sc2f	(SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_uc2f	(SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bes2f	(SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_les2f	(SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bet2f	(SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_let2f	(SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bei2f	(SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_lei2f	(SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+
+static sf_count_t	pcm_read_sc2d	(SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_uc2d	(SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bes2d	(SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_les2d	(SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bet2d	(SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_let2d	(SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bei2d	(SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_lei2d	(SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t	pcm_write_s2sc	(SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_s2uc	(SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_s2bes (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_s2les (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_s2bet (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_s2let (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_s2bei (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_s2lei (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+
+static sf_count_t	pcm_write_i2sc	(SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_i2uc	(SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_i2bes (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_i2les (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_i2bet (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_i2let (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_i2bei (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_i2lei (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+
+static sf_count_t	pcm_write_f2sc	(SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_f2uc	(SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_f2bes (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_f2les (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_f2bet (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_f2let (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_f2bei (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_f2lei (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+
+static sf_count_t	pcm_write_d2sc	(SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_d2uc	(SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_d2bes (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_d2les (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_d2bet (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_d2let (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_d2bei (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_d2lei (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+enum
+{	/* Char type for 8 bit files. */
+	SF_CHARS_SIGNED		= 200,
+	SF_CHARS_UNSIGNED	= 201
+} ;
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+int
+pcm_init (SF_PRIVATE *psf)
+{	int chars = 0 ;
+
+	if (psf->bytewidth == 0 || psf->sf.channels == 0)
+	{	psf_log_printf (psf, "pcm_init : internal error : bytewitdh = %d, channels = %d\n", psf->bytewidth, psf->sf.channels) ;
+		return SFE_INTERNAL ;
+		} ;
+
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+	if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_PCM_S8)
+		chars = SF_CHARS_SIGNED ;
+	else if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_PCM_U8)
+		chars = SF_CHARS_UNSIGNED ;
+
+	if (CPU_IS_BIG_ENDIAN)
+		psf->data_endswap = (psf->endian == SF_ENDIAN_BIG) ? SF_FALSE : SF_TRUE ;
+	else
+		psf->data_endswap = (psf->endian == SF_ENDIAN_LITTLE) ? SF_FALSE : SF_TRUE ;
+
+	if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR)
+	{	switch (psf->bytewidth * 0x10000 + psf->endian + chars)
+		{	case (0x10000 + SF_ENDIAN_BIG + SF_CHARS_SIGNED) :
+			case (0x10000 + SF_ENDIAN_LITTLE + SF_CHARS_SIGNED) :
+					psf->read_short		= pcm_read_sc2s ;
+					psf->read_int		= pcm_read_sc2i ;
+					psf->read_float		= pcm_read_sc2f ;
+					psf->read_double	= pcm_read_sc2d ;
+					break ;
+			case (0x10000 + SF_ENDIAN_BIG + SF_CHARS_UNSIGNED) :
+			case (0x10000 + SF_ENDIAN_LITTLE + SF_CHARS_UNSIGNED) :
+					psf->read_short		= pcm_read_uc2s ;
+					psf->read_int		= pcm_read_uc2i ;
+					psf->read_float		= pcm_read_uc2f ;
+					psf->read_double	= pcm_read_uc2d ;
+					break ;
+
+			case (2 * 0x10000 + SF_ENDIAN_BIG) :
+					psf->read_short		= pcm_read_bes2s ;
+					psf->read_int		= pcm_read_bes2i ;
+					psf->read_float		= pcm_read_bes2f ;
+					psf->read_double	= pcm_read_bes2d ;
+					break ;
+			case (3 * 0x10000 + SF_ENDIAN_BIG) :
+					psf->read_short		= pcm_read_bet2s ;
+					psf->read_int		= pcm_read_bet2i ;
+					psf->read_float		= pcm_read_bet2f ;
+					psf->read_double	= pcm_read_bet2d ;
+					break ;
+			case (4 * 0x10000 + SF_ENDIAN_BIG) :
+
+					psf->read_short		= pcm_read_bei2s ;
+					psf->read_int		= pcm_read_bei2i ;
+					psf->read_float		= pcm_read_bei2f ;
+					psf->read_double	= pcm_read_bei2d ;
+					break ;
+
+			case (2 * 0x10000 + SF_ENDIAN_LITTLE) :
+					psf->read_short		= pcm_read_les2s ;
+					psf->read_int		= pcm_read_les2i ;
+					psf->read_float		= pcm_read_les2f ;
+					psf->read_double	= pcm_read_les2d ;
+					break ;
+			case (3 * 0x10000 + SF_ENDIAN_LITTLE) :
+					psf->read_short		= pcm_read_let2s ;
+					psf->read_int		= pcm_read_let2i ;
+					psf->read_float		= pcm_read_let2f ;
+					psf->read_double	= pcm_read_let2d ;
+					break ;
+			case (4 * 0x10000 + SF_ENDIAN_LITTLE) :
+					psf->read_short		= pcm_read_lei2s ;
+					psf->read_int		= pcm_read_lei2i ;
+					psf->read_float		= pcm_read_lei2f ;
+					psf->read_double	= pcm_read_lei2d ;
+					break ;
+			default :
+				psf_log_printf (psf, "pcm.c returning SFE_UNIMPLEMENTED\nbytewidth %d    endian %d\n", psf->bytewidth, psf->endian) ;
+				return SFE_UNIMPLEMENTED ;
+			} ;
+		} ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	switch (psf->bytewidth * 0x10000 + psf->endian + chars)
+		{	case (0x10000 + SF_ENDIAN_BIG + SF_CHARS_SIGNED) :
+			case (0x10000 + SF_ENDIAN_LITTLE + SF_CHARS_SIGNED) :
+					psf->write_short	= pcm_write_s2sc ;
+					psf->write_int		= pcm_write_i2sc ;
+					psf->write_float	= pcm_write_f2sc ;
+					psf->write_double	= pcm_write_d2sc ;
+					break ;
+			case (0x10000 + SF_ENDIAN_BIG + SF_CHARS_UNSIGNED) :
+			case (0x10000 + SF_ENDIAN_LITTLE + SF_CHARS_UNSIGNED) :
+					psf->write_short	= pcm_write_s2uc ;
+					psf->write_int		= pcm_write_i2uc ;
+					psf->write_float	= pcm_write_f2uc ;
+					psf->write_double	= pcm_write_d2uc ;
+					break ;
+
+			case (2 * 0x10000 + SF_ENDIAN_BIG) :
+					psf->write_short	= pcm_write_s2bes ;
+					psf->write_int		= pcm_write_i2bes ;
+					psf->write_float	= pcm_write_f2bes ;
+					psf->write_double	= pcm_write_d2bes ;
+					break ;
+
+			case (3 * 0x10000 + SF_ENDIAN_BIG) :
+					psf->write_short	= pcm_write_s2bet ;
+					psf->write_int		= pcm_write_i2bet ;
+					psf->write_float	= pcm_write_f2bet ;
+					psf->write_double	= pcm_write_d2bet ;
+					break ;
+
+			case (4 * 0x10000 + SF_ENDIAN_BIG) :
+					psf->write_short	= pcm_write_s2bei ;
+					psf->write_int		= pcm_write_i2bei ;
+					psf->write_float	= pcm_write_f2bei ;
+					psf->write_double	= pcm_write_d2bei ;
+					break ;
+
+			case (2 * 0x10000 + SF_ENDIAN_LITTLE) :
+					psf->write_short	= pcm_write_s2les ;
+					psf->write_int		= pcm_write_i2les ;
+					psf->write_float	= pcm_write_f2les ;
+					psf->write_double	= pcm_write_d2les ;
+					break ;
+
+			case (3 * 0x10000 + SF_ENDIAN_LITTLE) :
+					psf->write_short	= pcm_write_s2let ;
+					psf->write_int		= pcm_write_i2let ;
+					psf->write_float	= pcm_write_f2let ;
+					psf->write_double	= pcm_write_d2let ;
+					break ;
+
+			case (4 * 0x10000 + SF_ENDIAN_LITTLE) :
+					psf->write_short	= pcm_write_s2lei ;
+					psf->write_int		= pcm_write_i2lei ;
+					psf->write_float	= pcm_write_f2lei ;
+					psf->write_double	= pcm_write_d2lei ;
+					break ;
+
+			default :
+				psf_log_printf (psf, "pcm.c returning SFE_UNIMPLEMENTED\nbytewidth %s    endian %d\n", psf->bytewidth, psf->endian) ;
+				return SFE_UNIMPLEMENTED ;
+			} ;
+
+		} ;
+
+	if (psf->filelength > psf->dataoffset)
+	{	psf->datalength = (psf->dataend > 0) ? psf->dataend - psf->dataoffset :
+							psf->filelength - psf->dataoffset ;
+		}
+	else
+		psf->datalength = 0 ;
+
+	psf->sf.frames = psf->blockwidth > 0 ? psf->datalength / psf->blockwidth : 0 ;
+
+	return 0 ;
+} /* pcm_init */
+
+/*==============================================================================
+*/
+
+static inline void
+sc2s_array	(signed char *src, int count, short *dest)
+{	while (--count >= 0)
+	{	dest [count] = src [count] << 8 ;
+		} ;
+} /* sc2s_array */
+
+static inline void
+uc2s_array	(unsigned char *src, int count, short *dest)
+{	while (--count >= 0)
+	{	dest [count] = (((short) src [count]) - 0x80) << 8 ;
+		} ;
+} /* uc2s_array */
+
+static inline void
+let2s_array (tribyte *src, int count, short *dest)
+{	unsigned char	*ucptr ;
+
+	ucptr = ((unsigned char*) src) + 3 * count ;
+	while (--count >= 0)
+	{	ucptr -= 3 ;
+		dest [count] = LET2H_SHORT_PTR (ucptr) ;
+		} ;
+} /* let2s_array */
+
+static inline void
+bet2s_array (tribyte *src, int count, short *dest)
+{	unsigned char	*ucptr ;
+
+	ucptr = ((unsigned char*) src) + 3 * count ;
+	while (--count >= 0)
+	{	ucptr -= 3 ;
+		dest [count] = BET2H_SHORT_PTR (ucptr) ;
+			} ;
+} /* bet2s_array */
+
+static inline void
+lei2s_array (int *src, int count, short *dest)
+{	int value ;
+
+	while (--count >= 0)
+	{	value = LEI2H_INT (src [count]) ;
+		dest [count] = value >> 16 ;
+		} ;
+} /* lei2s_array */
+
+static inline void
+bei2s_array (int *src, int count, short *dest)
+{	int value ;
+
+	while (--count >= 0)
+	{	value = BEI2H_INT (src [count]) ;
+		dest [count] = value >> 16 ;
+		} ;
+} /* bei2s_array */
+
+/*--------------------------------------------------------------------------
+*/
+
+static inline void
+sc2i_array	(signed char *src, int count, int *dest)
+{	while (--count >= 0)
+	{	dest [count] = ((int) src [count]) << 24 ;
+		} ;
+} /* sc2i_array */
+
+static inline void
+uc2i_array	(unsigned char *src, int count, int *dest)
+{	while (--count >= 0)
+	{	dest [count] = (((int) src [count]) - 128) << 24 ;
+		} ;
+} /* uc2i_array */
+
+static inline void
+bes2i_array (short *src, int count, int *dest)
+{	short value ;
+
+	while (--count >= 0)
+	{	value = BES2H_SHORT (src [count]) ;
+		dest [count] = value << 16 ;
+		} ;
+} /* bes2i_array */
+
+static inline void
+les2i_array (short *src, int count, int *dest)
+{	short value ;
+
+	while (--count >= 0)
+	{	value = LES2H_SHORT (src [count]) ;
+		dest [count] = value << 16 ;
+		} ;
+} /* les2i_array */
+
+static inline void
+bet2i_array (tribyte *src, int count, int *dest)
+{	unsigned char	*ucptr ;
+
+	ucptr = ((unsigned char*) src) + 3 * count ;
+	while (--count >= 0)
+	{	ucptr -= 3 ;
+		dest [count] = BET2H_INT_PTR (ucptr) ;
+			} ;
+} /* bet2i_array */
+
+static inline void
+let2i_array (tribyte *src, int count, int *dest)
+{	unsigned char	*ucptr ;
+
+	ucptr = ((unsigned char*) src) + 3 * count ;
+	while (--count >= 0)
+	{	ucptr -= 3 ;
+		dest [count] = LET2H_INT_PTR (ucptr) ;
+		} ;
+} /* let2i_array */
+
+/*--------------------------------------------------------------------------
+*/
+
+static inline void
+sc2f_array	(signed char *src, int count, float *dest, float normfact)
+{	while (--count >= 0)
+		dest [count] = ((float) src [count]) * normfact ;
+} /* sc2f_array */
+
+static inline void
+uc2f_array	(unsigned char *src, int count, float *dest, float normfact)
+{	while (--count >= 0)
+		dest [count] = (((int) src [count]) - 128) * normfact ;
+} /* uc2f_array */
+
+static inline void
+les2f_array (short *src, int count, float *dest, float normfact)
+{	short	value ;
+
+	while (--count >= 0)
+	{	value = src [count] ;
+		value = LES2H_SHORT (value) ;
+		dest [count] = ((float) value) * normfact ;
+		} ;
+} /* les2f_array */
+
+static inline void
+bes2f_array (short *src, int count, float *dest, float normfact)
+{	short			value ;
+
+	while (--count >= 0)
+	{	value = src [count] ;
+		value = BES2H_SHORT (value) ;
+		dest [count] = ((float) value) * normfact ;
+		} ;
+} /* bes2f_array */
+
+static inline void
+let2f_array (tribyte *src, int count, float *dest, float normfact)
+{	unsigned char	*ucptr ;
+	int 			value ;
+
+	ucptr = ((unsigned char*) src) + 3 * count ;
+	while (--count >= 0)
+	{	ucptr -= 3 ;
+		value = LET2H_INT_PTR (ucptr) ;
+		dest [count] = ((float) value) * normfact ;
+		} ;
+} /* let2f_array */
+
+static inline void
+bet2f_array (tribyte *src, int count, float *dest, float normfact)
+{	unsigned char	*ucptr ;
+	int				value ;
+
+	ucptr = ((unsigned char*) src) + 3 * count ;
+	while (--count >= 0)
+	{	ucptr -= 3 ;
+		value = BET2H_INT_PTR (ucptr) ;
+		dest [count] = ((float) value) * normfact ;
+			} ;
+} /* bet2f_array */
+
+static inline void
+lei2f_array (int *src, int count, float *dest, float normfact)
+{	int 			value ;
+
+	while (--count >= 0)
+	{	value = src [count] ;
+		value = LEI2H_INT (value) ;
+		dest [count] = ((float) value) * normfact ;
+		} ;
+} /* lei2f_array */
+
+static inline void
+bei2f_array (int *src, int count, float *dest, float normfact)
+{	int 			value ;
+
+	while (--count >= 0)
+	{	value = src [count] ;
+		value = BEI2H_INT (value) ;
+		dest [count] = ((float) value) * normfact ;
+		} ;
+} /* bei2f_array */
+
+/*--------------------------------------------------------------------------
+*/
+
+static inline void
+sc2d_array	(signed char *src, int count, double *dest, double normfact)
+{	while (--count >= 0)
+		dest [count] = ((double) src [count]) * normfact ;
+} /* sc2d_array */
+
+static inline void
+uc2d_array	(unsigned char *src, int count, double *dest, double normfact)
+{	while (--count >= 0)
+		dest [count] = (((int) src [count]) - 128) * normfact ;
+} /* uc2d_array */
+
+static inline void
+les2d_array (short *src, int count, double *dest, double normfact)
+{	short	value ;
+
+	while (--count >= 0)
+	{	value = src [count] ;
+		value = LES2H_SHORT (value) ;
+		dest [count] = ((double) value) * normfact ;
+		} ;
+} /* les2d_array */
+
+static inline void
+bes2d_array (short *src, int count, double *dest, double normfact)
+{	short	value ;
+
+	while (--count >= 0)
+	{	value = src [count] ;
+		value = BES2H_SHORT (value) ;
+		dest [count] = ((double) value) * normfact ;
+		} ;
+} /* bes2d_array */
+
+static inline void
+let2d_array (tribyte *src, int count, double *dest, double normfact)
+{	unsigned char	*ucptr ;
+	int				value ;
+
+	ucptr = ((unsigned char*) src) + 3 * count ;
+	while (--count >= 0)
+	{	ucptr -= 3 ;
+		value = LET2H_INT_PTR (ucptr) ;
+		dest [count] = ((double) value) * normfact ;
+		} ;
+} /* let2d_array */
+
+static inline void
+bet2d_array (tribyte *src, int count, double *dest, double normfact)
+{	unsigned char	*ucptr ;
+	int				value ;
+
+	ucptr = ((unsigned char*) src) + 3 * count ;
+	while (--count >= 0)
+	{	ucptr -= 3 ;
+		value = (ucptr [0] << 24) | (ucptr [1] << 16) | (ucptr [2] << 8) ;
+		dest [count] = ((double) value) * normfact ;
+		} ;
+} /* bet2d_array */
+
+static inline void
+lei2d_array (int *src, int count, double *dest, double normfact)
+{	int 	value ;
+
+	while (--count >= 0)
+	{	value = src [count] ;
+		value = LEI2H_INT (value) ;
+		dest [count] = ((double) value) * normfact ;
+		} ;
+} /* lei2d_array */
+
+static inline void
+bei2d_array (int *src, int count, double *dest, double normfact)
+{	int 	value ;
+
+	while (--count >= 0)
+	{	value = src [count] ;
+		value = BEI2H_INT (value) ;
+		dest [count] = ((double) value) * normfact ;
+		} ;
+} /* bei2d_array */
+
+/*--------------------------------------------------------------------------
+*/
+
+static inline void
+s2sc_array	(const short *src, signed char *dest, int count)
+{	while (--count >= 0)
+		dest [count] = src [count] >> 8 ;
+} /* s2sc_array */
+
+static inline void
+s2uc_array	(const short *src, unsigned char *dest, int count)
+{	while (--count >= 0)
+		dest [count] = (src [count] >> 8) + 0x80 ;
+} /* s2uc_array */
+
+static inline void
+s2let_array (const short *src, tribyte *dest, int count)
+{	unsigned char	*ucptr ;
+
+	ucptr = ((unsigned char*) dest) + 3 * count ;
+	while (--count >= 0)
+	{	ucptr -= 3 ;
+		ucptr [0] = 0 ;
+		ucptr [1] = src [count] ;
+		ucptr [2] = src [count] >> 8 ;
+		} ;
+} /* s2let_array */
+
+static inline void
+s2bet_array (const short *src, tribyte *dest, int count)
+{	unsigned char	*ucptr ;
+
+	ucptr = ((unsigned char*) dest) + 3 * count ;
+	while (--count >= 0)
+	{	ucptr -= 3 ;
+		ucptr [2] = 0 ;
+		ucptr [1] = src [count] ;
+		ucptr [0] = src [count] >> 8 ;
+		} ;
+} /* s2bet_array */
+
+static inline void
+s2lei_array (const short *src, int *dest, int count)
+{	unsigned char	*ucptr ;
+
+	ucptr = ((unsigned char*) dest) + 4 * count ;
+	while (--count >= 0)
+	{	ucptr -= 4 ;
+		ucptr [0] = 0 ;
+		ucptr [1] = 0 ;
+		ucptr [2] = src [count] ;
+		ucptr [3] = src [count] >> 8 ;
+		} ;
+} /* s2lei_array */
+
+static inline void
+s2bei_array (const short *src, int *dest, int count)
+{	unsigned char	*ucptr ;
+
+	ucptr = ((unsigned char*) dest) + 4 * count ;
+	while (--count >= 0)
+	{	ucptr -= 4 ;
+		ucptr [0] = src [count] >> 8 ;
+		ucptr [1] = src [count] ;
+		ucptr [2] = 0 ;
+		ucptr [3] = 0 ;
+		} ;
+} /* s2bei_array */
+
+/*--------------------------------------------------------------------------
+*/
+
+static inline void
+i2sc_array	(const int *src, signed char *dest, int count)
+{	while (--count >= 0)
+		dest [count] = (src [count] >> 24) ;
+} /* i2sc_array */
+
+static inline void
+i2uc_array	(const int *src, unsigned char *dest, int count)
+{	while (--count >= 0)
+		dest [count] = ((src [count] >> 24) + 128) ;
+} /* i2uc_array */
+
+static inline void
+i2bes_array (const int *src, short *dest, int count)
+{	unsigned char	*ucptr ;
+
+	ucptr = ((unsigned char*) dest) + 2 * count ;
+	while (--count >= 0)
+	{	ucptr -= 2 ;
+		ucptr [0] = src [count] >> 24 ;
+		ucptr [1] = src [count] >> 16 ;
+		} ;
+} /* i2bes_array */
+
+static inline void
+i2les_array (const int *src, short *dest, int count)
+{	unsigned char	*ucptr ;
+
+	ucptr = ((unsigned char*) dest) + 2 * count ;
+	while (--count >= 0)
+	{	ucptr -= 2 ;
+		ucptr [0] = src [count] >> 16 ;
+		ucptr [1] = src [count] >> 24 ;
+		} ;
+} /* i2les_array */
+
+static inline void
+i2let_array (const int *src, tribyte *dest, int count)
+{	unsigned char	*ucptr ;
+	int				value ;
+
+	ucptr = ((unsigned char*) dest) + 3 * count ;
+	while (--count >= 0)
+	{	ucptr -= 3 ;
+		value = src [count] >> 8 ;
+		ucptr [0] = value ;
+		ucptr [1] = value >> 8 ;
+		ucptr [2] = value >> 16 ;
+		} ;
+} /* i2let_array */
+
+static inline void
+i2bet_array (const int *src, tribyte *dest, int count)
+{	unsigned char	*ucptr ;
+	int				value ;
+
+	ucptr = ((unsigned char*) dest) + 3 * count ;
+	while (--count >= 0)
+	{	ucptr -= 3 ;
+		value = src [count] >> 8 ;
+		ucptr [2] = value ;
+		ucptr [1] = value >> 8 ;
+		ucptr [0] = value >> 16 ;
+		} ;
+} /* i2bet_array */
+
+/*===============================================================================================
+*/
+
+static sf_count_t
+pcm_read_sc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.scbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+		sc2s_array (psf->u.scbuf, readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_sc2s */
+
+static sf_count_t
+pcm_read_uc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
+		uc2s_array (psf->u.ucbuf, readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_uc2s */
+
+static sf_count_t
+pcm_read_bes2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	int		total ;
+
+	total = psf_fread (ptr, sizeof (short), len, psf) ;
+	if (CPU_IS_LITTLE_ENDIAN)
+		endswap_short_array (ptr, len) ;
+
+	return total ;
+} /* pcm_read_bes2s */
+
+static sf_count_t
+pcm_read_les2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	int		total ;
+
+	total = psf_fread (ptr, sizeof (short), len, psf) ;
+	if (CPU_IS_BIG_ENDIAN)
+		endswap_short_array (ptr, len) ;
+
+	return total ;
+} /* pcm_read_les2s */
+
+static sf_count_t
+pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+		bet2s_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_bet2s */
+
+static sf_count_t
+pcm_read_let2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+		let2s_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_let2s */
+
+static sf_count_t
+pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+		bei2s_array (psf->u.ibuf, readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_bei2s */
+
+static sf_count_t
+pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+		lei2s_array (psf->u.ibuf, readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_lei2s */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static sf_count_t
+pcm_read_sc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.scbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+		sc2i_array (psf->u.scbuf, readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_sc2i */
+
+static sf_count_t
+pcm_read_uc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
+		uc2i_array (psf->u.ucbuf, readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_uc2i */
+
+static sf_count_t
+pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		bes2i_array (psf->u.sbuf, readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_bes2i */
+
+static sf_count_t
+pcm_read_les2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		les2i_array (psf->u.sbuf, readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_les2i */
+
+static sf_count_t
+pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+		bet2i_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_bet2i */
+
+static sf_count_t
+pcm_read_let2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+		let2i_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_let2i */
+
+static sf_count_t
+pcm_read_bei2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	int		total ;
+
+	total = psf_fread (ptr, sizeof (int), len, psf) ;
+	if (CPU_IS_LITTLE_ENDIAN)
+		endswap_int_array	(ptr, len) ;
+
+	return total ;
+} /* pcm_read_bei2i */
+
+static sf_count_t
+pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	int		total ;
+
+	total = psf_fread (ptr, sizeof (int), len, psf) ;
+	if (CPU_IS_BIG_ENDIAN)
+		endswap_int_array	(ptr, len) ;
+
+	return total ;
+} /* pcm_read_lei2i */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static sf_count_t
+pcm_read_sc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.scbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+		sc2f_array (psf->u.scbuf, readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_sc2f */
+
+static sf_count_t
+pcm_read_uc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
+		uc2f_array (psf->u.ucbuf, readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_uc2f */
+
+static sf_count_t
+pcm_read_bes2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		bes2f_array (psf->u.sbuf, readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_bes2f */
+
+static sf_count_t
+pcm_read_les2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		les2f_array (psf->u.sbuf, readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_les2f */
+
+static sf_count_t
+pcm_read_bet2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	float	normfact ;
+
+	/* Special normfactor because tribyte value is read into an int. */
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 / 256.0 ;
+
+	bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+		bet2f_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_bet2f */
+
+static sf_count_t
+pcm_read_let2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	float	normfact ;
+
+	/* Special normfactor because tribyte value is read into an int. */
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 / 256.0 ;
+
+	bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+		let2f_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_let2f */
+
+static sf_count_t
+pcm_read_bei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+		bei2f_array (psf->u.ibuf, readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_bei2f */
+
+static sf_count_t
+pcm_read_lei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+		lei2f_array (psf->u.ibuf, readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_lei2f */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static sf_count_t
+pcm_read_sc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	double		normfact ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.scbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+		sc2d_array (psf->u.scbuf, readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_sc2d */
+
+static sf_count_t
+pcm_read_uc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	double		normfact ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
+		uc2d_array (psf->u.ucbuf, readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_uc2d */
+
+static sf_count_t
+pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	double		normfact ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		bes2d_array (psf->u.sbuf, readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_bes2d */
+
+static sf_count_t
+pcm_read_les2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	double		normfact ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		les2d_array (psf->u.sbuf, readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_les2d */
+
+static sf_count_t
+pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	double		normfact ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 / 256.0 ;
+
+	bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+		bet2d_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_bet2d */
+
+static sf_count_t
+pcm_read_let2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	double		normfact ;
+
+	/* Special normfactor because tribyte value is read into an int. */
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 / 256.0 ;
+
+	bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+		let2d_array ((tribyte*) (psf->u.ucbuf), readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_let2d */
+
+static sf_count_t
+pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	double		normfact ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+		bei2d_array (psf->u.ibuf, readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_bei2d */
+
+static sf_count_t
+pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	double		normfact ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+		lei2d_array (psf->u.ibuf, readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* pcm_read_lei2d */
+
+/*===============================================================================================
+**-----------------------------------------------------------------------------------------------
+**===============================================================================================
+*/
+
+static sf_count_t
+pcm_write_s2sc	(SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.scbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		s2sc_array (ptr + total, psf->u.scbuf, bufferlen) ;
+		writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_s2sc */
+
+static sf_count_t
+pcm_write_s2uc	(SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		s2uc_array (ptr + total, psf->u.ucbuf, bufferlen) ;
+		writecount = psf_fwrite (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_s2uc */
+
+static sf_count_t
+pcm_write_s2bes	(SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	if (CPU_IS_BIG_ENDIAN)
+		return psf_fwrite (ptr, sizeof (short), len, psf) ;
+	else
+
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		endswap_short_copy (psf->u.sbuf, ptr + total, bufferlen) ;
+		writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_s2bes */
+
+static sf_count_t
+pcm_write_s2les	(SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	if (CPU_IS_LITTLE_ENDIAN)
+		return psf_fwrite (ptr, sizeof (short), len, psf) ;
+
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		endswap_short_copy (psf->u.sbuf, ptr + total, bufferlen) ;
+		writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_s2les */
+
+static sf_count_t
+pcm_write_s2bet	(SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		s2bet_array (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen) ;
+		writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_s2bet */
+
+static sf_count_t
+pcm_write_s2let	(SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		s2let_array (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen) ;
+		writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_s2let */
+
+static sf_count_t
+pcm_write_s2bei	(SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		s2bei_array (ptr + total, psf->u.ibuf, bufferlen) ;
+		writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_s2bei */
+
+static sf_count_t
+pcm_write_s2lei	(SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		s2lei_array (ptr + total, psf->u.ibuf, bufferlen) ;
+		writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_s2lei */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static sf_count_t
+pcm_write_i2sc	(SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.scbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		i2sc_array (ptr + total, psf->u.scbuf, bufferlen) ;
+		writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_i2sc */
+
+static sf_count_t
+pcm_write_i2uc	(SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		i2uc_array (ptr + total, psf->u.ucbuf, bufferlen) ;
+		writecount = psf_fwrite (psf->u.ucbuf, sizeof (signed char), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_i2uc */
+
+static sf_count_t
+pcm_write_i2bes	(SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		i2bes_array (ptr + total, psf->u.sbuf, bufferlen) ;
+		writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_i2bes */
+
+static sf_count_t
+pcm_write_i2les	(SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		i2les_array (ptr + total, psf->u.sbuf, bufferlen) ;
+		writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_i2les */
+
+static sf_count_t
+pcm_write_i2bet	(SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		i2bet_array (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen) ;
+		writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_i2bet */
+
+static sf_count_t
+pcm_write_i2let	(SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		i2let_array (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen) ;
+		writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_i2les */
+
+static sf_count_t
+pcm_write_i2bei	(SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	if (CPU_IS_BIG_ENDIAN)
+		return psf_fwrite (ptr, sizeof (int), len, psf) ;
+
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		endswap_int_copy (psf->u.ibuf, ptr + total, bufferlen) ;
+		writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_i2bei */
+
+static sf_count_t
+pcm_write_i2lei	(SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	if (CPU_IS_LITTLE_ENDIAN)
+		return psf_fwrite (ptr, sizeof (int), len, psf) ;
+
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		endswap_int_copy (psf->u.ibuf, ptr + total, bufferlen) ;
+		writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_i2lei */
+
+/*------------------------------------------------------------------------------
+**==============================================================================
+**------------------------------------------------------------------------------
+*/
+
+static void
+f2sc_array (const float *src, signed char *dest, int count, int normalize)
+{	float normfact ;
+
+	normfact = normalize ? (1.0 * 0x7F) : 1.0 ;
+
+	while (--count >= 0)
+	{	dest [count] = lrintf (src [count] * normfact) ;
+		} ;
+} /* f2sc_array */
+
+static void
+f2sc_clip_array (const float *src, signed char *dest, int count, int normalize)
+{	float	normfact, scaled_value ;
+
+	normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x1000000) ;
+
+	while (--count >= 0)
+	{	scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
+		{	dest [count] = 127 ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
+		{	dest [count] = -128 ;
+			continue ;
+			} ;
+
+		dest [count] = lrintf (scaled_value) >> 24 ;
+		} ;
+} /* f2sc_clip_array */
+
+static sf_count_t
+pcm_write_f2sc	(SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	void		(*convert) (const float *, signed char *, int, int) ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	convert = (psf->add_clipping) ? f2sc_clip_array : f2sc_array ;
+	bufferlen = ARRAY_LEN (psf->u.scbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		convert (ptr + total, psf->u.scbuf, bufferlen, psf->norm_float) ;
+		writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_f2sc */
+
+/*==============================================================================
+*/
+
+static	void
+f2uc_array	(const float *src, unsigned char *dest, int count, int normalize)
+{	float normfact ;
+
+	normfact = normalize ? (1.0 * 0x7F) : 1.0 ;
+
+	while (--count >= 0)
+	{	dest [count] = lrintf (src [count] * normfact) + 128 ;
+		} ;
+} /* f2uc_array */
+
+static	void
+f2uc_clip_array	(const float *src, unsigned char *dest, int count, int normalize)
+{	float	normfact, scaled_value ;
+
+	normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x1000000) ;
+
+	while (--count >= 0)
+	{	scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
+		{	dest [count] = 0xFF ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
+		{	dest [count] = 0 ;
+			continue ;
+			} ;
+
+		dest [count] = (lrintf (scaled_value) >> 24) + 128 ;
+		} ;
+} /* f2uc_clip_array */
+
+static sf_count_t
+pcm_write_f2uc	(SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	void		(*convert) (const float *, unsigned char *, int, int) ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	convert = (psf->add_clipping) ? f2uc_clip_array : f2uc_array ;
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		convert (ptr + total, psf->u.ucbuf, bufferlen, psf->norm_float) ;
+		writecount = psf_fwrite (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_f2uc */
+
+/*==============================================================================
+*/
+
+static void
+f2bes_array (const float *src, short *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	float 			normfact ;
+	short			value ;
+
+	normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ;
+	ucptr = ((unsigned char*) dest) + 2 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 2 ;
+		value = lrintf (src [count] * normfact) ;
+		ucptr [1] = value ;
+		ucptr [0] = value >> 8 ;
+			} ;
+} /* f2bes_array */
+
+static void
+f2bes_clip_array (const float *src, short *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	float			normfact, scaled_value ;
+	int				value ;
+
+	normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x10000) ;
+	ucptr = ((unsigned char*) dest) + 2 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 2 ;
+		scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
+		{	ucptr [1] = 0xFF ;
+			ucptr [0] = 0x7F ;
+			continue ;
+		} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
+		{	ucptr [1] = 0x00 ;
+			ucptr [0] = 0x80 ;
+			continue ;
+			} ;
+
+		value = lrintf (scaled_value) ;
+		ucptr [1] = value >> 16 ;
+		ucptr [0] = value >> 24 ;
+		} ;
+} /* f2bes_clip_array */
+
+static sf_count_t
+pcm_write_f2bes	(SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	void		(*convert) (const float *, short *t, int, int) ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	convert = (psf->add_clipping) ? f2bes_clip_array : f2bes_array ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		convert (ptr + total, psf->u.sbuf, bufferlen, psf->norm_float) ;
+		writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+				break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_f2bes */
+
+/*==============================================================================
+*/
+
+static void
+f2les_array (const float *src, short *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	float			normfact ;
+	int				value ;
+
+	normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ;
+	ucptr = ((unsigned char*) dest) + 2 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 2 ;
+		value = lrintf (src [count] * normfact) ;
+		ucptr [0] = value ;
+		ucptr [1] = value >> 8 ;
+		} ;
+} /* f2les_array */
+
+static void
+f2les_clip_array (const float *src, short *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	float			normfact, scaled_value ;
+	int				value ;
+
+	normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x10000) ;
+	ucptr = ((unsigned char*) dest) + 2 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 2 ;
+		scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
+		{	ucptr [0] = 0xFF ;
+			ucptr [1] = 0x7F ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
+		{	ucptr [0] = 0x00 ;
+			ucptr [1] = 0x80 ;
+			continue ;
+			} ;
+
+		value = lrintf (scaled_value) ;
+		ucptr [0] = value >> 16 ;
+		ucptr [1] = value >> 24 ;
+		} ;
+} /* f2les_clip_array */
+
+static sf_count_t
+pcm_write_f2les	(SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	void		(*convert) (const float *, short *t, int, int) ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	convert = (psf->add_clipping) ? f2les_clip_array : f2les_array ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		convert (ptr + total, psf->u.sbuf, bufferlen, psf->norm_float) ;
+		writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_f2les */
+
+/*==============================================================================
+*/
+
+static void
+f2let_array (const float *src, tribyte *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	float 			normfact ;
+	int				value ;
+
+	normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ;
+	ucptr = ((unsigned char*) dest) + 3 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 3 ;
+		value = lrintf (src [count] * normfact) ;
+		ucptr [0] = value ;
+		ucptr [1] = value >> 8 ;
+		ucptr [2] = value >> 16 ;
+		} ;
+} /* f2let_array */
+
+static void
+f2let_clip_array (const float *src, tribyte *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	float			normfact, scaled_value ;
+	int				value ;
+
+	normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x100) ;
+	ucptr = ((unsigned char*) dest) + 3 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 3 ;
+		scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
+		{	ucptr [0] = 0xFF ;
+			ucptr [1] = 0xFF ;
+			ucptr [2] = 0x7F ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
+		{	ucptr [0] = 0x00 ;
+			ucptr [1] = 0x00 ;
+			ucptr [2] = 0x80 ;
+			continue ;
+		} ;
+
+		value = lrintf (scaled_value) ;
+		ucptr [0] = value >> 8 ;
+		ucptr [1] = value >> 16 ;
+		ucptr [2] = value >> 24 ;
+		} ;
+} /* f2let_clip_array */
+
+static sf_count_t
+pcm_write_f2let	(SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	void		(*convert) (const float *, tribyte *, int, int) ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	convert = (psf->add_clipping) ? f2let_clip_array : f2let_array ;
+	bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		convert (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen, psf->norm_float) ;
+		writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_f2let */
+
+/*==============================================================================
+*/
+
+static void
+f2bet_array (const float *src, tribyte *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	float 			normfact ;
+	int				value ;
+
+	normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ;
+	ucptr = ((unsigned char*) dest) + 3 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 3 ;
+		value = lrintf (src [count] * normfact) ;
+		ucptr [0] = value >> 16 ;
+		ucptr [1] = value >> 8 ;
+		ucptr [2] = value ;
+		} ;
+} /* f2bet_array */
+
+static void
+f2bet_clip_array (const float *src, tribyte *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	float			normfact, scaled_value ;
+	int				value ;
+
+	normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x100) ;
+	ucptr = ((unsigned char*) dest) + 3 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 3 ;
+		scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
+		{	ucptr [0] = 0x7F ;
+			ucptr [1] = 0xFF ;
+			ucptr [2] = 0xFF ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
+		{	ucptr [0] = 0x80 ;
+			ucptr [1] = 0x00 ;
+			ucptr [2] = 0x00 ;
+			continue ;
+		} ;
+
+		value = lrint (scaled_value) ;
+		ucptr [0] = value >> 24 ;
+		ucptr [1] = value >> 16 ;
+		ucptr [2] = value >> 8 ;
+		} ;
+} /* f2bet_clip_array */
+
+static sf_count_t
+pcm_write_f2bet	(SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	void		(*convert) (const float *, tribyte *, int, int) ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	convert = (psf->add_clipping) ? f2bet_clip_array : f2bet_array ;
+	bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		convert (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen, psf->norm_float) ;
+		writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_f2bet */
+
+/*==============================================================================
+*/
+
+static void
+f2bei_array (const float *src, int *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	float			normfact ;
+	int				value ;
+
+	normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ;
+	ucptr = ((unsigned char*) dest) + 4 * count ;
+	while (--count >= 0)
+	{	ucptr -= 4 ;
+		value = lrintf (src [count] * normfact) ;
+		ucptr [0] = value >> 24 ;
+		ucptr [1] = value >> 16 ;
+		ucptr [2] = value >> 8 ;
+		ucptr [3] = value ;
+		} ;
+} /* f2bei_array */
+
+static void
+f2bei_clip_array (const float *src, int *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	float			normfact, scaled_value ;
+	int				value ;
+
+	normfact = normalize ? (8.0 * 0x10000000) : 1.0 ;
+	ucptr = ((unsigned char*) dest) + 4 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 4 ;
+		scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= 1.0 * 0x7FFFFFFF)
+		{	ucptr [0] = 0x7F ;
+			ucptr [1] = 0xFF ;
+			ucptr [2] = 0xFF ;
+			ucptr [3] = 0xFF ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
+		{	ucptr [0] = 0x80 ;
+			ucptr [1] = 0x00 ;
+			ucptr [2] = 0x00 ;
+			ucptr [3] = 0x00 ;
+			continue ;
+		} ;
+
+		value = lrintf (scaled_value) ;
+		ucptr [0] = value >> 24 ;
+		ucptr [1] = value >> 16 ;
+		ucptr [2] = value >> 8 ;
+		ucptr [3] = value ;
+		} ;
+} /* f2bei_clip_array */
+
+static sf_count_t
+pcm_write_f2bei	(SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	void		(*convert) (const float *, int *, int, int) ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	convert = (psf->add_clipping) ? f2bei_clip_array : f2bei_array ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		convert (ptr + total, psf->u.ibuf, bufferlen, psf->norm_float) ;
+		writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_f2bei */
+
+/*==============================================================================
+*/
+
+static void
+f2lei_array (const float *src, int *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	float			normfact ;
+	int				value ;
+
+	normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ;
+	ucptr = ((unsigned char*) dest) + 4 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 4 ;
+		value = lrintf (src [count] * normfact) ;
+		ucptr [0] = value ;
+		ucptr [1] = value >> 8 ;
+		ucptr [2] = value >> 16 ;
+		ucptr [3] = value >> 24 ;
+		} ;
+} /* f2lei_array */
+
+static void
+f2lei_clip_array (const float *src, int *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	float			normfact, scaled_value ;
+	int				value ;
+
+	normfact = normalize ? (8.0 * 0x10000000) : 1.0 ;
+	ucptr = ((unsigned char*) dest) + 4 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 4 ;
+		scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
+		{	ucptr [0] = 0xFF ;
+			ucptr [1] = 0xFF ;
+			ucptr [2] = 0xFF ;
+			ucptr [3] = 0x7F ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
+		{	ucptr [0] = 0x00 ;
+			ucptr [1] = 0x00 ;
+			ucptr [2] = 0x00 ;
+			ucptr [3] = 0x80 ;
+			continue ;
+			} ;
+
+		value = lrintf (scaled_value) ;
+		ucptr [0] = value ;
+		ucptr [1] = value >> 8 ;
+		ucptr [2] = value >> 16 ;
+		ucptr [3] = value >> 24 ;
+		} ;
+} /* f2lei_clip_array */
+
+static sf_count_t
+pcm_write_f2lei	(SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	void		(*convert) (const float *, int *, int, int) ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	convert = (psf->add_clipping) ? f2lei_clip_array : f2lei_array ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		convert (ptr + total, psf->u.ibuf, bufferlen, psf->norm_float) ;
+		writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_f2lei */
+
+/*==============================================================================
+*/
+
+static void
+d2sc_array	(const double *src, signed char *dest, int count, int normalize)
+{	double	normfact ;
+
+	normfact = normalize ? (1.0 * 0x7F) : 1.0 ;
+
+	while (--count >= 0)
+	{	dest [count] = lrint (src [count] * normfact) ;
+		} ;
+} /* d2sc_array */
+
+static void
+d2sc_clip_array	(const double *src, signed char *dest, int count, int normalize)
+{	double	normfact, scaled_value ;
+
+	normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x1000000) ;
+
+	while (--count >= 0)
+	{	scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
+		{	dest [count] = 127 ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
+		{	dest [count] = -128 ;
+			continue ;
+			} ;
+
+		dest [count] = lrintf (scaled_value) >> 24 ;
+		} ;
+} /* d2sc_clip_array */
+
+static sf_count_t
+pcm_write_d2sc	(SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	void		(*convert) (const double *, signed char *, int, int) ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	convert = (psf->add_clipping) ? d2sc_clip_array : d2sc_array ;
+	bufferlen = ARRAY_LEN (psf->u.scbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		convert (ptr + total, psf->u.scbuf, bufferlen, psf->norm_double) ;
+		writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_d2sc */
+
+/*==============================================================================
+*/
+
+static	void
+d2uc_array	(const double *src, unsigned char *dest, int count, int normalize)
+{	double normfact ;
+
+	normfact = normalize ? (1.0 * 0x7F) : 1.0 ;
+
+	while (--count >= 0)
+	{	dest [count] = lrint (src [count] * normfact) + 128 ;
+		} ;
+} /* d2uc_array */
+
+static	void
+d2uc_clip_array	(const double *src, unsigned char *dest, int count, int normalize)
+{	double	normfact, scaled_value ;
+
+	normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x1000000) ;
+
+	while (--count >= 0)
+	{	scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
+		{	dest [count] = 255 ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
+		{	dest [count] = 0 ;
+			continue ;
+			} ;
+
+		dest [count] = (lrint (src [count] * normfact) >> 24) + 128 ;
+		} ;
+} /* d2uc_clip_array */
+
+static sf_count_t
+pcm_write_d2uc	(SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	void		(*convert) (const double *, unsigned char *, int, int) ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	convert = (psf->add_clipping) ? d2uc_clip_array : d2uc_array ;
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		convert (ptr + total, psf->u.ucbuf, bufferlen, psf->norm_double) ;
+		writecount = psf_fwrite (psf->u.ucbuf, sizeof (unsigned char), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_d2uc */
+
+/*==============================================================================
+*/
+
+static void
+d2bes_array (const double *src, short *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	short			value ;
+	double			normfact ;
+
+	normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ;
+	ucptr = ((unsigned char*) dest) + 2 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 2 ;
+		value = lrint (src [count] * normfact) ;
+		ucptr [1] = value ;
+		ucptr [0] = value >> 8 ;
+		} ;
+} /* d2bes_array */
+
+static void
+d2bes_clip_array (const double *src, short *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	double			normfact, scaled_value ;
+	int				value ;
+
+	normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x10000) ;
+	ucptr = ((unsigned char*) dest) + 2 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 2 ;
+		scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
+		{	ucptr [1] = 0xFF ;
+			ucptr [0] = 0x7F ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
+		{	ucptr [1] = 0x00 ;
+			ucptr [0] = 0x80 ;
+			continue ;
+			} ;
+
+		value = lrint (scaled_value) ;
+		ucptr [1] = value >> 16 ;
+		ucptr [0] = value >> 24 ;
+		} ;
+} /* d2bes_clip_array */
+
+static sf_count_t
+pcm_write_d2bes	(SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	void		(*convert) (const double *, short *, int, int) ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	convert = (psf->add_clipping) ? d2bes_clip_array : d2bes_array ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		convert (ptr + total, psf->u.sbuf, bufferlen, psf->norm_double) ;
+		writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_d2bes */
+
+/*==============================================================================
+*/
+
+static void
+d2les_array (const double *src, short *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	short			value ;
+	double			normfact ;
+
+	normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ;
+	ucptr = ((unsigned char*) dest) + 2 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 2 ;
+		value = lrint (src [count] * normfact) ;
+		ucptr [0] = value ;
+		ucptr [1] = value >> 8 ;
+		} ;
+} /* d2les_array */
+
+static void
+d2les_clip_array (const double *src, short *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	int				value ;
+	double			normfact, scaled_value ;
+
+	normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x10000) ;
+	ucptr = ((unsigned char*) dest) + 2 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 2 ;
+		scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
+		{	ucptr [0] = 0xFF ;
+			ucptr [1] = 0x7F ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
+		{	ucptr [0] = 0x00 ;
+			ucptr [1] = 0x80 ;
+			continue ;
+			} ;
+
+		value = lrint (scaled_value) ;
+		ucptr [0] = value >> 16 ;
+		ucptr [1] = value >> 24 ;
+		} ;
+} /* d2les_clip_array */
+
+static sf_count_t
+pcm_write_d2les	(SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	void		(*convert) (const double *, short *, int, int) ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	convert = (psf->add_clipping) ? d2les_clip_array : d2les_array ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		convert (ptr + total, psf->u.sbuf, bufferlen, psf->norm_double) ;
+		writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_d2les */
+
+/*==============================================================================
+*/
+
+static void
+d2let_array (const double *src, tribyte *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	int				value ;
+	double			normfact ;
+
+	normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ;
+	ucptr = ((unsigned char*) dest) + 3 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 3 ;
+		value = lrint (src [count] * normfact) ;
+		ucptr [0] = value ;
+		ucptr [1] = value >> 8 ;
+		ucptr [2] = value >> 16 ;
+		} ;
+} /* d2let_array */
+
+static void
+d2let_clip_array (const double *src, tribyte *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	int				value ;
+	double			normfact, scaled_value ;
+
+	normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x100) ;
+	ucptr = ((unsigned char*) dest) + 3 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 3 ;
+		scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
+		{	ucptr [0] = 0xFF ;
+			ucptr [1] = 0xFF ;
+			ucptr [2] = 0x7F ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
+		{	ucptr [0] = 0x00 ;
+			ucptr [1] = 0x00 ;
+			ucptr [2] = 0x80 ;
+			continue ;
+			} ;
+
+		value = lrint (scaled_value) ;
+		ucptr [0] = value >> 8 ;
+		ucptr [1] = value >> 16 ;
+		ucptr [2] = value >> 24 ;
+		} ;
+} /* d2let_clip_array */
+
+static sf_count_t
+pcm_write_d2let	(SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	void		(*convert) (const double *, tribyte *, int, int) ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	convert = (psf->add_clipping) ? d2let_clip_array : d2let_array ;
+	bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		convert (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen, psf->norm_double) ;
+		writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_d2let */
+
+/*==============================================================================
+*/
+
+static void
+d2bet_array (const double *src, tribyte *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	int				value ;
+	double			normfact ;
+
+	normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ;
+	ucptr = ((unsigned char*) dest) + 3 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 3 ;
+		value = lrint (src [count] * normfact) ;
+		ucptr [2] = value ;
+		ucptr [1] = value >> 8 ;
+		ucptr [0] = value >> 16 ;
+		} ;
+} /* d2bet_array */
+
+static void
+d2bet_clip_array (const double *src, tribyte *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	int				value ;
+	double			normfact, scaled_value ;
+
+	normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x100) ;
+	ucptr = ((unsigned char*) dest) + 3 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 3 ;
+		scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
+		{	ucptr [2] = 0xFF ;
+			ucptr [1] = 0xFF ;
+			ucptr [0] = 0x7F ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
+		{	ucptr [2] = 0x00 ;
+			ucptr [1] = 0x00 ;
+			ucptr [0] = 0x80 ;
+			continue ;
+			} ;
+
+		value = lrint (scaled_value) ;
+		ucptr [2] = value >> 8 ;
+		ucptr [1] = value >> 16 ;
+		ucptr [0] = value >> 24 ;
+		} ;
+} /* d2bet_clip_array */
+
+static sf_count_t
+pcm_write_d2bet	(SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	void		(*convert) (const double *, tribyte *, int, int) ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	convert = (psf->add_clipping) ? d2bet_clip_array : d2bet_array ;
+	bufferlen = sizeof (psf->u.ucbuf) / SIZEOF_TRIBYTE ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		convert (ptr + total, (tribyte*) (psf->u.ucbuf), bufferlen, psf->norm_double) ;
+		writecount = psf_fwrite (psf->u.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_d2bet */
+
+/*==============================================================================
+*/
+
+static void
+d2bei_array (const double *src, int *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	int				value ;
+	double			normfact ;
+
+	normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ;
+	ucptr = ((unsigned char*) dest) + 4 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 4 ;
+		value = lrint (src [count] * normfact) ;
+		ucptr [0] = value >> 24 ;
+		ucptr [1] = value >> 16 ;
+		ucptr [2] = value >> 8 ;
+		ucptr [3] = value ;
+		} ;
+} /* d2bei_array */
+
+static void
+d2bei_clip_array (const double *src, int *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	int				value ;
+	double			normfact, scaled_value ;
+
+	normfact = normalize ? (8.0 * 0x10000000) : 1.0 ;
+	ucptr = ((unsigned char*) dest) + 4 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 4 ;
+		scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
+		{	ucptr [3] = 0xFF ;
+			ucptr [2] = 0xFF ;
+			ucptr [1] = 0xFF ;
+			ucptr [0] = 0x7F ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
+		{	ucptr [3] = 0x00 ;
+			ucptr [2] = 0x00 ;
+			ucptr [1] = 0x00 ;
+			ucptr [0] = 0x80 ;
+			continue ;
+			} ;
+
+		value = lrint (scaled_value) ;
+		ucptr [0] = value >> 24 ;
+		ucptr [1] = value >> 16 ;
+		ucptr [2] = value >> 8 ;
+		ucptr [3] = value ;
+		} ;
+} /* d2bei_clip_array */
+
+static sf_count_t
+pcm_write_d2bei	(SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	void		(*convert) (const double *, int *, int, int) ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	convert = (psf->add_clipping) ? d2bei_clip_array : d2bei_array ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		convert (ptr + total, psf->u.ibuf, bufferlen, psf->norm_double) ;
+		writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_d2bei */
+
+/*==============================================================================
+*/
+
+static void
+d2lei_array (const double *src, int *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	int				value ;
+	double			normfact ;
+
+	normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ;
+	ucptr = ((unsigned char*) dest) + 4 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 4 ;
+		value = lrint (src [count] * normfact) ;
+		ucptr [0] = value ;
+		ucptr [1] = value >> 8 ;
+		ucptr [2] = value >> 16 ;
+		ucptr [3] = value >> 24 ;
+		} ;
+} /* d2lei_array */
+
+static void
+d2lei_clip_array (const double *src, int *dest, int count, int normalize)
+{	unsigned char	*ucptr ;
+	int				value ;
+	double			normfact, scaled_value ;
+
+	normfact = normalize ? (8.0 * 0x10000000) : 1.0 ;
+	ucptr = ((unsigned char*) dest) + 4 * count ;
+
+	while (--count >= 0)
+	{	ucptr -= 4 ;
+		scaled_value = src [count] * normfact ;
+		if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF))
+		{	ucptr [0] = 0xFF ;
+			ucptr [1] = 0xFF ;
+			ucptr [2] = 0xFF ;
+			ucptr [3] = 0x7F ;
+			continue ;
+			} ;
+		if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000))
+		{	ucptr [0] = 0x00 ;
+			ucptr [1] = 0x00 ;
+			ucptr [2] = 0x00 ;
+			ucptr [3] = 0x80 ;
+			continue ;
+			} ;
+
+		value = lrint (scaled_value) ;
+		ucptr [0] = value ;
+		ucptr [1] = value >> 8 ;
+		ucptr [2] = value >> 16 ;
+		ucptr [3] = value >> 24 ;
+		} ;
+} /* d2lei_clip_array */
+
+static sf_count_t
+pcm_write_d2lei	(SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	void		(*convert) (const double *, int *, int, int) ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	convert = (psf->add_clipping) ? d2lei_clip_array : d2lei_array ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		convert (ptr + total, psf->u.ibuf, bufferlen, psf->norm_double) ;
+		writecount = psf_fwrite (psf->u.ibuf, sizeof (int), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* pcm_write_d2lei */
+
diff --git a/jni/libsndfile-1.0.25/src/pcm.lo b/jni/libsndfile-1.0.25/src/pcm.lo
new file mode 100644
index 0000000..3539ae4
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/pcm.lo
@@ -0,0 +1,12 @@
+# pcm.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/pcm.o'
+
+# Name of the non-PIC object
+non_pic_object='pcm.o'
+
diff --git a/jni/libsndfile-1.0.25/src/pcm.o b/jni/libsndfile-1.0.25/src/pcm.o
new file mode 100644
index 0000000..e006889
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/pcm.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/pvf.c b/jni/libsndfile-1.0.25/src/pvf.c
new file mode 100644
index 0000000..4ea24b6
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/pvf.c
@@ -0,0 +1,188 @@
+/*
+** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+/*------------------------------------------------------------------------------
+** Macros to handle big/little endian issues.
+*/
+
+#define PVF1_MARKER		(MAKE_MARKER ('P', 'V', 'F', '1'))
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static	int		pvf_close		(SF_PRIVATE *psf) ;
+
+static int		pvf_write_header (SF_PRIVATE *psf, int calc_length) ;
+static int		pvf_read_header (SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+pvf_open	(SF_PRIVATE *psf)
+{	int		subformat ;
+	int		error = 0 ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = pvf_read_header (psf)))
+			return error ;
+		} ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_PVF)
+			return	SFE_BAD_OPEN_FORMAT ;
+
+		psf->endian = SF_ENDIAN_BIG ;
+
+		if (pvf_write_header (psf, SF_FALSE))
+			return psf->error ;
+
+		psf->write_header = pvf_write_header ;
+		} ;
+
+	psf->container_close = pvf_close ;
+
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+	switch (subformat)
+	{	case SF_FORMAT_PCM_S8 :	/* 8-bit linear PCM. */
+		case SF_FORMAT_PCM_16 :	/* 16-bit linear PCM. */
+		case SF_FORMAT_PCM_32 :	/* 32-bit linear PCM. */
+				error = pcm_init (psf) ;
+				break ;
+
+		default :	break ;
+		} ;
+
+	return error ;
+} /* pvf_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+pvf_close	(SF_PRIVATE * UNUSED (psf))
+{
+	return 0 ;
+} /* pvf_close */
+
+static int
+pvf_write_header (SF_PRIVATE *psf, int UNUSED (calc_length))
+{	sf_count_t	current ;
+
+	if (psf->pipeoffset > 0)
+		return 0 ;
+
+	current = psf_ftell (psf) ;
+
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+
+	if (psf->is_pipe == SF_FALSE)
+		psf_fseek (psf, 0, SEEK_SET) ;
+
+	snprintf ((char*) psf->header, sizeof (psf->header), "PVF1\n%d %d %d\n",
+		psf->sf.channels, psf->sf.samplerate, psf->bytewidth * 8) ;
+
+	psf->headindex = strlen ((char*) psf->header) ;
+
+	/* Header construction complete so write it out. */
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+
+	if (psf->error)
+		return psf->error ;
+
+	psf->dataoffset = psf->headindex ;
+
+	if (current > 0)
+		psf_fseek (psf, current, SEEK_SET) ;
+
+	return psf->error ;
+} /* pvf_write_header */
+
+static int
+pvf_read_header (SF_PRIVATE *psf)
+{	char	buffer [32] ;
+	int		marker, channels, samplerate, bitwidth ;
+
+	psf_binheader_readf (psf, "pmj", 0, &marker, 1) ;
+	psf_log_printf (psf, "%M\n", marker) ;
+
+	if (marker != PVF1_MARKER)
+		return SFE_PVF_NO_PVF1 ;
+
+	/* Grab characters up until a newline which is replaced by an EOS. */
+	psf_binheader_readf (psf, "G", buffer, sizeof (buffer)) ;
+
+	if (sscanf (buffer, "%d %d %d", &channels, &samplerate, &bitwidth) != 3)
+		return SFE_PVF_BAD_HEADER ;
+
+	psf_log_printf (psf, " Channels    : %d\n Sample rate : %d\n Bit width   : %d\n",
+				channels, samplerate, bitwidth) ;
+
+	psf->sf.channels = channels ;
+	psf->sf.samplerate = samplerate ;
+
+	switch (bitwidth)
+	{	case 8 :
+				psf->sf.format = SF_FORMAT_PVF | SF_FORMAT_PCM_S8 ;
+				psf->bytewidth = 1 ;
+				break ;
+
+		case 16 :
+				psf->sf.format = SF_FORMAT_PVF | SF_FORMAT_PCM_16 ;
+				psf->bytewidth = 2 ;
+				break ;
+		case 32 :
+				psf->sf.format = SF_FORMAT_PVF | SF_FORMAT_PCM_32 ;
+				psf->bytewidth = 4 ;
+				break ;
+
+		default :
+				return SFE_PVF_BAD_BITWIDTH ;
+		} ;
+
+	psf->dataoffset = psf_ftell (psf) ;
+	psf_log_printf (psf, " Data Offset : %D\n", psf->dataoffset) ;
+
+	psf->endian = SF_ENDIAN_BIG ;
+
+	psf->datalength = psf->filelength - psf->dataoffset ;
+	psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+
+	if (! psf->sf.frames && psf->blockwidth)
+		psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ;
+
+	return 0 ;
+} /* pvf_read_header */
diff --git a/jni/libsndfile-1.0.25/src/pvf.lo b/jni/libsndfile-1.0.25/src/pvf.lo
new file mode 100644
index 0000000..692c696
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/pvf.lo
@@ -0,0 +1,12 @@
+# pvf.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/pvf.o'
+
+# Name of the non-PIC object
+non_pic_object='pvf.o'
+
diff --git a/jni/libsndfile-1.0.25/src/pvf.o b/jni/libsndfile-1.0.25/src/pvf.o
new file mode 100644
index 0000000..3c8fbc5
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/pvf.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/raw.c b/jni/libsndfile-1.0.25/src/raw.c
new file mode 100644
index 0000000..e5dc49e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/raw.c
@@ -0,0 +1,104 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+
+#include	"sndfile.h"
+#include	"common.h"
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+raw_open	(SF_PRIVATE *psf)
+{	int	subformat, error = SFE_NO_ERROR ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+
+	psf->endian = SF_ENDIAN (psf->sf.format) ;
+
+	if (CPU_IS_BIG_ENDIAN && (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU))
+		psf->endian = SF_ENDIAN_BIG ;
+	else if (CPU_IS_LITTLE_ENDIAN && (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU))
+		psf->endian = SF_ENDIAN_LITTLE ;
+
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+	psf->dataoffset = 0 ;
+	psf->datalength = psf->filelength ;
+
+	switch (subformat)
+	{	case SF_FORMAT_PCM_S8 :
+				error = pcm_init (psf) ;
+				break ;
+
+		case SF_FORMAT_PCM_U8 :
+				error = pcm_init (psf) ;
+				break ;
+
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_24 :
+		case SF_FORMAT_PCM_32 :
+				error = pcm_init (psf) ;
+				break ;
+
+		case SF_FORMAT_ULAW :
+				error = ulaw_init (psf) ;
+				break ;
+
+		case SF_FORMAT_ALAW :
+				error = alaw_init (psf) ;
+				break ;
+
+		case SF_FORMAT_GSM610 :
+				error = gsm610_init (psf) ;
+				break ;
+
+		/* Lite remove start */
+		case SF_FORMAT_FLOAT :
+				error = float32_init (psf) ;
+				break ;
+
+		case SF_FORMAT_DOUBLE :
+				error = double64_init (psf) ;
+				break ;
+
+		case SF_FORMAT_DWVW_12 :
+				error = dwvw_init (psf, 12) ;
+				break ;
+
+		case SF_FORMAT_DWVW_16 :
+				error = dwvw_init (psf, 16) ;
+				break ;
+
+		case SF_FORMAT_DWVW_24 :
+				error = dwvw_init (psf, 24) ;
+				break ;
+
+		case SF_FORMAT_VOX_ADPCM :
+				error = vox_adpcm_init (psf) ;
+				break ;
+		/* Lite remove end */
+
+		default : return SFE_BAD_OPEN_FORMAT ;
+		} ;
+
+	return error ;
+} /* raw_open */
diff --git a/jni/libsndfile-1.0.25/src/raw.lo b/jni/libsndfile-1.0.25/src/raw.lo
new file mode 100644
index 0000000..f79f1c3
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/raw.lo
@@ -0,0 +1,12 @@
+# raw.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/raw.o'
+
+# Name of the non-PIC object
+non_pic_object='raw.o'
+
diff --git a/jni/libsndfile-1.0.25/src/raw.o b/jni/libsndfile-1.0.25/src/raw.o
new file mode 100644
index 0000000..2ec1372
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/raw.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/rf64.c b/jni/libsndfile-1.0.25/src/rf64.c
new file mode 100644
index 0000000..d40bfab
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/rf64.c
@@ -0,0 +1,716 @@
+/*
+** Copyright (C) 2008-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2009      Uli Franke <cls@nebadje.org>
+**
+** This program is free software; you can redistribute it and/or modify
+** 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.
+*/
+
+/*
+**	This format documented at:
+**	http://www.sr.se/utveckling/tu/bwf/prog/RF_64v1_4.pdf
+**
+**	But this may be a better reference:
+**	http://www.ebu.ch/CMSimages/en/tec_doc_t3306-2007_tcm6-42570.pdf
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+#include	"wav_w64.h"
+
+/*------------------------------------------------------------------------------
+** Macros to handle big/little endian issues.
+*/
+#define	RF64_MARKER		MAKE_MARKER ('R', 'F', '6', '4')
+#define	FFFF_MARKER		MAKE_MARKER (0xff, 0xff, 0xff, 0xff)
+#define	WAVE_MARKER		MAKE_MARKER ('W', 'A', 'V', 'E')
+#define	ds64_MARKER		MAKE_MARKER ('d', 's', '6', '4')
+#define	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 bext_MARKER		MAKE_MARKER ('b', 'e', 'x', 't')
+#define OggS_MARKER		MAKE_MARKER ('O', 'g', 'g', 'S')
+#define wvpk_MARKER 	MAKE_MARKER ('w', 'v', 'p', 'k')
+
+/*------------------------------------------------------------------------------
+** Typedefs.
+*/
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static int	rf64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock) ;
+static int	rf64_write_header (SF_PRIVATE *psf, int calc_length) ;
+static int	rf64_close (SF_PRIVATE *psf) ;
+static int	rf64_command (SF_PRIVATE *psf, int command, void * UNUSED (data), int datasize) ;
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+rf64_open (SF_PRIVATE *psf)
+{	WAV_PRIVATE *wpriv ;
+	int	subformat, error = 0 ;
+	int blockalign, framesperblock ;
+
+	if ((wpriv = calloc (1, sizeof (WAV_PRIVATE))) == NULL)
+		return SFE_MALLOC_FAILED ;
+	psf->container_data = wpriv ;
+	wpriv->wavex_ambisonic = SF_AMBISONIC_NONE ;
+
+	/* All RF64 files are little endian. */
+	psf->endian = SF_ENDIAN_LITTLE ;
+
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = rf64_read_header (psf, &blockalign, &framesperblock)) != 0)
+			return error ;
+		} ;
+
+	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RF64)
+		return	SFE_BAD_OPEN_FORMAT ;
+
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	if (psf->is_pipe)
+			return SFE_NO_PIPE_WRITE ;
+
+		psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+		if ((error = rf64_write_header (psf, SF_FALSE)))
+			return error ;
+
+		psf->write_header = rf64_write_header ;
+		} ;
+
+	psf->container_close = rf64_close ;
+	psf->command = rf64_command ;
+
+	switch (subformat)
+	{	case SF_FORMAT_PCM_U8 :
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_24 :
+		case SF_FORMAT_PCM_32 :
+					error = pcm_init (psf) ;
+					break ;
+
+		case SF_FORMAT_ULAW :
+					error = ulaw_init (psf) ;
+					break ;
+
+		case SF_FORMAT_ALAW :
+					error = alaw_init (psf) ;
+					break ;
+
+		/* Lite remove start */
+		case SF_FORMAT_FLOAT :
+					error = float32_init (psf) ;
+					break ;
+
+		case SF_FORMAT_DOUBLE :
+					error = double64_init (psf) ;
+					break ;
+
+		/* Lite remove end */
+
+		default : 	return SFE_UNIMPLEMENTED ;
+		} ;
+
+	return error ;
+} /* rf64_open */
+
+/*------------------------------------------------------------------------------
+*/
+enum
+{	HAVE_ds64	= 0x01,
+	HAVE_fmt	= 0x02,
+	HAVE_bext	= 0x04,
+	HAVE_data	= 0x08
+} ;
+
+#define HAVE_CHUNK(CHUNK)	((parsestage & CHUNK) != 0)
+
+static int
+rf64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
+{	WAV_PRIVATE	*wpriv ;
+	WAV_FMT		*wav_fmt ;
+	sf_count_t riff_size = 0, frame_count = 0, ds64_datalength = 0 ;
+	unsigned int size32, parsestage = 0 ;
+	int marker, marks [2], error, done = 0, format = 0 ;
+
+	if ((wpriv = psf->container_data) == NULL)
+		return SFE_INTERNAL ;
+	wav_fmt = &wpriv->wav_fmt ;
+
+	/* Set position to start of file to begin reading header. */
+	psf_binheader_readf (psf, "pmmm", 0, &marker, marks, marks + 1) ;
+	if (marker != RF64_MARKER || marks [1] != WAVE_MARKER)
+		return SFE_RF64_NOT_RF64 ;
+
+	if (marks [0] == FFFF_MARKER)
+		psf_log_printf (psf, "%M\n  %M\n", RF64_MARKER, WAVE_MARKER) ;
+	else
+		psf_log_printf (psf, "%M : 0x%x (should be 0xFFFFFFFF)\n  %M\n", RF64_MARKER, WAVE_MARKER) ;
+
+	while (NOT (done))
+	{	psf_binheader_readf (psf, "em4", &marker, &size32) ;
+
+		switch (marker)
+		{	case ds64_MARKER :
+				{	unsigned int table_len, bytesread ;
+
+					/* Read ds64 sizes (3 8-byte words). */
+					bytesread = psf_binheader_readf (psf, "888", &riff_size, &ds64_datalength, &frame_count) ;
+
+					/* Read table length. */
+					bytesread += psf_binheader_readf (psf, "4", &table_len) ;
+					/* Skip table for now. (this was "table_len + 4", why?) */
+					bytesread += psf_binheader_readf (psf, "j", table_len) ;
+
+					if (size32 == bytesread)
+						psf_log_printf (psf, "%M : %u\n", marker, size32) ;
+					else if (size32 >= bytesread + 4)
+					{	unsigned int next ;
+						psf_binheader_readf (psf, "m", &next) ;
+						if (next == fmt_MARKER)
+						{	psf_log_printf (psf, "%M : %u (should be %u)\n", marker, size32, bytesread) ;
+							psf_binheader_readf (psf, "j", -4) ;
+							}
+						else
+						{	psf_log_printf (psf, "%M : %u\n", marker, size32) ;
+							psf_binheader_readf (psf, "j", size32 - bytesread - 4) ;
+							} ;
+						} ;
+
+					if (psf->filelength != riff_size + 8)
+						psf_log_printf (psf, "  Riff size : %D (should be %D)\n", riff_size, psf->filelength - 8) ;
+					else
+						psf_log_printf (psf, "  Riff size : %D\n", riff_size) ;
+
+					psf_log_printf (psf, "  Data size : %D\n", ds64_datalength) ;
+
+					psf_log_printf (psf, "  Frames    : %D\n", frame_count) ;
+					psf_log_printf (psf, "  Table length : %u\n", table_len) ;
+
+					} ;
+				parsestage |= HAVE_ds64 ;
+				break ;
+
+			case fmt_MARKER:
+					psf_log_printf (psf, "%M : %u\n", marker, size32) ;
+					if ((error = wav_w64_read_fmt_chunk (psf, size32)) != 0)
+						return error ;
+					format = wav_fmt->format ;
+					parsestage |= HAVE_fmt ;
+					break ;
+
+			case bext_MARKER :
+					if ((error = wav_read_bext_chunk (psf, size32)) != 0)
+						return error ;
+					parsestage |= HAVE_bext ;
+					break ;
+
+			case data_MARKER :
+				/* see wav for more sophisticated parsing -> implement state machine with parsestage */
+
+				if (HAVE_CHUNK (HAVE_ds64))
+				{	if (size32 == 0xffffffff)
+						psf_log_printf (psf, "%M : 0x%x\n", marker, size32) ;
+					else
+						psf_log_printf (psf, "%M : 0x%x (should be 0xffffffff\n", marker, size32) ;
+					psf->datalength = ds64_datalength ;
+					}
+				else
+				{	if (size32 == 0xffffffff)
+					{	psf_log_printf (psf, "%M : 0x%x\n", marker, size32) ;
+						psf_log_printf (psf, "  *** Data length not specified no 'ds64' chunk.\n") ;
+						}
+					else
+					{	psf_log_printf (psf, "%M : 0x%x\n**** Weird, RF64 file without a 'ds64' chunk and no valid 'data' size.\n", marker, size32) ;
+						psf->datalength = size32 ;
+						} ;
+					} ;
+
+				psf->dataoffset = psf_ftell (psf) ;
+
+				if (psf->dataoffset > 0)
+				{	if (size32 == 0 && riff_size == 8 && psf->filelength > 44)
+					{	psf_log_printf (psf, "  *** Looks like a WAV file which wasn't closed properly. Fixing it.\n") ;
+						psf->datalength = psf->filelength - psf->dataoffset ;
+						} ;
+
+					/* Only set dataend if there really is data at the end. */
+					if (psf->datalength + psf->dataoffset < psf->filelength)
+						psf->dataend = psf->datalength + psf->dataoffset ;
+
+					if (NOT (psf->sf.seekable) || psf->dataoffset < 0)
+						break ;
+
+					/* Seek past data and continue reading header. */
+					psf_fseek (psf, psf->datalength, SEEK_CUR) ;
+
+					if (psf_ftell (psf) != psf->datalength + psf->dataoffset)
+						psf_log_printf (psf, "  *** psf_fseek past end error ***\n") ;
+						break ;
+					} ;
+				break ;
+
+			default :
+					if (isprint ((marker >> 24) & 0xFF) && isprint ((marker >> 16) & 0xFF)
+						&& isprint ((marker >> 8) & 0xFF) && isprint (marker & 0xFF))
+					{	psf_log_printf (psf, "*** %M : %d (unknown marker)\n", marker, size32) ;
+						if (size32 < 8)
+							done = SF_TRUE ;
+						psf_binheader_readf (psf, "j", size32) ;
+						break ;
+						} ;
+					if (psf_ftell (psf) & 0x03)
+					{	psf_log_printf (psf, "  Unknown chunk marker at position 0x%x. Resynching.\n", size32 - 4) ;
+						psf_binheader_readf (psf, "j", -3) ;
+						break ;
+						} ;
+					psf_log_printf (psf, "*** Unknown chunk marker (0x%X) at position 0x%X. Exiting parser.\n", marker, psf_ftell (psf) - 4) ;
+					done = SF_TRUE ;
+				break ;
+			} ;	/* switch (marker) */
+
+		if (psf_ftell (psf) >= psf->filelength - SIGNED_SIZEOF (marker))
+		{	psf_log_printf (psf, "End\n") ;
+			break ;
+			} ;
+		} ;
+
+	if (psf->dataoffset <= 0)
+		return SFE_WAV_NO_DATA ;
+
+	/* WAVs can be little or big endian */
+	psf->endian = psf->rwf_endian ;
+
+	psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+
+	if (psf->is_pipe == 0)
+	{	/*
+		** Check for 'wvpk' at the start of the DATA section. Not able to
+		** handle this.
+		*/
+		psf_binheader_readf (psf, "4", &marker) ;
+		if (marker == wvpk_MARKER || marker == OggS_MARKER)
+			return SFE_WAV_WVPK_DATA ;
+		} ;
+
+	/* Seek to start of DATA section. */
+	psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+
+	if (psf->blockwidth)
+	{	if (psf->filelength - psf->dataoffset < psf->datalength)
+			psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ;
+		else
+			psf->sf.frames = psf->datalength / psf->blockwidth ;
+		} ;
+
+	if (frame_count != psf->sf.frames)
+		psf_log_printf (psf, "*** Calculated frame count %d does not match value from 'ds64' chunk of %d.\n", psf->sf.frames, frame_count) ;
+
+	switch (format)
+	{
+		case WAVE_FORMAT_EXTENSIBLE :
+
+			/* with WAVE_FORMAT_EXTENSIBLE the psf->sf.format field is already set. We just have to set the major to rf64 */
+			psf->sf.format = (psf->sf.format & ~SF_FORMAT_TYPEMASK ) | SF_FORMAT_RF64 ;
+
+			if (psf->sf.format == (SF_FORMAT_WAVEX | SF_FORMAT_MS_ADPCM))
+			{	*blockalign = wav_fmt->msadpcm.blockalign ;
+				*framesperblock = wav_fmt->msadpcm.samplesperblock ;
+				} ;
+			break ;
+
+		case WAVE_FORMAT_PCM :
+					psf->sf.format = SF_FORMAT_RF64 | u_bitwidth_to_subformat (psf->bytewidth * 8) ;
+					break ;
+
+		case WAVE_FORMAT_MULAW :
+		case IBM_FORMAT_MULAW :
+					psf->sf.format = (SF_FORMAT_RF64 | SF_FORMAT_ULAW) ;
+					break ;
+
+		case WAVE_FORMAT_ALAW :
+		case IBM_FORMAT_ALAW :
+					psf->sf.format = (SF_FORMAT_RF64 | SF_FORMAT_ALAW) ;
+					break ;
+
+		case WAVE_FORMAT_MS_ADPCM :
+					psf->sf.format = (SF_FORMAT_RF64 | SF_FORMAT_MS_ADPCM) ;
+					*blockalign = wav_fmt->msadpcm.blockalign ;
+					*framesperblock = wav_fmt->msadpcm.samplesperblock ;
+					break ;
+
+		case WAVE_FORMAT_IMA_ADPCM :
+					psf->sf.format = (SF_FORMAT_RF64 | SF_FORMAT_IMA_ADPCM) ;
+					*blockalign = wav_fmt->ima.blockalign ;
+					*framesperblock = wav_fmt->ima.samplesperblock ;
+					break ;
+
+		case WAVE_FORMAT_GSM610 :
+					psf->sf.format = (SF_FORMAT_RF64 | SF_FORMAT_GSM610) ;
+					break ;
+
+		case WAVE_FORMAT_IEEE_FLOAT :
+					psf->sf.format = SF_FORMAT_RF64 ;
+					psf->sf.format |= (psf->bytewidth == 8) ? SF_FORMAT_DOUBLE : SF_FORMAT_FLOAT ;
+					break ;
+
+		case WAVE_FORMAT_G721_ADPCM :
+					psf->sf.format = SF_FORMAT_RF64 | SF_FORMAT_G721_32 ;
+					break ;
+
+		default : return SFE_UNIMPLEMENTED ;
+		} ;
+
+	if (wpriv->fmt_is_broken)
+		wav_w64_analyze (psf) ;
+
+	/* Only set the format endian-ness if its non-standard big-endian. */
+	if (psf->endian == SF_ENDIAN_BIG)
+		psf->sf.format |= SF_ENDIAN_BIG ;
+
+	return 0 ;
+} /* rf64_read_header */
+
+/*  known WAVEFORMATEXTENSIBLE GUIDS  */
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_PCM =
+{	0x00000001, 0x0000, 0x0010, {	0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+} ;
+
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_MS_ADPCM =
+{	0x00000002, 0x0000, 0x0010, {	0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+} ;
+
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_IEEE_FLOAT =
+{	0x00000003, 0x0000, 0x0010, {	0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+} ;
+
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_ALAW =
+{	0x00000006, 0x0000, 0x0010, {	0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+} ;
+
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_MULAW =
+{	0x00000007, 0x0000, 0x0010, {	0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+} ;
+
+/*
+** the next two are from
+** http://dream.cs.bath.ac.uk/researchdev/wave-ex/bformat.html
+*/
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_PCM =
+{	0x00000001, 0x0721, 0x11d3, {	0x86, 0x44, 0xC8, 0xC1, 0xCA, 0x00, 0x00, 0x00 }
+} ;
+
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT =
+{	0x00000003, 0x0721, 0x11d3, {	0x86, 0x44, 0xC8, 0xC1, 0xCA, 0x00, 0x00, 0x00 }
+} ;
+
+
+static int
+rf64_write_fmt_chunk (SF_PRIVATE *psf)
+{	WAV_PRIVATE	*wpriv ;
+	int subformat, fmt_size ;
+
+	if ((wpriv = psf->container_data) == NULL)
+		return SFE_INTERNAL ;
+
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+
+	/* initial section (same for all, it appears) */
+	switch (subformat)
+	{	case SF_FORMAT_PCM_U8 :
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_24 :
+		case SF_FORMAT_PCM_32 :
+		case SF_FORMAT_FLOAT :
+		case SF_FORMAT_DOUBLE :
+		case SF_FORMAT_ULAW :
+		case SF_FORMAT_ALAW :
+			fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 + 4 + 4 + 2 + 2 + 8 ;
+
+			/* fmt : format, channels, samplerate */
+			psf_binheader_writef (psf, "4224", fmt_size, WAVE_FORMAT_EXTENSIBLE, psf->sf.channels, psf->sf.samplerate) ;
+			/*  fmt : bytespersec */
+			psf_binheader_writef (psf, "4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+			/*  fmt : blockalign, bitwidth */
+			psf_binheader_writef (psf, "22", psf->bytewidth * psf->sf.channels, psf->bytewidth * 8) ;
+
+			/* cbSize 22 is sizeof (WAVEFORMATEXTENSIBLE) - sizeof (WAVEFORMATEX) */
+			psf_binheader_writef (psf, "2", 22) ;
+
+			/* wValidBitsPerSample, for our use same as bitwidth as we use it fully */
+			psf_binheader_writef (psf, "2", psf->bytewidth * 8) ;
+
+			/* For an Ambisonic file set the channel mask to zero.
+			** Otherwise use a default based on the channel count.
+			*/
+			if (wpriv->wavex_ambisonic != SF_AMBISONIC_NONE)
+				psf_binheader_writef (psf, "4", 0) ;
+			else if (wpriv->wavex_channelmask != 0)
+				psf_binheader_writef (psf, "4", wpriv->wavex_channelmask) ;
+			else
+			{	/*
+				** Ok some liberty is taken here to use the most commonly used channel masks
+				** instead of "no mapping". If you really want to use "no mapping" for 8 channels and less
+				** please don't use wavex. (otherwise we'll have to create a new SF_COMMAND)
+				*/
+				switch (psf->sf.channels)
+				{	case 1 :	/* center channel mono */
+						psf_binheader_writef (psf, "4", 0x4) ;
+						break ;
+
+					case 2 :	/* front left and right */
+						psf_binheader_writef (psf, "4", 0x1 | 0x2) ;
+						break ;
+
+					case 4 :	/* Quad */
+						psf_binheader_writef (psf, "4", 0x1 | 0x2 | 0x10 | 0x20) ;
+						break ;
+
+					case 6 :	/* 5.1 */
+						psf_binheader_writef (psf, "4", 0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20) ;
+						break ;
+
+					case 8 :	/* 7.1 */
+						psf_binheader_writef (psf, "4", 0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20 | 0x40 | 0x80) ;
+						break ;
+
+					default :	/* 0 when in doubt , use direct out, ie NO mapping*/
+						psf_binheader_writef (psf, "4", 0x0) ;
+						break ;
+					} ;
+				} ;
+			break ;
+
+		case SF_FORMAT_MS_ADPCM : /* Todo, GUID exists might have different header as per wav_write_header */
+		default :
+			return SFE_UNIMPLEMENTED ;
+		} ;
+
+	/* GUID section, different for each */
+
+	switch (subformat)
+	{	case SF_FORMAT_PCM_U8 :
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_24 :
+		case SF_FORMAT_PCM_32 :
+			wavex_write_guid (psf, wpriv->wavex_ambisonic == SF_AMBISONIC_NONE ?
+						&MSGUID_SUBTYPE_PCM : &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_PCM) ;
+			break ;
+
+		case SF_FORMAT_FLOAT :
+		case SF_FORMAT_DOUBLE :
+			wavex_write_guid (psf, wpriv->wavex_ambisonic == SF_AMBISONIC_NONE ?
+						&MSGUID_SUBTYPE_IEEE_FLOAT : &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT) ;
+			break ;
+
+		case SF_FORMAT_ULAW :
+			wavex_write_guid (psf, &MSGUID_SUBTYPE_MULAW) ;
+			break ;
+
+		case SF_FORMAT_ALAW :
+			wavex_write_guid (psf, &MSGUID_SUBTYPE_ALAW) ;
+			break ;
+
+		default : return SFE_UNIMPLEMENTED ;
+		} ;
+
+	return 0 ;
+} /* rf64_write_fmt_chunk */
+
+
+static int
+rf64_write_header (SF_PRIVATE *psf, int calc_length)
+{	sf_count_t	current ;
+	int 		error = 0, has_data = SF_FALSE ;
+
+	current = psf_ftell (psf) ;
+
+	if (psf->dataoffset > 0 && current > psf->dataoffset)
+		has_data = SF_TRUE ;
+
+	if (calc_length)
+	{	psf->filelength = psf_get_filelen (psf) ;
+		psf->datalength = psf->filelength - psf->dataoffset ;
+
+		if (psf->dataend)
+			psf->datalength -= psf->filelength - psf->dataend ;
+
+		if (psf->bytewidth > 0)
+			psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+		} ;
+
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	psf_fseek (psf, 0, SEEK_SET) ;
+
+	psf_binheader_writef (psf, "em4m", RF64_MARKER, 0xffffffff, WAVE_MARKER) ;
+
+	/* Currently no table. */
+	psf_binheader_writef (psf, "m48884", ds64_MARKER, 28, psf->filelength - 8, psf->datalength, psf->sf.frames, 0) ;
+
+	/* WAVE and 'fmt ' markers. */
+	psf_binheader_writef (psf, "m", fmt_MARKER) ;
+
+	/* Write the 'fmt ' chunk. */
+	switch (psf->sf.format & SF_FORMAT_TYPEMASK)
+	{	case SF_FORMAT_WAV :
+				psf_log_printf (psf, "ooops SF_FORMAT_WAV\n") ;
+				return SFE_UNIMPLEMENTED ;
+				break ;
+
+		case SF_FORMAT_WAVEX :
+		case SF_FORMAT_RF64 :
+				if ((error = rf64_write_fmt_chunk (psf)) != 0)
+					return error ;
+				break ;
+
+		default :
+				return SFE_UNIMPLEMENTED ;
+		} ;
+
+	if (psf->broadcast_16k != NULL)
+		wav_write_bext_chunk (psf) ;
+
+#if 0
+	/* The LIST/INFO chunk. */
+	if (psf->str_flags & SF_STR_LOCATE_START)
+		wav_write_strings (psf, SF_STR_LOCATE_START) ;
+
+	if (psf->peak_info != NULL && psf->peak_info->peak_loc == SF_PEAK_START)
+	{	psf_binheader_writef (psf, "m4", PEAK_MARKER, WAV_PEAK_CHUNK_SIZE (psf->sf.channels)) ;
+		psf_binheader_writef (psf, "44", 1, time (NULL)) ;
+		for (k = 0 ; k < psf->sf.channels ; k++)
+			psf_binheader_writef (psf, "ft8", (float) psf->peak_info->peaks [k].value, psf->peak_info->peaks [k].position) ;
+		} ;
+
+//	if (psf->broadcast_info != NULL)
+//		wav_write_bext_chunk (psf) ;
+
+	if (psf->instrument != NULL)
+	{	int		tmp ;
+		double	dtune = (double) (0x40000000) / 25.0 ;
+
+		psf_binheader_writef (psf, "m4", smpl_MARKER, 9 * 4 + psf->instrument->loop_count * 6 * 4) ;
+		psf_binheader_writef (psf, "44", 0, 0) ; /* Manufacturer zero is everyone */
+		tmp = (int) (1.0e9 / psf->sf.samplerate) ; /* Sample period in nano seconds */
+		psf_binheader_writef (psf, "44", tmp, psf->instrument->basenote) ;
+		tmp = (unsigned int) (psf->instrument->detune * dtune + 0.5) ;
+		psf_binheader_writef (psf, "4", tmp) ;
+		psf_binheader_writef (psf, "44", 0, 0) ; /* SMTPE format */
+		psf_binheader_writef (psf, "44", psf->instrument->loop_count, 0) ;
+
+		for (tmp = 0 ; tmp < psf->instrument->loop_count ; tmp++)
+		{	int type ;
+
+			type = psf->instrument->loops [tmp].mode ;
+			type = (type == SF_LOOP_FORWARD ? 0 : type==SF_LOOP_BACKWARD ? 2 : type == SF_LOOP_ALTERNATING ? 1 : 32) ;
+
+			psf_binheader_writef (psf, "44", tmp, type) ;
+			psf_binheader_writef (psf, "44", psf->instrument->loops [tmp].start, psf->instrument->loops [tmp].end) ;
+			psf_binheader_writef (psf, "44", 0, psf->instrument->loops [tmp].count) ;
+			} ;
+		} ;
+
+	if (psf->headindex + 8 < psf->dataoffset)
+	{	/* Add PAD data if necessary. */
+		k = psf->dataoffset - 16 - psf->headindex ;
+		psf_binheader_writef (psf, "m4z", PAD_MARKER, k, make_size_t (k)) ;
+		} ;
+
+#endif
+
+	psf_binheader_writef (psf, "m4", data_MARKER, 0xffffffff) ;
+
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+	if (psf->error)
+		return psf->error ;
+
+	if (has_data && psf->dataoffset != psf->headindex)
+	{	printf ("Oooops : has_data && psf->dataoffset != psf->headindex\n") ;
+		return psf->error = SFE_INTERNAL ;
+		} ;
+
+	psf->dataoffset = psf->headindex ;
+
+	if (NOT (has_data))
+		psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+	else if (current > 0)
+		psf_fseek (psf, current, SEEK_SET) ;
+
+	return psf->error ;
+} /* rf64_write_header */
+
+static int
+rf64_close (SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	// rf64_write_tailer (psf) ;
+
+		psf->write_header (psf, SF_TRUE) ;
+		} ;
+
+	return 0 ;
+} /* rf64_close */
+
+static int
+rf64_command (SF_PRIVATE *psf, int command, void * UNUSED (data), int datasize)
+{	WAV_PRIVATE	*wpriv ;
+
+	if ((wpriv = psf->container_data) == NULL)
+		return SFE_INTERNAL ;
+
+	switch (command)
+	{	case SFC_WAVEX_SET_AMBISONIC :
+			if ((SF_CONTAINER (psf->sf.format)) == SF_FORMAT_WAVEX)
+			{	if (datasize == SF_AMBISONIC_NONE)
+					wpriv->wavex_ambisonic = SF_AMBISONIC_NONE ;
+				else if (datasize == SF_AMBISONIC_B_FORMAT)
+					wpriv->wavex_ambisonic = SF_AMBISONIC_B_FORMAT ;
+				else
+					return 0 ;
+				} ;
+			return wpriv->wavex_ambisonic ;
+
+		case SFC_WAVEX_GET_AMBISONIC :
+			return wpriv->wavex_ambisonic ;
+
+		case SFC_SET_CHANNEL_MAP_INFO :
+			wpriv->wavex_channelmask = wavex_gen_channel_mask (psf->channel_map, psf->sf.channels) ;
+			return (wpriv->wavex_channelmask != 0) ;
+
+		default :
+			break ;
+	} ;
+
+	return 0 ;
+} /* rf64_command */
+
diff --git a/jni/libsndfile-1.0.25/src/rf64.lo b/jni/libsndfile-1.0.25/src/rf64.lo
new file mode 100644
index 0000000..0af99d9
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/rf64.lo
@@ -0,0 +1,12 @@
+# rf64.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/rf64.o'
+
+# Name of the non-PIC object
+non_pic_object='rf64.o'
+
diff --git a/jni/libsndfile-1.0.25/src/rf64.o b/jni/libsndfile-1.0.25/src/rf64.o
new file mode 100644
index 0000000..4fcb2dd
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/rf64.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/rx2.c b/jni/libsndfile-1.0.25/src/rx2.c
new file mode 100644
index 0000000..0aa1bcf
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/rx2.c
@@ -0,0 +1,319 @@
+/*
+** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<string.h>
+#include	<ctype.h>
+#include	<stdarg.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+#if (ENABLE_EXPERIMENTAL_CODE == 0)
+
+int
+rx2_open	(SF_PRIVATE *psf)
+{	if (psf)
+		return SFE_UNIMPLEMENTED ;
+	return 0 ;
+} /* rx2_open */
+
+#else
+
+/*------------------------------------------------------------------------------
+ * Macros to handle big/little endian issues.
+*/
+
+#define	CAT_MARKER	(MAKE_MARKER ('C', 'A', 'T', ' '))
+#define	GLOB_MARKER (MAKE_MARKER ('G', 'L', 'O', 'B'))
+
+#define	RECY_MARKER (MAKE_MARKER ('R', 'E', 'C', 'Y'))
+
+#define	SLCL_MARKER (MAKE_MARKER ('S', 'L', 'C', 'L'))
+#define	SLCE_MARKER (MAKE_MARKER ('S', 'L', 'C', 'E'))
+
+#define	DEVL_MARKER	(MAKE_MARKER ('D', 'E', 'V', 'L'))
+#define	TRSH_MARKER	(MAKE_MARKER ('T', 'R', 'S', 'H'))
+
+#define	EQ_MARKER	(MAKE_MARKER ('E', 'Q', ' ', ' '))
+#define	COMP_MARKER (MAKE_MARKER ('C', 'O', 'M', 'P'))
+
+#define	SINF_MARKER (MAKE_MARKER ('S', 'I', 'N', 'F'))
+#define	SDAT_MARKER (MAKE_MARKER ('S', 'D', 'A', 'T'))
+
+/*------------------------------------------------------------------------------
+ * Typedefs for file chunks.
+*/
+
+
+/*------------------------------------------------------------------------------
+ * Private static functions.
+*/
+static int	rx2_close	(SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------
+** Public functions.
+*/
+
+int
+rx2_open	(SF_PRIVATE *psf)
+{	static const char *marker_type [4] =
+	{	"Original Enabled", "Enabled Hidden",
+		"Additional/PencilTool", "Disabled"
+		} ;
+
+	int error, marker, length, glob_offset, slce_count, frames ;
+
+	int sdat_length = 0, slce_total = 0 ;
+
+	int n_channels ;
+
+
+	/* So far only doing read. */
+
+	psf_binheader_readf (psf, "Epm4", 0, &marker, &length) ;
+
+	if (marker != CAT_MARKER)
+	{	psf_log_printf (psf, "length : %d\n", length) ;
+		return -1000 ;
+		} ;
+
+	if (length != psf->filelength - 8)
+		psf_log_printf (psf, "%M : %d (should be %d)\n", marker, length, psf->filelength - 8) ;
+	else
+		psf_log_printf (psf, "%M : %d\n", marker, length) ;
+
+	/* 'REX2' marker */
+	psf_binheader_readf (psf, "m", &marker) ;
+	psf_log_printf (psf, "%M", marker) ;
+
+	/* 'HEAD' marker */
+	psf_binheader_readf (psf, "m", &marker) ;
+	psf_log_printf (psf, "%M\n", marker) ;
+
+	/* Grab 'GLOB' offset. */
+	psf_binheader_readf (psf, "E4", &glob_offset) ;
+	glob_offset += 0x14 ;	/* Add the current file offset. */
+
+	/* Jump to offset 0x30 */
+	psf_binheader_readf (psf, "p", 0x30) ;
+
+	/* Get name length */
+	length = 0 ;
+	psf_binheader_readf (psf, "1", &length) ;
+	if (length >= SIGNED_SIZEOF (psf->u.cbuf))
+	{	psf_log_printf (psf, "  Text : %d *** Error : Too sf_count_t!\n") ;
+		return -1001 ;
+		}
+
+	memset (psf->u.cbuf, 0, sizeof (psf->u.cbuf)) ;
+	psf_binheader_readf (psf, "b", psf->u.cbuf, length) ;
+	psf_log_printf (psf, " Text : \"%s\"\n", psf->u.cbuf) ;
+
+	/* Jump to GLOB offset position. */
+	if (glob_offset & 1)
+		glob_offset ++ ;
+
+	psf_binheader_readf (psf, "p", glob_offset) ;
+
+	slce_count = 0 ;
+	/* GLOB */
+	while (1)
+	{	psf_binheader_readf (psf, "m", &marker) ;
+
+		if (marker != SLCE_MARKER && slce_count > 0)
+		{	psf_log_printf (psf, "   SLCE count : %d\n", slce_count) ;
+			slce_count = 0 ;
+			}
+		switch (marker)
+		{	case GLOB_MARKER:
+					psf_binheader_readf (psf, "E4", &length) ;
+					psf_log_printf (psf, " %M : %d\n", marker, length) ;
+					psf_binheader_readf (psf, "j", length) ;
+					break ;
+
+			case RECY_MARKER:
+					psf_binheader_readf (psf, "E4", &length) ;
+					psf_log_printf (psf, " %M : %d\n", marker, length) ;
+					psf_binheader_readf (psf, "j", (length+1) & 0xFFFFFFFE) ; /* ?????? */
+					break ;
+
+			case CAT_MARKER:
+					psf_binheader_readf (psf, "E4", &length) ;
+					psf_log_printf (psf, " %M : %d\n", marker, length) ;
+					/*-psf_binheader_readf (psf, "j", length) ;-*/
+					break ;
+
+			case DEVL_MARKER:
+					psf_binheader_readf (psf, "mE4", &marker, &length) ;
+					psf_log_printf (psf, "  DEVL%M : %d\n", marker, length) ;
+					if (length & 1)
+						length ++ ;
+					psf_binheader_readf (psf, "j", length) ;
+					break ;
+
+			case EQ_MARKER:
+			case COMP_MARKER:
+					psf_binheader_readf (psf, "E4", &length) ;
+					psf_log_printf (psf, "   %M : %d\n", marker, length) ;
+					/* This is weird!!!! why make this (length - 1) */
+					if (length & 1)
+						length ++ ;
+					psf_binheader_readf (psf, "j", length) ;
+					break ;
+
+			case SLCL_MARKER:
+					psf_log_printf (psf, "  %M\n    (Offset, Next Offset, Type)\n", marker) ;
+					slce_count = 0 ;
+					break ;
+
+			case SLCE_MARKER:
+					{	int len [4], indx ;
+
+						psf_binheader_readf (psf, "E4444", &len [0], &len [1], &len [2], &len [3]) ;
+
+						indx = ((len [3] & 0x0000FFFF) >> 8) & 3 ;
+
+						if (len [2] == 1)
+						{	if (indx != 1)
+								indx = 3 ;	/* 2 cases, where next slice offset = 1 -> disabled & enabled/hidden */
+
+							psf_log_printf (psf, "   %M : (%6d, ?: 0x%X, %s)\n", marker, len [1], (len [3] & 0xFFFF0000) >> 16, marker_type [indx]) ;
+							}
+						else
+						{	slce_total += len [2] ;
+
+							psf_log_printf (psf, "   %M : (%6d, SLCE_next_ofs:%d, ?: 0x%X, %s)\n", marker, len [1], len [2], (len [3] & 0xFFFF0000) >> 16, marker_type [indx]) ;
+							} ;
+
+						slce_count ++ ;
+						} ;
+					break ;
+
+			case SINF_MARKER:
+					psf_binheader_readf (psf, "E4", &length) ;
+					psf_log_printf (psf, " %M : %d\n", marker, length) ;
+
+					psf_binheader_readf (psf, "E2", &n_channels) ;
+					n_channels = (n_channels & 0x0000FF00) >> 8 ;
+					psf_log_printf (psf, "  Channels    : %d\n", n_channels) ;
+
+					psf_binheader_readf (psf, "E44", &psf->sf.samplerate, &frames) ;
+					psf->sf.frames = frames ;
+					psf_log_printf (psf, "  Sample Rate : %d\n", psf->sf.samplerate) ;
+					psf_log_printf (psf, "  Frames      : %D\n", psf->sf.frames) ;
+
+					psf_binheader_readf (psf, "E4", &length) ;
+					psf_log_printf (psf, "  ??????????? : %d\n", length) ;
+
+					psf_binheader_readf (psf, "E4", &length) ;
+					psf_log_printf (psf, "  ??????????? : %d\n", length) ;
+					break ;
+
+			case SDAT_MARKER:
+					psf_binheader_readf (psf, "E4", &length) ;
+
+				sdat_length = length ;
+
+					/* Get the current offset. */
+					psf->dataoffset = psf_binheader_readf (psf, NULL) ;
+
+					if (psf->dataoffset + length != psf->filelength)
+						psf_log_printf (psf, " %M : %d (should be %d)\n", marker, length, psf->dataoffset + psf->filelength) ;
+					else
+						psf_log_printf (psf, " %M : %d\n", marker, length) ;
+					break ;
+
+			default :
+					psf_log_printf (psf, "Unknown marker : 0x%X %M", marker, marker) ;
+					return -1003 ;
+					break ;
+			} ;
+
+		/* SDAT always last marker in file. */
+		if (marker == SDAT_MARKER)
+			break ;
+		} ;
+
+	puts (psf->logbuffer) ;
+	puts ("-----------------------------------") ;
+
+	printf ("SDAT length  : %d\n", sdat_length) ;
+	printf ("SLCE count   : %d\n", slce_count) ;
+
+	/* Hack for zero slice count. */
+	if (slce_count == 0 && slce_total == 1)
+		slce_total = frames ;
+
+	printf ("SLCE samples : %d\n", slce_total) ;
+
+	/* Two bytes per sample. */
+	printf ("Comp Ratio   : %f:1\n", (2.0 * slce_total * n_channels) / sdat_length) ;
+
+	puts (" ") ;
+
+	psf->logbuffer [0] = 0 ;
+
+	/* OK, have the header although not too sure what it all means. */
+
+	psf->endian = SF_ENDIAN_BIG ;
+
+	psf->datalength = psf->filelength - psf->dataoffset ;
+
+ 	if (psf_fseek (psf, psf->dataoffset, SEEK_SET))
+		return SFE_BAD_SEEK ;
+
+	psf->sf.format = (SF_FORMAT_REX2 | SF_FORMAT_DWVW_12) ;
+
+	psf->sf.channels	= 1 ;
+	psf->bytewidth		= 2 ;
+	psf->blockwidth		= psf->sf.channels * psf->bytewidth ;
+
+	if ((error = dwvw_init (psf, 16)))
+		return error ;
+
+	psf->container_close = rx2_close ;
+
+	if (! psf->sf.frames && psf->blockwidth)
+		psf->sf.frames = psf->datalength / psf->blockwidth ;
+
+	/* All done. */
+
+	return 0 ;
+} /* rx2_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+rx2_close	(SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_WRITE)
+	{	/*  Now we know for certain the length of the file we can re-write
+		**	correct values for the FORM, 8SVX and BODY chunks.
+		*/
+
+		} ;
+
+	return 0 ;
+} /* rx2_close */
+
+#endif
diff --git a/jni/libsndfile-1.0.25/src/rx2.lo b/jni/libsndfile-1.0.25/src/rx2.lo
new file mode 100644
index 0000000..5c7689f
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/rx2.lo
@@ -0,0 +1,12 @@
+# rx2.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/rx2.o'
+
+# Name of the non-PIC object
+non_pic_object='rx2.o'
+
diff --git a/jni/libsndfile-1.0.25/src/rx2.o b/jni/libsndfile-1.0.25/src/rx2.o
new file mode 100644
index 0000000..8768079
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/rx2.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/sd2.c b/jni/libsndfile-1.0.25/src/sd2.c
new file mode 100644
index 0000000..9ef10a9
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/sd2.c
@@ -0,0 +1,632 @@
+/*
+** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2004 Paavo Jumppanen
+**
+** This program is free software; you can redistribute it and/or modify
+** 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.
+*/
+
+/*
+** The sd2 support implemented in this file was partially sponsored
+** (financially) by Paavo Jumppanen.
+*/
+
+/*
+** Documentation on the Mac resource fork was obtained here :
+** http://developer.apple.com/documentation/mac/MoreToolbox/MoreToolbox-99.html
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<stdlib.h>
+#include	<string.h>
+#include	<ctype.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+/*------------------------------------------------------------------------------
+ * Markers.
+*/
+
+#define	Sd2f_MARKER			MAKE_MARKER ('S', 'd', '2', 'f')
+#define	Sd2a_MARKER			MAKE_MARKER ('S', 'd', '2', 'a')
+#define	ALCH_MARKER			MAKE_MARKER ('A', 'L', 'C', 'H')
+#define lsf1_MARKER			MAKE_MARKER ('l', 's', 'f', '1')
+
+#define STR_MARKER			MAKE_MARKER ('S', 'T', 'R', ' ')
+#define sdML_MARKER			MAKE_MARKER ('s', 'd', 'M', 'L')
+
+enum
+{	RSRC_STR = 111,
+	RSRC_BIN
+} ;
+
+typedef struct
+{	unsigned char * rsrc_data ;
+	int rsrc_len ;
+	int need_to_free_rsrc_data ;
+
+	int data_offset, data_length ;
+	int map_offset, map_length ;
+
+	int type_count, type_offset ;
+	int item_offset ;
+
+	int str_index, str_count ;
+
+	int string_offset ;
+
+	/* All the above just to get these three. */
+	int sample_size, sample_rate, channels ;
+} SD2_RSRC ;
+
+typedef struct
+{	int type ;
+	int id ;
+	char name [32] ;
+	char value [32] ;
+	int value_len ;
+} STR_RSRC ;
+
+/*------------------------------------------------------------------------------
+ * Private static functions.
+*/
+
+static int sd2_close	(SF_PRIVATE *psf) ;
+
+static int sd2_parse_rsrc_fork (SF_PRIVATE *psf) ;
+static int parse_str_rsrc (SF_PRIVATE *psf, SD2_RSRC * rsrc) ;
+
+static int sd2_write_rsrc_fork (SF_PRIVATE *psf, int calc_length) ;
+
+/*------------------------------------------------------------------------------
+** Public functions.
+*/
+
+int
+sd2_open (SF_PRIVATE *psf)
+{	int subformat, error = 0, valid ;
+
+	/* SD2 is always big endian. */
+	psf->endian = SF_ENDIAN_BIG ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->rsrclength > 0))
+	{	psf_use_rsrc (psf, SF_TRUE) ;
+		valid = psf_file_valid (psf) ;
+		psf_use_rsrc (psf, SF_FALSE) ;
+		if (! valid)
+		{	psf_log_printf (psf, "sd2_open : psf->rsrc.filedes < 0\n") ;
+			return SFE_SD2_BAD_RSRC ;
+			} ;
+
+		error = sd2_parse_rsrc_fork (psf) ;
+
+		if (error)
+			goto error_cleanup ;
+		} ;
+
+	if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_SD2)
+	{	error = SFE_BAD_OPEN_FORMAT ;
+		goto error_cleanup ;
+		} ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+	psf->dataoffset = 0 ;
+
+	/* Only open and write the resource in RDWR mode is its current length is zero. */
+	if (psf->file.mode == SFM_WRITE || (psf->file.mode == SFM_RDWR && psf->rsrclength == 0))
+	{	psf->rsrc.mode = psf->file.mode ;
+		psf_open_rsrc (psf) ;
+
+		error = sd2_write_rsrc_fork (psf, SF_FALSE) ;
+
+		if (error)
+			goto error_cleanup ;
+
+		/* Not needed. */
+		psf->write_header = NULL ;
+		} ;
+
+	psf->container_close = sd2_close ;
+
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+	switch (subformat)
+	{	case SF_FORMAT_PCM_S8 :	/* 8-bit linear PCM. */
+		case SF_FORMAT_PCM_16 :	/* 16-bit linear PCM. */
+		case SF_FORMAT_PCM_24 :	/* 24-bit linear PCM */
+				error = pcm_init (psf) ;
+				break ;
+
+		default :
+				error = SFE_UNIMPLEMENTED ;
+				break ;
+		} ;
+
+	psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+
+error_cleanup:
+
+	/* Close the resource fork regardless. We won't need it again. */
+	psf_close_rsrc (psf) ;
+
+	return error ;
+} /* sd2_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+sd2_close	(SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_WRITE)
+	{	/*  Now we know for certain the audio_length of the file we can re-write
+		**	correct values for the FORM, 8SVX and BODY chunks.
+		*/
+
+		} ;
+
+	return 0 ;
+} /* sd2_close */
+
+/*------------------------------------------------------------------------------
+*/
+
+static inline void
+write_char (unsigned char * data, int offset, char value)
+{	data [offset] = value ;
+} /* write_char */
+
+static inline void
+write_short (unsigned char * data, int offset, short value)
+{	data [offset] = value >> 8 ;
+	data [offset + 1] = value ;
+} /* write_char */
+
+static inline void
+write_int (unsigned char * data, int offset, int value)
+{	data [offset] = value >> 24 ;
+	data [offset + 1] = value >> 16 ;
+	data [offset + 2] = value >> 8 ;
+	data [offset + 3] = value ;
+} /* write_int */
+
+static inline void
+write_marker (unsigned char * data, int offset, int value)
+{
+	if (CPU_IS_BIG_ENDIAN)
+	{	data [offset] = value >> 24 ;
+		data [offset + 1] = value >> 16 ;
+		data [offset + 2] = value >> 8 ;
+		data [offset + 3] = value ;
+		}
+	else
+	{	data [offset] = value ;
+		data [offset + 1] = value >> 8 ;
+		data [offset + 2] = value >> 16 ;
+		data [offset + 3] = value >> 24 ;
+		} ;
+} /* write_marker */
+
+static void
+write_str (unsigned char * data, int offset, const char * buffer, int buffer_len)
+{	memcpy (data + offset, buffer, buffer_len) ;
+} /* write_str */
+
+static int
+sd2_write_rsrc_fork (SF_PRIVATE *psf, int UNUSED (calc_length))
+{	SD2_RSRC rsrc ;
+	STR_RSRC str_rsrc [] =
+	{	{ RSRC_STR, 1000, "_sample-size", "", 0 },
+		{ RSRC_STR, 1001, "_sample-rate", "", 0 },
+		{ RSRC_STR, 1002, "_channels", "", 0 },
+		{ RSRC_BIN, 1000, "_Markers", "", 8 }
+		} ;
+
+	int k, str_offset, data_offset, next_str ;
+
+	psf_use_rsrc (psf, SF_TRUE) ;
+
+	memset (&rsrc, 0, sizeof (rsrc)) ;
+
+	rsrc.sample_rate = psf->sf.samplerate ;
+	rsrc.sample_size = psf->bytewidth ;
+	rsrc.channels = psf->sf.channels ;
+
+	rsrc.rsrc_data = psf->header ;
+	rsrc.rsrc_len = sizeof (psf->header) ;
+	memset (rsrc.rsrc_data, 0xea, rsrc.rsrc_len) ;
+
+	snprintf (str_rsrc [0].value, sizeof (str_rsrc [0].value), "_%d", rsrc.sample_size) ;
+	snprintf (str_rsrc [1].value, sizeof (str_rsrc [1].value), "_%d.000000", rsrc.sample_rate) ;
+	snprintf (str_rsrc [2].value, sizeof (str_rsrc [2].value), "_%d", rsrc.channels) ;
+
+	for (k = 0 ; k < ARRAY_LEN (str_rsrc) ; k++)
+	{	if (str_rsrc [k].value_len == 0)
+		{	str_rsrc [k].value_len = strlen (str_rsrc [k].value) ;
+			str_rsrc [k].value [0] = str_rsrc [k].value_len - 1 ;
+			} ;
+
+		/* Turn name string into a pascal string. */
+		str_rsrc [k].name [0] = strlen (str_rsrc [k].name) - 1 ;
+		} ;
+
+	rsrc.data_offset = 0x100 ;
+
+	/*
+	** Calculate data length :
+	**		length of strings, plus the length of the sdML chunk.
+	*/
+	rsrc.data_length = 0 ;
+	for (k = 0 ; k < ARRAY_LEN (str_rsrc) ; k++)
+		rsrc.data_length += str_rsrc [k].value_len + 4 ;
+
+	rsrc.map_offset = rsrc.data_offset + rsrc.data_length ;
+
+	/* Very start of resource fork. */
+	write_int (rsrc.rsrc_data, 0, rsrc.data_offset) ;
+	write_int (rsrc.rsrc_data, 4, rsrc.map_offset) ;
+	write_int (rsrc.rsrc_data, 8, rsrc.data_length) ;
+
+	write_char (rsrc.rsrc_data, 0x30, strlen (psf->file.name.c)) ;
+	write_str (rsrc.rsrc_data, 0x31, psf->file.name.c, strlen (psf->file.name.c)) ;
+
+	write_short (rsrc.rsrc_data, 0x50, 0) ;
+	write_marker (rsrc.rsrc_data, 0x52, Sd2f_MARKER) ;
+	write_marker (rsrc.rsrc_data, 0x56, lsf1_MARKER) ;
+
+	/* Very start of resource map. */
+	write_int (rsrc.rsrc_data, rsrc.map_offset + 0, rsrc.data_offset) ;
+	write_int (rsrc.rsrc_data, rsrc.map_offset + 4, rsrc.map_offset) ;
+	write_int (rsrc.rsrc_data, rsrc.map_offset + 8, rsrc.data_length) ;
+
+	/* These I don't currently understand. */
+	if (1)
+	{	write_char (rsrc.rsrc_data, rsrc.map_offset+ 16, 1) ;
+		/* Next resource map. */
+		write_int (rsrc.rsrc_data, rsrc.map_offset + 17, 0x12345678) ;
+		/* File ref number. */
+		write_short (rsrc.rsrc_data, rsrc.map_offset + 21, 0xabcd) ;
+		/* Fork attributes. */
+		write_short (rsrc.rsrc_data, rsrc.map_offset + 23, 0) ;
+		} ;
+
+	/* Resource type offset. */
+	rsrc.type_offset = rsrc.map_offset + 30 ;
+	write_short (rsrc.rsrc_data, rsrc.map_offset + 24, rsrc.type_offset - rsrc.map_offset - 2) ;
+
+	/* Type index max. */
+	rsrc.type_count = 2 ;
+	write_short (rsrc.rsrc_data, rsrc.map_offset + 28, rsrc.type_count - 1) ;
+
+	rsrc.item_offset = rsrc.type_offset + rsrc.type_count * 8 ;
+
+	rsrc.str_count = ARRAY_LEN (str_rsrc) ;
+	rsrc.string_offset = rsrc.item_offset + (rsrc.str_count + 1) * 12 - rsrc.map_offset ;
+	write_short (rsrc.rsrc_data, rsrc.map_offset + 26, rsrc.string_offset) ;
+
+	/* Write 'STR ' resource type. */
+	rsrc.str_count = 3 ;
+	write_marker (rsrc.rsrc_data, rsrc.type_offset, STR_MARKER) ;
+	write_short (rsrc.rsrc_data, rsrc.type_offset + 4, rsrc.str_count - 1) ;
+	write_short (rsrc.rsrc_data, rsrc.type_offset + 6, 0x12) ;
+
+	/* Write 'sdML' resource type. */
+	write_marker (rsrc.rsrc_data, rsrc.type_offset + 8, sdML_MARKER) ;
+	write_short (rsrc.rsrc_data, rsrc.type_offset + 12, 0) ;
+	write_short (rsrc.rsrc_data, rsrc.type_offset + 14, 0x36) ;
+
+	str_offset = rsrc.map_offset + rsrc.string_offset ;
+	next_str = 0 ;
+	data_offset = rsrc.data_offset ;
+	for (k = 0 ; k < ARRAY_LEN (str_rsrc) ; k++)
+	{	write_str (rsrc.rsrc_data, str_offset, str_rsrc [k].name, strlen (str_rsrc [k].name)) ;
+
+		write_short (rsrc.rsrc_data, rsrc.item_offset + k * 12, str_rsrc [k].id) ;
+		write_short (rsrc.rsrc_data, rsrc.item_offset + k * 12 + 2, next_str) ;
+
+		str_offset += strlen (str_rsrc [k].name) ;
+		next_str += strlen (str_rsrc [k].name) ;
+
+		write_int (rsrc.rsrc_data, rsrc.item_offset + k * 12 + 4, data_offset - rsrc.data_offset) ;
+
+		write_int (rsrc.rsrc_data, data_offset, str_rsrc [k].value_len) ;
+		write_str (rsrc.rsrc_data, data_offset + 4, str_rsrc [k].value, str_rsrc [k].value_len) ;
+		data_offset += 4 + str_rsrc [k].value_len ;
+		} ;
+
+	/* Finally, calculate and set map length. */
+	rsrc.map_length = str_offset - rsrc.map_offset ;
+	write_int (rsrc.rsrc_data, 12, rsrc.map_length) ;
+	write_int (rsrc.rsrc_data, rsrc.map_offset + 12, rsrc.map_length) ;
+
+	rsrc.rsrc_len = rsrc.map_offset + rsrc.map_length ;
+
+	psf_fwrite (rsrc.rsrc_data, rsrc.rsrc_len, 1, psf) ;
+
+	psf_use_rsrc (psf, SF_FALSE) ;
+
+	if (psf->error)
+		return psf->error ;
+
+	return 0 ;
+} /* sd2_write_rsrc_fork */
+
+/*------------------------------------------------------------------------------
+*/
+
+static inline int
+read_char (const unsigned char * data, int offset)
+{	return data [offset] ;
+} /* read_char */
+
+static inline int
+read_short (const unsigned char * data, int offset)
+{	return (data [offset] << 8) + data [offset + 1] ;
+} /* read_short */
+
+static inline int
+read_int (const unsigned char * data, int offset)
+{	return (data [offset] << 24) + (data [offset + 1] << 16) + (data [offset + 2] << 8) + data [offset + 3] ;
+} /* read_int */
+
+static inline int
+read_marker (const unsigned char * data, int offset)
+{
+	if (CPU_IS_BIG_ENDIAN)
+		return (data [offset] << 24) + (data [offset + 1] << 16) + (data [offset + 2] << 8) + data [offset + 3] ;
+	else if (CPU_IS_LITTLE_ENDIAN)
+		return data [offset] + (data [offset + 1] << 8) + (data [offset + 2] << 16) + (data [offset + 3] << 24) ;
+	else
+		return 0x666 ;
+} /* read_marker */
+
+static void
+read_str (const unsigned char * data, int offset, char * buffer, int buffer_len)
+{	int k ;
+
+	memset (buffer, 0, buffer_len) ;
+
+	for (k = 0 ; k < buffer_len - 1 ; k++)
+	{	if (psf_isprint (data [offset + k]) == 0)
+			return ;
+		buffer [k] = data [offset + k] ;
+		} ;
+	return ;
+} /* read_str */
+
+static int
+sd2_parse_rsrc_fork (SF_PRIVATE *psf)
+{	SD2_RSRC rsrc ;
+	int k, marker, error = 0 ;
+
+	psf_use_rsrc (psf, SF_TRUE) ;
+
+	memset (&rsrc, 0, sizeof (rsrc)) ;
+
+	rsrc.rsrc_len = psf_get_filelen (psf) ;
+	psf_log_printf (psf, "Resource length : %d (0x%04X)\n", rsrc.rsrc_len, rsrc.rsrc_len) ;
+
+	if (rsrc.rsrc_len > SIGNED_SIZEOF (psf->header))
+	{	rsrc.rsrc_data = calloc (1, rsrc.rsrc_len) ;
+		rsrc.need_to_free_rsrc_data = SF_TRUE ;
+		}
+	else
+		rsrc.rsrc_data = psf->header ;
+
+	/* Read in the whole lot. */
+	psf_fread (rsrc.rsrc_data, rsrc.rsrc_len, 1, psf) ;
+
+	/* Reset the header storage because we have changed to the rsrcdes. */
+	psf->headindex = psf->headend = rsrc.rsrc_len ;
+
+	rsrc.data_offset = read_int (rsrc.rsrc_data, 0) ;
+	rsrc.map_offset = read_int (rsrc.rsrc_data, 4) ;
+	rsrc.data_length = read_int (rsrc.rsrc_data, 8) ;
+	rsrc.map_length = read_int (rsrc.rsrc_data, 12) ;
+
+	if (rsrc.data_offset == 0x51607 && rsrc.map_offset == 0x20000)
+	{	psf_log_printf (psf, "Trying offset of 0x52 bytes.\n") ;
+		rsrc.data_offset = read_int (rsrc.rsrc_data, 0x52 + 0) + 0x52 ;
+		rsrc.map_offset = read_int (rsrc.rsrc_data, 0x52 + 4) + 0x52 ;
+		rsrc.data_length = read_int (rsrc.rsrc_data, 0x52 + 8) ;
+		rsrc.map_length = read_int (rsrc.rsrc_data, 0x52 + 12) ;
+		} ;
+
+	psf_log_printf (psf, "  data offset : 0x%04X\n  map  offset : 0x%04X\n"
+				"  data length : 0x%04X\n  map  length : 0x%04X\n",
+				rsrc.data_offset, rsrc.map_offset, rsrc.data_length, rsrc.map_length) ;
+
+	if (rsrc.data_offset > rsrc.rsrc_len)
+	{	psf_log_printf (psf, "Error : rsrc.data_offset (%d, 0x%x) > len\n", rsrc.data_offset, rsrc.data_offset) ;
+		error = SFE_SD2_BAD_DATA_OFFSET ;
+		goto parse_rsrc_fork_cleanup ;
+		} ;
+
+	if (rsrc.map_offset > rsrc.rsrc_len)
+	{	psf_log_printf (psf, "Error : rsrc.map_offset > len\n") ;
+		error = SFE_SD2_BAD_MAP_OFFSET ;
+		goto parse_rsrc_fork_cleanup ;
+		} ;
+
+	if (rsrc.data_length > rsrc.rsrc_len)
+	{	psf_log_printf (psf, "Error : rsrc.data_length > len\n") ;
+		error = SFE_SD2_BAD_DATA_LENGTH ;
+		goto parse_rsrc_fork_cleanup ;
+		} ;
+
+	if (rsrc.map_length > rsrc.rsrc_len)
+	{	psf_log_printf (psf, "Error : rsrc.map_length > len\n") ;
+		error = SFE_SD2_BAD_MAP_LENGTH ;
+		goto parse_rsrc_fork_cleanup ;
+		} ;
+
+	if (rsrc.data_offset + rsrc.data_length != rsrc.map_offset || rsrc.map_offset + rsrc.map_length != rsrc.rsrc_len)
+	{	psf_log_printf (psf, "Error : This does not look like a MacOSX resource fork.\n") ;
+		error = SFE_SD2_BAD_RSRC ;
+		goto parse_rsrc_fork_cleanup ;
+		} ;
+
+	if (rsrc.map_offset + 28 >= rsrc.rsrc_len)
+	{	psf_log_printf (psf, "Bad map offset (%d + 28 > %d).\n", rsrc.map_offset, rsrc.rsrc_len) ;
+		error = SFE_SD2_BAD_RSRC ;
+		goto parse_rsrc_fork_cleanup ;
+		} ;
+
+	rsrc.string_offset = rsrc.map_offset + read_short (rsrc.rsrc_data, rsrc.map_offset + 26) ;
+	if (rsrc.string_offset > rsrc.rsrc_len)
+	{	psf_log_printf (psf, "Bad string offset (%d).\n", rsrc.string_offset) ;
+		error = SFE_SD2_BAD_RSRC ;
+		goto parse_rsrc_fork_cleanup ;
+		} ;
+
+	rsrc.type_offset = rsrc.map_offset + 30 ;
+
+	rsrc.type_count = read_short (rsrc.rsrc_data, rsrc.map_offset + 28) + 1 ;
+	if (rsrc.type_count < 1)
+	{	psf_log_printf (psf, "Bad type count.\n") ;
+		error = SFE_SD2_BAD_RSRC ;
+		goto parse_rsrc_fork_cleanup ;
+		} ;
+
+	rsrc.item_offset = rsrc.type_offset + rsrc.type_count * 8 ;
+	if (rsrc.item_offset < 0 || rsrc.item_offset > rsrc.rsrc_len)
+	{	psf_log_printf (psf, "Bad item offset (%d).\n", rsrc.item_offset) ;
+		error = SFE_SD2_BAD_RSRC ;
+		goto parse_rsrc_fork_cleanup ;
+		} ;
+
+	rsrc.str_index = -1 ;
+	for (k = 0 ; k < rsrc.type_count ; k ++)
+	{	marker = read_marker (rsrc.rsrc_data, rsrc.type_offset + k * 8) ;
+
+		if (marker == STR_MARKER)
+		{	rsrc.str_index = k ;
+			rsrc.str_count = read_short (rsrc.rsrc_data, rsrc.type_offset + k * 8 + 4) + 1 ;
+			error = parse_str_rsrc (psf, &rsrc) ;
+			goto parse_rsrc_fork_cleanup ;
+			} ;
+		} ;
+
+	psf_log_printf (psf, "No 'STR ' resource.\n") ;
+	error = SFE_SD2_BAD_RSRC ;
+
+parse_rsrc_fork_cleanup :
+
+	psf_use_rsrc (psf, SF_FALSE) ;
+
+	if (rsrc.need_to_free_rsrc_data)
+		free (rsrc.rsrc_data) ;
+
+	return error ;
+} /* sd2_parse_rsrc_fork */
+
+static int
+parse_str_rsrc (SF_PRIVATE *psf, SD2_RSRC * rsrc)
+{	char name [32], value [32] ;
+	int k, str_offset, rsrc_id, data_offset = 0, data_len = 0 ;
+
+	psf_log_printf (psf, "Finding parameters :\n") ;
+
+	str_offset = rsrc->string_offset ;
+	psf_log_printf (psf, "  Offset    RsrcId    dlen    slen    Value\n") ;
+
+	for (k = 0 ; data_offset + data_len < rsrc->rsrc_len ; k++)
+	{	int slen ;
+
+		slen = read_char (rsrc->rsrc_data, str_offset) ;
+		read_str (rsrc->rsrc_data, str_offset + 1, name, SF_MIN (SIGNED_SIZEOF (name), slen + 1)) ;
+		str_offset += slen + 1 ;
+
+		rsrc_id = read_short (rsrc->rsrc_data, rsrc->item_offset + k * 12) ;
+
+		data_offset = rsrc->data_offset + read_int (rsrc->rsrc_data, rsrc->item_offset + k * 12 + 4) ;
+		if (data_offset < 0 || data_offset > rsrc->rsrc_len)
+		{	psf_log_printf (psf, "Exiting parser on data offset of %d.\n", data_offset) ;
+			break ;
+			} ;
+
+		data_len = read_int (rsrc->rsrc_data, data_offset) ;
+		if (data_len < 0 || data_len > rsrc->rsrc_len)
+		{	psf_log_printf (psf, "Exiting parser on data length of %d.\n", data_len) ;
+			break ;
+			} ;
+
+		slen = read_char (rsrc->rsrc_data, data_offset + 4) ;
+		read_str (rsrc->rsrc_data, data_offset + 5, value, SF_MIN (SIGNED_SIZEOF (value), slen + 1)) ;
+
+		psf_log_printf (psf, "  0x%04x     %4d     %4d     %3d    '%s'\n", data_offset, rsrc_id, data_len, slen, value) ;
+
+		if (rsrc_id == 1000 && rsrc->sample_size == 0)
+			rsrc->sample_size = strtol (value, NULL, 10) ;
+		else if (rsrc_id == 1001 && rsrc->sample_rate == 0)
+			rsrc->sample_rate = strtol (value, NULL, 10) ;
+		else if (rsrc_id == 1002 && rsrc->channels == 0)
+			rsrc->channels = strtol (value, NULL, 10) ;
+		} ;
+
+	psf_log_printf (psf, "Found Parameters :\n") ;
+	psf_log_printf (psf, "  sample-size : %d\n", rsrc->sample_size) ;
+	psf_log_printf (psf, "  sample-rate : %d\n", rsrc->sample_rate) ;
+	psf_log_printf (psf, "  channels    : %d\n", rsrc->channels) ;
+
+	if (rsrc->sample_rate <= 4 && rsrc->sample_size > 4)
+	{	int temp ;
+
+		psf_log_printf (psf, "Geez!! Looks like sample rate and sample size got switched.\nCorrecting this screw up.\n") ;
+		temp = rsrc->sample_rate ;
+		rsrc->sample_rate = rsrc->sample_size ;
+		rsrc->sample_size = temp ;
+		} ;
+
+	if (rsrc->sample_rate < 0)
+	{	psf_log_printf (psf, "Bad sample rate (%d)\n", rsrc->sample_rate) ;
+		return SFE_SD2_BAD_RSRC ;
+		} ;
+
+	if (rsrc->channels < 0)
+	{	psf_log_printf (psf, "Bad channel count (%d)\n", rsrc->channels) ;
+		return SFE_SD2_BAD_RSRC ;
+		} ;
+
+	psf->sf.samplerate = rsrc->sample_rate ;
+	psf->sf.channels = rsrc->channels ;
+	psf->bytewidth = rsrc->sample_size ;
+
+	switch (rsrc->sample_size)
+	{	case 1 :
+			psf->sf.format = SF_FORMAT_SD2 | SF_FORMAT_PCM_S8 ;
+			break ;
+
+		case 2 :
+			psf->sf.format = SF_FORMAT_SD2 | SF_FORMAT_PCM_16 ;
+			break ;
+
+		case 3 :
+			psf->sf.format = SF_FORMAT_SD2 | SF_FORMAT_PCM_24 ;
+			break ;
+
+		default :
+			psf_log_printf (psf, "Bad sample size (%d)\n", rsrc->sample_size) ;
+			return SFE_SD2_BAD_SAMPLE_SIZE ;
+		} ;
+
+	psf_log_printf (psf, "ok\n") ;
+
+	return 0 ;
+} /* parse_str_rsrc */
+
diff --git a/jni/libsndfile-1.0.25/src/sd2.lo b/jni/libsndfile-1.0.25/src/sd2.lo
new file mode 100644
index 0000000..c3661f7
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/sd2.lo
@@ -0,0 +1,12 @@
+# sd2.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/sd2.o'
+
+# Name of the non-PIC object
+non_pic_object='sd2.o'
+
diff --git a/jni/libsndfile-1.0.25/src/sd2.o b/jni/libsndfile-1.0.25/src/sd2.o
new file mode 100644
index 0000000..b274c1f
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/sd2.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/sds.c b/jni/libsndfile-1.0.25/src/sds.c
new file mode 100644
index 0000000..17c7036
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/sds.c
@@ -0,0 +1,1005 @@
+/*
+** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
+
+#include "sndfile.h"
+#include "sfendian.h"
+#include "common.h"
+
+/*------------------------------------------------------------------------------
+*/
+
+#define	SDS_DATA_OFFSET				0x15
+#define SDS_BLOCK_SIZE				127
+
+#define SDS_AUDIO_BYTES_PER_BLOCK	120
+
+#define SDS_3BYTE_TO_INT_DECODE(x) (((x) & 0x7F) | (((x) & 0x7F00) >> 1) | (((x) & 0x7F0000) >> 2))
+#define SDS_INT_TO_3BYTE_ENCODE(x) (((x) & 0x7F) | (((x) << 1) & 0x7F00) | (((x) << 2) & 0x7F0000))
+
+/*------------------------------------------------------------------------------
+** Typedefs.
+*/
+
+typedef struct tag_SDS_PRIVATE
+{	int bitwidth, frames ;
+	int	samplesperblock, total_blocks ;
+
+	int (*reader) (SF_PRIVATE *psf, struct tag_SDS_PRIVATE *psds) ;
+	int (*writer) (SF_PRIVATE *psf, struct tag_SDS_PRIVATE *psds) ;
+
+	int read_block, read_count ;
+	unsigned char read_data [SDS_BLOCK_SIZE] ;
+	int	read_samples [SDS_BLOCK_SIZE / 2] ; /* Maximum samples per block */
+
+	int write_block, write_count ;
+	int total_written ;
+	unsigned char write_data [SDS_BLOCK_SIZE] ;
+	int	write_samples [SDS_BLOCK_SIZE / 2] ; /* Maximum samples per block */
+} SDS_PRIVATE ;
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static int	sds_close	(SF_PRIVATE *psf) ;
+
+static int	sds_write_header (SF_PRIVATE *psf, int calc_length) ;
+static int	sds_read_header (SF_PRIVATE *psf, SDS_PRIVATE *psds) ;
+
+static int	sds_init (SF_PRIVATE *psf, SDS_PRIVATE *psds) ;
+
+static sf_count_t sds_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t sds_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t sds_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t sds_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t sds_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t sds_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t sds_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t sds_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+static sf_count_t sds_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+
+static int sds_2byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds) ;
+static int sds_3byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds) ;
+static int sds_4byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds) ;
+
+static int sds_read (SF_PRIVATE *psf, SDS_PRIVATE *psds, int *iptr, int readcount) ;
+
+static int sds_2byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds) ;
+static int sds_3byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds) ;
+static int sds_4byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds) ;
+
+static int sds_write (SF_PRIVATE *psf, SDS_PRIVATE *psds, const int *iptr, int writecount) ;
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+sds_open	(SF_PRIVATE *psf)
+{	SDS_PRIVATE	*psds ;
+	int			error = 0 ;
+
+	/* Hmmmm, need this here to pass update_header_test. */
+	psf->sf.frames = 0 ;
+
+	if (! (psds = calloc (1, sizeof (SDS_PRIVATE))))
+		return SFE_MALLOC_FAILED ;
+	psf->codec_data = psds ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = sds_read_header (psf, psds)))
+			return error ;
+		} ;
+
+	if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_SDS)
+		return	SFE_BAD_OPEN_FORMAT ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	if (sds_write_header (psf, SF_FALSE))
+			return psf->error ;
+
+		psf->write_header = sds_write_header ;
+
+		psf_fseek (psf, SDS_DATA_OFFSET, SEEK_SET) ;
+		} ;
+
+	if ((error = sds_init (psf, psds)) != 0)
+		return error ;
+
+	psf->seek = sds_seek ;
+	psf->container_close = sds_close ;
+
+	psf->blockwidth = 0 ;
+
+	return error ;
+} /* sds_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+sds_close	(SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	SDS_PRIVATE *psds ;
+
+		if ((psds = (SDS_PRIVATE *) psf->codec_data) == NULL)
+		{	psf_log_printf (psf, "*** Bad psf->codec_data ptr.\n") ;
+			return SFE_INTERNAL ;
+			} ;
+
+		if (psds->write_count > 0)
+		{	memset (&(psds->write_data [psds->write_count]), 0, (psds->samplesperblock - psds->write_count) * sizeof (int)) ;
+			psds->writer (psf, psds) ;
+			} ;
+
+		sds_write_header (psf, SF_TRUE) ;
+		} ;
+
+	return 0 ;
+} /* sds_close */
+
+static int
+sds_init (SF_PRIVATE *psf, SDS_PRIVATE *psds)
+{
+	if (psds->bitwidth < 8 || psds->bitwidth > 28)
+		return (psf->error = SFE_SDS_BAD_BIT_WIDTH) ;
+
+	if (psds->bitwidth < 14)
+	{	psds->reader = sds_2byte_read ;
+		psds->writer = sds_2byte_write ;
+		psds->samplesperblock = SDS_AUDIO_BYTES_PER_BLOCK / 2 ;
+		}
+	else if (psds->bitwidth < 21)
+	{	psds->reader = sds_3byte_read ;
+		psds->writer = sds_3byte_write ;
+		psds->samplesperblock = SDS_AUDIO_BYTES_PER_BLOCK / 3 ;
+		}
+	else
+	{	psds->reader = sds_4byte_read ;
+		psds->writer = sds_4byte_write ;
+		psds->samplesperblock = SDS_AUDIO_BYTES_PER_BLOCK / 4 ;
+		} ;
+
+	if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR)
+	{	psf->read_short		= sds_read_s ;
+		psf->read_int		= sds_read_i ;
+		psf->read_float		= sds_read_f ;
+		psf->read_double	= sds_read_d ;
+
+		/* Read first block. */
+		psds->reader (psf, psds) ;
+		} ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	psf->write_short	= sds_write_s ;
+		psf->write_int		= sds_write_i ;
+		psf->write_float	= sds_write_f ;
+		psf->write_double	= sds_write_d ;
+		} ;
+
+	return 0 ;
+} /* sds_init */
+
+static int
+sds_read_header (SF_PRIVATE *psf, SDS_PRIVATE *psds)
+{	unsigned char	channel, bitwidth, loop_type, byte ;
+	unsigned short	sample_no, marker ;
+	unsigned int	samp_period, data_length, sustain_loop_start, sustain_loop_end ;
+	int		bytesread, blockcount ;
+
+	/* Set position to start of file to begin reading header. */
+	bytesread = psf_binheader_readf (psf, "pE211", 0, &marker, &channel, &byte) ;
+
+	if (marker != 0xF07E || byte != 0x01)
+		return SFE_SDS_NOT_SDS ;
+
+	bytesread += psf_binheader_readf (psf, "e2", &sample_no) ;
+	sample_no = SDS_3BYTE_TO_INT_DECODE (sample_no) ;
+
+	psf_log_printf (psf, "Midi Sample Dump Standard (.sds)\nF07E\n"
+						" Midi Channel  : %d\n Sample Number : %d\n",
+						channel, sample_no) ;
+
+	bytesread += psf_binheader_readf (psf, "e13", &bitwidth, &samp_period) ;
+
+	samp_period = SDS_3BYTE_TO_INT_DECODE (samp_period) ;
+
+	psds->bitwidth = bitwidth ;
+
+	if (psds->bitwidth > 1)
+		psf_log_printf (psf, " Bit Width     : %d\n", psds->bitwidth) ;
+	else
+	{	psf_log_printf (psf, " Bit Width     : %d (should be > 1)\n", psds->bitwidth) ;
+		return SFE_SDS_BAD_BIT_WIDTH ;
+		} ;
+
+	if (samp_period > 0)
+	{	psf->sf.samplerate = 1000000000 / samp_period ;
+
+		psf_log_printf (psf, " Sample Period : %d\n"
+							" Sample Rate   : %d\n",
+							samp_period, psf->sf.samplerate) ;
+		}
+	else
+	{	psf->sf.samplerate = 16000 ;
+
+		psf_log_printf (psf, " Sample Period : %d (should be > 0)\n"
+							" Sample Rate   : %d (guessed)\n",
+							samp_period, psf->sf.samplerate) ;
+		} ;
+
+	bytesread += psf_binheader_readf (psf, "e3331", &data_length, &sustain_loop_start, &sustain_loop_end, &loop_type) ;
+
+	data_length = SDS_3BYTE_TO_INT_DECODE (data_length) ;
+
+	psf->sf.frames = psds->frames = data_length ;
+
+	sustain_loop_start = SDS_3BYTE_TO_INT_DECODE (sustain_loop_start) ;
+	sustain_loop_end = SDS_3BYTE_TO_INT_DECODE (sustain_loop_end) ;
+
+	psf_log_printf (psf, 	" Sustain Loop\n"
+							"     Start     : %d\n"
+							"     End       : %d\n"
+							"     Loop Type : %d\n",
+			sustain_loop_start, sustain_loop_end, loop_type) ;
+
+	psf->dataoffset = SDS_DATA_OFFSET ;
+	psf->datalength = psf->filelength - psf->dataoffset ;
+
+	bytesread += psf_binheader_readf (psf, "1", &byte) ;
+	if (byte != 0xF7)
+		psf_log_printf (psf, "bad end : %X\n", byte & 0xFF) ;
+
+	for (blockcount = 0 ; bytesread < psf->filelength ; blockcount++)
+	{
+		bytesread += psf_fread (&marker, 1, 2, psf) ;
+
+		if (marker == 0)
+			break ;
+
+		psf_fseek (psf, SDS_BLOCK_SIZE - 2, SEEK_CUR) ;
+		bytesread += SDS_BLOCK_SIZE - 2 ;
+		} ;
+
+	psf_log_printf (psf, "\nBlocks         : %d\n", blockcount) ;
+	psds->total_blocks = blockcount ;
+
+	psds->samplesperblock = SDS_AUDIO_BYTES_PER_BLOCK / ((psds->bitwidth + 6) / 7) ;
+	psf_log_printf (psf, "Samples/Block  : %d\n", psds->samplesperblock) ;
+
+	psf_log_printf (psf, "Frames         : %d\n", blockcount * psds->samplesperblock) ;
+
+	/* Always Mono */
+	psf->sf.channels = 1 ;
+	psf->sf.sections = 1 ;
+
+	/*
+	** Lie to the user about PCM bit width. Always round up to
+	** the next multiple of 8.
+	*/
+	switch ((psds->bitwidth + 7) / 8)
+	{	case 1 :
+			psf->sf.format = SF_FORMAT_SDS | SF_FORMAT_PCM_S8 ;
+			break ;
+
+		case 2 :
+			psf->sf.format = SF_FORMAT_SDS | SF_FORMAT_PCM_16 ;
+			break ;
+
+		case 3 :
+			psf->sf.format = SF_FORMAT_SDS | SF_FORMAT_PCM_24 ;
+			break ;
+
+		case 4 :
+			psf->sf.format = SF_FORMAT_SDS | SF_FORMAT_PCM_32 ;
+			break ;
+
+		default :
+			psf_log_printf (psf, "*** Weird byte width (%d)\n", (psds->bitwidth + 7) / 8) ;
+			return SFE_SDS_BAD_BIT_WIDTH ;
+		} ;
+
+	psf_fseek (psf, SDS_DATA_OFFSET, SEEK_SET) ;
+
+	return 0 ;
+} /* sds_read_header */
+
+static int
+sds_write_header (SF_PRIVATE *psf, int calc_length)
+{	SDS_PRIVATE *psds ;
+	sf_count_t	current ;
+	int samp_period, data_length, sustain_loop_start, sustain_loop_end ;
+	unsigned char loop_type = 0 ;
+
+	if ((psds = (SDS_PRIVATE *) psf->codec_data) == NULL)
+	{	psf_log_printf (psf, "*** Bad psf->codec_data ptr.\n") ;
+		return SFE_INTERNAL ;
+		} ;
+
+	if (psf->pipeoffset > 0)
+		return 0 ;
+
+	current = psf_ftell (psf) ;
+
+	if (calc_length)
+		psf->sf.frames = psds->total_written ;
+
+	if (psds->write_count > 0)
+	{	int current_count = psds->write_count ;
+		int current_block = psds->write_block ;
+
+		psds->writer (psf, psds) ;
+
+		psf_fseek (psf, -1 * SDS_BLOCK_SIZE, SEEK_CUR) ;
+
+		psds->write_count = current_count ;
+		psds->write_block = current_block ;
+		} ;
+
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+
+	if (psf->is_pipe == SF_FALSE)
+		psf_fseek (psf, 0, SEEK_SET) ;
+
+	psf_binheader_writef (psf, "E211", 0xF07E, 0, 1) ;
+
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_S8 :
+				psds->bitwidth = 8 ;
+				break ;
+		case SF_FORMAT_PCM_16 :
+				psds->bitwidth = 16 ;
+				break ;
+		case SF_FORMAT_PCM_24 :
+				psds->bitwidth = 24 ;
+				break ;
+		default:
+			return SFE_SDS_BAD_BIT_WIDTH ;
+		} ;
+
+	samp_period = SDS_INT_TO_3BYTE_ENCODE (1000000000 / psf->sf.samplerate) ;
+
+	psf_binheader_writef (psf, "e213", 0, psds->bitwidth, samp_period) ;
+
+	data_length			= SDS_INT_TO_3BYTE_ENCODE (psds->total_written) ;
+	sustain_loop_start	= SDS_INT_TO_3BYTE_ENCODE (0) ;
+	sustain_loop_end	= SDS_INT_TO_3BYTE_ENCODE (0) ;
+
+	psf_binheader_writef (psf, "e33311", data_length, sustain_loop_start, sustain_loop_end, loop_type, 0xF7) ;
+
+	/* Header construction complete so write it out. */
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+
+	if (psf->error)
+		return psf->error ;
+
+	psf->dataoffset = psf->headindex ;
+	psf->datalength = psds->write_block * SDS_BLOCK_SIZE ;
+
+	if (current > 0)
+		psf_fseek (psf, current, SEEK_SET) ;
+
+	return psf->error ;
+} /* sds_write_header */
+
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+sds_2byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds)
+{	unsigned char *ucptr, checksum ;
+	unsigned int sample ;
+	int 	k ;
+
+	psds->read_block ++ ;
+	psds->read_count = 0 ;
+
+	if (psds->read_block * psds->samplesperblock > psds->frames)
+	{	memset (psds->read_samples, 0, psds->samplesperblock * sizeof (int)) ;
+		return 1 ;
+		} ;
+
+	if ((k = psf_fread (psds->read_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE)
+		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, SDS_BLOCK_SIZE) ;
+
+	if (psds->read_data [0] != 0xF0)
+	{	printf ("Error A : %02X\n", psds->read_data [0] & 0xFF) ;
+		} ;
+
+	checksum = psds->read_data [1] ;
+	if (checksum != 0x7E)
+	{	printf ("Error 1 : %02X\n", checksum & 0xFF) ;
+		}
+
+	for (k = 2 ; k <= SDS_BLOCK_SIZE - 3 ; k ++)
+		checksum ^= psds->read_data [k] ;
+
+	checksum &= 0x7F ;
+
+	if (checksum != psds->read_data [SDS_BLOCK_SIZE - 2])
+	{	psf_log_printf (psf, "Block %d : checksum is %02X should be %02X\n", psds->read_data [4], checksum, psds->read_data [SDS_BLOCK_SIZE - 2]) ;
+		} ;
+
+	ucptr = psds->read_data + 5 ;
+	for (k = 0 ; k < 120 ; k += 2)
+	{	sample = (ucptr [k] << 25) + (ucptr [k + 1] << 18) ;
+		psds->read_samples [k / 2] = (int) (sample - 0x80000000) ;
+		} ;
+
+	return 1 ;
+} /* sds_2byte_read */
+
+static int
+sds_3byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds)
+{	unsigned char *ucptr, checksum ;
+	unsigned int sample ;
+	int 	k ;
+
+	psds->read_block ++ ;
+	psds->read_count = 0 ;
+
+	if (psds->read_block * psds->samplesperblock > psds->frames)
+	{	memset (psds->read_samples, 0, psds->samplesperblock * sizeof (int)) ;
+		return 1 ;
+		} ;
+
+	if ((k = psf_fread (psds->read_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE)
+		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, SDS_BLOCK_SIZE) ;
+
+	if (psds->read_data [0] != 0xF0)
+	{	printf ("Error A : %02X\n", psds->read_data [0] & 0xFF) ;
+		} ;
+
+	checksum = psds->read_data [1] ;
+	if (checksum != 0x7E)
+	{	printf ("Error 1 : %02X\n", checksum & 0xFF) ;
+		}
+
+	for (k = 2 ; k <= SDS_BLOCK_SIZE - 3 ; k ++)
+		checksum ^= psds->read_data [k] ;
+
+	checksum &= 0x7F ;
+
+	if (checksum != psds->read_data [SDS_BLOCK_SIZE - 2])
+	{	psf_log_printf (psf, "Block %d : checksum is %02X should be %02X\n", psds->read_data [4], checksum, psds->read_data [SDS_BLOCK_SIZE - 2]) ;
+		} ;
+
+	ucptr = psds->read_data + 5 ;
+	for (k = 0 ; k < 120 ; k += 3)
+	{	sample = (ucptr [k] << 25) + (ucptr [k + 1] << 18) + (ucptr [k + 2] << 11) ;
+		psds->read_samples [k / 3] = (int) (sample - 0x80000000) ;
+		} ;
+
+	return 1 ;
+} /* sds_3byte_read */
+
+static int
+sds_4byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds)
+{	unsigned char *ucptr, checksum ;
+	unsigned int sample ;
+	int 	k ;
+
+	psds->read_block ++ ;
+	psds->read_count = 0 ;
+
+	if (psds->read_block * psds->samplesperblock > psds->frames)
+	{	memset (psds->read_samples, 0, psds->samplesperblock * sizeof (int)) ;
+		return 1 ;
+		} ;
+
+	if ((k = psf_fread (psds->read_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE)
+		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, SDS_BLOCK_SIZE) ;
+
+	if (psds->read_data [0] != 0xF0)
+	{	printf ("Error A : %02X\n", psds->read_data [0] & 0xFF) ;
+		} ;
+
+	checksum = psds->read_data [1] ;
+	if (checksum != 0x7E)
+	{	printf ("Error 1 : %02X\n", checksum & 0xFF) ;
+		}
+
+	for (k = 2 ; k <= SDS_BLOCK_SIZE - 3 ; k ++)
+		checksum ^= psds->read_data [k] ;
+
+	checksum &= 0x7F ;
+
+	if (checksum != psds->read_data [SDS_BLOCK_SIZE - 2])
+	{	psf_log_printf (psf, "Block %d : checksum is %02X should be %02X\n", psds->read_data [4], checksum, psds->read_data [SDS_BLOCK_SIZE - 2]) ;
+		} ;
+
+	ucptr = psds->read_data + 5 ;
+	for (k = 0 ; k < 120 ; k += 4)
+	{	sample = (ucptr [k] << 25) + (ucptr [k + 1] << 18) + (ucptr [k + 2] << 11) + (ucptr [k + 3] << 4) ;
+		psds->read_samples [k / 4] = (int) (sample - 0x80000000) ;
+		} ;
+
+	return 1 ;
+} /* sds_4byte_read */
+
+
+static sf_count_t
+sds_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	SDS_PRIVATE	*psds ;
+	int			*iptr ;
+	int			k, bufferlen, readcount, count ;
+	sf_count_t	total = 0 ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	psds = (SDS_PRIVATE*) psf->codec_data ;
+
+	iptr = psf->u.ibuf ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = sds_read (psf, psds, iptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = iptr [k] >> 16 ;
+		total += count ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* sds_read_s */
+
+static sf_count_t
+sds_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	SDS_PRIVATE *psds ;
+	int			total ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	psds = (SDS_PRIVATE*) psf->codec_data ;
+
+	total = sds_read (psf, psds, ptr, len) ;
+
+	return total ;
+} /* sds_read_i */
+
+static sf_count_t
+sds_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	SDS_PRIVATE	*psds ;
+	int			*iptr ;
+	int			k, bufferlen, readcount, count ;
+	sf_count_t	total = 0 ;
+	float		normfact ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	psds = (SDS_PRIVATE*) psf->codec_data ;
+
+	if (psf->norm_float == SF_TRUE)
+		normfact = 1.0 / 0x80000000 ;
+	else
+		normfact = 1.0 / (1 << psds->bitwidth) ;
+
+	iptr = psf->u.ibuf ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = sds_read (psf, psds, iptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = normfact * iptr [k] ;
+		total += count ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* sds_read_f */
+
+static sf_count_t
+sds_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	SDS_PRIVATE	*psds ;
+	int			*iptr ;
+	int			k, bufferlen, readcount, count ;
+	sf_count_t	total = 0 ;
+	double		normfact ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	psds = (SDS_PRIVATE*) psf->codec_data ;
+
+	if (psf->norm_double == SF_TRUE)
+		normfact = 1.0 / 0x80000000 ;
+	else
+		normfact = 1.0 / (1 << psds->bitwidth) ;
+
+	iptr = psf->u.ibuf ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = sds_read (psf, psds, iptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = normfact * iptr [k] ;
+		total += count ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* sds_read_d */
+
+static int
+sds_read (SF_PRIVATE *psf, SDS_PRIVATE *psds, int *ptr, int len)
+{	int	count, total = 0 ;
+
+	while (total < len)
+	{	if (psds->read_block * psds->samplesperblock >= psds->frames)
+		{	memset (&(ptr [total]), 0, (len - total) * sizeof (int)) ;
+			return total ;
+			} ;
+
+		if (psds->read_count >= psds->samplesperblock)
+			psds->reader (psf, psds) ;
+
+		count = (psds->samplesperblock - psds->read_count) ;
+		count = (len - total > count) ? count : len - total ;
+
+		memcpy (&(ptr [total]), &(psds->read_samples [psds->read_count]), count * sizeof (int)) ;
+		total += count ;
+		psds->read_count += count ;
+		} ;
+
+	return total ;
+} /* sds_read */
+
+/*==============================================================================
+*/
+
+static sf_count_t
+sds_seek (SF_PRIVATE *psf, int mode, sf_count_t seek_from_start)
+{	SDS_PRIVATE	*psds ;
+	sf_count_t	file_offset ;
+	int			newblock, newsample ;
+
+	if ((psds = psf->codec_data) == NULL)
+	{	psf->error = SFE_INTERNAL ;
+		return PSF_SEEK_ERROR ;
+		} ;
+
+	if (psf->datalength < 0 || psf->dataoffset < 0)
+	{	psf->error = SFE_BAD_SEEK ;
+		return PSF_SEEK_ERROR ;
+		} ;
+
+	if (seek_from_start < 0 || seek_from_start > psf->sf.frames)
+	{	psf->error = SFE_BAD_SEEK ;
+		return PSF_SEEK_ERROR ;
+		} ;
+
+	if (mode == SFM_READ && psds->write_count > 0)
+		psds->writer (psf, psds) ;
+
+	newblock = seek_from_start / psds->samplesperblock ;
+	newsample = seek_from_start % psds->samplesperblock ;
+
+	switch (mode)
+	{	case SFM_READ :
+			if (newblock > psds->total_blocks)
+			{	psf->error = SFE_BAD_SEEK ;
+				return PSF_SEEK_ERROR ;
+				} ;
+
+			file_offset = psf->dataoffset + newblock * SDS_BLOCK_SIZE ;
+
+			if (psf_fseek (psf, file_offset, SEEK_SET) != file_offset)
+			{	psf->error = SFE_SEEK_FAILED ;
+				return PSF_SEEK_ERROR ;
+				} ;
+
+			psds->read_block = newblock ;
+			psds->reader (psf, psds) ;
+			psds->read_count = newsample ;
+			break ;
+
+		case SFM_WRITE :
+			if (newblock > psds->total_blocks)
+			{	psf->error = SFE_BAD_SEEK ;
+				return PSF_SEEK_ERROR ;
+				} ;
+
+			file_offset = psf->dataoffset + newblock * SDS_BLOCK_SIZE ;
+
+			if (psf_fseek (psf, file_offset, SEEK_SET) != file_offset)
+			{	psf->error = SFE_SEEK_FAILED ;
+				return PSF_SEEK_ERROR ;
+				} ;
+
+			psds->write_block = newblock ;
+			psds->reader (psf, psds) ;
+			psds->write_count = newsample ;
+			break ;
+
+		default :
+			psf->error = SFE_BAD_SEEK ;
+			return PSF_SEEK_ERROR ;
+			break ;
+		} ;
+
+	return seek_from_start ;
+} /* sds_seek */
+
+/*==============================================================================
+*/
+
+static int
+sds_2byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds)
+{	unsigned char *ucptr, checksum ;
+	unsigned int sample ;
+	int 	k ;
+
+	psds->write_data [0] = 0xF0 ;
+	psds->write_data [1] = 0x7E ;
+	psds->write_data [2] = 0 ;							/* Channel number */
+	psds->write_data [3] = 2 ;
+	psds->write_data [4] = psds->write_block & 0x7F ;	/* Packet number */
+
+	ucptr = psds->write_data + 5 ;
+	for (k = 0 ; k < 120 ; k += 2)
+	{	sample = psds->write_samples [k / 2] ;
+		sample += 0x80000000 ;
+		ucptr [k] = (sample >> 25) & 0x7F ;
+		ucptr [k + 1] = (sample >> 18) & 0x7F ;
+		} ;
+
+	checksum = psds->write_data [1] ;
+	for (k = 2 ; k <= SDS_BLOCK_SIZE - 3 ; k ++)
+		checksum ^= psds->write_data [k] ;
+	checksum &= 0x7F ;
+
+	psds->write_data [SDS_BLOCK_SIZE - 2] = checksum ;
+	psds->write_data [SDS_BLOCK_SIZE - 1] = 0xF7 ;
+
+	if ((k = psf_fwrite (psds->write_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE)
+		psf_log_printf (psf, "*** Warning : psf_fwrite (%d != %d).\n", k, SDS_BLOCK_SIZE) ;
+
+	psds->write_block ++ ;
+	psds->write_count = 0 ;
+
+	if (psds->write_block > psds->total_blocks)
+		psds->total_blocks = psds->write_block ;
+	psds->frames = psds->total_blocks * psds->samplesperblock ;
+
+	return 1 ;
+} /* sds_2byte_write */
+
+static int
+sds_3byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds)
+{	unsigned char *ucptr, checksum ;
+	unsigned int sample ;
+	int 	k ;
+
+	psds->write_data [0] = 0xF0 ;
+	psds->write_data [1] = 0x7E ;
+	psds->write_data [2] = 0 ;							/* Channel number */
+	psds->write_data [3] = 2 ;
+	psds->write_data [4] = psds->write_block & 0x7F ;	/* Packet number */
+
+	ucptr = psds->write_data + 5 ;
+	for (k = 0 ; k < 120 ; k += 3)
+	{	sample = psds->write_samples [k / 3] ;
+		sample += 0x80000000 ;
+		ucptr [k] = (sample >> 25) & 0x7F ;
+		ucptr [k + 1] = (sample >> 18) & 0x7F ;
+		ucptr [k + 2] = (sample >> 11) & 0x7F ;
+		} ;
+
+	checksum = psds->write_data [1] ;
+	for (k = 2 ; k <= SDS_BLOCK_SIZE - 3 ; k ++)
+		checksum ^= psds->write_data [k] ;
+	checksum &= 0x7F ;
+
+	psds->write_data [SDS_BLOCK_SIZE - 2] = checksum ;
+	psds->write_data [SDS_BLOCK_SIZE - 1] = 0xF7 ;
+
+	if ((k = psf_fwrite (psds->write_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE)
+		psf_log_printf (psf, "*** Warning : psf_fwrite (%d != %d).\n", k, SDS_BLOCK_SIZE) ;
+
+	psds->write_block ++ ;
+	psds->write_count = 0 ;
+
+	if (psds->write_block > psds->total_blocks)
+		psds->total_blocks = psds->write_block ;
+	psds->frames = psds->total_blocks * psds->samplesperblock ;
+
+	return 1 ;
+} /* sds_3byte_write */
+
+static int
+sds_4byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds)
+{	unsigned char *ucptr, checksum ;
+	unsigned int sample ;
+	int 	k ;
+
+	psds->write_data [0] = 0xF0 ;
+	psds->write_data [1] = 0x7E ;
+	psds->write_data [2] = 0 ;							/* Channel number */
+	psds->write_data [3] = 2 ;
+	psds->write_data [4] = psds->write_block & 0x7F ;	/* Packet number */
+
+	ucptr = psds->write_data + 5 ;
+	for (k = 0 ; k < 120 ; k += 4)
+	{	sample = psds->write_samples [k / 4] ;
+		sample += 0x80000000 ;
+		ucptr [k] = (sample >> 25) & 0x7F ;
+		ucptr [k + 1] = (sample >> 18) & 0x7F ;
+		ucptr [k + 2] = (sample >> 11) & 0x7F ;
+		ucptr [k + 3] = (sample >> 4) & 0x7F ;
+		} ;
+
+	checksum = psds->write_data [1] ;
+	for (k = 2 ; k <= SDS_BLOCK_SIZE - 3 ; k ++)
+		checksum ^= psds->write_data [k] ;
+	checksum &= 0x7F ;
+
+	psds->write_data [SDS_BLOCK_SIZE - 2] = checksum ;
+	psds->write_data [SDS_BLOCK_SIZE - 1] = 0xF7 ;
+
+	if ((k = psf_fwrite (psds->write_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE)
+		psf_log_printf (psf, "*** Warning : psf_fwrite (%d != %d).\n", k, SDS_BLOCK_SIZE) ;
+
+	psds->write_block ++ ;
+	psds->write_count = 0 ;
+
+	if (psds->write_block > psds->total_blocks)
+		psds->total_blocks = psds->write_block ;
+	psds->frames = psds->total_blocks * psds->samplesperblock ;
+
+	return 1 ;
+} /* sds_4byte_write */
+
+static sf_count_t
+sds_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	SDS_PRIVATE	*psds ;
+	int			*iptr ;
+	int			k, bufferlen, writecount, count ;
+	sf_count_t	total = 0 ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	psds = (SDS_PRIVATE*) psf->codec_data ;
+	psds->total_written += len ;
+
+	iptr = psf->u.ibuf ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			iptr [k] = ptr [total + k] << 16 ;
+		count = sds_write (psf, psds, iptr, writecount) ;
+		total += count ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* sds_write_s */
+
+static sf_count_t
+sds_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	SDS_PRIVATE *psds ;
+	int			total ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	psds = (SDS_PRIVATE*) psf->codec_data ;
+	psds->total_written += len ;
+
+	total = sds_write (psf, psds, ptr, len) ;
+
+	return total ;
+} /* sds_write_i */
+
+static sf_count_t
+sds_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	SDS_PRIVATE	*psds ;
+	int			*iptr ;
+	int			k, bufferlen, writecount, count ;
+	sf_count_t	total = 0 ;
+	float		normfact ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	psds = (SDS_PRIVATE*) psf->codec_data ;
+	psds->total_written += len ;
+
+	if (psf->norm_float == SF_TRUE)
+		normfact = 1.0 * 0x80000000 ;
+	else
+		normfact = 1.0 * (1 << psds->bitwidth) ;
+
+	iptr = psf->u.ibuf ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			iptr [k] = normfact * ptr [total + k] ;
+		count = sds_write (psf, psds, iptr, writecount) ;
+		total += count ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* sds_write_f */
+
+static sf_count_t
+sds_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	SDS_PRIVATE	*psds ;
+	int			*iptr ;
+	int			k, bufferlen, writecount, count ;
+	sf_count_t	total = 0 ;
+	double		normfact ;
+
+	if (psf->codec_data == NULL)
+		return 0 ;
+	psds = (SDS_PRIVATE*) psf->codec_data ;
+	psds->total_written += len ;
+
+	if (psf->norm_double == SF_TRUE)
+		normfact = 1.0 * 0x80000000 ;
+	else
+		normfact = 1.0 * (1 << psds->bitwidth) ;
+
+	iptr = psf->u.ibuf ;
+	bufferlen = ARRAY_LEN (psf->u.ibuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			iptr [k] = normfact * ptr [total + k] ;
+		count = sds_write (psf, psds, iptr, writecount) ;
+		total += count ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* sds_write_d */
+
+static int
+sds_write (SF_PRIVATE *psf, SDS_PRIVATE *psds, const int *ptr, int len)
+{	int	count, total = 0 ;
+
+	while (total < len)
+	{	count = psds->samplesperblock - psds->write_count ;
+		if (count > len - total)
+			count = len - total ;
+
+		memcpy (&(psds->write_samples [psds->write_count]), &(ptr [total]), count * sizeof (int)) ;
+		total += count ;
+		psds->write_count += count ;
+
+		if (psds->write_count >= psds->samplesperblock)
+			psds->writer (psf, psds) ;
+		} ;
+
+	return total ;
+} /* sds_write */
+
diff --git a/jni/libsndfile-1.0.25/src/sds.lo b/jni/libsndfile-1.0.25/src/sds.lo
new file mode 100644
index 0000000..b02f21d
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/sds.lo
@@ -0,0 +1,12 @@
+# sds.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/sds.o'
+
+# Name of the non-PIC object
+non_pic_object='sds.o'
+
diff --git a/jni/libsndfile-1.0.25/src/sds.o b/jni/libsndfile-1.0.25/src/sds.o
new file mode 100644
index 0000000..3dd2eff
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/sds.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/sf_unistd.h b/jni/libsndfile-1.0.25/src/sf_unistd.h
new file mode 100644
index 0000000..9fca68e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/sf_unistd.h
@@ -0,0 +1,63 @@
+/*
+** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/* Some defines that microsoft 'forgot' to implement. */
+
+#ifndef S_IRWXU
+#define	S_IRWXU 	0000700	/* rwx, owner */
+#endif
+
+#ifndef		S_IRUSR
+#define		S_IRUSR	0000400	/* read permission, owner */
+#endif
+
+#ifndef		S_IWUSR
+#define		S_IWUSR	0000200	/* write permission, owner */
+#endif
+
+#ifndef		S_IXUSR
+#define		S_IXUSR	0000100	/* execute/search permission, owner */
+#endif
+
+/* Windows doesn't have group permissions so set all these to zero. */
+#define	S_IRWXG		0	/* rwx, group */
+#define		S_IRGRP	0	/* read permission, group */
+#define		S_IWGRP	0	/* write permission, grougroup */
+#define		S_IXGRP	0	/* execute/search permission, group */
+
+/* Windows doesn't have others permissions so set all these to zero. */
+#define	S_IRWXO		0	/* rwx, other */
+#define		S_IROTH	0	/* read permission, other */
+#define		S_IWOTH	0	/* write permission, other */
+#define		S_IXOTH	0	/* execute/search permission, other */
+
+#ifndef S_ISFIFO
+#define S_ISFIFO(mode)	(((mode) & _S_IFMT) == _S_IFIFO)
+#endif
+
+#ifndef S_ISREG
+#define	S_ISREG(mode)	(((mode) & _S_IFREG) == _S_IFREG)
+#endif
+
+/*
+**	Don't know if these are still needed.
+**
+**	#define	_IFMT		_S_IFMT
+**	#define _IFREG		_S_IFREG
+*/
+
diff --git a/jni/libsndfile-1.0.25/src/sfconfig.h b/jni/libsndfile-1.0.25/src/sfconfig.h
new file mode 100644
index 0000000..f7f5a80
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/sfconfig.h
@@ -0,0 +1,113 @@
+/*
+** Copyright (C) 2005-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/*
+**	Autoconf leaves many config parameters undefined.
+**	Here we change then from being undefined to defining them to 0.
+**	This allows things like:
+**
+**		#if HAVE_CONFIG_PARAM
+**
+**	and
+**
+**		if (HAVE_CONFIG_PARAM)
+**			do_something () ;
+*/
+
+#ifndef SFCONFIG_H
+#define SFCONFIG_H
+
+/* Include the Autoconf generated file. */
+#include "config.h"
+
+/* Now fiddle the values. */
+
+#ifndef HAVE_ALSA_ASOUNDLIB_H
+#define HAVE_ALSA_ASOUNDLIB_H 0
+#endif
+
+#ifndef HAVE_BYTESWAP_H
+#define HAVE_BYTESWAP_H 0
+#endif
+
+#ifndef HAVE_DECL_S_IRGRP
+#define	HAVE_DECL_S_IRGRP 0
+#endif
+
+#ifndef HAVE_ENDIAN_H
+#define HAVE_ENDIAN_H 0
+#endif
+
+#ifndef HAVE_FSYNC
+#define HAVE_FSYNC 0
+#endif
+
+#ifndef HAVE_LOCALE_H
+#define HAVE_LOCALE_H 0
+#endif
+
+#ifndef HAVE_LRINT
+#define HAVE_LRINT 0
+#endif
+
+#ifndef HAVE_LRINTF
+#define HAVE_LRINTF 0
+#endif
+
+#ifndef HAVE_MMAP
+#define HAVE_MMAP 0
+#endif
+
+#ifndef HAVE_PREAD
+#define HAVE_PREAD 0
+#endif
+
+#ifndef HAVE_PWRITE
+#define HAVE_PWRITE 0
+#endif
+
+#ifndef HAVE_SETLOCALE
+#define HAVE_SETLOCALE 0
+#endif
+
+#ifndef HAVE_SQLITE3
+#define HAVE_SQLITE3 0
+#endif
+
+#ifndef HAVE_STDINT_H
+#define HAVE_STDINT_H 0
+#endif
+
+#ifndef HAVE_SYS_WAIT_H
+#define HAVE_SYS_WAIT_H 0
+#endif
+
+#ifndef HAVE_UNISTD_H
+#define HAVE_UNISTD_H 0
+#endif
+
+#ifndef HAVE_PIPE
+#define HAVE_PIPE 0
+#endif
+
+#ifndef HAVE_WAITPID
+#define	HAVE_WAITPID 0
+#endif
+
+#endif
+
diff --git a/jni/libsndfile-1.0.25/src/sfendian.h b/jni/libsndfile-1.0.25/src/sfendian.h
new file mode 100644
index 0000000..386361c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/sfendian.h
@@ -0,0 +1,254 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#ifndef SFENDIAN_INCLUDED
+#define SFENDIAN_INCLUDED
+
+#include "sfconfig.h"
+
+#if HAVE_STDINT_H
+#include <stdint.h>
+#elif HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if (defined (SIZEOF_INT64_T) && (SIZEOF_INT64_T == 8))
+/* Good, we have int64_t. */
+#elif (defined (SIZEOF_LONG_LONG) && (SIZEOF_LONG_LONG == 8))
+typedef long long int64_t ;
+#elif (defined (SIZEOF_LONG) && (SIZEOF_LONG == 8))
+typedef long int64_t ;
+#elif (defined (WIN32) || defined (_WIN32))
+typedef __int64 int64_t ;
+#else
+#error "No 64 bit integer type."
+#endif
+
+#if HAVE_BYTESWAP_H
+
+#include <byteswap.h>
+
+#define	ENDSWAP_SHORT(x)	((short) bswap_16 (x))
+#define	ENDSWAP_INT(x)		((int) bswap_32 (x))
+
+#else
+
+#define	ENDSWAP_SHORT(x)	((((x) >> 8) & 0xFF) + (((x) & 0xFF) << 8))
+#define	ENDSWAP_INT(x)		((((x) >> 24) & 0xFF) + (((x) >> 8) & 0xFF00) + (((x) & 0xFF00) << 8) + (((x) & 0xFF) << 24))
+
+#endif
+
+/*
+** Many file types (ie WAV, AIFF) use sets of four consecutive bytes as a
+** marker indicating different sections of the file.
+** The following MAKE_MARKER macro allows th creation of integer constants
+** for these markers.
+*/
+
+#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 "Target CPU endian-ness unknown. May need to hand edit src/sfconfig.h"
+#endif
+
+/*
+** Macros to handle reading of data of a specific endian-ness into host endian
+** shorts and ints. The single input is an unsigned char* pointer to the start
+** of the object. There are two versions of each macro as we need to deal with
+** both big and little endian CPUs.
+*/
+
+#if (CPU_IS_LITTLE_ENDIAN == 1)
+	#define LES2H_SHORT(x)			(x)
+	#define LEI2H_INT(x)			(x)
+
+	#define BES2H_SHORT(x)			ENDSWAP_SHORT (x)
+	#define BEI2H_INT(x)			ENDSWAP_INT (x)
+
+	#define H2BE_SHORT(x)			ENDSWAP_SHORT (x)
+	#define H2BE_INT(x)				ENDSWAP_INT (x)
+
+#elif (CPU_IS_BIG_ENDIAN == 1)
+	#define LES2H_SHORT(x)			ENDSWAP_SHORT (x)
+	#define LEI2H_INT(x)			ENDSWAP_INT (x)
+
+	#define BES2H_SHORT(x)			(x)
+	#define BEI2H_INT(x)			(x)
+
+	#define H2LE_SHORT(x)			ENDSWAP_SHORT (x)
+	#define H2LE_INT(x)				ENDSWAP_INT (x)
+
+#else
+	#error "Target CPU endian-ness unknown. May need to hand edit src/sfconfig.h"
+#endif
+
+#define LET2H_SHORT_PTR(x)		((x) [1] + ((x) [2] << 8))
+#define LET2H_INT_PTR(x)		(((x) [0] << 8) + ((x) [1] << 16) + ((x) [2] << 24))
+
+#define BET2H_SHORT_PTR(x)		(((x) [0] << 8) + (x) [1])
+#define BET2H_INT_PTR(x)		(((x) [0] << 24) + ((x) [1] << 16) + ((x) [2] << 8))
+
+/*-----------------------------------------------------------------------------------------------
+** Generic functions for performing endian swapping on integer arrays.
+*/
+
+static inline void
+endswap_short_array (short *ptr, int len)
+{	short	temp ;
+
+	while (--len >= 0)
+	{	temp = ptr [len] ;
+		ptr [len] = ENDSWAP_SHORT (temp) ;
+		} ;
+} /* endswap_short_array */
+
+static inline void
+endswap_short_copy (short *dest, const short *src, int len)
+{
+	while (--len >= 0)
+	{	dest [len] = ENDSWAP_SHORT (src [len]) ;
+		} ;
+} /* endswap_short_copy */
+
+static inline void
+endswap_int_array (int *ptr, int len)
+{	int temp ;
+
+	while (--len >= 0)
+	{	temp = ptr [len] ;
+		ptr [len] = ENDSWAP_INT (temp) ;
+		} ;
+} /* endswap_int_array */
+
+static inline void
+endswap_int_copy (int *dest, const int *src, int len)
+{
+	while (--len >= 0)
+	{	dest [len] = ENDSWAP_INT (src [len]) ;
+		} ;
+} /* endswap_int_copy */
+
+/*========================================================================================
+*/
+
+#if	(HAVE_BYTESWAP_H && defined (SIZEOF_INT64_T) && (SIZEOF_INT64_T == 8))
+
+static inline void
+endswap_int64_t_array (int64_t *ptr, int len)
+{	int64_t value ;
+
+	while (--len >= 0)
+	{	value = ptr [len] ;
+		ptr [len] = bswap_64 (value) ;
+		} ;
+} /* endswap_int64_t_array */
+
+static inline void
+endswap_int64_t_copy (int64_t *dest, const int64_t *src, int len)
+{	int64_t value ;
+
+	while (--len >= 0)
+	{	value = src [len] ;
+		dest [len] = bswap_64 (value) ;
+		} ;
+} /* endswap_int64_t_copy */
+
+#else
+
+static inline void
+endswap_int64_t_array (int64_t *ptr, int len)
+{	unsigned char *ucptr, temp ;
+
+	ucptr = (unsigned char *) ptr ;
+	ucptr += 8 * len ;
+	while (--len >= 0)
+	{	ucptr -= 8 ;
+
+		temp = ucptr [0] ;
+		ucptr [0] = ucptr [7] ;
+		ucptr [7] = temp ;
+
+		temp = ucptr [1] ;
+		ucptr [1] = ucptr [6] ;
+		ucptr [6] = temp ;
+
+		temp = ucptr [2] ;
+		ucptr [2] = ucptr [5] ;
+		ucptr [5] = temp ;
+
+		temp = ucptr [3] ;
+		ucptr [3] = ucptr [4] ;
+		ucptr [4] = temp ;
+		} ;
+} /* endswap_int64_t_array */
+
+static inline void
+endswap_int64_t_copy (int64_t *dest, const int64_t *src, int len)
+{	const unsigned char *psrc ;
+	unsigned char *pdest ;
+
+	if (dest == src)
+	{	endswap_int64_t_array (dest, len) ;
+		return ;
+		} ;
+
+	psrc = ((const unsigned char *) src) + 8 * len ;
+	pdest = ((unsigned char *) dest) + 8 * len ;
+	while (--len >= 0)
+	{	psrc -= 8 ;
+		pdest -= 8 ;
+
+		pdest [0] = psrc [7] ;
+		pdest [2] = psrc [5] ;
+		pdest [4] = psrc [3] ;
+		pdest [6] = psrc [1] ;
+		pdest [7] = psrc [0] ;
+		pdest [1] = psrc [6] ;
+		pdest [3] = psrc [4] ;
+		pdest [5] = psrc [2] ;
+		} ;
+} /* endswap_int64_t_copy */
+
+#endif
+
+/* A couple of wrapper functions. */
+
+static inline void
+endswap_float_array (float *ptr, int len)
+{	endswap_int_array ((void *) ptr, len) ;
+} /* endswap_float_array */
+
+static inline void
+endswap_double_array (double *ptr, int len)
+{	endswap_int64_t_array ((void *) ptr, len) ;
+} /* endswap_double_array */
+
+static inline void
+endswap_float_copy (float *dest, const float *src, int len)
+{	endswap_int_copy ((int *) dest, (const int *) src, len) ;
+} /* endswap_float_copy */
+
+static inline void
+endswap_double_copy (double *dest, const double *src, int len)
+{	endswap_int64_t_copy ((int64_t *) dest, (const int64_t *) src, len) ;
+} /* endswap_double_copy */
+
+#endif /* SFENDIAN_INCLUDED */
+
diff --git a/jni/libsndfile-1.0.25/src/sndfile.c b/jni/libsndfile-1.0.25/src/sndfile.c
new file mode 100644
index 0000000..d88a16c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/sndfile.c
@@ -0,0 +1,2923 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdlib.h>
+#include	<string.h>
+#include	<ctype.h>
+#include	<assert.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+#define		SNDFILE_MAGICK	0x1234C0DE
+
+#ifdef __APPLE__
+	/*
+	**	Detect if a compile for a universal binary is being attempted and barf if it is.
+	**	See the URL below for the rationale.
+	*/
+	#ifdef __BIG_ENDIAN__
+		#if (CPU_IS_LITTLE_ENDIAN == 1)
+			#error "Universal binary compile detected. See http://www.mega-nerd.com/libsndfile/FAQ.html#Q018"
+		#endif
+	#endif
+
+	#ifdef __LITTLE_ENDIAN__
+		#if (CPU_IS_BIG_ENDIAN == 1)
+			#error "Universal binary compile detected. See http://www.mega-nerd.com/libsndfile/FAQ.html#Q018"
+		#endif
+	#endif
+#endif
+
+
+typedef struct
+{	int 		error ;
+	const char	*str ;
+} ErrorStruct ;
+
+static
+ErrorStruct SndfileErrors [] =
+{
+	/* Public error values and their associated strings. */
+	{	SF_ERR_NO_ERROR				, "No Error." },
+	{	SF_ERR_UNRECOGNISED_FORMAT	, "Format not recognised." },
+	{	SF_ERR_SYSTEM				, "System error." /* Often replaced. */ 	},
+	{	SF_ERR_MALFORMED_FILE		, "Supported file format but file is malformed." },
+	{	SF_ERR_UNSUPPORTED_ENCODING	, "Supported file format but unsupported encoding." },
+
+	/* Private error values and their associated strings. */
+	{	SFE_ZERO_MAJOR_FORMAT	, "Error : major format is 0." },
+	{	SFE_ZERO_MINOR_FORMAT	, "Error : minor format is 0." },
+	{	SFE_BAD_FILE			, "File does not exist or is not a regular file (possibly a pipe?)." },
+	{	SFE_BAD_FILE_READ		, "File exists but no data could be read." },
+	{	SFE_OPEN_FAILED			, "Could not open file." },
+	{	SFE_BAD_SNDFILE_PTR		, "Not a valid SNDFILE* pointer." },
+	{	SFE_BAD_SF_INFO_PTR		, "NULL SF_INFO pointer passed to libsndfile." },
+	{	SFE_BAD_SF_INCOMPLETE	, "SF_PRIVATE struct incomplete and end of header parsing." },
+	{	SFE_BAD_FILE_PTR		, "Bad FILE pointer." },
+	{	SFE_BAD_INT_PTR			, "Internal error, Bad pointer." },
+	{	SFE_BAD_STAT_SIZE		, "Error : software was misconfigured at compile time (sizeof statbuf.st_size)." },
+
+	{	SFE_MALLOC_FAILED		, "Internal malloc () failed." },
+	{	SFE_UNIMPLEMENTED		, "File contains data in an unimplemented format." },
+	{	SFE_BAD_READ_ALIGN		, "Attempt to read a non-integer number of channels." },
+	{	SFE_BAD_WRITE_ALIGN 	, "Attempt to write a non-integer number of channels." },
+	{	SFE_UNKNOWN_FORMAT		, "File contains data in an unknown format." },
+	{	SFE_NOT_READMODE		, "Read attempted on file currently open for write." },
+	{	SFE_NOT_WRITEMODE		, "Write attempted on file currently open for read." },
+	{	SFE_BAD_MODE_RW			, "Error : This file format does not support read/write mode." },
+	{	SFE_BAD_SF_INFO			, "Internal error : SF_INFO struct incomplete." },
+	{	SFE_BAD_OFFSET			, "Error : supplied offset beyond end of file." },
+	{	SFE_NO_EMBED_SUPPORT	, "Error : embedding not supported for this file format." },
+	{	SFE_NO_EMBEDDED_RDWR	, "Error : cannot open embedded file read/write." },
+	{	SFE_NO_PIPE_WRITE		, "Error : this file format does not support pipe write." },
+	{	SFE_BAD_VIRTUAL_IO		, "Error : bad pointer on SF_VIRTUAL_IO struct." },
+	{	SFE_BAD_BROADCAST_INFO_SIZE
+								, "Error : bad size in SF_BROADCAST_INFO struct." },
+	{	SFE_BAD_BROADCAST_INFO_TOO_BIG
+								, "Error : SF_BROADCAST_INFO struct too large." },
+
+	{	SFE_INTERLEAVE_MODE		, "Attempt to write to file with non-interleaved data." },
+	{	SFE_INTERLEAVE_SEEK		, "Bad karma in seek during interleave read operation." },
+	{	SFE_INTERLEAVE_READ		, "Bad karma in read during interleave read operation." },
+
+	{	SFE_INTERNAL			, "Unspecified internal error." },
+	{	SFE_BAD_COMMAND_PARAM	, "Bad parameter passed to function sf_command." },
+	{	SFE_BAD_ENDIAN			, "Bad endian-ness. Try default endian-ness" },
+	{	SFE_CHANNEL_COUNT_ZERO	, "Channel count is zero." },
+	{	SFE_CHANNEL_COUNT		, "Too many channels specified." },
+
+	{	SFE_BAD_SEEK			, "Internal psf_fseek() failed." },
+	{	SFE_NOT_SEEKABLE		, "Seek attempted on unseekable file type." },
+	{	SFE_AMBIGUOUS_SEEK		, "Error : combination of file open mode and seek command is ambiguous." },
+	{	SFE_WRONG_SEEK			, "Error : invalid seek parameters." },
+	{	SFE_SEEK_FAILED			, "Error : parameters OK, but psf_seek() failed." },
+
+	{	SFE_BAD_OPEN_MODE		, "Error : bad mode parameter for file open." },
+	{	SFE_OPEN_PIPE_RDWR		, "Error : attempt to open a pipe in read/write mode." },
+	{	SFE_RDWR_POSITION		, "Error on RDWR position (cryptic)." },
+	{	SFE_RDWR_BAD_HEADER		, "Error : Cannot open file in read/write mode due to string data in header." },
+	{	SFE_CMD_HAS_DATA		, "Error : Command fails because file already has audio data." },
+
+	{	SFE_STR_NO_SUPPORT		, "Error : File type does not support string data." },
+	{	SFE_STR_NOT_WRITE		, "Error : Trying to set a string when file is not in write mode." },
+	{	SFE_STR_MAX_DATA		, "Error : Maximum string data storage reached." },
+	{	SFE_STR_MAX_COUNT		, "Error : Maximum string data count reached." },
+	{	SFE_STR_BAD_TYPE		, "Error : Bad string data type." },
+	{	SFE_STR_NO_ADD_END		, "Error : file type does not support strings added at end of file." },
+	{	SFE_STR_BAD_STRING		, "Error : bad string." },
+	{	SFE_STR_WEIRD			, "Error : Weird string error." },
+
+	{	SFE_WAV_NO_RIFF			, "Error in WAV file. No 'RIFF' chunk marker." },
+	{	SFE_WAV_NO_WAVE			, "Error in WAV file. No 'WAVE' chunk marker." },
+	{	SFE_WAV_NO_FMT			, "Error in WAV/W64/RF64 file. No 'fmt ' chunk marker." },
+	{	SFE_WAV_BAD_FMT			, "Error in WAV/W64/RF64 file. Malformed 'fmt ' chunk." },
+	{	SFE_WAV_FMT_SHORT		, "Error in WAV/W64/RF64 file. Short 'fmt ' chunk." },
+
+	{	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." },
+	{	SFE_WAV_NO_DATA			, "Error in WAV file. No 'data' chunk marker." },
+	{	SFE_WAV_BAD_LIST		, "Error in WAV file. Malformed LIST chunk." },
+	{	SFE_WAV_UNKNOWN_CHUNK	, "Error in WAV file. File contains an unknown chunk marker." },
+	{	SFE_WAV_WVPK_DATA		, "Error in WAV file. Data is in WAVPACK format." },
+
+	{	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_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_AIFF_RW_SSND_NOT_LAST, "Error in AIFF file, RDWR only possible if SSND chunk at end of file." },
+
+	{	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_EMBED_BAD_LEN	, "Embedded AU file with unknown length." },
+
+	{	SFE_RAW_READ_BAD_SPEC	, "Error while opening RAW file for read. Must specify format and channels.\n"
+									"Possibly trying to open unsupported format."
+									 },
+	{	SFE_RAW_BAD_BITWIDTH	, "Error. RAW file bitwidth must be a multiple of 8." },
+	{	SFE_RAW_BAD_FORMAT		, "Error. Bad format field in SF_INFO struct when openning a RAW file for read." },
+
+	{	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_BAD_CHANNELS	, "Error in PAF file. Bad channel count." },
+
+	{	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_BAD_NAME_LENGTH	, "Error in 8SVX / 16SV file, NAME chunk too long." },
+
+	{	SFE_NIST_BAD_HEADER		, "Error in NIST file, bad header." },
+	{	SFE_NIST_CRLF_CONVERISON, "Error : NIST file damaged by Windows CR -> CRLF conversion process."	},
+	{	SFE_NIST_BAD_ENCODING	, "Error in NIST file, unsupported compression format." },
+
+	{	SFE_VOC_NO_CREATIVE		, "Error in VOC file, no 'Creative Voice File' marker." },
+	{	SFE_VOC_BAD_FORMAT		, "Error in VOC file, bad format." },
+	{	SFE_VOC_BAD_VERSION		, "Error in VOC file, bad version number." },
+	{	SFE_VOC_BAD_MARKER		, "Error in VOC file, bad marker in file." },
+	{	SFE_VOC_BAD_SECTIONS	, "Error in VOC file, incompatible VOC sections." },
+	{	SFE_VOC_MULTI_SAMPLERATE, "Error in VOC file, more than one sample rate defined." },
+	{	SFE_VOC_MULTI_SECTION	, "Unimplemented VOC file feature, file contains multiple sound sections." },
+	{	SFE_VOC_MULTI_PARAM		, "Error in VOC file, file contains multiple bit or channel widths." },
+	{	SFE_VOC_SECTION_COUNT	, "Error in VOC file, too many sections." },
+	{	SFE_VOC_NO_PIPE			, "Error : not able to operate on VOC files over a pipe." },
+
+	{	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_W64_64_BIT			, "Error in W64 file, file contains 64 bit offset." },
+	{	SFE_W64_NO_RIFF			, "Error in W64 file. No 'riff' chunk marker." },
+	{	SFE_W64_NO_WAVE			, "Error in W64 file. No 'wave' chunk marker." },
+	{	SFE_W64_NO_DATA			, "Error in W64 file. No 'data' chunk marker." },
+	{	SFE_W64_ADPCM_NOT4BIT	, "Error in ADPCM W64 file. Invalid bit width." },
+	{	SFE_W64_ADPCM_CHANNELS	, "Error in ADPCM W64 file. Invalid number of channels." },
+	{	SFE_W64_GSM610_FORMAT	, "Error in GSM610 W64 file. Invalid format chunk." },
+
+	{	SFE_MAT4_BAD_NAME		, "Error in MAT4 file. No variable name." },
+	{	SFE_MAT4_NO_SAMPLERATE	, "Error in MAT4 file. No sample rate." },
+
+	{	SFE_MAT5_BAD_ENDIAN		, "Error in MAT5 file. Not able to determine endian-ness." },
+	{	SFE_MAT5_NO_BLOCK		, "Error in MAT5 file. Bad block structure." },
+	{	SFE_MAT5_SAMPLE_RATE	, "Error in MAT5 file. Not able to determine sample rate." },
+
+	{	SFE_PVF_NO_PVF1			, "Error in PVF file. No PVF1 marker." },
+	{	SFE_PVF_BAD_HEADER		, "Error in PVF file. Bad header." },
+	{	SFE_PVF_BAD_BITWIDTH	, "Error in PVF file. Bad bit width." },
+
+	{	SFE_XI_BAD_HEADER		, "Error in XI file. Bad header." },
+	{	SFE_XI_EXCESS_SAMPLES	, "Error in XI file. Excess samples in file." },
+	{	SFE_XI_NO_PIPE			, "Error : not able to operate on XI files over a pipe." },
+
+	{	SFE_HTK_NO_PIPE			, "Error : not able to operate on HTK files over a pipe." },
+
+	{	SFE_SDS_NOT_SDS			, "Error : not an SDS file." },
+	{	SFE_SDS_BAD_BIT_WIDTH	, "Error : bad bit width for SDS file." },
+
+	{	SFE_SD2_FD_DISALLOWED	, "Error : cannot open SD2 file without a file name." },
+	{	SFE_SD2_BAD_DATA_OFFSET	, "Error : bad data offset." },
+	{	SFE_SD2_BAD_MAP_OFFSET	, "Error : bad map offset." },
+	{	SFE_SD2_BAD_DATA_LENGTH	, "Error : bad data length." },
+	{	SFE_SD2_BAD_MAP_LENGTH	, "Error : bad map length." },
+	{	SFE_SD2_BAD_RSRC		, "Error : bad resource fork." },
+	{	SFE_SD2_BAD_SAMPLE_SIZE	, "Error : bad sample size." },
+
+	{	SFE_FLAC_BAD_HEADER		, "Error : bad flac header." },
+	{	SFE_FLAC_NEW_DECODER	, "Error : problem while creating flac decoder." },
+	{	SFE_FLAC_INIT_DECODER	, "Error : problem while initialization of the flac decoder." },
+	{	SFE_FLAC_LOST_SYNC		, "Error : flac decoder lost sync." },
+	{	SFE_FLAC_BAD_SAMPLE_RATE, "Error : flac does not support this sample rate." },
+	{	SFE_FLAC_UNKOWN_ERROR	, "Error : unknown error in flac decoder." },
+
+	{	SFE_WVE_NOT_WVE			, "Error : not a WVE file." },
+	{	SFE_WVE_NO_PIPE			, "Error : not able to operate on WVE files over a pipe." },
+
+	{	SFE_DWVW_BAD_BITWIDTH	, "Error : Bad bit width for DWVW encoding. Must be 12, 16 or 24." },
+	{	SFE_G72X_NOT_MONO		, "Error : G72x encoding does not support more than 1 channel." },
+
+	{	SFE_VORBIS_ENCODER_BUG	, "Error : Sample rate chosen is known to trigger a Vorbis encoder bug on this CPU." },
+
+	{	SFE_RF64_NOT_RF64		, "Error : Not an RF64 file." },
+
+	{	SFE_MAX_ERROR			, "Maximum error number." },
+	{	SFE_MAX_ERROR + 1		, NULL }
+} ;
+
+/*------------------------------------------------------------------------------
+*/
+
+static int 	format_from_extension (SF_PRIVATE *psf) ;
+static int	guess_file_type (SF_PRIVATE *psf) ;
+static int	validate_sfinfo (SF_INFO *sfinfo) ;
+static int	validate_psf (SF_PRIVATE *psf) ;
+static void	save_header_info (SF_PRIVATE *psf) ;
+static void	copy_filename (SF_PRIVATE *psf, const char *path) ;
+static int	psf_close (SF_PRIVATE *psf) ;
+
+static int	try_resource_fork (SF_PRIVATE * psf) ;
+
+/*------------------------------------------------------------------------------
+** Private (static) variables.
+*/
+
+int	sf_errno = 0 ;
+static char	sf_logbuffer [SF_BUFFER_LEN] = { 0 } ;
+static char	sf_syserr [SF_SYSERR_LEN] = { 0 } ;
+
+/*------------------------------------------------------------------------------
+*/
+
+#define	VALIDATE_SNDFILE_AND_ASSIGN_PSF(a,b,c)		\
+		{	if ((a) == NULL)						\
+			{	sf_errno = SFE_BAD_SNDFILE_PTR ;	\
+				return 0 ;							\
+				} ;									\
+			(b) = (SF_PRIVATE*) (a) ;				\
+			if ((b)->virtual_io == SF_FALSE &&		\
+				psf_file_valid (b) == 0)			\
+			{	(b)->error = SFE_BAD_FILE_PTR ;		\
+				return 0 ;							\
+				} ;									\
+			if ((b)->Magick != SNDFILE_MAGICK)		\
+			{	(b)->error = SFE_BAD_SNDFILE_PTR ;	\
+				return 0 ;							\
+				} ;									\
+			if (c) (b)->error = 0 ;					\
+			}
+
+/*------------------------------------------------------------------------------
+**	Public functions.
+*/
+
+SNDFILE*
+sf_open	(const char *path, int mode, SF_INFO *sfinfo)
+{	SF_PRIVATE 	*psf ;
+
+	/* Ultimate sanity check. */
+	assert (sizeof (sf_count_t) == 8) ;
+
+	if ((psf = calloc (1, sizeof (SF_PRIVATE))) == NULL)
+	{	sf_errno = SFE_MALLOC_FAILED ;
+		return	NULL ;
+		} ;
+
+	memset (psf, 0, sizeof (SF_PRIVATE)) ;
+	psf_init_files (psf) ;
+
+	psf_log_printf (psf, "File : %s\n", path) ;
+
+	copy_filename (psf, path) ;
+
+	psf->file.mode = mode ;
+	if (strcmp (path, "-") == 0)
+		psf->error = psf_set_stdio (psf) ;
+	else
+		psf->error = psf_fopen (psf) ;
+
+	return psf_open_file (psf, sfinfo) ;
+} /* sf_open */
+
+SNDFILE*
+sf_open_fd	(int fd, int mode, SF_INFO *sfinfo, int close_desc)
+{	SF_PRIVATE 	*psf ;
+
+	if ((SF_CONTAINER (sfinfo->format)) == SF_FORMAT_SD2)
+	{	sf_errno = SFE_SD2_FD_DISALLOWED ;
+		return	NULL ;
+		} ;
+
+	if ((psf = calloc (1, sizeof (SF_PRIVATE))) == NULL)
+	{	sf_errno = SFE_MALLOC_FAILED ;
+		return	NULL ;
+		} ;
+
+	psf_init_files (psf) ;
+	copy_filename (psf, "") ;
+
+	psf->file.mode = mode ;
+	psf_set_file (psf, fd) ;
+	psf->is_pipe = psf_is_pipe (psf) ;
+	psf->fileoffset = psf_ftell (psf) ;
+
+	if (! close_desc)
+		psf->file.do_not_close_descriptor = SF_TRUE ;
+
+	return psf_open_file (psf, sfinfo) ;
+} /* sf_open_fd */
+
+SNDFILE*
+sf_open_virtual	(SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo, void *user_data)
+{	SF_PRIVATE 	*psf ;
+
+	/* Make sure we have a valid set ot virtual pointers. */
+	if (sfvirtual->get_filelen == NULL || sfvirtual->seek == NULL || sfvirtual->tell == NULL)
+	{	sf_errno = SFE_BAD_VIRTUAL_IO ;
+		snprintf (sf_logbuffer, sizeof (sf_logbuffer), "Bad vio_get_filelen / vio_seek / vio_tell in SF_VIRTUAL_IO struct.\n") ;
+		return NULL ;
+		} ;
+
+	if ((mode == SFM_READ || mode == SFM_RDWR) && sfvirtual->read == NULL)
+	{	sf_errno = SFE_BAD_VIRTUAL_IO ;
+		snprintf (sf_logbuffer, sizeof (sf_logbuffer), "Bad vio_read in SF_VIRTUAL_IO struct.\n") ;
+		return NULL ;
+		} ;
+
+	if ((mode == SFM_WRITE || mode == SFM_RDWR) && sfvirtual->write == NULL)
+	{	sf_errno = SFE_BAD_VIRTUAL_IO ;
+		snprintf (sf_logbuffer, sizeof (sf_logbuffer), "Bad vio_write in SF_VIRTUAL_IO struct.\n") ;
+		return NULL ;
+		} ;
+
+	if ((psf = calloc (1, sizeof (SF_PRIVATE))) == NULL)
+	{	sf_errno = SFE_MALLOC_FAILED ;
+		return	NULL ;
+		} ;
+
+	psf_init_files (psf) ;
+
+	psf->virtual_io = SF_TRUE ;
+	psf->vio = *sfvirtual ;
+	psf->vio_user_data = user_data ;
+
+	psf->file.mode = mode ;
+
+	return psf_open_file (psf, sfinfo) ;
+} /* sf_open_virtual */
+
+int
+sf_close	(SNDFILE *sndfile)
+{	SF_PRIVATE	*psf ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	return psf_close (psf) ;
+} /* sf_close */
+
+void
+sf_write_sync	(SNDFILE *sndfile)
+{	SF_PRIVATE	*psf ;
+
+	if ((psf = (SF_PRIVATE *) sndfile) == NULL)
+		return ;
+
+	psf_fsync (psf) ;
+
+	return ;
+} /* sf_write_sync */
+
+/*==============================================================================
+*/
+
+const char*
+sf_error_number	(int errnum)
+{	static const char *bad_errnum =
+		"No error defined for this error number. This is a bug in libsndfile." ;
+	int	k ;
+
+	if (errnum == SFE_MAX_ERROR)
+		return SndfileErrors [0].str ;
+
+	if (errnum < 0 || errnum > SFE_MAX_ERROR)
+	{	/* This really shouldn't happen in release versions. */
+		printf ("Not a valid error number (%d).\n", errnum) ;
+		return bad_errnum ;
+		} ;
+
+	for (k = 0 ; SndfileErrors [k].str ; k++)
+		if (errnum == SndfileErrors [k].error)
+			return SndfileErrors [k].str ;
+
+	return bad_errnum ;
+} /* sf_error_number */
+
+const char*
+sf_strerror (SNDFILE *sndfile)
+{	SF_PRIVATE 	*psf = NULL ;
+	int errnum ;
+
+	if (sndfile == NULL)
+	{	errnum = sf_errno ;
+		if (errnum == SFE_SYSTEM && sf_syserr [0])
+			return sf_syserr ;
+		}
+	else
+	{	psf = (SF_PRIVATE *) sndfile ;
+
+		if (psf->Magick != SNDFILE_MAGICK)
+			return	"sf_strerror : Bad magic number." ;
+
+		errnum = psf->error ;
+
+		if (errnum == SFE_SYSTEM && psf->syserr [0])
+			return psf->syserr ;
+		} ;
+
+	return sf_error_number (errnum) ;
+} /* sf_strerror */
+
+/*------------------------------------------------------------------------------
+*/
+
+int
+sf_error (SNDFILE *sndfile)
+{	SF_PRIVATE	*psf ;
+
+	if (sndfile == NULL)
+		return sf_errno ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 0) ;
+
+	if (psf->error)
+		return psf->error ;
+
+	return 0 ;
+} /* sf_error */
+
+/*------------------------------------------------------------------------------
+*/
+
+int
+sf_perror (SNDFILE *sndfile)
+{	SF_PRIVATE 	*psf ;
+	int 		errnum ;
+
+	if (sndfile == NULL)
+	{	errnum = sf_errno ;
+		}
+	else
+	{	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 0) ;
+		errnum = psf->error ;
+		} ;
+
+	fprintf (stderr, "%s\n", sf_error_number (errnum)) ;
+	return SFE_NO_ERROR ;
+} /* sf_perror */
+
+
+/*------------------------------------------------------------------------------
+*/
+
+int
+sf_error_str (SNDFILE *sndfile, char *str, size_t maxlen)
+{	SF_PRIVATE 	*psf ;
+	int 		errnum ;
+
+	if (str == NULL)
+		return SFE_INTERNAL ;
+
+	if (sndfile == NULL)
+		errnum = sf_errno ;
+	else
+	{	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 0) ;
+		errnum = psf->error ;
+		} ;
+
+	snprintf (str, maxlen, "%s", sf_error_number (errnum)) ;
+
+	return SFE_NO_ERROR ;
+} /* sf_error_str */
+
+/*==============================================================================
+*/
+
+int
+sf_format_check	(const SF_INFO *info)
+{	int	subformat, endian ;
+
+	subformat = SF_CODEC (info->format) ;
+	endian = SF_ENDIAN (info->format) ;
+
+	/* This is the place where each file format can check if the suppiled
+	** SF_INFO struct is valid.
+	** Return 0 on failure, 1 ons success.
+	*/
+
+	if (info->channels < 1 || info->channels > SF_MAX_CHANNELS)
+		return 0 ;
+
+	if (info->samplerate < 0)
+		return 0 ;
+
+	switch (SF_CONTAINER (info->format))
+	{	case SF_FORMAT_WAV :
+				/* WAV now allows both endian, RIFF or RIFX (little or big respectively) */
+				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16)
+					return 1 ;
+				if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
+					return 1 ;
+				if ((subformat == SF_FORMAT_IMA_ADPCM || subformat == SF_FORMAT_MS_ADPCM) && info->channels <= 2)
+					return 1 ;
+				if (subformat == SF_FORMAT_GSM610 && info->channels == 1)
+					return 1 ;
+				if (subformat == SF_FORMAT_G721_32 && info->channels == 1)
+					return 1 ;
+				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
+					return 1 ;
+				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_WAVEX :
+				if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)
+					return 0 ;
+				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16)
+					return 1 ;
+				if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
+					return 1 ;
+				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
+					return 1 ;
+				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_AIFF :
+				/* AIFF does allow both endian-nesses for PCM data.*/
+				if (subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
+					return 1 ;
+				/* Other encodings. Check for endian-ness. */
+				if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)
+					return 0 ;
+				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_S8)
+					return 1 ;
+				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
+					return 1 ;
+				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
+					return 1 ;
+				if ((subformat == SF_FORMAT_DWVW_12 || subformat == SF_FORMAT_DWVW_16 ||
+							subformat == SF_FORMAT_DWVW_24) && info-> channels == 1)
+					return 1 ;
+				if (subformat == SF_FORMAT_GSM610 && info->channels == 1)
+					return 1 ;
+				if (subformat == SF_FORMAT_IMA_ADPCM && (info->channels == 1 || info->channels == 2))
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_AU :
+				if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)
+					return 1 ;
+				if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
+					return 1 ;
+				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
+					return 1 ;
+				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
+					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_G723_40 && info->channels == 1)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_CAF :
+				if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)
+					return 1 ;
+				if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
+					return 1 ;
+				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
+					return 1 ;
+				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_RAW :
+				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)
+					return 1 ;
+				if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
+					return 1 ;
+				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
+					return 1 ;
+				if (subformat == SF_FORMAT_ALAW || subformat == SF_FORMAT_ULAW)
+					return 1 ;
+				if ((subformat == SF_FORMAT_DWVW_12 || subformat == SF_FORMAT_DWVW_16 ||
+							subformat == SF_FORMAT_DWVW_24) && info-> channels == 1)
+					return 1 ;
+				if (subformat == SF_FORMAT_GSM610 && info->channels == 1)
+					return 1 ;
+				if (subformat == SF_FORMAT_VOX_ADPCM && info->channels == 1)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_PAF :
+				if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_SVX :
+				/* SVX only supports writing mono SVX files. */
+				if (info->channels > 1)
+					return 0 ;
+				/* Always big endian. */
+				if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)
+					return 0 ;
+
+				if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_NIST :
+				if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)
+					return 1 ;
+				if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
+					return 1 ;
+				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_IRCAM :
+				if (subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_32)
+					return 1 ;
+				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW || subformat == SF_FORMAT_FLOAT)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_VOC :
+				/* VOC is strictly little endian. */
+				if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)
+					return 0 ;
+				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16)
+					return 1 ;
+				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_W64 :
+				/* W64 is strictly little endian. */
+				if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)
+					return 0 ;
+				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16)
+					return 1 ;
+				if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
+					return 1 ;
+				if ((subformat == SF_FORMAT_IMA_ADPCM || subformat == SF_FORMAT_MS_ADPCM) && info->channels <= 2)
+					return 1 ;
+				if (subformat == SF_FORMAT_GSM610 && info->channels == 1)
+					return 1 ;
+				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
+					return 1 ;
+				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_MAT4 :
+				if (subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_32)
+					return 1 ;
+				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_MAT5 :
+				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_32)
+					return 1 ;
+				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_PVF :
+				if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_32)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_XI :
+				if (info->channels != 1)
+					return 0 ;
+				if (subformat == SF_FORMAT_DPCM_8 || subformat == SF_FORMAT_DPCM_16)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_HTK :
+				/* HTK is strictly big endian. */
+				if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)
+					return 0 ;
+				if (info->channels != 1)
+					return 0 ;
+				if (subformat == SF_FORMAT_PCM_16)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_SDS :
+				/* SDS is strictly big endian. */
+				if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)
+					return 0 ;
+				if (info->channels != 1)
+					return 0 ;
+				if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_AVR :
+				/* SDS is strictly big endian. */
+				if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)
+					return 0 ;
+				if (info->channels > 2)
+					return 0 ;
+				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_FLAC :
+				/* FLAC can't do more than 8 channels. */
+				if (info->channels > 8)
+					return 0 ;
+				if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_SD2 :
+				/* SD2 is strictly big endian. */
+				if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)
+					return 0 ;
+				if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_WVE :
+				/* WVE is strictly big endian. */
+				if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)
+					return 0 ;
+				if (info->channels > 1)
+					return 0 ;
+				if (subformat == SF_FORMAT_ALAW)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_OGG :
+				if (subformat == SF_FORMAT_VORBIS)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_MPC2K :
+				/* MPC2000 is strictly little endian. */
+				if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)
+					return 0 ;
+				if (info->channels > 2)
+					return 0 ;
+				if (subformat == SF_FORMAT_PCM_16)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_RF64 :
+				if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)
+					return 0 ;
+				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16)
+					return 1 ;
+				if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
+					return 1 ;
+				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
+					return 1 ;
+				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
+					return 1 ;
+				break ;
+		default : break ;
+		} ;
+
+	return 0 ;
+} /* sf_format_check */
+
+/*------------------------------------------------------------------------------
+*/
+
+const char *
+sf_version_string (void)
+{
+#if	ENABLE_EXPERIMENTAL_CODE
+	return PACKAGE_NAME "-" PACKAGE_VERSION "-exp" ;
+#else
+	return PACKAGE_NAME "-" PACKAGE_VERSION ;
+#endif
+}
+
+
+/*------------------------------------------------------------------------------
+*/
+
+int
+sf_command	(SNDFILE *sndfile, int command, void *data, int datasize)
+{	SF_PRIVATE *psf = (SF_PRIVATE *) sndfile ;
+	int old_value ;
+
+	/* This set of commands do not need the sndfile parameter. */
+	switch (command)
+	{	case SFC_GET_LIB_VERSION :
+			if (data == NULL)
+			{	if (psf)
+					psf->error = SFE_BAD_COMMAND_PARAM ;
+				return SFE_BAD_COMMAND_PARAM ;
+				} ;
+			snprintf (data, datasize, "%s", sf_version_string ()) ;
+			return strlen (data) ;
+
+		case SFC_GET_SIMPLE_FORMAT_COUNT :
+			if (data == NULL || datasize != SIGNED_SIZEOF (int))
+				return (sf_errno = SFE_BAD_COMMAND_PARAM) ;
+			*((int*) data) = psf_get_format_simple_count () ;
+			return 0 ;
+
+		case SFC_GET_SIMPLE_FORMAT :
+			if (data == NULL || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO))
+				return (sf_errno = SFE_BAD_COMMAND_PARAM) ;
+			return psf_get_format_simple (data) ;
+
+		case SFC_GET_FORMAT_MAJOR_COUNT :
+			if (data == NULL || datasize != SIGNED_SIZEOF (int))
+				return (sf_errno = SFE_BAD_COMMAND_PARAM) ;
+			*((int*) data) = psf_get_format_major_count () ;
+			return 0 ;
+
+		case SFC_GET_FORMAT_MAJOR :
+			if (data == NULL || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO))
+				return (sf_errno = SFE_BAD_COMMAND_PARAM) ;
+			return psf_get_format_major (data) ;
+
+		case SFC_GET_FORMAT_SUBTYPE_COUNT :
+			if (data == NULL || datasize != SIGNED_SIZEOF (int))
+				return (sf_errno = SFE_BAD_COMMAND_PARAM) ;
+			*((int*) data) = psf_get_format_subtype_count () ;
+			return 0 ;
+
+		case SFC_GET_FORMAT_SUBTYPE :
+			if (data == NULL || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO))
+				return (sf_errno = SFE_BAD_COMMAND_PARAM) ;
+			return psf_get_format_subtype (data) ;
+
+		case SFC_GET_FORMAT_INFO :
+			if (data == NULL || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO))
+				return (sf_errno = SFE_BAD_COMMAND_PARAM) ;
+			return psf_get_format_info (data) ;
+		} ;
+
+	if (sndfile == NULL && command == SFC_GET_LOG_INFO)
+	{	if (data == NULL)
+			return (sf_errno = SFE_BAD_COMMAND_PARAM) ;
+		snprintf (data, datasize, "%s", sf_logbuffer) ;
+		return strlen (data) ;
+		} ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	switch (command)
+	{	case SFC_SET_NORM_FLOAT :
+			old_value = psf->norm_float ;
+			psf->norm_float = (datasize) ? SF_TRUE : SF_FALSE ;
+			return old_value ;
+
+		case SFC_GET_CURRENT_SF_INFO :
+			if (data == NULL || datasize != SIGNED_SIZEOF (SF_INFO))
+				return (sf_errno = SFE_BAD_COMMAND_PARAM) ;
+			memcpy (data, &psf->sf, sizeof (SF_INFO)) ;
+			break ;
+
+		case SFC_SET_NORM_DOUBLE :
+			old_value = psf->norm_double ;
+			psf->norm_double = (datasize) ? SF_TRUE : SF_FALSE ;
+			return old_value ;
+
+		case SFC_GET_NORM_FLOAT :
+			return psf->norm_float ;
+
+		case SFC_GET_NORM_DOUBLE :
+			return psf->norm_double ;
+
+		case SFC_SET_SCALE_FLOAT_INT_READ :
+			old_value = psf->float_int_mult ;
+
+			psf->float_int_mult = (datasize != 0) ? SF_TRUE : SF_FALSE ;
+			if (psf->float_int_mult && psf->float_max < 0.0)
+				psf->float_max = psf_calc_signal_max (psf, SF_FALSE) ;
+			return old_value ;
+
+		case SFC_SET_SCALE_INT_FLOAT_WRITE :
+			old_value = psf->scale_int_float ;
+			psf->scale_int_float = (datasize != 0) ? SF_TRUE : SF_FALSE ;
+			return old_value ;
+
+		case SFC_SET_ADD_PEAK_CHUNK :
+			{	int format = SF_CONTAINER (psf->sf.format) ;
+
+				/* Only WAV and AIFF support the PEAK chunk. */
+				switch (format)
+				{	case SF_FORMAT_AIFF :
+					case SF_FORMAT_CAF :
+					case SF_FORMAT_WAV :
+					case SF_FORMAT_WAVEX :
+						break ;
+
+					default :
+						return SF_FALSE ;
+					} ;
+
+				format = SF_CODEC (psf->sf.format) ;
+
+				/* Only files containg the following data types support the PEAK chunk. */
+				if (format != SF_FORMAT_FLOAT && format != SF_FORMAT_DOUBLE)
+					return SF_FALSE ;
+
+				} ;
+			/* Can only do this is in SFM_WRITE mode. */
+			if (psf->file.mode != SFM_WRITE && psf->file.mode != SFM_RDWR)
+				return SF_FALSE ;
+			/* If data has already been written this must fail. */
+			if (psf->have_written)
+			{	psf->error = SFE_CMD_HAS_DATA ;
+				return SF_FALSE ;
+				} ;
+			/* Everything seems OK, so set psf->has_peak and re-write header. */
+			if (datasize == SF_FALSE && psf->peak_info != NULL)
+			{	free (psf->peak_info) ;
+				psf->peak_info = NULL ;
+				}
+			else if (psf->peak_info == NULL)
+			{	psf->peak_info = peak_info_calloc (psf->sf.channels) ;
+				if (psf->peak_info != NULL)
+					psf->peak_info->peak_loc = SF_PEAK_START ;
+				} ;
+
+			if (psf->write_header)
+				psf->write_header (psf, SF_TRUE) ;
+			return datasize ;
+
+		case SFC_SET_ADD_HEADER_PAD_CHUNK :
+			return SF_FALSE ;
+
+		case SFC_GET_LOG_INFO :
+			if (data == NULL)
+				return SFE_BAD_COMMAND_PARAM ;
+			snprintf (data, datasize, "%s", psf->logbuffer) ;
+			break ;
+
+		case SFC_CALC_SIGNAL_MAX :
+			if (data == NULL || datasize != sizeof (double))
+				return (psf->error = SFE_BAD_COMMAND_PARAM) ;
+			*((double*) data) = psf_calc_signal_max (psf, SF_FALSE) ;
+			break ;
+
+		case SFC_CALC_NORM_SIGNAL_MAX :
+			if (data == NULL || datasize != sizeof (double))
+				return (psf->error = SFE_BAD_COMMAND_PARAM) ;
+			*((double*) data) = psf_calc_signal_max (psf, SF_TRUE) ;
+			break ;
+
+		case SFC_CALC_MAX_ALL_CHANNELS :
+			if (data == NULL || datasize != SIGNED_SIZEOF (double) * psf->sf.channels)
+				return (psf->error = SFE_BAD_COMMAND_PARAM) ;
+			return psf_calc_max_all_channels (psf, (double*) data, SF_FALSE) ;
+
+		case SFC_CALC_NORM_MAX_ALL_CHANNELS :
+			if (data == NULL || datasize != SIGNED_SIZEOF (double) * psf->sf.channels)
+				return (psf->error = SFE_BAD_COMMAND_PARAM) ;
+			return psf_calc_max_all_channels (psf, (double*) data, SF_TRUE) ;
+
+		case SFC_GET_SIGNAL_MAX :
+			if (data == NULL || datasize != sizeof (double))
+			{	psf->error = SFE_BAD_COMMAND_PARAM ;
+				return SF_FALSE ;
+				} ;
+			return psf_get_signal_max (psf, (double *) data) ;
+
+		case SFC_GET_MAX_ALL_CHANNELS :
+			if (data == NULL || datasize != SIGNED_SIZEOF (double) * psf->sf.channels)
+			{	psf->error = SFE_BAD_COMMAND_PARAM ;
+				return SF_FALSE ;
+				} ;
+			return psf_get_max_all_channels (psf, (double*) data) ;
+
+		case SFC_UPDATE_HEADER_NOW :
+			if (psf->write_header)
+				psf->write_header (psf, SF_TRUE) ;
+			break ;
+
+		case SFC_SET_UPDATE_HEADER_AUTO :
+			psf->auto_header = datasize ? SF_TRUE : SF_FALSE ;
+			return psf->auto_header ;
+			break ;
+
+		case SFC_SET_ADD_DITHER_ON_WRITE :
+		case SFC_SET_ADD_DITHER_ON_READ :
+			/*
+			** FIXME !
+			** These are obsolete. Just return.
+			** Remove some time after version 1.0.8.
+			*/
+			break ;
+
+		case SFC_SET_DITHER_ON_WRITE :
+			if (data == NULL || datasize != SIGNED_SIZEOF (SF_DITHER_INFO))
+				return (psf->error = SFE_BAD_COMMAND_PARAM) ;
+			memcpy (&psf->write_dither, data, sizeof (psf->write_dither)) ;
+			if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+				dither_init (psf, SFM_WRITE) ;
+			break ;
+
+		case SFC_SET_DITHER_ON_READ :
+			if (data == NULL || datasize != SIGNED_SIZEOF (SF_DITHER_INFO))
+				return (psf->error = SFE_BAD_COMMAND_PARAM) ;
+			memcpy (&psf->read_dither, data, sizeof (psf->read_dither)) ;
+			if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR)
+				dither_init (psf, SFM_READ) ;
+			break ;
+
+		case SFC_FILE_TRUNCATE :
+			if (psf->file.mode != SFM_WRITE && psf->file.mode != SFM_RDWR)
+				return SF_TRUE ;
+			if (datasize != sizeof (sf_count_t))
+				return SF_TRUE ;
+			if (data == NULL || datasize != sizeof (sf_count_t))
+			{	psf->error = SFE_BAD_COMMAND_PARAM ;
+				return SF_FALSE ;
+				}
+			else
+			{	sf_count_t position ;
+
+				position = *((sf_count_t*) data) ;
+
+				if (sf_seek (sndfile, position, SEEK_SET) != position)
+					return SF_TRUE ;
+
+				psf->sf.frames = position ;
+
+				position = psf_fseek (psf, 0, SEEK_CUR) ;
+
+				return psf_ftruncate (psf, position) ;
+				} ;
+			break ;
+
+		case SFC_SET_RAW_START_OFFSET :
+			if (data == NULL || datasize != sizeof (sf_count_t))
+				return (psf->error = SFE_BAD_COMMAND_PARAM) ;
+
+			if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_RAW)
+				return (psf->error = SFE_BAD_COMMAND_PARAM) ;
+
+			psf->dataoffset = *((sf_count_t*) data) ;
+			sf_seek (sndfile, 0, SEEK_CUR) ;
+			break ;
+
+		case SFC_GET_EMBED_FILE_INFO :
+			if (data == NULL || datasize != sizeof (SF_EMBED_FILE_INFO))
+				return (psf->error = SFE_BAD_COMMAND_PARAM) ;
+
+			((SF_EMBED_FILE_INFO*) data)->offset = psf->fileoffset ;
+			((SF_EMBED_FILE_INFO*) data)->length = psf->filelength ;
+			break ;
+
+		/* Lite remove start */
+		case SFC_TEST_IEEE_FLOAT_REPLACE :
+			psf->ieee_replace = (datasize) ? SF_TRUE : SF_FALSE ;
+			if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_FLOAT)
+				float32_init (psf) ;
+			else if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_DOUBLE)
+				double64_init (psf) ;
+			else
+				return (psf->error = SFE_BAD_COMMAND_PARAM) ;
+			break ;
+		/* Lite remove end */
+
+		case SFC_SET_CLIPPING :
+			psf->add_clipping = (datasize) ? SF_TRUE : SF_FALSE ;
+			return psf->add_clipping ;
+
+		case SFC_GET_CLIPPING :
+			return psf->add_clipping ;
+
+		case SFC_GET_LOOP_INFO :
+			if (datasize != sizeof (SF_LOOP_INFO) || data == NULL)
+			{	psf->error = SFE_BAD_COMMAND_PARAM ;
+				return SF_FALSE ;
+				} ;
+			if (psf->loop_info == NULL)
+				return SF_FALSE ;
+			memcpy (data, psf->loop_info, sizeof (SF_LOOP_INFO)) ;
+			return SF_TRUE ;
+
+		case SFC_SET_BROADCAST_INFO :
+			{	int format = SF_CONTAINER (psf->sf.format) ;
+
+				/* Only WAV and RF64 supports the BEXT (Broadcast) chunk. */
+				if (format != SF_FORMAT_WAV && format != SF_FORMAT_WAVEX && format != SF_FORMAT_RF64)
+					return SF_FALSE ;
+				} ;
+
+			/* Only makes sense in SFM_WRITE or SFM_RDWR mode. */
+			if ((psf->file.mode != SFM_WRITE) && (psf->file.mode != SFM_RDWR))
+				return SF_FALSE ;
+			/* If data has already been written this must fail. */
+			if (psf->broadcast_16k == NULL && psf->have_written)
+			{	psf->error = SFE_CMD_HAS_DATA ;
+				return SF_FALSE ;
+				} ;
+
+#if 0
+			if (psf->broadcast_info == NULL)
+				psf->broadcast_info = broadcast_info_alloc () ;
+
+			broadcast_info_copy (psf->broadcast_info, data) ;
+			broadcast_add_coding_history (psf->broadcast_info, psf->sf.channels, psf->sf.samplerate, psf->sf.format) ;
+#else
+			broadcast_var_set (psf, data, datasize) ;
+#endif
+
+			if (psf->write_header)
+				psf->write_header (psf, SF_TRUE) ;
+			return SF_TRUE ;
+
+		case SFC_GET_BROADCAST_INFO :
+			if (data == NULL)
+			{	psf->error = SFE_BAD_COMMAND_PARAM ;
+				return SF_FALSE ;
+				} ;
+#if 0
+			if (psf->broadcast_info == NULL)
+				return SF_FALSE ;
+			return broadcast_info_copy (data, psf->broadcast_info) ;
+#else
+			return broadcast_var_get (psf, data, datasize) ;
+#endif
+
+		case SFC_GET_INSTRUMENT :
+			if (datasize != sizeof (SF_INSTRUMENT) || data == NULL)
+			{	psf->error = SFE_BAD_COMMAND_PARAM ;
+				return SF_FALSE ;
+				} ;
+			if (psf->instrument == NULL)
+				return SF_FALSE ;
+			memcpy (data, psf->instrument, sizeof (SF_INSTRUMENT)) ;
+			return SF_TRUE ;
+
+		case SFC_SET_INSTRUMENT :
+			/* If data has already been written this must fail. */
+			if (psf->have_written)
+			{	psf->error = SFE_CMD_HAS_DATA ;
+				return SF_FALSE ;
+				} ;
+			if (datasize != sizeof (SF_INSTRUMENT) || data == NULL)
+			{	psf->error = SFE_BAD_COMMAND_PARAM ;
+				return SF_FALSE ;
+				} ;
+
+			if (psf->instrument == NULL && (psf->instrument = psf_instrument_alloc ()) == NULL)
+			{	psf->error = SFE_MALLOC_FAILED ;
+				return SF_FALSE ;
+				} ;
+			memcpy (psf->instrument, data, sizeof (SF_INSTRUMENT)) ;
+			return SF_TRUE ;
+
+		case SFC_RAW_DATA_NEEDS_ENDSWAP :
+			return psf->data_endswap ;
+
+		case SFC_GET_CHANNEL_MAP_INFO :
+			if (psf->channel_map == NULL)
+				return SF_FALSE ;
+
+			if (data == NULL || datasize != SIGNED_SIZEOF (psf->channel_map [0]) * psf->sf.channels)
+			{	psf->error = SFE_BAD_COMMAND_PARAM ;
+				return SF_FALSE ;
+				} ;
+
+			memcpy (data, psf->channel_map, datasize) ;
+			return SF_TRUE ;
+
+		case SFC_SET_CHANNEL_MAP_INFO :
+			if (psf->have_written)
+			{	psf->error = SFE_CMD_HAS_DATA ;
+				return SF_FALSE ;
+				} ;
+			if (data == NULL || datasize != SIGNED_SIZEOF (psf->channel_map [0]) * psf->sf.channels)
+			{	psf->error = SFE_BAD_COMMAND_PARAM ;
+				return SF_FALSE ;
+				} ;
+
+			{	int *iptr ;
+
+				for (iptr = data ; iptr < (int*) data + psf->sf.channels ; iptr++)
+				{	if (*iptr <= SF_CHANNEL_MAP_INVALID || *iptr >= SF_CHANNEL_MAP_MAX)
+					{	psf->error = SFE_BAD_COMMAND_PARAM ;
+						return SF_FALSE ;
+						} ;
+					} ;
+				} ;
+
+			free (psf->channel_map) ;
+			if ((psf->channel_map = malloc (datasize)) == NULL)
+			{	psf->error = SFE_MALLOC_FAILED ;
+				return SF_FALSE ;
+				} ;
+
+			memcpy (psf->channel_map, data, datasize) ;
+
+			/*
+			**	Pass the command down to the container's command handler.
+			**	Don't pass user data, use validated psf->channel_map data instead.
+			*/
+			if (psf->command)
+				return psf->command (psf, command, NULL, 0) ;
+			return SF_FALSE ;
+
+		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 = 0x%X\n", command) ;
+			return (psf->error = SFE_BAD_COMMAND_PARAM) ;
+		} ;
+
+	return 0 ;
+} /* sf_command */
+
+/*------------------------------------------------------------------------------
+*/
+
+sf_count_t
+sf_seek	(SNDFILE *sndfile, sf_count_t offset, int whence)
+{	SF_PRIVATE 	*psf ;
+	sf_count_t	seek_from_start = 0, retval ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	if (! psf->sf.seekable)
+	{	psf->error = SFE_NOT_SEEKABLE ;
+		return	PSF_SEEK_ERROR ;
+		} ;
+
+	/* If the whence parameter has a mode ORed in, check to see that
+	** it makes sense.
+	*/
+	if (((whence & SFM_MASK) == SFM_WRITE && psf->file.mode == SFM_READ) ||
+			((whence & SFM_MASK) == SFM_READ && psf->file.mode == SFM_WRITE))
+	{	psf->error = SFE_WRONG_SEEK ;
+		return PSF_SEEK_ERROR ;
+		} ;
+
+	/* Convert all SEEK_CUR and SEEK_END into seek_from_start to be
+	** used with SEEK_SET.
+	*/
+	switch (whence)
+	{	/* The SEEK_SET behaviour is independant of mode. */
+		case SEEK_SET :
+		case SEEK_SET | SFM_READ :
+		case SEEK_SET | SFM_WRITE :
+		case SEEK_SET | SFM_RDWR :
+				seek_from_start = offset ;
+				break ;
+
+		/* The SEEK_CUR is a little more tricky. */
+		case SEEK_CUR :
+				if (offset == 0)
+				{	if (psf->file.mode == SFM_READ)
+						return psf->read_current ;
+					if (psf->file.mode == SFM_WRITE)
+						return psf->write_current ;
+					} ;
+				if (psf->file.mode == SFM_READ)
+					seek_from_start = psf->read_current + offset ;
+				else if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+					seek_from_start = psf->write_current + offset ;
+				else
+					psf->error = SFE_AMBIGUOUS_SEEK ;
+				break ;
+
+		case SEEK_CUR | SFM_READ :
+				if (offset == 0)
+					return psf->read_current ;
+				seek_from_start = psf->read_current + offset ;
+				break ;
+
+		case SEEK_CUR | SFM_WRITE :
+				if (offset == 0)
+					return psf->write_current ;
+				seek_from_start = psf->write_current + offset ;
+				break ;
+
+		/* The SEEK_END */
+		case SEEK_END :
+		case SEEK_END | SFM_READ :
+		case SEEK_END | SFM_WRITE :
+				seek_from_start = psf->sf.frames + offset ;
+				break ;
+
+		default :
+				psf->error = SFE_BAD_SEEK ;
+				break ;
+		} ;
+
+	if (psf->error)
+		return PSF_SEEK_ERROR ;
+
+	if (psf->file.mode == SFM_RDWR || psf->file.mode == SFM_WRITE)
+	{	if (seek_from_start < 0)
+		{	psf->error = SFE_BAD_SEEK ;
+			return PSF_SEEK_ERROR ;
+			} ;
+		}
+	else if (seek_from_start < 0 || seek_from_start > psf->sf.frames)
+	{	psf->error = SFE_BAD_SEEK ;
+		return PSF_SEEK_ERROR ;
+		} ;
+
+	if (psf->seek)
+	{	int new_mode = (whence & SFM_MASK) ? (whence & SFM_MASK) : psf->file.mode ;
+
+		retval = psf->seek (psf, new_mode, seek_from_start) ;
+
+		switch (new_mode)
+		{	case SFM_READ :
+					psf->read_current = retval ;
+					break ;
+			case SFM_WRITE :
+					psf->write_current = retval ;
+					break ;
+			case SFM_RDWR :
+					psf->read_current = retval ;
+					psf->write_current = retval ;
+					new_mode = SFM_READ ;
+					break ;
+			} ;
+
+		psf->last_op = new_mode ;
+
+		return retval ;
+		} ;
+
+	psf->error = SFE_AMBIGUOUS_SEEK ;
+	return PSF_SEEK_ERROR ;
+} /* sf_seek */
+
+/*------------------------------------------------------------------------------
+*/
+
+const char*
+sf_get_string (SNDFILE *sndfile, int str_type)
+{	SF_PRIVATE 	*psf ;
+
+	if ((psf = (SF_PRIVATE*) sndfile) == NULL)
+		return NULL ;
+	if (psf->Magick != SNDFILE_MAGICK)
+		return NULL ;
+
+	return psf_get_string (psf, str_type) ;
+} /* sf_get_string */
+
+int
+sf_set_string (SNDFILE *sndfile, int str_type, const char* str)
+{	SF_PRIVATE 	*psf ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	return psf_set_string (psf, str_type, str) ;
+} /* sf_get_string */
+
+/*==============================================================================
+*/
+
+sf_count_t
+sf_read_raw		(SNDFILE *sndfile, void *ptr, sf_count_t bytes)
+{	SF_PRIVATE 	*psf ;
+	sf_count_t	count, extra ;
+	int			bytewidth, blockwidth ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	bytewidth = (psf->bytewidth > 0) ? psf->bytewidth : 1 ;
+	blockwidth = (psf->blockwidth > 0) ? psf->blockwidth : 1 ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	psf->error = SFE_NOT_READMODE ;
+		return	0 ;
+		} ;
+
+	if (bytes < 0 || psf->read_current >= psf->sf.frames)
+	{	psf_memset (ptr, 0, bytes) ;
+		return 0 ;
+		} ;
+
+	if (bytes % (psf->sf.channels * bytewidth))
+	{	psf->error = SFE_BAD_READ_ALIGN ;
+		return 0 ;
+		} ;
+
+	if (psf->last_op != SFM_READ)
+		if (psf->seek (psf, SFM_READ, psf->read_current) < 0)
+			return 0 ;
+
+	count = psf_fread (ptr, 1, bytes, psf) ;
+
+	if (psf->read_current + count / blockwidth <= psf->sf.frames)
+		psf->read_current += count / blockwidth ;
+	else
+	{	count = (psf->sf.frames - psf->read_current) * blockwidth ;
+		extra = bytes - count ;
+		psf_memset (((char *) ptr) + count, 0, extra) ;
+		psf->read_current = psf->sf.frames ;
+		} ;
+
+	psf->last_op = SFM_READ ;
+
+	return count ;
+} /* sf_read_raw */
+
+/*------------------------------------------------------------------------------
+*/
+
+sf_count_t
+sf_read_short	(SNDFILE *sndfile, short *ptr, sf_count_t len)
+{	SF_PRIVATE 	*psf ;
+	sf_count_t	count, extra ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	psf->error = SFE_NOT_READMODE ;
+		return 0 ;
+		} ;
+
+	if (len % psf->sf.channels)
+	{	psf->error = SFE_BAD_READ_ALIGN ;
+		return 0 ;
+		} ;
+
+	if (len <= 0 || psf->read_current >= psf->sf.frames)
+	{	psf_memset (ptr, 0, len * sizeof (short)) ;
+		return 0 ; /* End of file. */
+		} ;
+
+	if (psf->read_short == NULL || psf->seek == NULL)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return	0 ;
+		} ;
+
+	if (psf->last_op != SFM_READ)
+		if (psf->seek (psf, SFM_READ, psf->read_current) < 0)
+			return 0 ;
+
+	count = psf->read_short (psf, ptr, len) ;
+
+	if (psf->read_current + count / psf->sf.channels <= psf->sf.frames)
+		psf->read_current += count / psf->sf.channels ;
+	else
+	{	count = (psf->sf.frames - psf->read_current) * psf->sf.channels ;
+		extra = len - count ;
+		psf_memset (ptr + count, 0, extra * sizeof (short)) ;
+		psf->read_current = psf->sf.frames ;
+		} ;
+
+	psf->last_op = SFM_READ ;
+
+	return count ;
+} /* sf_read_short */
+
+sf_count_t
+sf_readf_short		(SNDFILE *sndfile, short *ptr, sf_count_t frames)
+{	SF_PRIVATE 	*psf ;
+	sf_count_t	count, extra ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	psf->error = SFE_NOT_READMODE ;
+		return 0 ;
+		} ;
+
+	if (frames <= 0 || psf->read_current >= psf->sf.frames)
+	{	psf_memset (ptr, 0, frames * psf->sf.channels * sizeof (short)) ;
+		return 0 ; /* End of file. */
+		} ;
+
+	if (psf->read_short == NULL || psf->seek == NULL)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return 0 ;
+		} ;
+
+	if (psf->last_op != SFM_READ)
+		if (psf->seek (psf, SFM_READ, psf->read_current) < 0)
+			return 0 ;
+
+	count = psf->read_short (psf, ptr, frames * psf->sf.channels) ;
+
+	if (psf->read_current + count / psf->sf.channels <= psf->sf.frames)
+		psf->read_current += count / psf->sf.channels ;
+	else
+	{	count = (psf->sf.frames - psf->read_current) * psf->sf.channels ;
+		extra = frames * psf->sf.channels - count ;
+		psf_memset (ptr + count, 0, extra * sizeof (short)) ;
+		psf->read_current = psf->sf.frames ;
+		} ;
+
+	psf->last_op = SFM_READ ;
+
+	return count / psf->sf.channels ;
+} /* sf_readf_short */
+
+/*------------------------------------------------------------------------------
+*/
+
+sf_count_t
+sf_read_int		(SNDFILE *sndfile, int *ptr, sf_count_t len)
+{	SF_PRIVATE 	*psf ;
+	sf_count_t	count, extra ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	psf->error = SFE_NOT_READMODE ;
+		return 0 ;
+		} ;
+
+	if (len % psf->sf.channels)
+	{	psf->error = SFE_BAD_READ_ALIGN ;
+		return 0 ;
+		} ;
+
+	if (len <= 0 || psf->read_current >= psf->sf.frames)
+	{	psf_memset (ptr, 0, len * sizeof (int)) ;
+		return 0 ;
+		} ;
+
+	if (psf->read_int == NULL || psf->seek == NULL)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return 0 ;
+		} ;
+
+	if (psf->last_op != SFM_READ)
+		if (psf->seek (psf, SFM_READ, psf->read_current) < 0)
+			return 0 ;
+
+	count = psf->read_int (psf, ptr, len) ;
+
+	if (psf->read_current + count / psf->sf.channels <= psf->sf.frames)
+		psf->read_current += count / psf->sf.channels ;
+	else
+	{	count = (psf->sf.frames - psf->read_current) * psf->sf.channels ;
+		extra = len - count ;
+		psf_memset (ptr + count, 0, extra * sizeof (int)) ;
+		psf->read_current = psf->sf.frames ;
+		} ;
+
+	psf->last_op = SFM_READ ;
+
+	return count ;
+} /* sf_read_int */
+
+sf_count_t
+sf_readf_int	(SNDFILE *sndfile, int *ptr, sf_count_t frames)
+{	SF_PRIVATE 	*psf ;
+	sf_count_t	count, extra ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	psf->error = SFE_NOT_READMODE ;
+		return 0 ;
+		} ;
+
+	if (frames <= 0 || psf->read_current >= psf->sf.frames)
+	{	psf_memset (ptr, 0, frames * psf->sf.channels * sizeof (int)) ;
+		return 0 ;
+		} ;
+
+	if (psf->read_int == NULL || psf->seek == NULL)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return	0 ;
+		} ;
+
+	if (psf->last_op != SFM_READ)
+		if (psf->seek (psf, SFM_READ, psf->read_current) < 0)
+			return 0 ;
+
+	count = psf->read_int (psf, ptr, frames * psf->sf.channels) ;
+
+	if (psf->read_current + count / psf->sf.channels <= psf->sf.frames)
+		psf->read_current += count / psf->sf.channels ;
+	else
+	{	count = (psf->sf.frames - psf->read_current) * psf->sf.channels ;
+		extra = frames * psf->sf.channels - count ;
+		psf_memset (ptr + count, 0, extra * sizeof (int)) ;
+		psf->read_current = psf->sf.frames ;
+		} ;
+
+	psf->last_op = SFM_READ ;
+
+	return count / psf->sf.channels ;
+} /* sf_readf_int */
+
+/*------------------------------------------------------------------------------
+*/
+
+sf_count_t
+sf_read_float	(SNDFILE *sndfile, float *ptr, sf_count_t len)
+{	SF_PRIVATE 	*psf ;
+	sf_count_t	count, extra ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	psf->error = SFE_NOT_READMODE ;
+		return 0 ;
+		} ;
+
+	if (len % psf->sf.channels)
+	{	psf->error = SFE_BAD_READ_ALIGN ;
+		return 0 ;
+		} ;
+
+	if (len <= 0 || psf->read_current >= psf->sf.frames)
+	{	psf_memset (ptr, 0, len * sizeof (float)) ;
+		return 0 ;
+		} ;
+
+	if (psf->read_float == NULL || psf->seek == NULL)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return	0 ;
+		} ;
+
+	if (psf->last_op != SFM_READ)
+		if (psf->seek (psf, SFM_READ, psf->read_current) < 0)
+			return 0 ;
+
+	count = psf->read_float (psf, ptr, len) ;
+
+	if (psf->read_current + count / psf->sf.channels <= psf->sf.frames)
+		psf->read_current += count / psf->sf.channels ;
+	else
+	{	count = (psf->sf.frames - psf->read_current) * psf->sf.channels ;
+		extra = len - count ;
+		psf_memset (ptr + count, 0, extra * sizeof (float)) ;
+		psf->read_current = psf->sf.frames ;
+		} ;
+
+	psf->last_op = SFM_READ ;
+
+	return count ;
+} /* sf_read_float */
+
+sf_count_t
+sf_readf_float	(SNDFILE *sndfile, float *ptr, sf_count_t frames)
+{	SF_PRIVATE 	*psf ;
+	sf_count_t	count, extra ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	psf->error = SFE_NOT_READMODE ;
+		return 0 ;
+		} ;
+
+	if (frames <= 0 || psf->read_current >= psf->sf.frames)
+	{	psf_memset (ptr, 0, frames * psf->sf.channels * sizeof (float)) ;
+		return 0 ;
+		} ;
+
+	if (psf->read_float == NULL || psf->seek == NULL)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return	0 ;
+		} ;
+
+	if (psf->last_op != SFM_READ)
+		if (psf->seek (psf, SFM_READ, psf->read_current) < 0)
+			return 0 ;
+
+	count = psf->read_float (psf, ptr, frames * psf->sf.channels) ;
+
+	if (psf->read_current + count / psf->sf.channels <= psf->sf.frames)
+		psf->read_current += count / psf->sf.channels ;
+	else
+	{	count = (psf->sf.frames - psf->read_current) * psf->sf.channels ;
+		extra = frames * psf->sf.channels - count ;
+		psf_memset (ptr + count, 0, extra * sizeof (float)) ;
+		psf->read_current = psf->sf.frames ;
+		} ;
+
+	psf->last_op = SFM_READ ;
+
+	return count / psf->sf.channels ;
+} /* sf_readf_float */
+
+/*------------------------------------------------------------------------------
+*/
+
+sf_count_t
+sf_read_double	(SNDFILE *sndfile, double *ptr, sf_count_t len)
+{	SF_PRIVATE 	*psf ;
+	sf_count_t	count, extra ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	psf->error = SFE_NOT_READMODE ;
+		return 0 ;
+		} ;
+
+	if (len % psf->sf.channels)
+	{	psf->error = SFE_BAD_READ_ALIGN ;
+		return 0 ;
+		} ;
+
+	if (len <= 0 || psf->read_current >= psf->sf.frames)
+	{	psf_memset (ptr, 0, len * sizeof (double)) ;
+		return 0 ;
+		} ;
+
+	if (psf->read_double == NULL || psf->seek == NULL)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return	0 ;
+		} ;
+
+	if (psf->last_op != SFM_READ)
+		if (psf->seek (psf, SFM_READ, psf->read_current) < 0)
+			return 0 ;
+
+	count = psf->read_double (psf, ptr, len) ;
+
+	if (psf->read_current + count / psf->sf.channels <= psf->sf.frames)
+		psf->read_current += count / psf->sf.channels ;
+	else
+	{	count = (psf->sf.frames - psf->read_current) * psf->sf.channels ;
+		extra = len - count ;
+		psf_memset (ptr + count, 0, extra * sizeof (double)) ;
+		psf->read_current = psf->sf.frames ;
+		} ;
+
+	psf->last_op = SFM_READ ;
+
+	return count ;
+} /* sf_read_double */
+
+sf_count_t
+sf_readf_double	(SNDFILE *sndfile, double *ptr, sf_count_t frames)
+{	SF_PRIVATE 	*psf ;
+	sf_count_t	count, extra ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	psf->error = SFE_NOT_READMODE ;
+		return 0 ;
+		} ;
+
+	if (frames <= 0 || psf->read_current >= psf->sf.frames)
+	{	psf_memset (ptr, 0, frames * psf->sf.channels * sizeof (double)) ;
+		return 0 ;
+		} ;
+
+	if (psf->read_double == NULL || psf->seek == NULL)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return	0 ;
+		} ;
+
+	if (psf->last_op != SFM_READ)
+		if (psf->seek (psf, SFM_READ, psf->read_current) < 0)
+			return 0 ;
+
+	count = psf->read_double (psf, ptr, frames * psf->sf.channels) ;
+
+	if (psf->read_current + count / psf->sf.channels <= psf->sf.frames)
+		psf->read_current += count / psf->sf.channels ;
+	else
+	{	count = (psf->sf.frames - psf->read_current) * psf->sf.channels ;
+		extra = frames * psf->sf.channels - count ;
+		psf_memset (ptr + count, 0, extra * sizeof (double)) ;
+		psf->read_current = psf->sf.frames ;
+		} ;
+
+	psf->last_op = SFM_READ ;
+
+	return count / psf->sf.channels ;
+} /* sf_readf_double */
+
+/*------------------------------------------------------------------------------
+*/
+
+sf_count_t
+sf_write_raw	(SNDFILE *sndfile, const void *ptr, sf_count_t len)
+{	SF_PRIVATE 	*psf ;
+	sf_count_t	count ;
+	int			bytewidth, blockwidth ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	bytewidth = (psf->bytewidth > 0) ? psf->bytewidth : 1 ;
+	blockwidth = (psf->blockwidth > 0) ? psf->blockwidth : 1 ;
+
+	if (psf->file.mode == SFM_READ)
+	{	psf->error = SFE_NOT_WRITEMODE ;
+		return 0 ;
+		} ;
+
+	if (len % (psf->sf.channels * bytewidth))
+	{	psf->error = SFE_BAD_WRITE_ALIGN ;
+		return 0 ;
+		} ;
+
+	if (psf->last_op != SFM_WRITE)
+		if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)
+			return 0 ;
+
+	if (psf->have_written == SF_FALSE && psf->write_header != NULL)
+		psf->write_header (psf, SF_FALSE) ;
+	psf->have_written = SF_TRUE ;
+
+	count = psf_fwrite (ptr, 1, len, psf) ;
+
+	psf->write_current += count / blockwidth ;
+
+	psf->last_op = SFM_WRITE ;
+
+	if (psf->auto_header && psf->write_header != NULL)
+		psf->write_header (psf, SF_TRUE) ;
+
+	if (psf->write_current > psf->sf.frames)
+		psf->sf.frames = psf->write_current ;
+
+	return count ;
+} /* sf_write_raw */
+
+/*------------------------------------------------------------------------------
+*/
+
+sf_count_t
+sf_write_short	(SNDFILE *sndfile, const short *ptr, sf_count_t len)
+{	SF_PRIVATE 	*psf ;
+	sf_count_t	count ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	if (psf->file.mode == SFM_READ)
+	{	psf->error = SFE_NOT_WRITEMODE ;
+		return 0 ;
+		} ;
+
+	if (len % psf->sf.channels)
+	{	psf->error = SFE_BAD_WRITE_ALIGN ;
+		return 0 ;
+		} ;
+
+	if (psf->write_short == NULL || psf->seek == NULL)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return 0 ;
+		} ;
+
+	if (psf->last_op != SFM_WRITE)
+		if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)
+			return 0 ;
+
+	if (psf->have_written == SF_FALSE && psf->write_header != NULL)
+		psf->write_header (psf, SF_FALSE) ;
+	psf->have_written = SF_TRUE ;
+
+	count = psf->write_short (psf, ptr, len) ;
+
+	psf->write_current += count / psf->sf.channels ;
+
+	psf->last_op = SFM_WRITE ;
+
+	if (psf->auto_header && psf->write_header != NULL)
+		psf->write_header (psf, SF_TRUE) ;
+
+	if (psf->write_current > psf->sf.frames)
+		psf->sf.frames = psf->write_current ;
+
+	return count ;
+} /* sf_write_short */
+
+sf_count_t
+sf_writef_short	(SNDFILE *sndfile, const short *ptr, sf_count_t frames)
+{	SF_PRIVATE 	*psf ;
+	sf_count_t	count ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	if (psf->file.mode == SFM_READ)
+	{	psf->error = SFE_NOT_WRITEMODE ;
+		return 0 ;
+		} ;
+
+	if (psf->write_short == NULL || psf->seek == NULL)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return 0 ;
+		} ;
+
+	if (psf->last_op != SFM_WRITE)
+		if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)
+			return 0 ;
+
+	if (psf->have_written == SF_FALSE && psf->write_header != NULL)
+		psf->write_header (psf, SF_FALSE) ;
+	psf->have_written = SF_TRUE ;
+
+	count = psf->write_short (psf, ptr, frames * psf->sf.channels) ;
+
+	psf->write_current += count / psf->sf.channels ;
+
+	psf->last_op = SFM_WRITE ;
+
+	if (psf->auto_header && psf->write_header != NULL)
+		psf->write_header (psf, SF_TRUE) ;
+
+	if (psf->write_current > psf->sf.frames)
+		psf->sf.frames = psf->write_current ;
+
+	return count / psf->sf.channels ;
+} /* sf_writef_short */
+
+/*------------------------------------------------------------------------------
+*/
+
+sf_count_t
+sf_write_int	(SNDFILE *sndfile, const int *ptr, sf_count_t len)
+{	SF_PRIVATE 	*psf ;
+	sf_count_t	count ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	if (psf->file.mode == SFM_READ)
+	{	psf->error = SFE_NOT_WRITEMODE ;
+		return 0 ;
+		} ;
+
+	if (len % psf->sf.channels)
+	{	psf->error = SFE_BAD_WRITE_ALIGN ;
+		return 0 ;
+		} ;
+
+	if (psf->write_int == NULL || psf->seek == NULL)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return 0 ;
+		} ;
+
+	if (psf->last_op != SFM_WRITE)
+		if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)
+			return 0 ;
+
+	if (psf->have_written == SF_FALSE && psf->write_header != NULL)
+		psf->write_header (psf, SF_FALSE) ;
+	psf->have_written = SF_TRUE ;
+
+	count = psf->write_int (psf, ptr, len) ;
+
+	psf->write_current += count / psf->sf.channels ;
+
+	psf->last_op = SFM_WRITE ;
+
+	if (psf->auto_header && psf->write_header != NULL)
+		psf->write_header (psf, SF_TRUE) ;
+
+	if (psf->write_current > psf->sf.frames)
+		psf->sf.frames = psf->write_current ;
+
+	return count ;
+} /* sf_write_int */
+
+sf_count_t
+sf_writef_int	(SNDFILE *sndfile, const int *ptr, sf_count_t frames)
+{	SF_PRIVATE 	*psf ;
+	sf_count_t	count ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	if (psf->file.mode == SFM_READ)
+	{	psf->error = SFE_NOT_WRITEMODE ;
+		return 0 ;
+		} ;
+
+	if (psf->write_int == NULL || psf->seek == NULL)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return 0 ;
+		} ;
+
+	if (psf->last_op != SFM_WRITE)
+		if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)
+			return 0 ;
+
+	if (psf->have_written == SF_FALSE && psf->write_header != NULL)
+		psf->write_header (psf, SF_FALSE) ;
+	psf->have_written = SF_TRUE ;
+
+	count = psf->write_int (psf, ptr, frames * psf->sf.channels) ;
+
+	psf->write_current += count / psf->sf.channels ;
+
+	psf->last_op = SFM_WRITE ;
+
+	if (psf->auto_header && psf->write_header != NULL)
+		psf->write_header (psf, SF_TRUE) ;
+
+	if (psf->write_current > psf->sf.frames)
+		psf->sf.frames = psf->write_current ;
+
+	return count / psf->sf.channels ;
+} /* sf_writef_int */
+
+/*------------------------------------------------------------------------------
+*/
+
+sf_count_t
+sf_write_float	(SNDFILE *sndfile, const float *ptr, sf_count_t len)
+{	SF_PRIVATE 	*psf ;
+	sf_count_t	count ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	if (psf->file.mode == SFM_READ)
+	{	psf->error = SFE_NOT_WRITEMODE ;
+		return 0 ;
+		} ;
+
+	if (len % psf->sf.channels)
+	{	psf->error = SFE_BAD_WRITE_ALIGN ;
+		return 0 ;
+		} ;
+
+	if (psf->write_float == NULL || psf->seek == NULL)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return 0 ;
+		} ;
+
+	if (psf->last_op != SFM_WRITE)
+		if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)
+			return 0 ;
+
+	if (psf->have_written == SF_FALSE && psf->write_header != NULL)
+		psf->write_header (psf, SF_FALSE) ;
+	psf->have_written = SF_TRUE ;
+
+	count = psf->write_float (psf, ptr, len) ;
+
+	psf->write_current += count / psf->sf.channels ;
+
+	psf->last_op = SFM_WRITE ;
+
+	if (psf->auto_header && psf->write_header != NULL)
+		psf->write_header (psf, SF_TRUE) ;
+
+	if (psf->write_current > psf->sf.frames)
+		psf->sf.frames = psf->write_current ;
+
+	return count ;
+} /* sf_write_float */
+
+sf_count_t
+sf_writef_float	(SNDFILE *sndfile, const float *ptr, sf_count_t frames)
+{	SF_PRIVATE 	*psf ;
+	sf_count_t	count ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	if (psf->file.mode == SFM_READ)
+	{	psf->error = SFE_NOT_WRITEMODE ;
+		return 0 ;
+		} ;
+
+	if (psf->write_float == NULL || psf->seek == NULL)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return 0 ;
+		} ;
+
+	if (psf->last_op != SFM_WRITE)
+		if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)
+			return 0 ;
+
+	if (psf->have_written == SF_FALSE && psf->write_header != NULL)
+		psf->write_header (psf, SF_FALSE) ;
+	psf->have_written = SF_TRUE ;
+
+	count = psf->write_float (psf, ptr, frames * psf->sf.channels) ;
+
+	psf->write_current += count / psf->sf.channels ;
+
+	psf->last_op = SFM_WRITE ;
+
+	if (psf->auto_header && psf->write_header != NULL)
+		psf->write_header (psf, SF_TRUE) ;
+
+	if (psf->write_current > psf->sf.frames)
+		psf->sf.frames = psf->write_current ;
+
+	return count / psf->sf.channels ;
+} /* sf_writef_float */
+
+/*------------------------------------------------------------------------------
+*/
+
+sf_count_t
+sf_write_double	(SNDFILE *sndfile, const double *ptr, sf_count_t len)
+{	SF_PRIVATE 	*psf ;
+	sf_count_t	count ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	if (psf->file.mode == SFM_READ)
+	{	psf->error = SFE_NOT_WRITEMODE ;
+		return 0 ;
+		} ;
+
+	if (len % psf->sf.channels)
+	{	psf->error = SFE_BAD_WRITE_ALIGN ;
+		return	0 ;
+		} ;
+
+	if (psf->write_double == NULL || psf->seek == NULL)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return 0 ;
+		} ;
+
+	if (psf->last_op != SFM_WRITE)
+		if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)
+			return 0 ;
+
+	if (psf->have_written == SF_FALSE && psf->write_header != NULL)
+		psf->write_header (psf, SF_FALSE) ;
+	psf->have_written = SF_TRUE ;
+
+	count = psf->write_double (psf, ptr, len) ;
+
+	psf->write_current += count / psf->sf.channels ;
+
+	psf->last_op = SFM_WRITE ;
+
+	if (psf->auto_header && psf->write_header != NULL)
+		psf->write_header (psf, SF_TRUE) ;
+
+	if (psf->write_current > psf->sf.frames)
+		psf->sf.frames = psf->write_current ;
+
+	return count ;
+} /* sf_write_double */
+
+sf_count_t
+sf_writef_double	(SNDFILE *sndfile, const double *ptr, sf_count_t frames)
+{	SF_PRIVATE 	*psf ;
+	sf_count_t	count ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ;
+
+	if (psf->file.mode == SFM_READ)
+	{	psf->error = SFE_NOT_WRITEMODE ;
+		return 0 ;
+		} ;
+
+	if (psf->write_double == NULL || psf->seek == NULL)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return 0 ;
+		} ;
+
+	if (psf->last_op != SFM_WRITE)
+		if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0)
+			return 0 ;
+
+	if (psf->have_written == SF_FALSE && psf->write_header != NULL)
+		psf->write_header (psf, SF_FALSE) ;
+	psf->have_written = SF_TRUE ;
+
+	count = psf->write_double (psf, ptr, frames * psf->sf.channels) ;
+
+	psf->write_current += count / psf->sf.channels ;
+
+	psf->last_op = SFM_WRITE ;
+
+	if (psf->auto_header && psf->write_header != NULL)
+		psf->write_header (psf, SF_TRUE) ;
+
+	if (psf->write_current > psf->sf.frames)
+		psf->sf.frames = psf->write_current ;
+
+	return count / psf->sf.channels ;
+} /* sf_writef_double */
+
+/*=========================================================================
+** Private functions.
+*/
+
+static int
+try_resource_fork (SF_PRIVATE * psf)
+{	int old_error = psf->error ;
+
+	/* Set READ mode now, to see if resource fork exists. */
+	psf->rsrc.mode = SFM_READ ;
+	if (psf_open_rsrc (psf) != 0)
+	{	psf->error = old_error ;
+		return 0 ;
+		} ;
+
+	/* More checking here. */
+	psf_log_printf (psf, "Resource fork : %s\n", psf->rsrc.path.c) ;
+
+	return SF_FORMAT_SD2 ;
+} /* try_resource_fork */
+
+static int
+format_from_extension (SF_PRIVATE *psf)
+{	char *cptr ;
+	char buffer [16] ;
+	int format = 0 ;
+
+	if ((cptr = strrchr (psf->file.name.c, '.')) == NULL)
+		return 0 ;
+
+	cptr ++ ;
+	if (strlen (cptr) > sizeof (buffer) - 1)
+		return 0 ;
+
+	psf_strlcpy (buffer, sizeof (buffer), cptr) ;
+	buffer [sizeof (buffer) - 1] = 0 ;
+
+	/* Convert everything in the buffer to lower case. */
+	cptr = buffer ;
+	while (*cptr)
+	{	*cptr = tolower (*cptr) ;
+		cptr ++ ;
+		} ;
+
+	cptr = buffer ;
+
+	if (strcmp (cptr, "au") == 0)
+	{	psf->sf.channels = 1 ;
+		psf->sf.samplerate = 8000 ;
+		format = SF_FORMAT_RAW | SF_FORMAT_ULAW ;
+		}
+	else if (strcmp (cptr, "snd") == 0)
+	{	psf->sf.channels = 1 ;
+		psf->sf.samplerate = 8000 ;
+		format = SF_FORMAT_RAW | SF_FORMAT_ULAW ;
+		}
+
+	else if (strcmp (cptr, "vox") == 0 || strcmp (cptr, "vox8") == 0)
+	{	psf->sf.channels = 1 ;
+		psf->sf.samplerate = 8000 ;
+		format = SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM ;
+		}
+	else if (strcmp (cptr, "vox6") == 0)
+	{	psf->sf.channels = 1 ;
+		psf->sf.samplerate = 6000 ;
+		format = SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM ;
+		}
+	else if (strcmp (cptr, "gsm") == 0)
+	{	psf->sf.channels = 1 ;
+		psf->sf.samplerate = 8000 ;
+		format = SF_FORMAT_RAW | SF_FORMAT_GSM610 ;
+		}
+
+	/* For RAW files, make sure the dataoffset if set correctly. */
+	if ((SF_CONTAINER (format)) == SF_FORMAT_RAW)
+		psf->dataoffset = 0 ;
+
+	return format ;
+} /* format_from_extension */
+
+static int
+guess_file_type (SF_PRIVATE *psf)
+{	int buffer [3], format ;
+
+	if (psf_binheader_readf (psf, "b", &buffer, SIGNED_SIZEOF (buffer)) != SIGNED_SIZEOF (buffer))
+	{	psf->error = SFE_BAD_FILE_READ ;
+		return 0 ;
+		} ;
+
+	if ((buffer [0] == MAKE_MARKER ('R', 'I', 'F', 'F') || buffer [0] == MAKE_MARKER ('R', 'I', 'F', 'X'))
+			&& 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 ('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 ('r', 'i', 'f', 'f'))
+		return SF_FORMAT_W64 ;
+
+	if (buffer [0] == MAKE_MARKER (0, 0, 0x03, 0xE8) && buffer [1] == MAKE_MARKER (0, 0, 0, 1) &&
+								buffer [2] == MAKE_MARKER (0, 0, 0, 1))
+		return SF_FORMAT_MAT4 ;
+
+	if (buffer [0] == MAKE_MARKER (0, 0, 0, 0) && buffer [1] == MAKE_MARKER (1, 0, 0, 0) &&
+								buffer [2] == MAKE_MARKER (1, 0, 0, 0))
+		return SF_FORMAT_MAT4 ;
+
+	if (buffer [0] == MAKE_MARKER ('M', 'A', 'T', 'L') && buffer [1] == MAKE_MARKER ('A', 'B', ' ', '5'))
+		return SF_FORMAT_MAT5 ;
+
+	if (buffer [0] == MAKE_MARKER ('P', 'V', 'F', '1'))
+		return SF_FORMAT_PVF ;
+
+	if (buffer [0] == MAKE_MARKER ('E', 'x', 't', 'e') && buffer [1] == MAKE_MARKER ('n', 'd', 'e', 'd') &&
+								buffer [2] == MAKE_MARKER (' ', 'I', 'n', 's'))
+		return SF_FORMAT_XI ;
+
+	if (buffer [0] == MAKE_MARKER ('c', 'a', 'f', 'f') && buffer [2] == MAKE_MARKER ('d', 'e', 's', 'c'))
+		return SF_FORMAT_CAF ;
+
+	if (buffer [0] == MAKE_MARKER ('O', 'g', 'g', 'S'))
+		return SF_FORMAT_OGG ;
+
+	if (buffer [0] == MAKE_MARKER ('A', 'L', 'a', 'w') && buffer [1] == MAKE_MARKER ('S', 'o', 'u', 'n')
+			&& buffer [2] == MAKE_MARKER ('d', 'F', 'i', 'l'))
+		return SF_FORMAT_WVE ;
+
+	if (buffer [0] == MAKE_MARKER ('D', 'i', 'a', 'm') && buffer [1] == MAKE_MARKER ('o', 'n', 'd', 'W')
+			&& buffer [2] == MAKE_MARKER ('a', 'r', 'e', ' '))
+		return SF_FORMAT_DWD ;
+
+	if (buffer [0] == MAKE_MARKER ('L', 'M', '8', '9') || buffer [0] == MAKE_MARKER ('5', '3', 0, 0))
+		return SF_FORMAT_TXW ;
+
+	if ((buffer [0] & MAKE_MARKER (0xFF, 0xFF, 0x80, 0xFF)) == MAKE_MARKER (0xF0, 0x7E, 0, 0x01))
+		return SF_FORMAT_SDS ;
+
+	if ((buffer [0] & MAKE_MARKER (0xFF, 0xFF, 0, 0)) == MAKE_MARKER (1, 4, 0, 0))
+		return SF_FORMAT_MPC2K ;
+
+	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 0 /*-SF_FORMAT_WMA-*/ ;
+
+	/* HMM (Hidden Markov Model) Tool Kit. */
+	if (2 * BEI2H_INT (buffer [0]) + 12 == psf->filelength && buffer [2] == MAKE_MARKER (0, 2, 0, 0))
+		return SF_FORMAT_HTK ;
+
+	if (buffer [0] == MAKE_MARKER ('f', 'L', 'a', 'C'))
+		return SF_FORMAT_FLAC ;
+
+	if (buffer [0] == MAKE_MARKER ('2', 'B', 'I', 'T'))
+		return SF_FORMAT_AVR ;
+
+	if (buffer [0] == MAKE_MARKER ('R', 'F', '6', '4') && buffer [2] == MAKE_MARKER ('W', 'A', 'V', 'E'))
+		return SF_FORMAT_RF64 ;
+
+	if (buffer [0] == MAKE_MARKER ('I', 'D', '3', 3))
+	{	psf_log_printf (psf, "Found 'ID3' marker.\n") ;
+		if (id3_skip (psf))
+			return guess_file_type (psf) ;
+		return 0 ;
+		} ;
+
+	/* Turtle Beach SMP 16-bit */
+	if (buffer [0] == MAKE_MARKER ('S', 'O', 'U', 'N') && buffer [1] == MAKE_MARKER ('D', ' ', 'S', 'A'))
+		return 0 ;
+
+	/* Yamaha sampler format. */
+	if (buffer [0] == MAKE_MARKER ('S', 'Y', '8', '0') || buffer [0] == MAKE_MARKER ('S', 'Y', '8', '5'))
+		return 0 ;
+
+	if (buffer [0] == MAKE_MARKER ('a', 'j', 'k', 'g'))
+		return 0 /*-SF_FORMAT_SHN-*/ ;
+
+	/* This must be the last one. */
+	if (psf->filelength > 0 && (format = try_resource_fork (psf)) != 0)
+		return format ;
+
+	return 0 ;
+} /* guess_file_type */
+
+
+static int
+validate_sfinfo (SF_INFO *sfinfo)
+{	if (sfinfo->samplerate < 1)
+		return 0 ;
+	if (sfinfo->frames < 0)
+		return 0 ;
+	if (sfinfo->channels < 1)
+		return 0 ;
+	if ((SF_CONTAINER (sfinfo->format)) == 0)
+		return 0 ;
+	if ((SF_CODEC (sfinfo->format)) == 0)
+		return 0 ;
+	if (sfinfo->sections < 1)
+		return 0 ;
+	return 1 ;
+} /* validate_sfinfo */
+
+static int
+validate_psf (SF_PRIVATE *psf)
+{
+	if (psf->datalength < 0)
+	{	psf_log_printf (psf, "Invalid SF_PRIVATE field : datalength == %D.\n", psf->datalength) ;
+		return 0 ;
+		} ;
+	if (psf->dataoffset < 0)
+	{	psf_log_printf (psf, "Invalid SF_PRIVATE field : dataoffset == %D.\n", psf->dataoffset) ;
+		return 0 ;
+		} ;
+	if (psf->blockwidth && psf->blockwidth != psf->sf.channels * psf->bytewidth)
+	{	psf_log_printf (psf, "Invalid SF_PRIVATE field : channels * bytewidth == %d.\n",
+								psf->sf.channels * psf->bytewidth) ;
+		return 0 ;
+		} ;
+	return 1 ;
+} /* validate_psf */
+
+static void
+save_header_info (SF_PRIVATE *psf)
+{	snprintf (sf_logbuffer, sizeof (sf_logbuffer), "%s", psf->logbuffer) ;
+} /* save_header_info */
+
+static void
+copy_filename (SF_PRIVATE *psf, const char *path)
+{	const char *ccptr ;
+	char *cptr ;
+
+	snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", path) ;
+	if ((ccptr = strrchr (path, '/')) || (ccptr = strrchr (path, '\\')))
+		ccptr ++ ;
+	else
+		ccptr = path ;
+
+	snprintf (psf->file.name.c, sizeof (psf->file.name.c), "%s", ccptr) ;
+
+	/* Now grab the directory. */
+	snprintf (psf->file.dir.c, sizeof (psf->file.dir.c), "%s", path) ;
+	if ((cptr = strrchr (psf->file.dir.c, '/')) || (cptr = strrchr (psf->file.dir.c, '\\')))
+		cptr [1] = 0 ;
+	else
+		psf->file.dir.c [0] = 0 ;
+
+	return ;
+} /* copy_filename */
+
+/*==============================================================================
+*/
+
+static int
+psf_close (SF_PRIVATE *psf)
+{	int	error = 0 ;
+
+	if (psf->codec_close)
+		error = psf->codec_close (psf) ;
+	if (psf->container_close)
+		error = psf->container_close (psf) ;
+
+	error = psf_fclose (psf) ;
+	psf_close_rsrc (psf) ;
+
+	if (psf->container_data)
+		free (psf->container_data) ;
+
+	if (psf->codec_data)
+		free (psf->codec_data) ;
+
+	if (psf->interleave)
+		free (psf->interleave) ;
+
+	if (psf->dither)
+		free (psf->dither) ;
+
+	if (psf->peak_info)
+		free (psf->peak_info) ;
+
+	if (psf->broadcast_16k)
+		free (psf->broadcast_16k) ;
+
+	if (psf->loop_info)
+		free (psf->loop_info) ;
+
+	if (psf->instrument)
+		free (psf->instrument) ;
+
+	if (psf->channel_map)
+		free (psf->channel_map) ;
+
+	if (psf->format_desc)
+	{	psf->format_desc [0] = 0 ;
+		free (psf->format_desc) ;
+		} ;
+
+	memset (psf, 0, sizeof (SF_PRIVATE)) ;
+	free (psf) ;
+
+	return error ;
+} /* psf_close */
+
+SNDFILE *
+psf_open_file (SF_PRIVATE *psf, SF_INFO *sfinfo)
+{	int		error, format ;
+
+	sf_errno = error = 0 ;
+	sf_logbuffer [0] = 0 ;
+
+	if (psf->error)
+	{	error = psf->error ;
+		goto error_exit ;
+		} ;
+
+	if (psf->file.mode != SFM_READ && psf->file.mode != SFM_WRITE && psf->file.mode != SFM_RDWR)
+	{	error = SFE_BAD_OPEN_MODE ;
+		goto error_exit ;
+		} ;
+
+	if (sfinfo == NULL)
+	{	error = SFE_BAD_SF_INFO_PTR ;
+		goto error_exit ;
+		} ;
+
+	/* Zero out these fields. */
+	sfinfo->frames = 0 ;
+	sfinfo->sections = 0 ;
+	sfinfo->seekable = 0 ;
+
+	if (psf->file.mode == SFM_READ)
+	{	if ((SF_CONTAINER (sfinfo->format)) == SF_FORMAT_RAW)
+		{	if (sf_format_check (sfinfo) == 0)
+			{	error = SFE_RAW_BAD_FORMAT ;
+				goto error_exit ;
+				} ;
+			}
+		else
+			memset (sfinfo, 0, sizeof (SF_INFO)) ;
+		} ;
+
+	memcpy (&(psf->sf), sfinfo, sizeof (SF_INFO)) ;
+
+	psf->Magick 		= SNDFILE_MAGICK ;
+	psf->norm_float 	= SF_TRUE ;
+	psf->norm_double	= SF_TRUE ;
+	psf->dataoffset		= -1 ;
+	psf->datalength		= -1 ;
+	psf->read_current	= -1 ;
+	psf->write_current	= -1 ;
+	psf->auto_header 	= SF_FALSE ;
+	psf->rwf_endian		= SF_ENDIAN_LITTLE ;
+	psf->seek			= psf_default_seek ;
+	psf->float_int_mult = 0 ;
+	psf->float_max		= -1.0 ;
+
+	/* An attempt at a per SF_PRIVATE unique id. */
+	psf->unique_id		= psf_rand_int32 () ;
+
+	psf->sf.sections = 1 ;
+
+	psf->is_pipe = psf_is_pipe (psf) ;
+
+	if (psf->is_pipe)
+	{	psf->sf.seekable = SF_FALSE ;
+		psf->filelength = SF_COUNT_MAX ;
+		}
+	else
+	{	psf->sf.seekable = SF_TRUE ;
+
+		/* File is open, so get the length. */
+		psf->filelength = psf_get_filelen (psf) ;
+		} ;
+
+	if (psf->fileoffset > 0)
+	{	switch (psf->file.mode)
+		{	case SFM_READ :
+				if (psf->filelength < 44)
+				{	psf_log_printf (psf, "Short filelength: %D (fileoffset: %D)\n", psf->filelength, psf->fileoffset) ;
+					error = SFE_BAD_OFFSET ;
+					goto error_exit ;
+					} ;
+				break ;
+
+			case SFM_WRITE :
+				psf->fileoffset = 0 ;
+				psf_fseek (psf, 0, SEEK_END) ;
+				psf->fileoffset = psf_ftell (psf) ;
+				break ;
+
+			case SFM_RDWR :
+				error = SFE_NO_EMBEDDED_RDWR ;
+				goto error_exit ;
+			} ;
+
+		psf_log_printf (psf, "Embedded file offset : %D\n", psf->fileoffset) ;
+		} ;
+
+	if (psf->filelength == SF_COUNT_MAX)
+		psf_log_printf (psf, "Length : unknown\n") ;
+	else
+		psf_log_printf (psf, "Length : %D\n", psf->filelength) ;
+
+	if (psf->file.mode == SFM_WRITE || (psf->file.mode == SFM_RDWR && psf->filelength == 0))
+	{	/* If the file is being opened for write or RDWR and the file is currently
+		** empty, then the SF_INFO struct must contain valid data.
+		*/
+		if ((SF_CONTAINER (psf->sf.format)) == 0)
+		{	error = SFE_ZERO_MAJOR_FORMAT ;
+			goto error_exit ;
+			} ;
+		if ((SF_CODEC (psf->sf.format)) == 0)
+		{	error = SFE_ZERO_MINOR_FORMAT ;
+			goto error_exit ;
+			} ;
+
+		if (sf_format_check (&(psf->sf)) == 0)
+		{	error = SFE_BAD_OPEN_FORMAT ;
+			goto error_exit ;
+			} ;
+		}
+	else if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_RAW)
+	{	/* If type RAW has not been specified then need to figure out file type. */
+		psf->sf.format = guess_file_type (psf) ;
+
+		if (psf->sf.format == 0)
+			psf->sf.format = format_from_extension (psf) ;
+		} ;
+
+	/* Prevent unnecessary seeks */
+	psf->last_op = psf->file.mode ;
+
+	/* Set bytewidth if known. */
+	switch (SF_CODEC (psf->sf.format))
+	{	case SF_FORMAT_PCM_S8 :
+		case SF_FORMAT_PCM_U8 :
+		case SF_FORMAT_ULAW :
+		case SF_FORMAT_ALAW :
+		case SF_FORMAT_DPCM_8 :
+				psf->bytewidth = 1 ;
+				break ;
+
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_DPCM_16 :
+				psf->bytewidth = 2 ;
+				break ;
+
+		case SF_FORMAT_PCM_24 :
+				psf->bytewidth = 3 ;
+				break ;
+
+		case SF_FORMAT_PCM_32 :
+		case SF_FORMAT_FLOAT :
+				psf->bytewidth = 4 ;
+				break ;
+
+		case SF_FORMAT_DOUBLE :
+				psf->bytewidth = 8 ;
+				break ;
+		} ;
+
+	/* Call the initialisation function for the relevant file type. */
+	switch (SF_CONTAINER (psf->sf.format))
+	{	case	SF_FORMAT_WAV :
+		case	SF_FORMAT_WAVEX :
+				error = wav_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_AIFF :
+				error = aiff_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_AU :
+				error = au_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_RAW :
+				error = raw_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_W64 :
+				error = w64_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_RF64 :
+				error = rf64_open (psf) ;
+				break ;
+
+		/* Lite remove start */
+		case	SF_FORMAT_PAF :
+				error = paf_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_SVX :
+				error = svx_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_NIST :
+				error = nist_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_IRCAM :
+				error = ircam_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_VOC :
+				error = voc_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_SDS :
+				error = sds_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_OGG :
+				error = ogg_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_TXW :
+				error = txw_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_WVE :
+				error = wve_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_DWD :
+				error = dwd_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_MAT4 :
+				error = mat4_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_MAT5 :
+				error = mat5_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_PVF :
+				error = pvf_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_XI :
+				error = xi_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_HTK :
+				error = htk_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_SD2 :
+				error = sd2_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_REX2 :
+				error = rx2_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_AVR :
+				error = avr_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_FLAC :
+				error = flac_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_CAF :
+				error = caf_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_MPC2K :
+				error = mpc2k_open (psf) ;
+				break ;
+
+		/* Lite remove end */
+
+		default :
+				error = SFE_UNKNOWN_FORMAT ;
+		} ;
+
+	if (error)
+		goto error_exit ;
+
+	/* For now, check whether embedding is supported. */
+	format = SF_CONTAINER (psf->sf.format) ;
+	if (psf->fileoffset > 0)
+	{	switch (format)
+		{	case SF_FORMAT_WAV :
+			case SF_FORMAT_WAVEX :
+			case SF_FORMAT_AIFF :
+			case SF_FORMAT_AU :
+				/* Actual embedded files. */
+				break ;
+
+			case SF_FORMAT_FLAC :
+				/* Flac with an ID3v2 header? */
+				break ;
+
+			default :
+				error = SFE_NO_EMBED_SUPPORT ;
+				goto error_exit ;
+			} ;
+		} ;
+
+	if (psf->fileoffset > 0)
+		psf_log_printf (psf, "Embedded file length : %D\n", psf->filelength) ;
+
+	if (psf->file.mode == SFM_RDWR && sf_format_check (&(psf->sf)) == 0)
+	{	error = SFE_BAD_MODE_RW ;
+		goto error_exit ;
+		} ;
+
+	if (validate_sfinfo (&(psf->sf)) == 0)
+	{	psf_log_SF_INFO (psf) ;
+		save_header_info (psf) ;
+		error = SFE_BAD_SF_INFO ;
+		goto error_exit ;
+		} ;
+
+	if (validate_psf (psf) == 0)
+	{	save_header_info (psf) ;
+		error = SFE_INTERNAL ;
+		goto error_exit ;
+		} ;
+
+	psf->read_current = 0 ;
+	psf->write_current = 0 ;
+	if (psf->file.mode == SFM_RDWR)
+	{	psf->write_current = psf->sf.frames ;
+		psf->have_written = psf->sf.frames > 0 ? SF_TRUE : SF_FALSE ;
+		} ;
+
+	memcpy (sfinfo, &(psf->sf), sizeof (SF_INFO)) ;
+
+	memcpy (sfinfo, &(psf->sf), sizeof (SF_INFO)) ;
+
+	return (SNDFILE *) psf ;
+
+error_exit :
+	sf_errno = error ;
+
+	if (error == SFE_SYSTEM)
+		snprintf (sf_syserr, sizeof (sf_syserr), "%s", psf->syserr) ;
+	snprintf (sf_logbuffer, sizeof (sf_logbuffer), "%s", psf->logbuffer) ;
+
+	switch (error)
+	{	case SF_ERR_SYSTEM :
+		case SF_ERR_UNSUPPORTED_ENCODING :
+		case SFE_UNIMPLEMENTED :
+			break ;
+
+		case SFE_RAW_BAD_FORMAT :
+			break ;
+
+		default :
+			if (psf->file.mode == SFM_READ)
+			{	psf_log_printf (psf, "Parse error : %s\n", sf_error_number (error)) ;
+				error = SF_ERR_MALFORMED_FILE ;
+				} ;
+		} ;
+
+	psf_close (psf) ;
+	return NULL ;
+} /* psf_open_file */
+
diff --git a/jni/libsndfile-1.0.25/src/sndfile.h b/jni/libsndfile-1.0.25/src/sndfile.h
new file mode 100644
index 0000000..d0b26de
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/sndfile.h
@@ -0,0 +1,666 @@
+/*
+** Copyright (C) 1999-2011Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/*
+** sndfile.h -- system-wide definitions
+**
+** API documentation is in the doc/ directory of the source code tarball
+** and at http://www.mega-nerd.com/libsndfile/api.html.
+*/
+
+#ifndef SNDFILE_H
+#define SNDFILE_H
+
+/* This is the version 1.0.X header file. */
+#define	SNDFILE_1
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif	/* __cplusplus */
+
+/* The following file types can be read and written.
+** A file type would consist of a major type (ie SF_FORMAT_WAV) bitwise
+** ORed with a minor type (ie SF_FORMAT_PCM). SF_FORMAT_TYPEMASK and
+** SF_FORMAT_SUBMASK can be used to separate the major and minor file
+** types.
+*/
+
+enum
+{	/* Major formats. */
+	SF_FORMAT_WAV			= 0x010000,		/* Microsoft WAV format (little endian default). */
+	SF_FORMAT_AIFF			= 0x020000,		/* Apple/SGI AIFF format (big endian). */
+	SF_FORMAT_AU			= 0x030000,		/* Sun/NeXT AU format (big endian). */
+	SF_FORMAT_RAW			= 0x040000,		/* RAW PCM data. */
+	SF_FORMAT_PAF			= 0x050000,		/* Ensoniq PARIS file format. */
+	SF_FORMAT_SVX			= 0x060000,		/* Amiga IFF / SVX8 / SV16 format. */
+	SF_FORMAT_NIST			= 0x070000,		/* Sphere NIST format. */
+	SF_FORMAT_VOC			= 0x080000,		/* VOC files. */
+	SF_FORMAT_IRCAM			= 0x0A0000,		/* Berkeley/IRCAM/CARL */
+	SF_FORMAT_W64			= 0x0B0000,		/* Sonic Foundry's 64 bit RIFF/WAV */
+	SF_FORMAT_MAT4			= 0x0C0000,		/* Matlab (tm) V4.2 / GNU Octave 2.0 */
+	SF_FORMAT_MAT5			= 0x0D0000,		/* Matlab (tm) V5.0 / GNU Octave 2.1 */
+	SF_FORMAT_PVF			= 0x0E0000,		/* Portable Voice Format */
+	SF_FORMAT_XI			= 0x0F0000,		/* Fasttracker 2 Extended Instrument */
+	SF_FORMAT_HTK			= 0x100000,		/* HMM Tool Kit format */
+	SF_FORMAT_SDS			= 0x110000,		/* Midi Sample Dump Standard */
+	SF_FORMAT_AVR			= 0x120000,		/* Audio Visual Research */
+	SF_FORMAT_WAVEX			= 0x130000,		/* MS WAVE with WAVEFORMATEX */
+	SF_FORMAT_SD2			= 0x160000,		/* Sound Designer 2 */
+	SF_FORMAT_FLAC			= 0x170000,		/* FLAC lossless file format */
+	SF_FORMAT_CAF			= 0x180000,		/* Core Audio File format */
+	SF_FORMAT_WVE			= 0x190000,		/* Psion WVE format */
+	SF_FORMAT_OGG			= 0x200000,		/* Xiph OGG container */
+	SF_FORMAT_MPC2K			= 0x210000,		/* Akai MPC 2000 sampler */
+	SF_FORMAT_RF64			= 0x220000,		/* RF64 WAV file */
+
+	/* Subtypes from here on. */
+
+	SF_FORMAT_PCM_S8		= 0x0001,		/* Signed 8 bit data */
+	SF_FORMAT_PCM_16		= 0x0002,		/* Signed 16 bit data */
+	SF_FORMAT_PCM_24		= 0x0003,		/* Signed 24 bit data */
+	SF_FORMAT_PCM_32		= 0x0004,		/* Signed 32 bit data */
+
+	SF_FORMAT_PCM_U8		= 0x0005,		/* Unsigned 8 bit data (WAV and RAW only) */
+
+	SF_FORMAT_FLOAT			= 0x0006,		/* 32 bit float data */
+	SF_FORMAT_DOUBLE		= 0x0007,		/* 64 bit float data */
+
+	SF_FORMAT_ULAW			= 0x0010,		/* U-Law encoded. */
+	SF_FORMAT_ALAW			= 0x0011,		/* A-Law encoded. */
+	SF_FORMAT_IMA_ADPCM		= 0x0012,		/* IMA ADPCM. */
+	SF_FORMAT_MS_ADPCM		= 0x0013,		/* Microsoft ADPCM. */
+
+	SF_FORMAT_GSM610		= 0x0020,		/* GSM 6.10 encoding. */
+	SF_FORMAT_VOX_ADPCM		= 0x0021,		/* OKI / Dialogix ADPCM */
+
+	SF_FORMAT_G721_32		= 0x0030,		/* 32kbs G721 ADPCM encoding. */
+	SF_FORMAT_G723_24		= 0x0031,		/* 24kbs G723 ADPCM encoding. */
+	SF_FORMAT_G723_40		= 0x0032,		/* 40kbs G723 ADPCM encoding. */
+
+	SF_FORMAT_DWVW_12		= 0x0040, 		/* 12 bit Delta Width Variable Word encoding. */
+	SF_FORMAT_DWVW_16		= 0x0041, 		/* 16 bit Delta Width Variable Word encoding. */
+	SF_FORMAT_DWVW_24		= 0x0042, 		/* 24 bit Delta Width Variable Word encoding. */
+	SF_FORMAT_DWVW_N		= 0x0043, 		/* N bit Delta Width Variable Word encoding. */
+
+	SF_FORMAT_DPCM_8		= 0x0050,		/* 8 bit differential PCM (XI only) */
+	SF_FORMAT_DPCM_16		= 0x0051,		/* 16 bit differential PCM (XI only) */
+
+	SF_FORMAT_VORBIS		= 0x0060,		/* Xiph Vorbis encoding. */
+
+	/* Endian-ness options. */
+
+	SF_ENDIAN_FILE			= 0x00000000,	/* Default file endian-ness. */
+	SF_ENDIAN_LITTLE		= 0x10000000,	/* Force little endian-ness. */
+	SF_ENDIAN_BIG			= 0x20000000,	/* Force big endian-ness. */
+	SF_ENDIAN_CPU			= 0x30000000,	/* Force CPU endian-ness. */
+
+	SF_FORMAT_SUBMASK		= 0x0000FFFF,
+	SF_FORMAT_TYPEMASK		= 0x0FFF0000,
+	SF_FORMAT_ENDMASK		= 0x30000000
+} ;
+
+/*
+** The following are the valid command numbers for the sf_command()
+** interface.  The use of these commands is documented in the file
+** command.html in the doc directory of the source code distribution.
+*/
+
+enum
+{	SFC_GET_LIB_VERSION				= 0x1000,
+	SFC_GET_LOG_INFO				= 0x1001,
+	SFC_GET_CURRENT_SF_INFO			= 0x1002,
+
+
+	SFC_GET_NORM_DOUBLE				= 0x1010,
+	SFC_GET_NORM_FLOAT				= 0x1011,
+	SFC_SET_NORM_DOUBLE				= 0x1012,
+	SFC_SET_NORM_FLOAT				= 0x1013,
+	SFC_SET_SCALE_FLOAT_INT_READ	= 0x1014,
+	SFC_SET_SCALE_INT_FLOAT_WRITE	= 0x1015,
+
+	SFC_GET_SIMPLE_FORMAT_COUNT		= 0x1020,
+	SFC_GET_SIMPLE_FORMAT			= 0x1021,
+
+	SFC_GET_FORMAT_INFO				= 0x1028,
+
+	SFC_GET_FORMAT_MAJOR_COUNT		= 0x1030,
+	SFC_GET_FORMAT_MAJOR			= 0x1031,
+	SFC_GET_FORMAT_SUBTYPE_COUNT	= 0x1032,
+	SFC_GET_FORMAT_SUBTYPE			= 0x1033,
+
+	SFC_CALC_SIGNAL_MAX				= 0x1040,
+	SFC_CALC_NORM_SIGNAL_MAX		= 0x1041,
+	SFC_CALC_MAX_ALL_CHANNELS		= 0x1042,
+	SFC_CALC_NORM_MAX_ALL_CHANNELS	= 0x1043,
+	SFC_GET_SIGNAL_MAX				= 0x1044,
+	SFC_GET_MAX_ALL_CHANNELS		= 0x1045,
+
+	SFC_SET_ADD_PEAK_CHUNK			= 0x1050,
+	SFC_SET_ADD_HEADER_PAD_CHUNK	= 0x1051,
+
+	SFC_UPDATE_HEADER_NOW			= 0x1060,
+	SFC_SET_UPDATE_HEADER_AUTO		= 0x1061,
+
+	SFC_FILE_TRUNCATE				= 0x1080,
+
+	SFC_SET_RAW_START_OFFSET		= 0x1090,
+
+	SFC_SET_DITHER_ON_WRITE			= 0x10A0,
+	SFC_SET_DITHER_ON_READ			= 0x10A1,
+
+	SFC_GET_DITHER_INFO_COUNT		= 0x10A2,
+	SFC_GET_DITHER_INFO				= 0x10A3,
+
+	SFC_GET_EMBED_FILE_INFO			= 0x10B0,
+
+	SFC_SET_CLIPPING				= 0x10C0,
+	SFC_GET_CLIPPING				= 0x10C1,
+
+	SFC_GET_INSTRUMENT				= 0x10D0,
+	SFC_SET_INSTRUMENT				= 0x10D1,
+
+	SFC_GET_LOOP_INFO				= 0x10E0,
+
+	SFC_GET_BROADCAST_INFO			= 0x10F0,
+	SFC_SET_BROADCAST_INFO			= 0x10F1,
+
+	SFC_GET_CHANNEL_MAP_INFO		= 0x1100,
+	SFC_SET_CHANNEL_MAP_INFO		= 0x1101,
+
+	SFC_RAW_DATA_NEEDS_ENDSWAP		= 0x1110,
+
+	/* Support for Wavex Ambisonics Format */
+	SFC_WAVEX_SET_AMBISONIC			= 0x1200,
+	SFC_WAVEX_GET_AMBISONIC			= 0x1201,
+
+	SFC_SET_VBR_ENCODING_QUALITY	= 0x1300,
+
+	/* Following commands for testing only. */
+	SFC_TEST_IEEE_FLOAT_REPLACE		= 0x6001,
+
+	/*
+	** SFC_SET_ADD_* values are deprecated and will disappear at some
+	** time in the future. They are guaranteed to be here up to and
+	** including version 1.0.8 to avoid breakage of existng software.
+	** They currently do nothing and will continue to do nothing.
+	*/
+	SFC_SET_ADD_DITHER_ON_WRITE		= 0x1070,
+	SFC_SET_ADD_DITHER_ON_READ		= 0x1071
+} ;
+
+
+/*
+** String types that can be set and read from files. Not all file types
+** support this and even the file types which support one, may not support
+** all string types.
+*/
+
+enum
+{	SF_STR_TITLE					= 0x01,
+	SF_STR_COPYRIGHT				= 0x02,
+	SF_STR_SOFTWARE					= 0x03,
+	SF_STR_ARTIST					= 0x04,
+	SF_STR_COMMENT					= 0x05,
+	SF_STR_DATE						= 0x06,
+	SF_STR_ALBUM					= 0x07,
+	SF_STR_LICENSE					= 0x08,
+	SF_STR_TRACKNUMBER				= 0x09,
+	SF_STR_GENRE					= 0x10
+} ;
+
+/*
+** Use the following as the start and end index when doing metadata
+** transcoding.
+*/
+
+#define	SF_STR_FIRST	SF_STR_TITLE
+#define	SF_STR_LAST		SF_STR_GENRE
+
+enum
+{	/* True and false */
+	SF_FALSE	= 0,
+	SF_TRUE		= 1,
+
+	/* Modes for opening files. */
+	SFM_READ	= 0x10,
+	SFM_WRITE	= 0x20,
+	SFM_RDWR	= 0x30,
+
+	SF_AMBISONIC_NONE		= 0x40,
+	SF_AMBISONIC_B_FORMAT	= 0x41
+} ;
+
+/* Public error values. These are guaranteed to remain unchanged for the duration
+** of the library major version number.
+** There are also a large number of private error numbers which are internal to
+** the library which can change at any time.
+*/
+
+enum
+{	SF_ERR_NO_ERROR				= 0,
+	SF_ERR_UNRECOGNISED_FORMAT	= 1,
+	SF_ERR_SYSTEM				= 2,
+	SF_ERR_MALFORMED_FILE		= 3,
+	SF_ERR_UNSUPPORTED_ENCODING	= 4
+} ;
+
+
+/* Channel map values (used with SFC_SET/GET_CHANNEL_MAP).
+*/
+
+enum
+{	SF_CHANNEL_MAP_INVALID = 0,
+	SF_CHANNEL_MAP_MONO = 1,
+	SF_CHANNEL_MAP_LEFT,					/* Apple calls this 'Left' */
+	SF_CHANNEL_MAP_RIGHT,					/* Apple calls this 'Right' */
+	SF_CHANNEL_MAP_CENTER,					/* Apple calls this 'Center' */
+	SF_CHANNEL_MAP_FRONT_LEFT,
+	SF_CHANNEL_MAP_FRONT_RIGHT,
+	SF_CHANNEL_MAP_FRONT_CENTER,
+	SF_CHANNEL_MAP_REAR_CENTER,				/* Apple calls this 'Center Surround', Msft calls this 'Back Center' */
+	SF_CHANNEL_MAP_REAR_LEFT,				/* Apple calls this 'Left Surround', Msft calls this 'Back Left' */
+	SF_CHANNEL_MAP_REAR_RIGHT,				/* Apple calls this 'Right Surround', Msft calls this 'Back Right' */
+	SF_CHANNEL_MAP_LFE,						/* Apple calls this 'LFEScreen', Msft calls this 'Low Frequency'  */
+	SF_CHANNEL_MAP_FRONT_LEFT_OF_CENTER,	/* Apple calls this 'Left Center' */
+	SF_CHANNEL_MAP_FRONT_RIGHT_OF_CENTER,	/* Apple calls this 'Right Center */
+	SF_CHANNEL_MAP_SIDE_LEFT,				/* Apple calls this 'Left Surround Direct' */
+	SF_CHANNEL_MAP_SIDE_RIGHT,				/* Apple calls this 'Right Surround Direct' */
+	SF_CHANNEL_MAP_TOP_CENTER,				/* Apple calls this 'Top Center Surround' */
+	SF_CHANNEL_MAP_TOP_FRONT_LEFT,			/* Apple calls this 'Vertical Height Left' */
+	SF_CHANNEL_MAP_TOP_FRONT_RIGHT,			/* Apple calls this 'Vertical Height Right' */
+	SF_CHANNEL_MAP_TOP_FRONT_CENTER,		/* Apple calls this 'Vertical Height Center' */
+	SF_CHANNEL_MAP_TOP_REAR_LEFT,			/* Apple and MS call this 'Top Back Left' */
+	SF_CHANNEL_MAP_TOP_REAR_RIGHT,			/* Apple and MS call this 'Top Back Right' */
+	SF_CHANNEL_MAP_TOP_REAR_CENTER,			/* Apple and MS call this 'Top Back Center' */
+
+	SF_CHANNEL_MAP_AMBISONIC_B_W,
+	SF_CHANNEL_MAP_AMBISONIC_B_X,
+	SF_CHANNEL_MAP_AMBISONIC_B_Y,
+	SF_CHANNEL_MAP_AMBISONIC_B_Z,
+
+	SF_CHANNEL_MAP_MAX
+} ;
+
+
+/* A SNDFILE* pointer can be passed around much like stdio.h's FILE* pointer. */
+
+typedef	struct SNDFILE_tag	SNDFILE ;
+
+/* The following typedef is system specific and is defined when libsndfile is
+** compiled. sf_count_t will be a 64 bit value when the underlying OS allows
+** 64 bit file offsets.
+** On windows, we need to allow the same header file to be compiler by both GCC
+** and the Microsoft compiler.
+*/
+
+#if (defined (_MSCVER) || defined (_MSC_VER))
+typedef __int64		sf_count_t ;
+#define SF_COUNT_MAX		0x7fffffffffffffffi64
+#else
+typedef int64_t	sf_count_t ;
+#define SF_COUNT_MAX		0x7FFFFFFFFFFFFFFFLL
+#endif
+
+
+/* A pointer to a SF_INFO structure is passed to sf_open () and filled in.
+** On write, the SF_INFO structure is filled in by the user and passed into
+** sf_open ().
+*/
+
+struct SF_INFO
+{	sf_count_t	frames ;		/* Used to be called samples.  Changed to avoid confusion. */
+	int			samplerate ;
+	int			channels ;
+	int			format ;
+	int			sections ;
+	int			seekable ;
+} ;
+
+typedef	struct SF_INFO SF_INFO ;
+
+/* The SF_FORMAT_INFO struct is used to retrieve information about the sound
+** file formats libsndfile supports using the sf_command () interface.
+**
+** Using this interface will allow applications to support new file formats
+** and encoding types when libsndfile is upgraded, without requiring
+** re-compilation of the application.
+**
+** Please consult the libsndfile documentation (particularly the information
+** on the sf_command () interface) for examples of its use.
+*/
+
+typedef struct
+{	int			format ;
+	const char	*name ;
+	const char	*extension ;
+} SF_FORMAT_INFO ;
+
+/*
+** Enums and typedefs for adding dither on read and write.
+** See the html documentation for sf_command(), SFC_SET_DITHER_ON_WRITE
+** and SFC_SET_DITHER_ON_READ.
+*/
+
+enum
+{	SFD_DEFAULT_LEVEL	= 0,
+	SFD_CUSTOM_LEVEL	= 0x40000000,
+
+	SFD_NO_DITHER		= 500,
+	SFD_WHITE			= 501,
+	SFD_TRIANGULAR_PDF	= 502
+} ;
+
+typedef struct
+{	int			type ;
+	double		level ;
+	const char	*name ;
+} SF_DITHER_INFO ;
+
+/* Struct used to retrieve information about a file embedded within a
+** larger file. See SFC_GET_EMBED_FILE_INFO.
+*/
+
+typedef struct
+{	sf_count_t	offset ;
+	sf_count_t	length ;
+} SF_EMBED_FILE_INFO ;
+
+/*
+**	Structs used to retrieve music sample information from a file.
+*/
+
+enum
+{	/*
+	**	The loop mode field in SF_INSTRUMENT will be one of the following.
+	*/
+	SF_LOOP_NONE = 800,
+	SF_LOOP_FORWARD,
+	SF_LOOP_BACKWARD,
+	SF_LOOP_ALTERNATING
+} ;
+
+typedef struct
+{	int gain ;
+	char basenote, detune ;
+	char velocity_lo, velocity_hi ;
+	char key_lo, key_hi ;
+	int loop_count ;
+
+	struct
+	{	int mode ;
+		unsigned int start ;
+		unsigned int end ;
+		unsigned int count ;
+	} loops [16] ; /* make variable in a sensible way */
+} SF_INSTRUMENT ;
+
+
+
+/* Struct used to retrieve loop information from a file.*/
+typedef struct
+{
+	short	time_sig_num ;	/* any positive integer    > 0  */
+	short	time_sig_den ;	/* any positive power of 2 > 0  */
+	int		loop_mode ;		/* see SF_LOOP enum             */
+
+	int		num_beats ;		/* this is NOT the amount of quarter notes !!!*/
+							/* a full bar of 4/4 is 4 beats */
+							/* a full bar of 7/8 is 7 beats */
+
+	float	bpm ;			/* suggestion, as it can be calculated using other fields:*/
+							/* file's lenght, file's sampleRate and our time_sig_den*/
+							/* -> bpms are always the amount of _quarter notes_ per minute */
+
+	int	root_key ;			/* MIDI note, or -1 for None */
+	int future [6] ;
+} SF_LOOP_INFO ;
+
+
+/*	Struct used to retrieve broadcast (EBU) information from a file.
+**	Strongly (!) based on EBU "bext" chunk format used in Broadcast WAVE.
+*/
+#define	SF_BROADCAST_INFO_VAR(coding_hist_size) \
+			struct \
+			{	char			description [256] ; \
+				char			originator [32] ; \
+				char			originator_reference [32] ; \
+				char			origination_date [10] ; \
+				char			origination_time [8] ; \
+				unsigned int	time_reference_low ; \
+				unsigned int	time_reference_high ; \
+				short			version ; \
+				char			umid [64] ; \
+				char			reserved [190] ; \
+				unsigned int	coding_history_size ; \
+				char			coding_history [coding_hist_size] ; \
+			}
+
+/* SF_BROADCAST_INFO is the above struct with coding_history field of 256 bytes. */
+typedef SF_BROADCAST_INFO_VAR (256) SF_BROADCAST_INFO ;
+
+
+/*	Virtual I/O functionality. */
+
+typedef sf_count_t		(*sf_vio_get_filelen)	(void *user_data) ;
+typedef sf_count_t		(*sf_vio_seek)		(sf_count_t offset, int whence, void *user_data) ;
+typedef sf_count_t		(*sf_vio_read)		(void *ptr, sf_count_t count, void *user_data) ;
+typedef sf_count_t		(*sf_vio_write)		(const void *ptr, sf_count_t count, void *user_data) ;
+typedef sf_count_t		(*sf_vio_tell)		(void *user_data) ;
+
+struct SF_VIRTUAL_IO
+{	sf_vio_get_filelen	get_filelen ;
+	sf_vio_seek			seek ;
+	sf_vio_read			read ;
+	sf_vio_write		write ;
+	sf_vio_tell			tell ;
+} ;
+
+typedef	struct SF_VIRTUAL_IO SF_VIRTUAL_IO ;
+
+
+/* Open the specified file for read, write or both. On error, this will
+** return a NULL pointer. To find the error number, pass a NULL SNDFILE
+** to sf_strerror ().
+** All calls to sf_open() should be matched with a call to sf_close().
+*/
+
+SNDFILE* 	sf_open		(const char *path, int mode, SF_INFO *sfinfo) ;
+
+
+/* Use the existing file descriptor to create a SNDFILE object. If close_desc
+** is TRUE, the file descriptor will be closed when sf_close() is called. If
+** it is FALSE, the descritor will not be closed.
+** When passed a descriptor like this, the library will assume that the start
+** of file header is at the current file offset. This allows sound files within
+** larger container files to be read and/or written.
+** On error, this will return a NULL pointer. To find the error number, pass a
+** NULL SNDFILE to sf_strerror ().
+** All calls to sf_open_fd() should be matched with a call to sf_close().
+
+*/
+
+SNDFILE* 	sf_open_fd	(int fd, int mode, SF_INFO *sfinfo, int close_desc) ;
+
+SNDFILE* 	sf_open_virtual	(SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo, void *user_data) ;
+
+
+/* sf_error () returns a error number which can be translated to a text
+** string using sf_error_number().
+*/
+
+int		sf_error		(SNDFILE *sndfile) ;
+
+
+/* sf_strerror () returns to the caller a pointer to the current error message for
+** the given SNDFILE.
+*/
+
+const char* sf_strerror (SNDFILE *sndfile) ;
+
+
+/* sf_error_number () allows the retrieval of the error string for each internal
+** error number.
+**
+*/
+
+const char*	sf_error_number	(int errnum) ;
+
+
+/* The following two error functions are deprecated but they will remain in the
+** library for the forseeable future. The function sf_strerror() should be used
+** in their place.
+*/
+
+int		sf_perror		(SNDFILE *sndfile) ;
+int		sf_error_str	(SNDFILE *sndfile, char* str, size_t len) ;
+
+
+/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */
+
+int		sf_command	(SNDFILE *sndfile, int command, 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) ;
+
+
+/* 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 function fseek ().
+** 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)
+** samples from the start of the file.
+** Please see the libsndfile documentation for moving the read pointer
+** separately from the write pointer on files open in mode SFM_RDWR.
+** On error all of these functions return -1.
+*/
+
+sf_count_t	sf_seek 		(SNDFILE *sndfile, sf_count_t frames, int whence) ;
+
+
+/* Functions for retrieving and setting string data within sound files.
+** Not all file types support this features; AIFF and WAV do. For both
+** functions, the str_type parameter must be one of the SF_STR_* values
+** defined above.
+** On error, sf_set_string() returns non-zero while sf_get_string()
+** returns NULL.
+*/
+
+int sf_set_string (SNDFILE *sndfile, int str_type, const char* str) ;
+
+const char* sf_get_string (SNDFILE *sndfile, int str_type) ;
+
+
+/* Return the library version string. */
+
+const char * sf_version_string (void) ;
+
+
+/* Functions for reading/writing the waveform data of a sound file.
+*/
+
+sf_count_t	sf_read_raw		(SNDFILE *sndfile, void *ptr, sf_count_t bytes) ;
+sf_count_t	sf_write_raw 	(SNDFILE *sndfile, const void *ptr, sf_count_t bytes) ;
+
+
+/* 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_short	passes data in the native short format
+**     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
+** All of these read/write function return number of frames read/written.
+*/
+
+sf_count_t	sf_readf_short	(SNDFILE *sndfile, short *ptr, sf_count_t frames) ;
+sf_count_t	sf_writef_short	(SNDFILE *sndfile, const short *ptr, sf_count_t frames) ;
+
+sf_count_t	sf_readf_int	(SNDFILE *sndfile, int *ptr, sf_count_t frames) ;
+sf_count_t	sf_writef_int 	(SNDFILE *sndfile, const int *ptr, sf_count_t frames) ;
+
+sf_count_t	sf_readf_float	(SNDFILE *sndfile, float *ptr, sf_count_t frames) ;
+sf_count_t	sf_writef_float	(SNDFILE *sndfile, const float *ptr, sf_count_t frames) ;
+
+sf_count_t	sf_readf_double		(SNDFILE *sndfile, double *ptr, sf_count_t frames) ;
+sf_count_t	sf_writef_double	(SNDFILE *sndfile, const double *ptr, sf_count_t frames) ;
+
+
+/* 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.
+*/
+
+sf_count_t	sf_read_short	(SNDFILE *sndfile, short *ptr, sf_count_t items) ;
+sf_count_t	sf_write_short	(SNDFILE *sndfile, const short *ptr, sf_count_t items) ;
+
+sf_count_t	sf_read_int		(SNDFILE *sndfile, int *ptr, sf_count_t items) ;
+sf_count_t	sf_write_int 	(SNDFILE *sndfile, const int *ptr, sf_count_t items) ;
+
+sf_count_t	sf_read_float	(SNDFILE *sndfile, float *ptr, sf_count_t items) ;
+sf_count_t	sf_write_float	(SNDFILE *sndfile, const float *ptr, sf_count_t items) ;
+
+sf_count_t	sf_read_double	(SNDFILE *sndfile, double *ptr, sf_count_t items) ;
+sf_count_t	sf_write_double	(SNDFILE *sndfile, const double *ptr, sf_count_t items) ;
+
+
+/* Close the SNDFILE and clean up all memory allocations associated with this
+** file.
+** Returns 0 on success, or an error number.
+*/
+
+int		sf_close		(SNDFILE *sndfile) ;
+
+
+/* If the file is opened SFM_WRITE or SFM_RDWR, call fsync() on the file
+** to force the writing of data to disk. If the file is opened SFM_READ
+** no action is taken.
+*/
+
+void	sf_write_sync	(SNDFILE *sndfile) ;
+
+
+
+/* The function sf_wchar_open() is Windows Only!
+** Open a file passing in a Windows Unicode filename. Otherwise, this is
+** the same as sf_open().
+**
+** In order for this to work, you need to do the following:
+**
+**		#include <windows.h>
+**		#define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1
+**		#including <sndfile.h>
+*/
+
+#if (defined (ENABLE_SNDFILE_WINDOWS_PROTOTYPES) && ENABLE_SNDFILE_WINDOWS_PROTOTYPES)
+SNDFILE* sf_wchar_open (LPCWSTR wpath, int mode, SF_INFO *sfinfo) ;
+#endif
+
+
+
+#ifdef __cplusplus
+}		/* extern "C" */
+#endif	/* __cplusplus */
+
+#endif	/* SNDFILE_H */
+
diff --git a/jni/libsndfile-1.0.25/src/sndfile.h.in b/jni/libsndfile-1.0.25/src/sndfile.h.in
new file mode 100644
index 0000000..8926fc6
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/sndfile.h.in
@@ -0,0 +1,666 @@
+/*
+** Copyright (C) 1999-2011Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/*
+** sndfile.h -- system-wide definitions
+**
+** API documentation is in the doc/ directory of the source code tarball
+** and at http://www.mega-nerd.com/libsndfile/api.html.
+*/
+
+#ifndef SNDFILE_H
+#define SNDFILE_H
+
+/* This is the version 1.0.X header file. */
+#define	SNDFILE_1
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif	/* __cplusplus */
+
+/* The following file types can be read and written.
+** A file type would consist of a major type (ie SF_FORMAT_WAV) bitwise
+** ORed with a minor type (ie SF_FORMAT_PCM). SF_FORMAT_TYPEMASK and
+** SF_FORMAT_SUBMASK can be used to separate the major and minor file
+** types.
+*/
+
+enum
+{	/* Major formats. */
+	SF_FORMAT_WAV			= 0x010000,		/* Microsoft WAV format (little endian default). */
+	SF_FORMAT_AIFF			= 0x020000,		/* Apple/SGI AIFF format (big endian). */
+	SF_FORMAT_AU			= 0x030000,		/* Sun/NeXT AU format (big endian). */
+	SF_FORMAT_RAW			= 0x040000,		/* RAW PCM data. */
+	SF_FORMAT_PAF			= 0x050000,		/* Ensoniq PARIS file format. */
+	SF_FORMAT_SVX			= 0x060000,		/* Amiga IFF / SVX8 / SV16 format. */
+	SF_FORMAT_NIST			= 0x070000,		/* Sphere NIST format. */
+	SF_FORMAT_VOC			= 0x080000,		/* VOC files. */
+	SF_FORMAT_IRCAM			= 0x0A0000,		/* Berkeley/IRCAM/CARL */
+	SF_FORMAT_W64			= 0x0B0000,		/* Sonic Foundry's 64 bit RIFF/WAV */
+	SF_FORMAT_MAT4			= 0x0C0000,		/* Matlab (tm) V4.2 / GNU Octave 2.0 */
+	SF_FORMAT_MAT5			= 0x0D0000,		/* Matlab (tm) V5.0 / GNU Octave 2.1 */
+	SF_FORMAT_PVF			= 0x0E0000,		/* Portable Voice Format */
+	SF_FORMAT_XI			= 0x0F0000,		/* Fasttracker 2 Extended Instrument */
+	SF_FORMAT_HTK			= 0x100000,		/* HMM Tool Kit format */
+	SF_FORMAT_SDS			= 0x110000,		/* Midi Sample Dump Standard */
+	SF_FORMAT_AVR			= 0x120000,		/* Audio Visual Research */
+	SF_FORMAT_WAVEX			= 0x130000,		/* MS WAVE with WAVEFORMATEX */
+	SF_FORMAT_SD2			= 0x160000,		/* Sound Designer 2 */
+	SF_FORMAT_FLAC			= 0x170000,		/* FLAC lossless file format */
+	SF_FORMAT_CAF			= 0x180000,		/* Core Audio File format */
+	SF_FORMAT_WVE			= 0x190000,		/* Psion WVE format */
+	SF_FORMAT_OGG			= 0x200000,		/* Xiph OGG container */
+	SF_FORMAT_MPC2K			= 0x210000,		/* Akai MPC 2000 sampler */
+	SF_FORMAT_RF64			= 0x220000,		/* RF64 WAV file */
+
+	/* Subtypes from here on. */
+
+	SF_FORMAT_PCM_S8		= 0x0001,		/* Signed 8 bit data */
+	SF_FORMAT_PCM_16		= 0x0002,		/* Signed 16 bit data */
+	SF_FORMAT_PCM_24		= 0x0003,		/* Signed 24 bit data */
+	SF_FORMAT_PCM_32		= 0x0004,		/* Signed 32 bit data */
+
+	SF_FORMAT_PCM_U8		= 0x0005,		/* Unsigned 8 bit data (WAV and RAW only) */
+
+	SF_FORMAT_FLOAT			= 0x0006,		/* 32 bit float data */
+	SF_FORMAT_DOUBLE		= 0x0007,		/* 64 bit float data */
+
+	SF_FORMAT_ULAW			= 0x0010,		/* U-Law encoded. */
+	SF_FORMAT_ALAW			= 0x0011,		/* A-Law encoded. */
+	SF_FORMAT_IMA_ADPCM		= 0x0012,		/* IMA ADPCM. */
+	SF_FORMAT_MS_ADPCM		= 0x0013,		/* Microsoft ADPCM. */
+
+	SF_FORMAT_GSM610		= 0x0020,		/* GSM 6.10 encoding. */
+	SF_FORMAT_VOX_ADPCM		= 0x0021,		/* OKI / Dialogix ADPCM */
+
+	SF_FORMAT_G721_32		= 0x0030,		/* 32kbs G721 ADPCM encoding. */
+	SF_FORMAT_G723_24		= 0x0031,		/* 24kbs G723 ADPCM encoding. */
+	SF_FORMAT_G723_40		= 0x0032,		/* 40kbs G723 ADPCM encoding. */
+
+	SF_FORMAT_DWVW_12		= 0x0040, 		/* 12 bit Delta Width Variable Word encoding. */
+	SF_FORMAT_DWVW_16		= 0x0041, 		/* 16 bit Delta Width Variable Word encoding. */
+	SF_FORMAT_DWVW_24		= 0x0042, 		/* 24 bit Delta Width Variable Word encoding. */
+	SF_FORMAT_DWVW_N		= 0x0043, 		/* N bit Delta Width Variable Word encoding. */
+
+	SF_FORMAT_DPCM_8		= 0x0050,		/* 8 bit differential PCM (XI only) */
+	SF_FORMAT_DPCM_16		= 0x0051,		/* 16 bit differential PCM (XI only) */
+
+	SF_FORMAT_VORBIS		= 0x0060,		/* Xiph Vorbis encoding. */
+
+	/* Endian-ness options. */
+
+	SF_ENDIAN_FILE			= 0x00000000,	/* Default file endian-ness. */
+	SF_ENDIAN_LITTLE		= 0x10000000,	/* Force little endian-ness. */
+	SF_ENDIAN_BIG			= 0x20000000,	/* Force big endian-ness. */
+	SF_ENDIAN_CPU			= 0x30000000,	/* Force CPU endian-ness. */
+
+	SF_FORMAT_SUBMASK		= 0x0000FFFF,
+	SF_FORMAT_TYPEMASK		= 0x0FFF0000,
+	SF_FORMAT_ENDMASK		= 0x30000000
+} ;
+
+/*
+** The following are the valid command numbers for the sf_command()
+** interface.  The use of these commands is documented in the file
+** command.html in the doc directory of the source code distribution.
+*/
+
+enum
+{	SFC_GET_LIB_VERSION				= 0x1000,
+	SFC_GET_LOG_INFO				= 0x1001,
+	SFC_GET_CURRENT_SF_INFO			= 0x1002,
+
+
+	SFC_GET_NORM_DOUBLE				= 0x1010,
+	SFC_GET_NORM_FLOAT				= 0x1011,
+	SFC_SET_NORM_DOUBLE				= 0x1012,
+	SFC_SET_NORM_FLOAT				= 0x1013,
+	SFC_SET_SCALE_FLOAT_INT_READ	= 0x1014,
+	SFC_SET_SCALE_INT_FLOAT_WRITE	= 0x1015,
+
+	SFC_GET_SIMPLE_FORMAT_COUNT		= 0x1020,
+	SFC_GET_SIMPLE_FORMAT			= 0x1021,
+
+	SFC_GET_FORMAT_INFO				= 0x1028,
+
+	SFC_GET_FORMAT_MAJOR_COUNT		= 0x1030,
+	SFC_GET_FORMAT_MAJOR			= 0x1031,
+	SFC_GET_FORMAT_SUBTYPE_COUNT	= 0x1032,
+	SFC_GET_FORMAT_SUBTYPE			= 0x1033,
+
+	SFC_CALC_SIGNAL_MAX				= 0x1040,
+	SFC_CALC_NORM_SIGNAL_MAX		= 0x1041,
+	SFC_CALC_MAX_ALL_CHANNELS		= 0x1042,
+	SFC_CALC_NORM_MAX_ALL_CHANNELS	= 0x1043,
+	SFC_GET_SIGNAL_MAX				= 0x1044,
+	SFC_GET_MAX_ALL_CHANNELS		= 0x1045,
+
+	SFC_SET_ADD_PEAK_CHUNK			= 0x1050,
+	SFC_SET_ADD_HEADER_PAD_CHUNK	= 0x1051,
+
+	SFC_UPDATE_HEADER_NOW			= 0x1060,
+	SFC_SET_UPDATE_HEADER_AUTO		= 0x1061,
+
+	SFC_FILE_TRUNCATE				= 0x1080,
+
+	SFC_SET_RAW_START_OFFSET		= 0x1090,
+
+	SFC_SET_DITHER_ON_WRITE			= 0x10A0,
+	SFC_SET_DITHER_ON_READ			= 0x10A1,
+
+	SFC_GET_DITHER_INFO_COUNT		= 0x10A2,
+	SFC_GET_DITHER_INFO				= 0x10A3,
+
+	SFC_GET_EMBED_FILE_INFO			= 0x10B0,
+
+	SFC_SET_CLIPPING				= 0x10C0,
+	SFC_GET_CLIPPING				= 0x10C1,
+
+	SFC_GET_INSTRUMENT				= 0x10D0,
+	SFC_SET_INSTRUMENT				= 0x10D1,
+
+	SFC_GET_LOOP_INFO				= 0x10E0,
+
+	SFC_GET_BROADCAST_INFO			= 0x10F0,
+	SFC_SET_BROADCAST_INFO			= 0x10F1,
+
+	SFC_GET_CHANNEL_MAP_INFO		= 0x1100,
+	SFC_SET_CHANNEL_MAP_INFO		= 0x1101,
+
+	SFC_RAW_DATA_NEEDS_ENDSWAP		= 0x1110,
+
+	/* Support for Wavex Ambisonics Format */
+	SFC_WAVEX_SET_AMBISONIC			= 0x1200,
+	SFC_WAVEX_GET_AMBISONIC			= 0x1201,
+
+	SFC_SET_VBR_ENCODING_QUALITY	= 0x1300,
+
+	/* Following commands for testing only. */
+	SFC_TEST_IEEE_FLOAT_REPLACE		= 0x6001,
+
+	/*
+	** SFC_SET_ADD_* values are deprecated and will disappear at some
+	** time in the future. They are guaranteed to be here up to and
+	** including version 1.0.8 to avoid breakage of existng software.
+	** They currently do nothing and will continue to do nothing.
+	*/
+	SFC_SET_ADD_DITHER_ON_WRITE		= 0x1070,
+	SFC_SET_ADD_DITHER_ON_READ		= 0x1071
+} ;
+
+
+/*
+** String types that can be set and read from files. Not all file types
+** support this and even the file types which support one, may not support
+** all string types.
+*/
+
+enum
+{	SF_STR_TITLE					= 0x01,
+	SF_STR_COPYRIGHT				= 0x02,
+	SF_STR_SOFTWARE					= 0x03,
+	SF_STR_ARTIST					= 0x04,
+	SF_STR_COMMENT					= 0x05,
+	SF_STR_DATE						= 0x06,
+	SF_STR_ALBUM					= 0x07,
+	SF_STR_LICENSE					= 0x08,
+	SF_STR_TRACKNUMBER				= 0x09,
+	SF_STR_GENRE					= 0x10
+} ;
+
+/*
+** Use the following as the start and end index when doing metadata
+** transcoding.
+*/
+
+#define	SF_STR_FIRST	SF_STR_TITLE
+#define	SF_STR_LAST		SF_STR_GENRE
+
+enum
+{	/* True and false */
+	SF_FALSE	= 0,
+	SF_TRUE		= 1,
+
+	/* Modes for opening files. */
+	SFM_READ	= 0x10,
+	SFM_WRITE	= 0x20,
+	SFM_RDWR	= 0x30,
+
+	SF_AMBISONIC_NONE		= 0x40,
+	SF_AMBISONIC_B_FORMAT	= 0x41
+} ;
+
+/* Public error values. These are guaranteed to remain unchanged for the duration
+** of the library major version number.
+** There are also a large number of private error numbers which are internal to
+** the library which can change at any time.
+*/
+
+enum
+{	SF_ERR_NO_ERROR				= 0,
+	SF_ERR_UNRECOGNISED_FORMAT	= 1,
+	SF_ERR_SYSTEM				= 2,
+	SF_ERR_MALFORMED_FILE		= 3,
+	SF_ERR_UNSUPPORTED_ENCODING	= 4
+} ;
+
+
+/* Channel map values (used with SFC_SET/GET_CHANNEL_MAP).
+*/
+
+enum
+{	SF_CHANNEL_MAP_INVALID = 0,
+	SF_CHANNEL_MAP_MONO = 1,
+	SF_CHANNEL_MAP_LEFT,					/* Apple calls this 'Left' */
+	SF_CHANNEL_MAP_RIGHT,					/* Apple calls this 'Right' */
+	SF_CHANNEL_MAP_CENTER,					/* Apple calls this 'Center' */
+	SF_CHANNEL_MAP_FRONT_LEFT,
+	SF_CHANNEL_MAP_FRONT_RIGHT,
+	SF_CHANNEL_MAP_FRONT_CENTER,
+	SF_CHANNEL_MAP_REAR_CENTER,				/* Apple calls this 'Center Surround', Msft calls this 'Back Center' */
+	SF_CHANNEL_MAP_REAR_LEFT,				/* Apple calls this 'Left Surround', Msft calls this 'Back Left' */
+	SF_CHANNEL_MAP_REAR_RIGHT,				/* Apple calls this 'Right Surround', Msft calls this 'Back Right' */
+	SF_CHANNEL_MAP_LFE,						/* Apple calls this 'LFEScreen', Msft calls this 'Low Frequency'  */
+	SF_CHANNEL_MAP_FRONT_LEFT_OF_CENTER,	/* Apple calls this 'Left Center' */
+	SF_CHANNEL_MAP_FRONT_RIGHT_OF_CENTER,	/* Apple calls this 'Right Center */
+	SF_CHANNEL_MAP_SIDE_LEFT,				/* Apple calls this 'Left Surround Direct' */
+	SF_CHANNEL_MAP_SIDE_RIGHT,				/* Apple calls this 'Right Surround Direct' */
+	SF_CHANNEL_MAP_TOP_CENTER,				/* Apple calls this 'Top Center Surround' */
+	SF_CHANNEL_MAP_TOP_FRONT_LEFT,			/* Apple calls this 'Vertical Height Left' */
+	SF_CHANNEL_MAP_TOP_FRONT_RIGHT,			/* Apple calls this 'Vertical Height Right' */
+	SF_CHANNEL_MAP_TOP_FRONT_CENTER,		/* Apple calls this 'Vertical Height Center' */
+	SF_CHANNEL_MAP_TOP_REAR_LEFT,			/* Apple and MS call this 'Top Back Left' */
+	SF_CHANNEL_MAP_TOP_REAR_RIGHT,			/* Apple and MS call this 'Top Back Right' */
+	SF_CHANNEL_MAP_TOP_REAR_CENTER,			/* Apple and MS call this 'Top Back Center' */
+
+	SF_CHANNEL_MAP_AMBISONIC_B_W,
+	SF_CHANNEL_MAP_AMBISONIC_B_X,
+	SF_CHANNEL_MAP_AMBISONIC_B_Y,
+	SF_CHANNEL_MAP_AMBISONIC_B_Z,
+
+	SF_CHANNEL_MAP_MAX
+} ;
+
+
+/* A SNDFILE* pointer can be passed around much like stdio.h's FILE* pointer. */
+
+typedef	struct SNDFILE_tag	SNDFILE ;
+
+/* The following typedef is system specific and is defined when libsndfile is
+** compiled. sf_count_t will be a 64 bit value when the underlying OS allows
+** 64 bit file offsets.
+** On windows, we need to allow the same header file to be compiler by both GCC
+** and the Microsoft compiler.
+*/
+
+#if (defined (_MSCVER) || defined (_MSC_VER))
+typedef __int64		sf_count_t ;
+#define SF_COUNT_MAX		0x7fffffffffffffffi64
+#else
+typedef @TYPEOF_SF_COUNT_T@	sf_count_t ;
+#define SF_COUNT_MAX		@SF_COUNT_MAX@
+#endif
+
+
+/* A pointer to a SF_INFO structure is passed to sf_open () and filled in.
+** On write, the SF_INFO structure is filled in by the user and passed into
+** sf_open ().
+*/
+
+struct SF_INFO
+{	sf_count_t	frames ;		/* Used to be called samples.  Changed to avoid confusion. */
+	int			samplerate ;
+	int			channels ;
+	int			format ;
+	int			sections ;
+	int			seekable ;
+} ;
+
+typedef	struct SF_INFO SF_INFO ;
+
+/* The SF_FORMAT_INFO struct is used to retrieve information about the sound
+** file formats libsndfile supports using the sf_command () interface.
+**
+** Using this interface will allow applications to support new file formats
+** and encoding types when libsndfile is upgraded, without requiring
+** re-compilation of the application.
+**
+** Please consult the libsndfile documentation (particularly the information
+** on the sf_command () interface) for examples of its use.
+*/
+
+typedef struct
+{	int			format ;
+	const char	*name ;
+	const char	*extension ;
+} SF_FORMAT_INFO ;
+
+/*
+** Enums and typedefs for adding dither on read and write.
+** See the html documentation for sf_command(), SFC_SET_DITHER_ON_WRITE
+** and SFC_SET_DITHER_ON_READ.
+*/
+
+enum
+{	SFD_DEFAULT_LEVEL	= 0,
+	SFD_CUSTOM_LEVEL	= 0x40000000,
+
+	SFD_NO_DITHER		= 500,
+	SFD_WHITE			= 501,
+	SFD_TRIANGULAR_PDF	= 502
+} ;
+
+typedef struct
+{	int			type ;
+	double		level ;
+	const char	*name ;
+} SF_DITHER_INFO ;
+
+/* Struct used to retrieve information about a file embedded within a
+** larger file. See SFC_GET_EMBED_FILE_INFO.
+*/
+
+typedef struct
+{	sf_count_t	offset ;
+	sf_count_t	length ;
+} SF_EMBED_FILE_INFO ;
+
+/*
+**	Structs used to retrieve music sample information from a file.
+*/
+
+enum
+{	/*
+	**	The loop mode field in SF_INSTRUMENT will be one of the following.
+	*/
+	SF_LOOP_NONE = 800,
+	SF_LOOP_FORWARD,
+	SF_LOOP_BACKWARD,
+	SF_LOOP_ALTERNATING
+} ;
+
+typedef struct
+{	int gain ;
+	char basenote, detune ;
+	char velocity_lo, velocity_hi ;
+	char key_lo, key_hi ;
+	int loop_count ;
+
+	struct
+	{	int mode ;
+		unsigned int start ;
+		unsigned int end ;
+		unsigned int count ;
+	} loops [16] ; /* make variable in a sensible way */
+} SF_INSTRUMENT ;
+
+
+
+/* Struct used to retrieve loop information from a file.*/
+typedef struct
+{
+	short	time_sig_num ;	/* any positive integer    > 0  */
+	short	time_sig_den ;	/* any positive power of 2 > 0  */
+	int		loop_mode ;		/* see SF_LOOP enum             */
+
+	int		num_beats ;		/* this is NOT the amount of quarter notes !!!*/
+							/* a full bar of 4/4 is 4 beats */
+							/* a full bar of 7/8 is 7 beats */
+
+	float	bpm ;			/* suggestion, as it can be calculated using other fields:*/
+							/* file's lenght, file's sampleRate and our time_sig_den*/
+							/* -> bpms are always the amount of _quarter notes_ per minute */
+
+	int	root_key ;			/* MIDI note, or -1 for None */
+	int future [6] ;
+} SF_LOOP_INFO ;
+
+
+/*	Struct used to retrieve broadcast (EBU) information from a file.
+**	Strongly (!) based on EBU "bext" chunk format used in Broadcast WAVE.
+*/
+#define	SF_BROADCAST_INFO_VAR(coding_hist_size) \
+			struct \
+			{	char			description [256] ; \
+				char			originator [32] ; \
+				char			originator_reference [32] ; \
+				char			origination_date [10] ; \
+				char			origination_time [8] ; \
+				unsigned int	time_reference_low ; \
+				unsigned int	time_reference_high ; \
+				short			version ; \
+				char			umid [64] ; \
+				char			reserved [190] ; \
+				unsigned int	coding_history_size ; \
+				char			coding_history [coding_hist_size] ; \
+			}
+
+/* SF_BROADCAST_INFO is the above struct with coding_history field of 256 bytes. */
+typedef SF_BROADCAST_INFO_VAR (256) SF_BROADCAST_INFO ;
+
+
+/*	Virtual I/O functionality. */
+
+typedef sf_count_t		(*sf_vio_get_filelen)	(void *user_data) ;
+typedef sf_count_t		(*sf_vio_seek)		(sf_count_t offset, int whence, void *user_data) ;
+typedef sf_count_t		(*sf_vio_read)		(void *ptr, sf_count_t count, void *user_data) ;
+typedef sf_count_t		(*sf_vio_write)		(const void *ptr, sf_count_t count, void *user_data) ;
+typedef sf_count_t		(*sf_vio_tell)		(void *user_data) ;
+
+struct SF_VIRTUAL_IO
+{	sf_vio_get_filelen	get_filelen ;
+	sf_vio_seek			seek ;
+	sf_vio_read			read ;
+	sf_vio_write		write ;
+	sf_vio_tell			tell ;
+} ;
+
+typedef	struct SF_VIRTUAL_IO SF_VIRTUAL_IO ;
+
+
+/* Open the specified file for read, write or both. On error, this will
+** return a NULL pointer. To find the error number, pass a NULL SNDFILE
+** to sf_strerror ().
+** All calls to sf_open() should be matched with a call to sf_close().
+*/
+
+SNDFILE* 	sf_open		(const char *path, int mode, SF_INFO *sfinfo) ;
+
+
+/* Use the existing file descriptor to create a SNDFILE object. If close_desc
+** is TRUE, the file descriptor will be closed when sf_close() is called. If
+** it is FALSE, the descritor will not be closed.
+** When passed a descriptor like this, the library will assume that the start
+** of file header is at the current file offset. This allows sound files within
+** larger container files to be read and/or written.
+** On error, this will return a NULL pointer. To find the error number, pass a
+** NULL SNDFILE to sf_strerror ().
+** All calls to sf_open_fd() should be matched with a call to sf_close().
+
+*/
+
+SNDFILE* 	sf_open_fd	(int fd, int mode, SF_INFO *sfinfo, int close_desc) ;
+
+SNDFILE* 	sf_open_virtual	(SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo, void *user_data) ;
+
+
+/* sf_error () returns a error number which can be translated to a text
+** string using sf_error_number().
+*/
+
+int		sf_error		(SNDFILE *sndfile) ;
+
+
+/* sf_strerror () returns to the caller a pointer to the current error message for
+** the given SNDFILE.
+*/
+
+const char* sf_strerror (SNDFILE *sndfile) ;
+
+
+/* sf_error_number () allows the retrieval of the error string for each internal
+** error number.
+**
+*/
+
+const char*	sf_error_number	(int errnum) ;
+
+
+/* The following two error functions are deprecated but they will remain in the
+** library for the forseeable future. The function sf_strerror() should be used
+** in their place.
+*/
+
+int		sf_perror		(SNDFILE *sndfile) ;
+int		sf_error_str	(SNDFILE *sndfile, char* str, size_t len) ;
+
+
+/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */
+
+int		sf_command	(SNDFILE *sndfile, int command, 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) ;
+
+
+/* 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 function fseek ().
+** 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)
+** samples from the start of the file.
+** Please see the libsndfile documentation for moving the read pointer
+** separately from the write pointer on files open in mode SFM_RDWR.
+** On error all of these functions return -1.
+*/
+
+sf_count_t	sf_seek 		(SNDFILE *sndfile, sf_count_t frames, int whence) ;
+
+
+/* Functions for retrieving and setting string data within sound files.
+** Not all file types support this features; AIFF and WAV do. For both
+** functions, the str_type parameter must be one of the SF_STR_* values
+** defined above.
+** On error, sf_set_string() returns non-zero while sf_get_string()
+** returns NULL.
+*/
+
+int sf_set_string (SNDFILE *sndfile, int str_type, const char* str) ;
+
+const char* sf_get_string (SNDFILE *sndfile, int str_type) ;
+
+
+/* Return the library version string. */
+
+const char * sf_version_string (void) ;
+
+
+/* Functions for reading/writing the waveform data of a sound file.
+*/
+
+sf_count_t	sf_read_raw		(SNDFILE *sndfile, void *ptr, sf_count_t bytes) ;
+sf_count_t	sf_write_raw 	(SNDFILE *sndfile, const void *ptr, sf_count_t bytes) ;
+
+
+/* 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_short	passes data in the native short format
+**     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
+** All of these read/write function return number of frames read/written.
+*/
+
+sf_count_t	sf_readf_short	(SNDFILE *sndfile, short *ptr, sf_count_t frames) ;
+sf_count_t	sf_writef_short	(SNDFILE *sndfile, const short *ptr, sf_count_t frames) ;
+
+sf_count_t	sf_readf_int	(SNDFILE *sndfile, int *ptr, sf_count_t frames) ;
+sf_count_t	sf_writef_int 	(SNDFILE *sndfile, const int *ptr, sf_count_t frames) ;
+
+sf_count_t	sf_readf_float	(SNDFILE *sndfile, float *ptr, sf_count_t frames) ;
+sf_count_t	sf_writef_float	(SNDFILE *sndfile, const float *ptr, sf_count_t frames) ;
+
+sf_count_t	sf_readf_double		(SNDFILE *sndfile, double *ptr, sf_count_t frames) ;
+sf_count_t	sf_writef_double	(SNDFILE *sndfile, const double *ptr, sf_count_t frames) ;
+
+
+/* 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.
+*/
+
+sf_count_t	sf_read_short	(SNDFILE *sndfile, short *ptr, sf_count_t items) ;
+sf_count_t	sf_write_short	(SNDFILE *sndfile, const short *ptr, sf_count_t items) ;
+
+sf_count_t	sf_read_int		(SNDFILE *sndfile, int *ptr, sf_count_t items) ;
+sf_count_t	sf_write_int 	(SNDFILE *sndfile, const int *ptr, sf_count_t items) ;
+
+sf_count_t	sf_read_float	(SNDFILE *sndfile, float *ptr, sf_count_t items) ;
+sf_count_t	sf_write_float	(SNDFILE *sndfile, const float *ptr, sf_count_t items) ;
+
+sf_count_t	sf_read_double	(SNDFILE *sndfile, double *ptr, sf_count_t items) ;
+sf_count_t	sf_write_double	(SNDFILE *sndfile, const double *ptr, sf_count_t items) ;
+
+
+/* Close the SNDFILE and clean up all memory allocations associated with this
+** file.
+** Returns 0 on success, or an error number.
+*/
+
+int		sf_close		(SNDFILE *sndfile) ;
+
+
+/* If the file is opened SFM_WRITE or SFM_RDWR, call fsync() on the file
+** to force the writing of data to disk. If the file is opened SFM_READ
+** no action is taken.
+*/
+
+void	sf_write_sync	(SNDFILE *sndfile) ;
+
+
+
+/* The function sf_wchar_open() is Windows Only!
+** Open a file passing in a Windows Unicode filename. Otherwise, this is
+** the same as sf_open().
+**
+** In order for this to work, you need to do the following:
+**
+**		#include <windows.h>
+**		#define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1
+**		#including <sndfile.h>
+*/
+
+#if (defined (ENABLE_SNDFILE_WINDOWS_PROTOTYPES) && ENABLE_SNDFILE_WINDOWS_PROTOTYPES)
+SNDFILE* sf_wchar_open (LPCWSTR wpath, int mode, SF_INFO *sfinfo) ;
+#endif
+
+
+
+#ifdef __cplusplus
+}		/* extern "C" */
+#endif	/* __cplusplus */
+
+#endif	/* SNDFILE_H */
+
diff --git a/jni/libsndfile-1.0.25/src/sndfile.hh b/jni/libsndfile-1.0.25/src/sndfile.hh
new file mode 100644
index 0000000..d80ec4c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/sndfile.hh
@@ -0,0 +1,422 @@
+/*
+** Copyright (C) 2005-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** All rights reserved.
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**
+**     * Redistributions of source code must retain the above copyright
+**       notice, this list of conditions and the following disclaimer.
+**     * Redistributions in binary form must reproduce the above copyright
+**       notice, this list of conditions and the following disclaimer in
+**       the documentation and/or other materials provided with the
+**       distribution.
+**     * Neither the author nor the names of any contributors may be used
+**       to endorse or promote products derived from this software without
+**       specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+** The above modified BSD style license (GPL and LGPL compatible) applies to
+** this file. It does not apply to libsndfile itself which is released under
+** the GNU LGPL or the libsndfile test suite which is released under the GNU
+** GPL.
+** This means that this header file can be used under this modified BSD style
+** license, but the LGPL still holds for the libsndfile library itself.
+*/
+
+/*
+** sndfile.hh -- A lightweight C++ wrapper for the libsndfile API.
+**
+** All the methods are inlines and all functionality is contained in this
+** file. There is no separate implementation file.
+**
+** API documentation is in the doc/ directory of the source code tarball
+** and at http://www.mega-nerd.com/libsndfile/api.html.
+*/
+
+#ifndef SNDFILE_HH
+#define SNDFILE_HH
+
+#include <sndfile.h>
+
+#include <string>
+#include <new> // for std::nothrow
+
+class SndfileHandle
+{	private :
+		struct SNDFILE_ref
+		{	SNDFILE_ref (void) ;
+			~SNDFILE_ref (void) ;
+
+			SNDFILE *sf ;
+			SF_INFO sfinfo ;
+			int ref ;
+			} ;
+
+		SNDFILE_ref *p ;
+
+	public :
+			/* Default constructor */
+			SndfileHandle (void) : p (NULL) {} ;
+			SndfileHandle (const char *path, int mode = SFM_READ,
+							int format = 0, int channels = 0, int samplerate = 0) ;
+			SndfileHandle (std::string const & path, int mode = SFM_READ,
+							int format = 0, int channels = 0, int samplerate = 0) ;
+			SndfileHandle (int fd, bool close_desc, int mode = SFM_READ,
+							int format = 0, int channels = 0, int samplerate = 0) ;
+
+#ifdef ENABLE_SNDFILE_WINDOWS_PROTOTYPES
+			SndfileHandle (LPCWSTR wpath, int mode = SFM_READ,
+							int format = 0, int channels = 0, int samplerate = 0) ;
+#endif
+
+			~SndfileHandle (void) ;
+
+			SndfileHandle (const SndfileHandle &orig) ;
+			SndfileHandle & operator = (const SndfileHandle &rhs) ;
+
+		/* Mainly for debugging/testing. */
+		int refCount (void) const { return (p == NULL) ? 0 : p->ref ; }
+
+		operator bool () const { return (p != NULL) ; }
+
+		bool operator == (const SndfileHandle &rhs) const { return (p == rhs.p) ; }
+
+		sf_count_t	frames (void) const		{ return p ? p->sfinfo.frames : 0 ; }
+		int			format (void) const		{ return p ? p->sfinfo.format : 0 ; }
+		int			channels (void) const	{ return p ? p->sfinfo.channels : 0 ; }
+		int			samplerate (void) const { return p ? p->sfinfo.samplerate : 0 ; }
+
+		int error (void) const ;
+		const char * strError (void) const ;
+
+		int command (int cmd, void *data, int datasize) ;
+
+		sf_count_t	seek (sf_count_t frames, int whence) ;
+
+		void writeSync (void) ;
+
+		int setString (int str_type, const char* str) ;
+
+		const char* getString (int str_type) const ;
+
+		static int formatCheck (int format, int channels, int samplerate) ;
+
+		sf_count_t read (short *ptr, sf_count_t items) ;
+		sf_count_t read (int *ptr, sf_count_t items) ;
+		sf_count_t read (float *ptr, sf_count_t items) ;
+		sf_count_t read (double *ptr, sf_count_t items) ;
+
+		sf_count_t write (const short *ptr, sf_count_t items) ;
+		sf_count_t write (const int *ptr, sf_count_t items) ;
+		sf_count_t write (const float *ptr, sf_count_t items) ;
+		sf_count_t write (const double *ptr, sf_count_t items) ;
+
+		sf_count_t readf (short *ptr, sf_count_t frames) ;
+		sf_count_t readf (int *ptr, sf_count_t frames) ;
+		sf_count_t readf (float *ptr, sf_count_t frames) ;
+		sf_count_t readf (double *ptr, sf_count_t frames) ;
+
+		sf_count_t writef (const short *ptr, sf_count_t frames) ;
+		sf_count_t writef (const int *ptr, sf_count_t frames) ;
+		sf_count_t writef (const float *ptr, sf_count_t frames) ;
+		sf_count_t writef (const double *ptr, sf_count_t frames) ;
+
+		sf_count_t	readRaw		(void *ptr, sf_count_t bytes) ;
+		sf_count_t	writeRaw	(const void *ptr, sf_count_t bytes) ;
+
+		/**< Raw access to the handle. SndfileHandle keeps ownership. */
+		SNDFILE * rawHandle (void) ;
+
+		/**< Take ownership of handle, iff reference count is 1. */
+		SNDFILE * takeOwnership (void) ;
+} ;
+
+/*==============================================================================
+**	Nothing but implementation below.
+*/
+
+inline
+SndfileHandle::SNDFILE_ref::SNDFILE_ref (void)
+: ref (1)
+{}
+
+inline
+SndfileHandle::SNDFILE_ref::~SNDFILE_ref (void)
+{	if (sf != NULL) sf_close (sf) ; }
+
+inline
+SndfileHandle::SndfileHandle (const char *path, int mode, int fmt, int chans, int srate)
+: p (NULL)
+{
+	p = new (std::nothrow) SNDFILE_ref () ;
+
+	if (p != NULL)
+	{	p->ref = 1 ;
+
+		p->sfinfo.frames = 0 ;
+		p->sfinfo.channels = chans ;
+		p->sfinfo.format = fmt ;
+		p->sfinfo.samplerate = srate ;
+		p->sfinfo.sections = 0 ;
+		p->sfinfo.seekable = 0 ;
+
+		p->sf = sf_open (path, mode, &p->sfinfo) ;
+		} ;
+
+	return ;
+} /* SndfileHandle const char * constructor */
+
+inline
+SndfileHandle::SndfileHandle (std::string const & path, int mode, int fmt, int chans, int srate)
+: p (NULL)
+{
+	p = new (std::nothrow) SNDFILE_ref () ;
+
+	if (p != NULL)
+	{	p->ref = 1 ;
+
+		p->sfinfo.frames = 0 ;
+		p->sfinfo.channels = chans ;
+		p->sfinfo.format = fmt ;
+		p->sfinfo.samplerate = srate ;
+		p->sfinfo.sections = 0 ;
+		p->sfinfo.seekable = 0 ;
+
+		p->sf = sf_open (path.c_str (), mode, &p->sfinfo) ;
+		} ;
+
+	return ;
+} /* SndfileHandle std::string constructor */
+
+inline
+SndfileHandle::SndfileHandle (int fd, bool close_desc, int mode, int fmt, int chans, int srate)
+: p (NULL)
+{
+	if (fd < 0)
+		return ;
+
+	p = new (std::nothrow) SNDFILE_ref () ;
+
+	if (p != NULL)
+	{	p->ref = 1 ;
+
+		p->sfinfo.frames = 0 ;
+		p->sfinfo.channels = chans ;
+		p->sfinfo.format = fmt ;
+		p->sfinfo.samplerate = srate ;
+		p->sfinfo.sections = 0 ;
+		p->sfinfo.seekable = 0 ;
+
+		p->sf = sf_open_fd (fd, mode, &p->sfinfo, close_desc) ;
+		} ;
+
+	return ;
+} /* SndfileHandle fd constructor */
+
+inline
+SndfileHandle::~SndfileHandle (void)
+{	if (p != NULL && --p->ref == 0)
+		delete p ;
+} /* SndfileHandle destructor */
+
+
+inline
+SndfileHandle::SndfileHandle (const SndfileHandle &orig)
+: p (orig.p)
+{	if (p != NULL)
+		++p->ref ;
+} /* SndfileHandle copy constructor */
+
+inline SndfileHandle &
+SndfileHandle::operator = (const SndfileHandle &rhs)
+{
+	if (&rhs == this)
+		return *this ;
+	if (p != NULL && --p->ref == 0)
+		delete p ;
+
+	p = rhs.p ;
+	if (p != NULL)
+		++p->ref ;
+
+	return *this ;
+} /* SndfileHandle assignment operator */
+
+inline int
+SndfileHandle::error (void) const
+{	return sf_error (p->sf) ; }
+
+inline const char *
+SndfileHandle::strError (void) const
+{	return sf_strerror (p->sf) ; }
+
+inline int
+SndfileHandle::command (int cmd, void *data, int datasize)
+{	return sf_command (p->sf, cmd, data, datasize) ; }
+
+inline sf_count_t
+SndfileHandle::seek (sf_count_t frame_count, int whence)
+{	return sf_seek (p->sf, frame_count, whence) ; }
+
+inline void
+SndfileHandle::writeSync (void)
+{	sf_write_sync (p->sf) ; }
+
+inline int
+SndfileHandle::setString (int str_type, const char* str)
+{	return sf_set_string (p->sf, str_type, str) ; }
+
+inline const char*
+SndfileHandle::getString (int str_type) const
+{	return sf_get_string (p->sf, str_type) ; }
+
+inline int
+SndfileHandle::formatCheck (int fmt, int chans, int srate)
+{
+	SF_INFO sfinfo ;
+
+	sfinfo.frames = 0 ;
+	sfinfo.channels = chans ;
+	sfinfo.format = fmt ;
+	sfinfo.samplerate = srate ;
+	sfinfo.sections = 0 ;
+	sfinfo.seekable = 0 ;
+
+	return sf_format_check (&sfinfo) ;
+}
+
+/*---------------------------------------------------------------------*/
+
+inline sf_count_t
+SndfileHandle::read (short *ptr, sf_count_t items)
+{	return sf_read_short (p->sf, ptr, items) ; }
+
+inline sf_count_t
+SndfileHandle::read (int *ptr, sf_count_t items)
+{	return sf_read_int (p->sf, ptr, items) ; }
+
+inline sf_count_t
+SndfileHandle::read (float *ptr, sf_count_t items)
+{	return sf_read_float (p->sf, ptr, items) ; }
+
+inline sf_count_t
+SndfileHandle::read (double *ptr, sf_count_t items)
+{	return sf_read_double (p->sf, ptr, items) ; }
+
+inline sf_count_t
+SndfileHandle::write (const short *ptr, sf_count_t items)
+{	return sf_write_short (p->sf, ptr, items) ; }
+
+inline sf_count_t
+SndfileHandle::write (const int *ptr, sf_count_t items)
+{	return sf_write_int (p->sf, ptr, items) ; }
+
+inline sf_count_t
+SndfileHandle::write (const float *ptr, sf_count_t items)
+{	return sf_write_float (p->sf, ptr, items) ; }
+
+inline sf_count_t
+SndfileHandle::write (const double *ptr, sf_count_t items)
+{	return sf_write_double (p->sf, ptr, items) ; }
+
+inline sf_count_t
+SndfileHandle::readf (short *ptr, sf_count_t frame_count)
+{	return sf_readf_short (p->sf, ptr, frame_count) ; }
+
+inline sf_count_t
+SndfileHandle::readf (int *ptr, sf_count_t frame_count)
+{	return sf_readf_int (p->sf, ptr, frame_count) ; }
+
+inline sf_count_t
+SndfileHandle::readf (float *ptr, sf_count_t frame_count)
+{	return sf_readf_float (p->sf, ptr, frame_count) ; }
+
+inline sf_count_t
+SndfileHandle::readf (double *ptr, sf_count_t frame_count)
+{	return sf_readf_double (p->sf, ptr, frame_count) ; }
+
+inline sf_count_t
+SndfileHandle::writef (const short *ptr, sf_count_t frame_count)
+{	return sf_writef_short (p->sf, ptr, frame_count) ; }
+
+inline sf_count_t
+SndfileHandle::writef (const int *ptr, sf_count_t frame_count)
+{	return sf_writef_int (p->sf, ptr, frame_count) ; }
+
+inline sf_count_t
+SndfileHandle::writef (const float *ptr, sf_count_t frame_count)
+{	return sf_writef_float (p->sf, ptr, frame_count) ; }
+
+inline sf_count_t
+SndfileHandle::writef (const double *ptr, sf_count_t frame_count)
+{	return sf_writef_double (p->sf, ptr, frame_count) ; }
+
+inline sf_count_t
+SndfileHandle::readRaw (void *ptr, sf_count_t bytes)
+{	return sf_read_raw (p->sf, ptr, bytes) ; }
+
+inline sf_count_t
+SndfileHandle::writeRaw (const void *ptr, sf_count_t bytes)
+{	return sf_write_raw (p->sf, ptr, bytes) ; }
+
+inline SNDFILE *
+SndfileHandle::rawHandle (void)
+{	return (p ? p->sf : NULL) ; }
+
+inline SNDFILE *
+SndfileHandle::takeOwnership (void)
+{
+	if (p == NULL || (p->ref != 1))
+		return NULL ;
+
+	SNDFILE * sf = p->sf ;
+	p->sf = NULL ;
+	delete p ;
+	p = NULL ;
+	return sf ;
+}
+
+#ifdef ENABLE_SNDFILE_WINDOWS_PROTOTYPES
+
+inline
+SndfileHandle::SndfileHandle (LPCWSTR wpath, int mode, int fmt, int chans, int srate)
+: p (NULL)
+{
+	p = new (std::nothrow) SNDFILE_ref () ;
+
+	if (p != NULL)
+	{	p->ref = 1 ;
+
+		p->sfinfo.frames = 0 ;
+		p->sfinfo.channels = chans ;
+		p->sfinfo.format = fmt ;
+		p->sfinfo.samplerate = srate ;
+		p->sfinfo.sections = 0 ;
+		p->sfinfo.seekable = 0 ;
+
+		p->sf = sf_wchar_open (wpath, mode, &p->sfinfo) ;
+		} ;
+
+	return ;
+} /* SndfileHandle const wchar_t * constructor */
+
+#endif
+
+#endif	/* SNDFILE_HH */
+
diff --git a/jni/libsndfile-1.0.25/src/sndfile.lo b/jni/libsndfile-1.0.25/src/sndfile.lo
new file mode 100644
index 0000000..7bad425
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/sndfile.lo
@@ -0,0 +1,12 @@
+# sndfile.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/sndfile.o'
+
+# Name of the non-PIC object
+non_pic_object='sndfile.o'
+
diff --git a/jni/libsndfile-1.0.25/src/sndfile.o b/jni/libsndfile-1.0.25/src/sndfile.o
new file mode 100644
index 0000000..67c6c1f
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/sndfile.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/stamp-h1 b/jni/libsndfile-1.0.25/src/stamp-h1
new file mode 100644
index 0000000..57ea58e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/stamp-h1
@@ -0,0 +1 @@
+timestamp for src/config.h
diff --git a/jni/libsndfile-1.0.25/src/strings.c b/jni/libsndfile-1.0.25/src/strings.c
new file mode 100644
index 0000000..ce42863
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/strings.c
@@ -0,0 +1,214 @@
+/*
+** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<string.h>
+#include	<math.h>
+
+#include	"sndfile.h"
+#include	"common.h"
+
+#define STRINGS_DEBUG 0
+#if STRINGS_DEBUG
+static void hexdump (void *data, int len) ;
+#endif
+
+int
+psf_store_string (SF_PRIVATE *psf, int str_type, const char *str)
+{	char	new_str [128] ;
+	size_t	len_remaining, str_len ;
+	int		k, str_flags ;
+
+	if (str == NULL)
+		return SFE_STR_BAD_STRING ;
+
+	str_len = strlen (str) ;
+
+	/* A few extra checks for write mode. */
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	if ((psf->str_flags & SF_STR_ALLOW_START) == 0)
+			return SFE_STR_NO_SUPPORT ;
+		if (psf->have_written && (psf->str_flags & SF_STR_ALLOW_END) == 0)
+			return SFE_STR_NO_SUPPORT ;
+		/* Only allow zero length strings for software. */
+		if (str_type != SF_STR_SOFTWARE && str_len == 0)
+			return SFE_STR_BAD_STRING ;
+		} ;
+
+	/* Find the next free slot in table. */
+	for (k = 0 ; k < SF_MAX_STRINGS ; k++)
+	{	/* If we find a matching entry clear it. */
+		if (psf->strings [k].type == str_type)
+			psf->strings [k].type = -1 ;
+
+		if (psf->strings [k].type == 0)
+			break ;
+		} ;
+
+	/* Determine flags */
+	str_flags = SF_STR_LOCATE_START ;
+	if (psf->file.mode == SFM_RDWR || psf->have_written)
+	{	if ((psf->str_flags & SF_STR_ALLOW_END) == 0)
+			return SFE_STR_NO_ADD_END ;
+		str_flags = SF_STR_LOCATE_END ;
+		} ;
+
+	/* More sanity checking. */
+	if (k >= SF_MAX_STRINGS)
+		return SFE_STR_MAX_COUNT ;
+
+	if (k == 0 && psf->str_end != NULL)
+	{	psf_log_printf (psf, "SFE_STR_WEIRD : k == 0 && psf->str_end != NULL\n") ;
+		return SFE_STR_WEIRD ;
+		} ;
+
+	if (k != 0 && psf->str_end == NULL)
+	{	psf_log_printf (psf, "SFE_STR_WEIRD : k != 0 && psf->str_end == NULL\n") ;
+		return SFE_STR_WEIRD ;
+		} ;
+
+	/* Special case for the first string. */
+	if (k == 0)
+		psf->str_end = psf->str_storage ;
+
+	switch (str_type)
+	{	case SF_STR_SOFTWARE :
+				/* In write mode, want to append libsndfile-version to string. */
+				if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+				{	if (strstr (str, PACKAGE) == NULL)
+					{	/*
+						** If the supplied string does not already contain a
+						** libsndfile-X.Y.Z component, then add it.
+						*/
+						if (strlen (str) == 0)
+							snprintf (new_str, sizeof (new_str), "%s-%s", PACKAGE, VERSION) ;
+						else
+							snprintf (new_str, sizeof (new_str), "%s (%s-%s)", str, PACKAGE, VERSION) ;
+						}
+					else
+						snprintf (new_str, sizeof (new_str), "%s", str) ;
+
+					str = new_str ;
+					} ;
+				break ;
+
+		case SF_STR_TITLE :
+		case SF_STR_COPYRIGHT :
+		case SF_STR_ARTIST :
+		case SF_STR_COMMENT :
+		case SF_STR_DATE :
+		case SF_STR_ALBUM :
+		case SF_STR_LICENSE :
+		case SF_STR_TRACKNUMBER :
+		case SF_STR_GENRE :
+				break ;
+
+		default :
+			psf_log_printf (psf, "%s : SFE_STR_BAD_TYPE\n", __func__) ;
+			return SFE_STR_BAD_TYPE ;
+		} ;
+
+	str_len = strlen (str) ;
+
+	len_remaining = SIGNED_SIZEOF (psf->str_storage) - (psf->str_end - psf->str_storage) ;
+
+	if (len_remaining < str_len + 2)
+		return SFE_STR_MAX_DATA ;
+
+	psf->strings [k].type = str_type ;
+	psf->strings [k].str = psf->str_end ;
+	psf->strings [k].flags = str_flags ;
+
+	memcpy (psf->str_end, str, str_len + 1) ;
+	/* Plus one to catch string terminator. */
+	psf->str_end += str_len + 1 ;
+
+	psf->str_flags |= str_flags ;
+
+#if STRINGS_DEBUG
+	psf_log_printf (psf, "str_storage          : %X\n", (int) psf->str_storage) ;
+	psf_log_printf (psf, "str_end              : %X\n", (int) psf->str_end) ;
+	psf_log_printf (psf, "sizeof (str_storage) : %d\n", SIGNED_SIZEOF (psf->str_storage)) ;
+	psf_log_printf (psf, "used                 : %d\n", (int ) (psf->str_end - psf->str_storage)) ;
+	psf_log_printf (psf, "remaining            : %d\n", SIGNED_SIZEOF (psf->str_storage) - (psf->str_end - psf->str_storage)) ;
+
+	hexdump (psf->str_storage, 300) ;
+#endif
+
+	return 0 ;
+} /* psf_store_string */
+
+int
+psf_set_string (SF_PRIVATE *psf, int str_type, const char *str)
+{	if (psf->file.mode == SFM_READ)
+		return SFE_STR_NOT_WRITE ;
+
+	return psf_store_string (psf, str_type, str) ;
+} /* psf_set_string */
+
+const char*
+psf_get_string (SF_PRIVATE *psf, int str_type)
+{	int k ;
+
+	for (k = 0 ; k < SF_MAX_STRINGS ; k++)
+		if (str_type == psf->strings [k].type)
+			return psf->strings [k].str ;
+
+	return NULL ;
+} /* psf_get_string */
+
+int
+psf_location_string_count (const SF_PRIVATE * psf, int location)
+{	int k, count = 0 ;
+
+	for (k = 0 ; k < SF_MAX_STRINGS ; k++)
+		if (psf->strings [k].type > 0 && psf->strings [k].flags & location)
+			count ++ ;
+
+	return count ;
+} /* psf_location_string_count */
+
+/*==============================================================================
+*/
+
+#if STRINGS_DEBUG
+
+#include <ctype.h>
+static void
+hexdump (void *data, int len)
+{	unsigned char *ptr ;
+	int k ;
+
+	ptr = data ;
+
+	puts ("---------------------------------------------------------") ;
+	while (len >= 16)
+	{	for (k = 0 ; k < 16 ; k++)
+			printf ("%02X ", ptr [k] & 0xFF) ;
+		printf ("   ") ;
+		for (k = 0 ; k < 16 ; k++)
+			printf ("%c", psf_isprint (ptr [k]) ? ptr [k] : '.') ;
+		puts ("") ;
+		ptr += 16 ;
+		len -= 16 ;
+		} ;
+} /* hexdump */
+
+#endif
diff --git a/jni/libsndfile-1.0.25/src/strings.lo b/jni/libsndfile-1.0.25/src/strings.lo
new file mode 100644
index 0000000..295ad43
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/strings.lo
@@ -0,0 +1,12 @@
+# strings.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/strings.o'
+
+# Name of the non-PIC object
+non_pic_object='strings.o'
+
diff --git a/jni/libsndfile-1.0.25/src/strings.o b/jni/libsndfile-1.0.25/src/strings.o
new file mode 100644
index 0000000..9afaa1e
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/strings.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/svx.c b/jni/libsndfile-1.0.25/src/svx.c
new file mode 100644
index 0000000..b611f76
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/svx.c
@@ -0,0 +1,416 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdarg.h>
+
+#include "sndfile.h"
+#include "sfendian.h"
+#include "common.h"
+
+
+/*------------------------------------------------------------------------------
+ * Macros to handle big/little endian issues.
+*/
+
+#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'))
+#define VHDR_MARKER	(MAKE_MARKER ('V', 'H', 'D', 'R'))
+#define BODY_MARKER	(MAKE_MARKER ('B', 'O', 'D', 'Y'))
+
+#define ATAK_MARKER	(MAKE_MARKER ('A', 'T', 'A', 'K'))
+#define RLSE_MARKER	(MAKE_MARKER ('R', 'L', 'S', 'E'))
+
+#define c_MARKER	(MAKE_MARKER ('(', 'c', ')', ' '))
+#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 CHAN_MARKER	(MAKE_MARKER ('C', 'H', 'A', 'N'))
+
+/*------------------------------------------------------------------------------
+ * Typedefs for file chunks.
+*/
+
+typedef struct
+{	unsigned int	oneShotHiSamples, repeatHiSamples, samplesPerHiCycle ;
+	unsigned short	samplesPerSec ;
+	unsigned char	octave, compression ;
+	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_write_header (SF_PRIVATE *psf, int calc_length) ;
+static int 	svx_read_header	(SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+svx_open	(SF_PRIVATE *psf)
+{	int error ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = svx_read_header (psf)))
+			return error ;
+
+		psf->endian = SF_ENDIAN_BIG ;			/* All SVX files are big endian. */
+
+		psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+		if (psf->blockwidth)
+			psf->sf.frames = psf->datalength / psf->blockwidth ;
+
+		psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+		} ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	if (psf->is_pipe)
+			return SFE_NO_PIPE_WRITE ;
+
+		if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_SVX)
+			return	SFE_BAD_OPEN_FORMAT ;
+
+		psf->endian = SF_ENDIAN (psf->sf.format) ;
+
+		if (psf->endian == SF_ENDIAN_LITTLE || (CPU_IS_LITTLE_ENDIAN && psf->endian == SF_ENDIAN_CPU))
+			return SFE_BAD_ENDIAN ;
+
+		psf->endian = SF_ENDIAN_BIG ;			/* All SVX files are big endian. */
+
+		error = svx_write_header (psf, SF_FALSE) ;
+		if (error)
+			return error ;
+
+		psf->write_header = svx_write_header ;
+		} ;
+
+	psf->container_close = svx_close ;
+
+	if ((error = pcm_init (psf)))
+		return error ;
+
+	return 0 ;
+} /* svx_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+svx_read_header	(SF_PRIVATE *psf)
+{	VHDR_CHUNK		vhdr ;
+	unsigned int	FORMsize, vhdrsize, dword, marker ;
+	int				filetype = 0, parsestage = 0, done = 0 ;
+	int 			bytecount = 0, channels ;
+
+	if (psf->filelength > SF_PLATFORM_S64 (0xffffffff))
+		psf_log_printf (psf, "Warning : filelength > 0xffffffff. This is bad!!!!\n") ;
+
+	memset (&vhdr, 0, sizeof (vhdr)) ;
+	psf_binheader_readf (psf, "p", 0) ;
+
+	/* Set default number of channels. Modify later if necessary */
+	psf->sf.channels = 1 ;
+
+	psf->sf.format = SF_FORMAT_SVX ;
+
+	while (! done)
+	{	psf_binheader_readf (psf, "m", &marker) ;
+		switch (marker)
+		{	case FORM_MARKER :
+					if (parsestage)
+						return SFE_SVX_NO_FORM ;
+
+					psf_binheader_readf (psf, "E4", &FORMsize) ;
+
+					if (FORMsize != psf->filelength - 2 * sizeof (dword))
+					{	dword = psf->filelength - 2 * sizeof (dword) ;
+						psf_log_printf (psf, "FORM : %d (should be %d)\n", FORMsize, dword) ;
+						FORMsize = dword ;
+						}
+					else
+						psf_log_printf (psf, "FORM : %d\n", FORMsize) ;
+					parsestage |= HAVE_FORM ;
+					break ;
+
+			case SVX8_MARKER :
+			case SV16_MARKER :
+					if (! (parsestage & HAVE_FORM))
+						return SFE_SVX_NO_FORM ;
+					filetype = marker ;
+					psf_log_printf (psf, " %M\n", marker) ;
+					parsestage |= HAVE_SVX ;
+					break ;
+
+			case VHDR_MARKER :
+					if (! (parsestage & (HAVE_FORM | HAVE_SVX)))
+						return SFE_SVX_NO_FORM ;
+
+					psf_binheader_readf (psf, "E4", &vhdrsize) ;
+
+					psf_log_printf (psf, " VHDR : %d\n", vhdrsize) ;
+
+					psf_binheader_readf (psf, "E4442114", &(vhdr.oneShotHiSamples), &(vhdr.repeatHiSamples),
+						&(vhdr.samplesPerHiCycle), &(vhdr.samplesPerSec), &(vhdr.octave), &(vhdr.compression),
+						&(vhdr.volume)) ;
+
+					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_log_printf (psf, "  Compression       : %d => ", vhdr.compression) ;
+
+					switch (vhdr.compression)
+					{	case 0 : psf_log_printf (psf, "None.\n") ;
+								break ;
+						case 1 : psf_log_printf (psf, "Fibonacci delta\n") ;
+								break ;
+						case 2 : psf_log_printf (psf, "Exponential delta\n") ;
+								break ;
+						} ;
+
+					psf_log_printf (psf, "  Volume            : %d\n", vhdr.volume) ;
+
+					psf->sf.samplerate 	= vhdr.samplesPerSec ;
+
+					if (filetype == SVX8_MARKER)
+					{	psf->sf.format |= SF_FORMAT_PCM_S8 ;
+						psf->bytewidth = 1 ;
+						}
+					else if (filetype == SV16_MARKER)
+					{	psf->sf.format |= SF_FORMAT_PCM_16 ;
+						psf->bytewidth = 2 ;
+						} ;
+
+					parsestage |= HAVE_VHDR ;
+					break ;
+
+			case BODY_MARKER :
+					if (! (parsestage & HAVE_VHDR))
+						return SFE_SVX_NO_BODY ;
+
+					psf_binheader_readf (psf, "E4", &dword) ;
+					psf->datalength = dword ;
+
+					psf->dataoffset = psf_ftell (psf) ;
+					if (psf->dataoffset < 0)
+						return SFE_SVX_NO_BODY ;
+
+					if (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_log_printf (psf, " BODY : %D\n", psf->datalength) ;
+
+					parsestage |= HAVE_BODY ;
+
+					if (! psf->sf.seekable)
+						break ;
+
+					psf_fseek (psf, psf->datalength, SEEK_CUR) ;
+					break ;
+
+			case NAME_MARKER :
+					if (! (parsestage & HAVE_SVX))
+						return SFE_SVX_NO_FORM ;
+
+					psf_binheader_readf (psf, "E4", &dword) ;
+
+					psf_log_printf (psf, " %M : %d\n", marker, dword) ;
+
+					if (strlen (psf->file.name.c) != dword)
+					{	if (dword > sizeof (psf->file.name.c) - 1)
+							return SFE_SVX_BAD_NAME_LENGTH ;
+
+						psf_binheader_readf (psf, "b", psf->file.name.c, dword) ;
+						psf->file.name.c [dword] = 0 ;
+						}
+					else
+						psf_binheader_readf (psf, "j", dword) ;
+					break ;
+
+			case ANNO_MARKER :
+					if (! (parsestage & HAVE_SVX))
+						return SFE_SVX_NO_FORM ;
+
+					psf_binheader_readf (psf, "E4", &dword) ;
+
+					psf_log_printf (psf, " %M : %d\n", marker, dword) ;
+
+					psf_binheader_readf (psf, "j", dword) ;
+					break ;
+
+			case CHAN_MARKER :
+					if (! (parsestage & HAVE_SVX))
+						return SFE_SVX_NO_FORM ;
+
+					psf_binheader_readf (psf, "E4", &dword) ;
+
+					psf_log_printf (psf, " %M : %d\n", marker, dword) ;
+
+					bytecount += psf_binheader_readf (psf, "E4", &channels) ;
+
+					if (channels == 2 || channels == 4)
+						psf_log_printf (psf, "  Channels : %d => mono\n", channels) ;
+					else if (channels == 6)
+					{	psf->sf.channels = 2 ;
+						psf_log_printf (psf, "  Channels : %d => stereo\n", channels) ;
+						}
+					else
+						psf_log_printf (psf, "  Channels : %d *** assuming mono\n", channels) ;
+
+					psf_binheader_readf (psf, "j", dword - bytecount) ;
+					break ;
+
+
+			case AUTH_MARKER :
+			case c_MARKER :
+					if (! (parsestage & HAVE_SVX))
+						return SFE_SVX_NO_FORM ;
+
+					psf_binheader_readf (psf, "E4", &dword) ;
+
+					psf_log_printf (psf, " %M : %d\n", marker, dword) ;
+
+					psf_binheader_readf (psf, "j", dword) ;
+					break ;
+
+			default :
+					if (psf_isprint ((marker >> 24) & 0xFF) && psf_isprint ((marker >> 16) & 0xFF)
+						&& psf_isprint ((marker >> 8) & 0xFF) && psf_isprint (marker & 0xFF))
+					{	psf_binheader_readf (psf, "E4", &dword) ;
+
+						psf_log_printf (psf, "%M : %d (unknown marker)\n", marker, dword) ;
+
+						psf_binheader_readf (psf, "j", dword) ;
+						break ;
+						} ;
+					if ((dword = psf_ftell (psf)) & 0x03)
+					{	psf_log_printf (psf, "  Unknown chunk marker at position %d. Resynching.\n", dword - 4) ;
+
+						psf_binheader_readf (psf, "j", -3) ;
+						break ;
+						} ;
+					psf_log_printf (psf, "*** Unknown chunk marker : %X. Exiting parser.\n", marker) ;
+					done = 1 ;
+			} ;	/* switch (marker) */
+
+		if (! psf->sf.seekable && (parsestage & HAVE_BODY))
+			break ;
+
+		if (psf_ftell (psf) >= psf->filelength - SIGNED_SIZEOF (dword))
+			break ;
+		} ; /* while (1) */
+
+	if (vhdr.compression)
+		return SFE_SVX_BAD_COMP ;
+
+	if (psf->dataoffset <= 0)
+		return SFE_SVX_NO_DATA ;
+
+	return 0 ;
+} /* svx_read_header */
+
+static int
+svx_close (SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+		svx_write_header (psf, SF_TRUE) ;
+
+	return 0 ;
+} /* svx_close */
+
+static int
+svx_write_header (SF_PRIVATE *psf, int calc_length)
+{	static	char 	annotation	[] = "libsndfile by Erik de Castro Lopo\0\0\0" ;
+	sf_count_t	current ;
+
+	current = psf_ftell (psf) ;
+
+	if (calc_length)
+	{	psf->filelength = psf_get_filelen (psf) ;
+
+		psf->datalength = psf->filelength - psf->dataoffset ;
+
+		if (psf->dataend)
+			psf->datalength -= psf->filelength - psf->dataend ;
+
+		psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+		} ;
+
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	psf_fseek (psf, 0, SEEK_SET) ;
+
+	/* FORM marker and FORM size. */
+	psf_binheader_writef (psf, "Etm8", FORM_MARKER, (psf->filelength < 8) ?
+			psf->filelength * 0 : psf->filelength - 8) ;
+
+	psf_binheader_writef (psf, "m", (psf->bytewidth == 1) ? SVX8_MARKER : SV16_MARKER) ;
+
+	/* VHDR chunk. */
+	psf_binheader_writef (psf, "Em4", VHDR_MARKER, sizeof (VHDR_CHUNK)) ;
+	/* VHDR : oneShotHiSamples, repeatHiSamples, samplesPerHiCycle */
+	psf_binheader_writef (psf, "E444", psf->sf.frames, 0, 0) ;
+	/* VHDR : samplesPerSec, octave, compression */
+	psf_binheader_writef (psf, "E211", psf->sf.samplerate, 1, 0) ;
+	/* VHDR : volume */
+	psf_binheader_writef (psf, "E4", (psf->bytewidth == 1) ? 0xFF : 0xFFFF) ;
+
+	if (psf->sf.channels == 2)
+		psf_binheader_writef (psf, "Em44", CHAN_MARKER, 4, 6) ;
+
+	/* Filename and annotation strings. */
+	psf_binheader_writef (psf, "Emsms", NAME_MARKER, psf->file.name.c, ANNO_MARKER, annotation) ;
+
+	/* BODY marker and size. */
+	psf_binheader_writef (psf, "Etm8", BODY_MARKER, (psf->datalength < 0) ?
+			psf->datalength * 0 : psf->datalength) ;
+
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+
+	if (psf->error)
+		return psf->error ;
+
+	psf->dataoffset = psf->headindex ;
+
+	if (current > 0)
+		psf_fseek (psf, current, SEEK_SET) ;
+
+	return psf->error ;
+} /* svx_write_header */
+
diff --git a/jni/libsndfile-1.0.25/src/svx.lo b/jni/libsndfile-1.0.25/src/svx.lo
new file mode 100644
index 0000000..2467558
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/svx.lo
@@ -0,0 +1,12 @@
+# svx.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/svx.o'
+
+# Name of the non-PIC object
+non_pic_object='svx.o'
+
diff --git a/jni/libsndfile-1.0.25/src/svx.o b/jni/libsndfile-1.0.25/src/svx.o
new file mode 100644
index 0000000..a21a38b
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/svx.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/test_audio_detect.c b/jni/libsndfile-1.0.25/src/test_audio_detect.c
new file mode 100644
index 0000000..9706249
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/test_audio_detect.c
@@ -0,0 +1,111 @@
+/*
+** Copyright (C) 2007-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <string.h>
+#include <errno.h>
+
+#include "common.h"
+#include "sfendian.h"
+
+#include "test_main.h"
+
+static unsigned char float_le_mono [] =
+{	0x36, 0x86, 0x21, 0x44, 0xB5, 0xB4, 0x49, 0x44, 0xA2, 0xC0, 0x71, 0x44, 0x7B, 0xD1, 0x8C, 0x44,
+	0x54, 0xAA, 0xA0, 0x44, 0x60, 0x67, 0xB4, 0x44, 0x22, 0x05, 0xC8, 0x44, 0x29, 0x80, 0xDB, 0x44,
+	0x04, 0xD5, 0xEE, 0x44, 0x27, 0x00, 0x01, 0x45, 0x50, 0x7F, 0x0A, 0x45, 0x53, 0xE6, 0x13, 0x45,
+	0x85, 0x33, 0x1D, 0x45, 0x43, 0x65, 0x26, 0x45, 0xEC, 0x79, 0x2F, 0x45, 0xE3, 0x6F, 0x38, 0x45,
+	0x98, 0x45, 0x41, 0x45, 0x77, 0xF9, 0x49, 0x45, 0xF6, 0x89, 0x52, 0x45, 0x8F, 0xF5, 0x5A, 0x45,
+	0xC9, 0x3A, 0x63, 0x45, 0x28, 0x58, 0x6B, 0x45, 0x3C, 0x4C, 0x73, 0x45, 0x9F, 0x15, 0x7B, 0x45,
+	0x75, 0x59, 0x81, 0x45, 0x64, 0x11, 0x85, 0x45, 0xF1, 0xB1, 0x88, 0x45, 0x78, 0x3A, 0x8C, 0x45,
+	0x58, 0xAA, 0x8F, 0x45, 0xF2, 0x00, 0x93, 0x45, 0xB2, 0x3D, 0x96, 0x45, 0x01, 0x60, 0x99, 0x45,
+	0x50, 0x67, 0x9C, 0x45, 0x15, 0x53, 0x9F, 0x45, 0xCC, 0x22, 0xA2, 0x45, 0xF0, 0xD5, 0xA4, 0x45,
+	0x07, 0x6C, 0xA7, 0x45, 0x9C, 0xE4, 0xA9, 0x45, 0x3D, 0x3F, 0xAC, 0x45, 0x7A, 0x7B, 0xAE, 0x45,
+	0xF2, 0x98, 0xB0, 0x45, 0x3C, 0x97, 0xB2, 0x45, 0x02, 0x76, 0xB4, 0x45, 0xEC, 0x34, 0xB6, 0x45,
+	0xA8, 0xD3, 0xB7, 0x45, 0xEB, 0x51, 0xB9, 0x45, 0x6F, 0xAF, 0xBA, 0x45, 0xF5, 0xEB, 0xBB, 0x45,
+	0x41, 0x07, 0xBD, 0x45, 0x21, 0x01, 0xBE, 0x45, 0x64, 0xD9, 0xBE, 0x45, 0xE3, 0x8F, 0xBF, 0x45,
+	0x7E, 0x24, 0xC0, 0x45, 0x15, 0x97, 0xC0, 0x45, 0x92, 0xE7, 0xC0, 0x45, 0xE8, 0x15, 0xC1, 0x45,
+	0x7E, 0x24, 0xC0, 0x45, 0x15, 0x97, 0xC0, 0x45, 0x92, 0xE7, 0xC0, 0x45, 0xE8, 0x15, 0xC1, 0x45,
+	0x7E, 0x24, 0xC0, 0x45, 0x15, 0x97, 0xC0, 0x45, 0x92, 0xE7, 0xC0, 0x45, 0xE8, 0x15, 0xC1, 0x45,
+} ;
+
+static unsigned char int24_32_le_stereo [] =
+{
+	0x00, 0xE7, 0xFB, 0xFF, 0x00, 0x7C, 0xFD, 0xFF, 0x00, 0xA2, 0xFC, 0xFF, 0x00, 0x2B, 0xFC, 0xFF,
+	0x00, 0xF3, 0xFD, 0xFF, 0x00, 0x19, 0xFB, 0xFF, 0x00, 0xA5, 0xFE, 0xFF, 0x00, 0x8D, 0xFA, 0xFF,
+	0x00, 0x91, 0xFF, 0xFF, 0x00, 0xB5, 0xFA, 0xFF, 0x00, 0x91, 0x00, 0x00, 0x00, 0x5E, 0xFB, 0xFF,
+	0x00, 0xD9, 0x01, 0x00, 0x00, 0x82, 0xFB, 0xFF, 0x00, 0xDF, 0x03, 0x00, 0x00, 0x44, 0xFC, 0xFF,
+	0x00, 0x1C, 0x05, 0x00, 0x00, 0x77, 0xFC, 0xFF, 0x00, 0x8D, 0x06, 0x00, 0x00, 0x4F, 0xFC, 0xFF,
+	0x00, 0x84, 0x07, 0x00, 0x00, 0x74, 0xFC, 0xFF, 0x00, 0x98, 0x08, 0x00, 0x00, 0x33, 0xFD, 0xFF,
+	0x00, 0xB9, 0x09, 0x00, 0x00, 0x48, 0xFF, 0xFF, 0x00, 0xD1, 0x0A, 0x00, 0x00, 0x10, 0x02, 0x00,
+	0x00, 0x28, 0x0C, 0x00, 0x00, 0xA2, 0x05, 0x00, 0x00, 0xA7, 0x0C, 0x00, 0x00, 0x45, 0x08, 0x00,
+	0x00, 0x44, 0x0D, 0x00, 0x00, 0x1A, 0x0A, 0x00, 0x00, 0x65, 0x0D, 0x00, 0x00, 0x51, 0x0B, 0x00,
+	0x00, 0x8B, 0x0D, 0x00, 0x00, 0x18, 0x0B, 0x00, 0x00, 0x37, 0x0E, 0x00, 0x00, 0x24, 0x0B, 0x00,
+	0x00, 0x00, 0x0F, 0x00, 0x00, 0xDD, 0x0A, 0x00, 0x00, 0x83, 0x10, 0x00, 0x00, 0x31, 0x0A, 0x00,
+	0x00, 0x07, 0x12, 0x00, 0x00, 0xC0, 0x08, 0x00, 0x00, 0xF7, 0x12, 0x00, 0x00, 0x47, 0x06, 0x00,
+	0x00, 0xDD, 0x12, 0x00, 0x00, 0x6A, 0x03, 0x00, 0x00, 0xD5, 0x11, 0x00, 0x00, 0x99, 0x00, 0x00,
+	0x00, 0x01, 0x10, 0x00, 0x00, 0xC5, 0xFE, 0xFF, 0x00, 0xF4, 0x0D, 0x00, 0x00, 0x97, 0xFD, 0xFF,
+	0x00, 0x62, 0x0B, 0x00, 0x00, 0x75, 0xFC, 0xFF, 0x00, 0xE9, 0x08, 0x00, 0x00, 0xC0, 0xFB, 0xFF,
+	0x00, 0x80, 0x06, 0x00, 0x00, 0x3C, 0xFB, 0xFF, 0x00, 0xDA, 0x03, 0x00, 0x00, 0xE4, 0xFA, 0xFF,
+	0x00, 0xEB, 0x01, 0x00, 0x00, 0x21, 0xFB, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0xE7, 0xFB, 0xFF,
+} ;
+
+
+void
+test_audio_detect (void)
+{
+	SF_PRIVATE psf ;
+	AUDIO_DETECT ad ;
+	int errors = 0 ;
+
+	print_test_name ("Testing audio detect") ;
+
+	memset (&psf, 0, sizeof (psf)) ;
+
+	ad.endianness = SF_ENDIAN_LITTLE ;
+	ad.channels = 1 ;
+	if (audio_detect (&psf, &ad, float_le_mono, sizeof (float_le_mono)) != SF_FORMAT_FLOAT)
+	{	puts ("    float_le_mono") ;
+		errors ++ ;
+		} ;
+
+	ad.endianness = SF_ENDIAN_LITTLE ;
+	ad.channels = 2 ;
+	if (audio_detect (&psf, &ad, int24_32_le_stereo, sizeof (int24_32_le_stereo)) != SF_FORMAT_PCM_32)
+	{	if (errors == 0) puts ("\nFailed tests :\n") ;
+		puts ("    int24_32_le_stereo") ;
+		errors ++ ;
+		} ;
+
+	if (errors != 0)
+	{	printf ("\n    Errors : %d\n\n", errors) ;
+		exit (1) ;
+		} ;
+
+	puts ("ok") ;
+
+	return ;
+} /* test_audio_detect */
diff --git a/jni/libsndfile-1.0.25/src/test_broadcast_var.c b/jni/libsndfile-1.0.25/src/test_broadcast_var.c
new file mode 100644
index 0000000..1f0240f
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/test_broadcast_var.c
@@ -0,0 +1,87 @@
+/*
+** Copyright (C) 2010-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "common.h"
+
+#include "test_main.h"
+
+#define	BCAST_MAX	512
+
+typedef SF_BROADCAST_INFO_VAR (BCAST_MAX) SF_BROADCAST_INFO_512 ;
+
+static void
+fill_coding_history (SF_BROADCAST_INFO_512 * bi)
+{	static const char *lines [] =
+	{	"Lorem ipsum dolor sit amet,\nconsectetur adipiscing elit.",
+		"Donec dignissim erat\nvehicula libero condimentum\ndictum porta augue faucibus.",
+		"Maecenas nec turpis\nsit amet quam\nfaucibus adipiscing.",
+		"Mauris aliquam,\nlectus interdum\ntincidunt luctus.",
+		"\n\n\n\n\n\n\n\n\n\n\n\n",
+		"In auctor lorem\nvel est euismod\ncondimentum.",
+		"\n\n\n\n\n\n\n\n\n\n\n\n",
+		"Ut vitae magna\nid dui placerat vehicula\nin id lectus.",
+		"\n\n\n\n\n\n\n\n\n\n\n\n",
+		"Sed lacus leo,\nmolestie et luctus ac,\ntincidunt sit amet nisi.",
+		"\n\n\n\n\n\n\n\n\n\n\n\n",
+		"Sed ligula neque,\ngravida semper vulputate laoreet,\ngravida eu tellus.",
+		"Donec dolor dolor,\nscelerisque in consequat ornare,\ntempor nec nisl."
+	} ;
+	int k ;
+
+	bi->coding_history [0] = 0 ;
+
+	for (k = 0 ; strlen (bi->coding_history) < bi->coding_history_size - 1 ; k ++)
+		append_snprintf (bi->coding_history, bi->coding_history_size, "%s\n", lines [k % ARRAY_LEN (lines)]) ;
+
+	return ;
+} /* fill_coding_listory */
+
+void
+test_broadcast_var (void)
+{	SF_PRIVATE	sf_private, *psf ;
+	int k ;
+
+	psf = &sf_private ;
+	memset (psf, 0, sizeof (sf_private)) ;
+
+	print_test_name ("Testing broadcast_var_set ") ;
+
+	for (k = 64 ; k < BCAST_MAX ; k++)
+	{
+		SF_BROADCAST_INFO_512 bi ;
+
+		memset (&bi, 0, sizeof (bi)) ;
+
+		bi.coding_history_size = k ;
+		fill_coding_history (&bi) ;
+		bi.coding_history_size -- ;
+
+		broadcast_var_set (psf, (SF_BROADCAST_INFO*) &bi, sizeof (bi)) ;
+		} ;
+
+	if (psf->broadcast_16k != NULL)
+		free (psf->broadcast_16k) ;
+
+	puts ("ok") ;
+} /* test_broadcast_var */
diff --git a/jni/libsndfile-1.0.25/src/test_conversions.c b/jni/libsndfile-1.0.25/src/test_conversions.c
new file mode 100644
index 0000000..34600b0
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/test_conversions.c
@@ -0,0 +1,110 @@
+/*
+** Copyright (C) 2006-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <inttypes.h>
+
+#include "common.h"
+#include "test_main.h"
+
+
+/*
+** This is a bit rough, but it is the nicest way to do it.
+*/
+
+#define cmp_test(line,ival,tval,str) \
+	if (ival != tval) \
+	{	printf (str, line, ival, tval) ; \
+		exit (1) ; \
+		} ;
+
+static void
+conversion_test (char endian)
+{
+	SF_PRIVATE	sf_private, *psf ;
+	const char * filename = "conversion.bin" ;
+	int64_t i64 = SF_PLATFORM_S64 (0x0123456789abcdef), t64 = 0 ;
+	char format_str [16] ;
+	char test_name [64] ;
+	char i8 = 12, t8 = 0 ;
+	short i16 = 0x123, t16 = 0 ;
+	int i24 = 0x23456, t24 = 0 ;
+	int i32 = 0x0a0b0c0d, t32 = 0 ;
+	int bytes ;
+
+	snprintf (format_str, sizeof (format_str), "%c12348", endian) ;
+
+	snprintf (test_name, sizeof (test_name), "Testing %s conversions", endian == 'e' ? "little endian" : "big endian") ;
+	print_test_name (test_name) ;
+
+	psf = &sf_private ;
+	memset (psf, 0, sizeof (sf_private)) ;
+
+	psf->file.mode = SFM_WRITE ;
+	snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", filename) ;
+
+	if (psf_fopen (psf) != 0)
+	{	printf ("\n\nError : failed to open file '%s' for write.\n\n", filename) ;
+		exit (1) ;
+		} ;
+
+	psf_binheader_writef (psf, format_str, i8, i16, i24, i32, i64) ;
+	psf_fwrite (psf->header, 1, psf->headindex, psf) ;
+	psf_fclose (psf) ;
+
+	memset (psf, 0, sizeof (sf_private)) ;
+
+	psf->file.mode = SFM_READ ;
+	snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", filename) ;
+
+	if (psf_fopen (psf) != 0)
+	{	printf ("\n\nError : failed to open file '%s' for read.\n\n", filename) ;
+		exit (1) ;
+		} ;
+
+	bytes = psf_binheader_readf (psf, format_str, &t8, &t16, &t24, &t32, &t64) ;
+	psf_fclose (psf) ;
+
+	if (bytes != 18)
+	{	printf ("\n\nLine %d : read %d bytes.\n\n", __LINE__, bytes) ;
+		exit (1) ;
+		} ;
+
+	cmp_test (__LINE__, i8, t8, "\n\nLine %d : 8 bit int failed %d -> %d.\n\n") ;
+	cmp_test (__LINE__, i16, t16, "\n\nLine %d : 16 bit int failed 0x%x -> 0x%x.\n\n") ;
+	cmp_test (__LINE__, i24, t24, "\n\nLine %d : 24 bit int failed 0x%x -> 0x%x.\n\n") ;
+	cmp_test (__LINE__, i32, t32, "\n\nLine %d : 32 bit int failed 0x%x -> 0x%x.\n\n") ;
+	cmp_test (__LINE__, i64, t64, "\n\nLine %d : 64 bit int failed 0x%" PRIx64 "x -> 0x%" PRIx64 "x.\n\n") ;
+
+	remove (filename) ;
+	puts ("ok") ;
+} /* conversion_test */
+
+void
+test_conversions (void)
+{
+	conversion_test ('E') ;
+	conversion_test ('e') ;
+} /* test_conversion */
+
diff --git a/jni/libsndfile-1.0.25/src/test_endswap.c b/jni/libsndfile-1.0.25/src/test_endswap.c
new file mode 100644
index 0000000..4931650
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/test_endswap.c
@@ -0,0 +1,235 @@
+/*
+** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <inttypes.h>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "common.h"
+#include "sfendian.h"
+
+#include "test_main.h"
+
+#define	FMT_SHORT	"0x%04x\n"
+#define	FMT_INT		"0x%08x\n"
+#define	FMT_INT64	"0x%016" PRIx64 "\n"
+
+/*==============================================================================
+** Test functions.
+*/
+
+
+static void
+dump_short_array (const char * name, short * data, int datalen)
+{	int k ;
+
+	printf ("%-6s : ", name) ;
+	for (k = 0 ; k < datalen ; k++)
+		printf (FMT_SHORT, data [k]) ;
+	putchar ('\n') ;
+} /* dump_short_array */
+
+static void
+test_endswap_short (void)
+{	short orig [4], first [4], second [4] ;
+	int k ;
+
+	printf ("    %-40s : ", "test_endswap_short") ;
+	fflush (stdout) ;
+
+	for (k = 0 ; k < ARRAY_LEN (orig) ; k++)
+		orig [k] = 0x3210 + k ;
+
+	endswap_short_copy (first, orig, ARRAY_LEN (first)) ;
+	endswap_short_copy (second, first, ARRAY_LEN (second)) ;
+
+	if (memcmp (orig, first, sizeof (orig)) == 0)
+	{	printf ("\n\nLine %d : test 1 : these two array should not be the same:\n\n", __LINE__) ;
+		dump_short_array ("orig", orig, ARRAY_LEN (orig)) ;
+		dump_short_array ("first", first, ARRAY_LEN (first)) ;
+		exit (1) ;
+		} ;
+
+	if (memcmp (orig, second, sizeof (orig)) != 0)
+	{	printf ("\n\nLine %d : test 2 : these two array should be the same:\n\n", __LINE__) ;
+		dump_short_array ("orig", orig, ARRAY_LEN (orig)) ;
+		dump_short_array ("second", second, ARRAY_LEN (second)) ;
+		exit (1) ;
+		} ;
+
+	endswap_short_array (first, ARRAY_LEN (first)) ;
+
+	if (memcmp (orig, first, sizeof (orig)) != 0)
+	{	printf ("\n\nLine %d : test 3 : these two array should be the same:\n\n", __LINE__) ;
+		dump_short_array ("orig", orig, ARRAY_LEN (orig)) ;
+		dump_short_array ("first", first, ARRAY_LEN (first)) ;
+		exit (1) ;
+		} ;
+
+	endswap_short_copy (first, orig, ARRAY_LEN (first)) ;
+	endswap_short_copy (first, first, ARRAY_LEN (first)) ;
+
+	if (memcmp (orig, first, sizeof (orig)) != 0)
+	{	printf ("\n\nLine %d : test 4 : these two array should be the same:\n\n", __LINE__) ;
+		dump_short_array ("orig", orig, ARRAY_LEN (orig)) ;
+		dump_short_array ("first", first, ARRAY_LEN (first)) ;
+		exit (1) ;
+		} ;
+
+	puts ("ok") ;
+} /* test_endswap_short */
+
+static void
+dump_int_array (const char * name, int * data, int datalen)
+{	int k ;
+
+	printf ("%-6s : ", name) ;
+	for (k = 0 ; k < datalen ; k++)
+		printf (FMT_INT, data [k]) ;
+	putchar ('\n') ;
+} /* dump_int_array */
+
+static void
+test_endswap_int (void)
+{	int orig [4], first [4], second [4] ;
+	int k ;
+
+	printf ("    %-40s : ", "test_endswap_int") ;
+	fflush (stdout) ;
+
+	for (k = 0 ; k < ARRAY_LEN (orig) ; k++)
+		orig [k] = 0x76543210 + k ;
+
+	endswap_int_copy (first, orig, ARRAY_LEN (first)) ;
+	endswap_int_copy (second, first, ARRAY_LEN (second)) ;
+
+	if (memcmp (orig, first, sizeof (orig)) == 0)
+	{	printf ("\n\nLine %d : test 1 : these two array should not be the same:\n\n", __LINE__) ;
+		dump_int_array ("orig", orig, ARRAY_LEN (orig)) ;
+		dump_int_array ("first", first, ARRAY_LEN (first)) ;
+		exit (1) ;
+		} ;
+
+	if (memcmp (orig, second, sizeof (orig)) != 0)
+	{	printf ("\n\nLine %d : test 2 : these two array should be the same:\n\n", __LINE__) ;
+		dump_int_array ("orig", orig, ARRAY_LEN (orig)) ;
+		dump_int_array ("second", second, ARRAY_LEN (second)) ;
+		exit (1) ;
+		} ;
+
+	endswap_int_array (first, ARRAY_LEN (first)) ;
+
+	if (memcmp (orig, first, sizeof (orig)) != 0)
+	{	printf ("\n\nLine %d : test 3 : these two array should be the same:\n\n", __LINE__) ;
+		dump_int_array ("orig", orig, ARRAY_LEN (orig)) ;
+		dump_int_array ("first", first, ARRAY_LEN (first)) ;
+		exit (1) ;
+		} ;
+
+	endswap_int_copy (first, orig, ARRAY_LEN (first)) ;
+	endswap_int_copy (first, first, ARRAY_LEN (first)) ;
+
+	if (memcmp (orig, first, sizeof (orig)) != 0)
+	{	printf ("\n\nLine %d : test 4 : these two array should be the same:\n\n", __LINE__) ;
+		dump_int_array ("orig", orig, ARRAY_LEN (orig)) ;
+		dump_int_array ("first", first, ARRAY_LEN (first)) ;
+		exit (1) ;
+		} ;
+
+	puts ("ok") ;
+} /* test_endswap_int */
+
+static void
+dump_int64_t_array (const char * name, int64_t * data, int datalen)
+{	int k ;
+
+	printf ("%-6s : ", name) ;
+	for (k = 0 ; k < datalen ; k++)
+		printf (FMT_INT64, data [k]) ;
+	putchar ('\n') ;
+} /* dump_int64_t_array */
+
+static void
+test_endswap_int64_t (void)
+{	int64_t orig [4], first [4], second [4] ;
+	int k ;
+
+	printf ("    %-40s : ", "test_endswap_int64_t") ;
+	fflush (stdout) ;
+
+	for (k = 0 ; k < ARRAY_LEN (orig) ; k++)
+		orig [k] = 0x0807050540302010LL + k ;
+
+	endswap_int64_t_copy (first, orig, ARRAY_LEN (first)) ;
+	endswap_int64_t_copy (second, first, ARRAY_LEN (second)) ;
+
+	if (memcmp (orig, first, sizeof (orig)) == 0)
+	{	printf ("\n\nLine %d : test 1 : these two array should not be the same:\n\n", __LINE__) ;
+		dump_int64_t_array ("orig", orig, ARRAY_LEN (orig)) ;
+		dump_int64_t_array ("first", first, ARRAY_LEN (first)) ;
+		exit (1) ;
+		} ;
+
+	if (memcmp (orig, second, sizeof (orig)) != 0)
+	{	printf ("\n\nLine %d : test 2 : these two array should be the same:\n\n", __LINE__) ;
+		dump_int64_t_array ("orig", orig, ARRAY_LEN (orig)) ;
+		dump_int64_t_array ("second", second, ARRAY_LEN (second)) ;
+		exit (1) ;
+		} ;
+
+	endswap_int64_t_array (first, ARRAY_LEN (first)) ;
+
+	if (memcmp (orig, first, sizeof (orig)) != 0)
+	{	printf ("\n\nLine %d : test 3 : these two array should be the same:\n\n", __LINE__) ;
+		dump_int64_t_array ("orig", orig, ARRAY_LEN (orig)) ;
+		dump_int64_t_array ("first", first, ARRAY_LEN (first)) ;
+		exit (1) ;
+		} ;
+
+	endswap_int64_t_copy (first, orig, ARRAY_LEN (first)) ;
+	endswap_int64_t_copy (first, first, ARRAY_LEN (first)) ;
+
+	if (memcmp (orig, first, sizeof (orig)) != 0)
+	{	printf ("\n\nLine %d : test 4 : these two array should be the same:\n\n", __LINE__) ;
+		dump_int64_t_array ("orig", orig, ARRAY_LEN (orig)) ;
+		dump_int64_t_array ("first", first, ARRAY_LEN (first)) ;
+		exit (1) ;
+		} ;
+
+	puts ("ok") ;
+} /* test_endswap_int64_t */
+
+
+
+void
+test_endswap (void)
+{
+	test_endswap_short () ;
+	test_endswap_int () ;
+	test_endswap_int64_t () ;
+
+} /* test_endswap */
+
diff --git a/jni/libsndfile-1.0.25/src/test_endswap.def b/jni/libsndfile-1.0.25/src/test_endswap.def
new file mode 100644
index 0000000..c817322
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/test_endswap.def
@@ -0,0 +1,20 @@
+autogen definitions test_endswap.tpl;
+
+int_type = {
+	name		= short ;
+	value		= 0x3210 ;
+	format		= FMT_SHORT ;
+	} ;
+
+int_type = {
+	name		= int ;
+	value		= 0x76543210 ;
+	format		= FMT_INT ;
+	} ;
+
+int_type = {
+	name		= int64_t ;
+	value		= "0x0807050540302010LL" ;
+	format		= FMT_INT64 ;
+	} ;
+
diff --git a/jni/libsndfile-1.0.25/src/test_endswap.tpl b/jni/libsndfile-1.0.25/src/test_endswap.tpl
new file mode 100644
index 0000000..ad7cee1
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/test_endswap.tpl
@@ -0,0 +1,117 @@
+[+ AutoGen5 template c +]
+/*
+** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <inttypes.h>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "common.h"
+#include "sfendian.h"
+
+#include "test_main.h"
+
+#define	FMT_SHORT	"0x%04x\n"
+#define	FMT_INT		"0x%08x\n"
+#define	FMT_INT64	"0x%016" PRIx64 "\n"
+
+/*==============================================================================
+** Test functions.
+*/
+
+[+ FOR int_type +]
+static void
+dump_[+ (get "name") +]_array (const char * name, [+ (get "name") +] * data, int datalen)
+{	int k ;
+
+	printf ("%-6s : ", name) ;
+	for (k = 0 ; k < datalen ; k++)
+		printf ([+ (get "format") +], data [k]) ;
+	putchar ('\n') ;
+} /* dump_[+ (get "name") +]_array */
+
+static void
+test_endswap_[+ (get "name") +] (void)
+{	[+ (get "name") +] orig [4], first [4], second [4] ;
+	int k ;
+
+	printf ("    %-40s : ", "test_endswap_[+ (get "name") +]") ;
+	fflush (stdout) ;
+
+	for (k = 0 ; k < ARRAY_LEN (orig) ; k++)
+		orig [k] = [+ (get "value") +] + k ;
+
+	endswap_[+ (get "name") +]_copy (first, orig, ARRAY_LEN (first)) ;
+	endswap_[+ (get "name") +]_copy (second, first, ARRAY_LEN (second)) ;
+
+	if (memcmp (orig, first, sizeof (orig)) == 0)
+	{	printf ("\n\nLine %d : test 1 : these two array should not be the same:\n\n", __LINE__) ;
+		dump_[+ (get "name") +]_array ("orig", orig, ARRAY_LEN (orig)) ;
+		dump_[+ (get "name") +]_array ("first", first, ARRAY_LEN (first)) ;
+		exit (1) ;
+		} ;
+
+	if (memcmp (orig, second, sizeof (orig)) != 0)
+	{	printf ("\n\nLine %d : test 2 : these two array should be the same:\n\n", __LINE__) ;
+		dump_[+ (get "name") +]_array ("orig", orig, ARRAY_LEN (orig)) ;
+		dump_[+ (get "name") +]_array ("second", second, ARRAY_LEN (second)) ;
+		exit (1) ;
+		} ;
+
+	endswap_[+ (get "name") +]_array (first, ARRAY_LEN (first)) ;
+
+	if (memcmp (orig, first, sizeof (orig)) != 0)
+	{	printf ("\n\nLine %d : test 3 : these two array should be the same:\n\n", __LINE__) ;
+		dump_[+ (get "name") +]_array ("orig", orig, ARRAY_LEN (orig)) ;
+		dump_[+ (get "name") +]_array ("first", first, ARRAY_LEN (first)) ;
+		exit (1) ;
+		} ;
+
+	endswap_[+ (get "name") +]_copy (first, orig, ARRAY_LEN (first)) ;
+	endswap_[+ (get "name") +]_copy (first, first, ARRAY_LEN (first)) ;
+
+	if (memcmp (orig, first, sizeof (orig)) != 0)
+	{	printf ("\n\nLine %d : test 4 : these two array should be the same:\n\n", __LINE__) ;
+		dump_[+ (get "name") +]_array ("orig", orig, ARRAY_LEN (orig)) ;
+		dump_[+ (get "name") +]_array ("first", first, ARRAY_LEN (first)) ;
+		exit (1) ;
+		} ;
+
+	puts ("ok") ;
+} /* test_endswap_[+ (get "name") +] */
+[+ ENDFOR int_type
++]
+
+
+void
+test_endswap (void)
+{
+[+ FOR int_type
++]	test_endswap_[+ (get "name") +] () ;
+[+ ENDFOR int_type
++]
+} /* test_endswap */
+
diff --git a/jni/libsndfile-1.0.25/src/test_file_io.c b/jni/libsndfile-1.0.25/src/test_file_io.c
new file mode 100644
index 0000000..08fcceb
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/test_file_io.c
@@ -0,0 +1,438 @@
+/*
+** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <string.h>
+#include <errno.h>
+#include <inttypes.h>
+
+#include "common.h"
+
+#include "test_main.h"
+
+static void make_data (int *data, int len, int seed) ;
+
+static void file_open_test (const char *filename) ;
+static void file_read_write_test (const char *filename) ;
+static void file_truncate_test (const char *filename) ;
+
+static void test_open_or_die (SF_PRIVATE *psf, int linenum) ;
+static void test_close_or_die (SF_PRIVATE *psf, int linenum) ;
+
+static void test_write_or_die	(SF_PRIVATE *psf, void *data, sf_count_t bytes, sf_count_t items, sf_count_t new_position, int linenum) ;
+static void test_read_or_die	(SF_PRIVATE *psf, void *data, sf_count_t bytes, sf_count_t items, sf_count_t new_position, int linenum) ;
+static void test_equal_or_die	(int *array1, int *array2, int len, int linenum) ;
+static void test_seek_or_die (SF_PRIVATE *psf, sf_count_t offset, int whence, sf_count_t new_position, int linenum) ;
+
+
+
+/*==============================================================================
+** Actual test functions.
+*/
+
+static void
+file_open_test (const char *filename)
+{	SF_PRIVATE sf_data, *psf ;
+	int		error ;
+
+	print_test_name ("Testing file open") ;
+
+	memset (&sf_data, 0, sizeof (sf_data)) ;
+	psf = &sf_data ;
+
+	/* Ensure that the file doesn't already exist. */
+	if (unlink (filename) != 0 && errno != ENOENT)
+	{	printf ("\n\nLine %d: unlink failed (%d) : %s\n\n", __LINE__, errno, strerror (errno)) ;
+		exit (1) ;
+		} ;
+
+	psf->file.mode = SFM_READ ;
+	snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", filename) ;
+
+	/* Test that open for read fails if the file doesn't exist. */
+	error = psf_fopen (psf) ;
+	if (error == 0)
+	{	printf ("\n\nLine %d: psf_fopen() should have failed.\n\n", __LINE__) ;
+		exit (1) ;
+		} ;
+
+	/* Reset error to zero. */
+	psf->error = SFE_NO_ERROR ;
+
+	/* Test file open in write mode. */
+	psf->file.mode = SFM_WRITE ;
+	test_open_or_die (psf, __LINE__) ;
+
+	test_close_or_die (psf, __LINE__) ;
+
+	unlink (psf->file.path.c) ;
+
+	/* Test file open in read/write mode for a non-existant file. */
+	psf->file.mode = SFM_RDWR ;
+	test_open_or_die (psf, __LINE__) ;
+
+	test_close_or_die (psf, __LINE__) ;
+
+	/* Test file open in read/write mode for an existing file. */
+	psf->file.mode = SFM_RDWR ;
+	test_open_or_die (psf, __LINE__) ;
+
+	test_close_or_die (psf, __LINE__) ;
+
+	unlink (psf->file.path.c) ;
+	puts ("ok") ;
+} /* file_open_test */
+
+static void
+file_read_write_test (const char *filename)
+{	static int data_out	[512] ;
+	static int data_in	[512] ;
+
+	SF_PRIVATE sf_data, *psf ;
+	sf_count_t retval ;
+
+	/*
+	** Open a new file and write two blocks of data to the file. After each
+	** write, test that psf_get_filelen() returns the new length.
+	*/
+
+	print_test_name ("Testing file write") ;
+
+	memset (&sf_data, 0, sizeof (sf_data)) ;
+	psf = &sf_data ;
+	snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", filename) ;
+
+	/* Test file open in write mode. */
+	psf->file.mode = SFM_WRITE ;
+	test_open_or_die (psf, __LINE__) ;
+
+	make_data (data_out, ARRAY_LEN (data_out), 1) ;
+	test_write_or_die (psf, data_out, sizeof (data_out [0]), ARRAY_LEN (data_out), sizeof (data_out), __LINE__) ;
+
+	if ((retval = psf_get_filelen (psf)) != sizeof (data_out))
+	{	printf ("\n\nLine %d: file length after write is not correct (%" PRId64 " should be %zd).\n\n", __LINE__, retval, sizeof (data_out)) ;
+		if (retval == 0)
+			printf ("An fsync() may be necessary before fstat() in psf_get_filelen().\n\n") ;
+		exit (1) ;
+		} ;
+
+	make_data (data_out, ARRAY_LEN (data_out), 2) ;
+	test_write_or_die (psf, data_out, ARRAY_LEN (data_out), sizeof (data_out [0]), 2 * sizeof (data_out), __LINE__) ;
+
+	if ((retval = psf_get_filelen (psf)) != 2 * sizeof (data_out))
+	{	printf ("\n\nLine %d: file length after write is not correct. (%" PRId64 " should be %zd)\n\n", __LINE__, retval, 2 * sizeof (data_out)) ;
+		exit (1) ;
+		} ;
+
+	test_close_or_die (psf, __LINE__) ;
+	puts ("ok") ;
+
+	/*
+	** Now open the file in read mode, check the file length and check
+	** that the data is correct.
+	*/
+
+	print_test_name ("Testing file read") ;
+
+	/* Test file open in write mode. */
+	psf->file.mode = SFM_READ ;
+	test_open_or_die (psf, __LINE__) ;
+
+	make_data (data_out, ARRAY_LEN (data_out), 1) ;
+	test_read_or_die (psf, data_in, 1, sizeof (data_in), sizeof (data_in), __LINE__) ;
+	test_equal_or_die	(data_out, data_in, ARRAY_LEN (data_out), __LINE__) ;
+
+	make_data (data_out, ARRAY_LEN (data_out), 2) ;
+	test_read_or_die (psf, data_in, sizeof (data_in [0]), ARRAY_LEN (data_in), 2 * sizeof (data_in), __LINE__) ;
+	test_equal_or_die	(data_out, data_in, ARRAY_LEN (data_out), __LINE__) ;
+
+	test_close_or_die (psf, __LINE__) ;
+
+	puts ("ok") ;
+
+	/*
+	** Open the file in read/write mode, seek around a bit and then seek to
+	** the end of the file and write another block of data (3rd block). Then
+	** go back and check that all three blocks are correct.
+	*/
+
+	print_test_name ("Testing file seek") ;
+
+	/* Test file open in read/write mode. */
+	psf->file.mode = SFM_RDWR ;
+	test_open_or_die (psf, __LINE__) ;
+
+	test_seek_or_die (psf, 0, SEEK_SET, 0, __LINE__) ;
+	test_seek_or_die (psf, 0, SEEK_END, 2 * SIGNED_SIZEOF (data_out), __LINE__) ;
+	test_seek_or_die (psf, -1 * SIGNED_SIZEOF (data_out), SEEK_CUR, (sf_count_t) sizeof (data_out), __LINE__) ;
+
+	test_seek_or_die (psf, SIGNED_SIZEOF (data_out), SEEK_CUR, 2 * SIGNED_SIZEOF (data_out), __LINE__) ;
+	make_data (data_out, ARRAY_LEN (data_out), 3) ;
+	test_write_or_die (psf, data_out, sizeof (data_out [0]), ARRAY_LEN (data_out), 3 * sizeof (data_out), __LINE__) ;
+
+	test_seek_or_die (psf, 0, SEEK_SET, 0, __LINE__) ;
+	make_data (data_out, ARRAY_LEN (data_out), 1) ;
+	test_read_or_die (psf, data_in, 1, sizeof (data_in), sizeof (data_in), __LINE__) ;
+	test_equal_or_die	(data_out, data_in, ARRAY_LEN (data_out), __LINE__) ;
+
+	test_seek_or_die (psf, 2 * SIGNED_SIZEOF (data_out), SEEK_SET, 2 * SIGNED_SIZEOF (data_out), __LINE__) ;
+	make_data (data_out, ARRAY_LEN (data_out), 3) ;
+	test_read_or_die (psf, data_in, 1, sizeof (data_in), 3 * sizeof (data_in), __LINE__) ;
+	test_equal_or_die	(data_out, data_in, ARRAY_LEN (data_out), __LINE__) ;
+
+	test_seek_or_die (psf, SIGNED_SIZEOF (data_out), SEEK_SET, SIGNED_SIZEOF (data_out), __LINE__) ;
+	make_data (data_out, ARRAY_LEN (data_out), 2) ;
+	test_read_or_die (psf, data_in, 1, sizeof (data_in), 2 * sizeof (data_in), __LINE__) ;
+	test_equal_or_die	(data_out, data_in, ARRAY_LEN (data_out), __LINE__) ;
+
+	test_close_or_die (psf, __LINE__) ;
+	puts ("ok") ;
+
+	/*
+	** Now test operations with a non-zero psf->fileoffset field. This field
+	** sets an artificial file start positions so that a seek to the start of
+	** the file will actually be a seek to the value given by psf->fileoffset.
+	*/
+
+	print_test_name ("Testing file offset") ;
+
+	/* Test file open in read/write mode. */
+	psf->file.mode = SFM_RDWR ;
+	psf->fileoffset = sizeof (data_out [0]) * ARRAY_LEN (data_out) ;
+	test_open_or_die (psf, __LINE__) ;
+
+	if ((retval = psf_get_filelen (psf)) != 3 * sizeof (data_out))
+	{	printf ("\n\nLine %d: file length after write is not correct. (%" PRId64 " should be %zd)\n\n", __LINE__, retval, 3 * sizeof (data_out)) ;
+		exit (1) ;
+		} ;
+
+	test_seek_or_die (psf, SIGNED_SIZEOF (data_out), SEEK_SET, SIGNED_SIZEOF (data_out), __LINE__) ;
+	make_data (data_out, ARRAY_LEN (data_out), 5) ;
+	test_write_or_die (psf, data_out, sizeof (data_out [0]), ARRAY_LEN (data_out), 2 * sizeof (data_out), __LINE__) ;
+	test_close_or_die (psf, __LINE__) ;
+
+	/* final test with psf->fileoffset == 0. */
+
+	psf->file.mode = SFM_RDWR ;
+	psf->fileoffset = 0 ;
+	test_open_or_die (psf, __LINE__) ;
+
+	if ((retval = psf_get_filelen (psf)) != 3 * sizeof (data_out))
+	{	printf ("\n\nLine %d: file length after write is not correct. (%" PRId64 " should be %zd)\n\n", __LINE__, retval, 3 * sizeof (data_out)) ;
+		exit (1) ;
+		} ;
+
+	make_data (data_out, ARRAY_LEN (data_out), 1) ;
+	test_read_or_die (psf, data_in, 1, sizeof (data_in), sizeof (data_in), __LINE__) ;
+	test_equal_or_die	(data_out, data_in, ARRAY_LEN (data_out), __LINE__) ;
+
+	make_data (data_out, ARRAY_LEN (data_out), 2) ;
+	test_read_or_die (psf, data_in, 1, sizeof (data_in), 2 * sizeof (data_in), __LINE__) ;
+	test_equal_or_die	(data_out, data_in, ARRAY_LEN (data_out), __LINE__) ;
+
+	make_data (data_out, ARRAY_LEN (data_out), 5) ;
+	test_read_or_die (psf, data_in, 1, sizeof (data_in), 3 * sizeof (data_in), __LINE__) ;
+	test_equal_or_die	(data_out, data_in, ARRAY_LEN (data_out), __LINE__) ;
+
+	test_close_or_die (psf, __LINE__) ;
+
+	puts ("ok") ;
+} /* file_read_write_test */
+
+static void
+file_truncate_test (const char *filename)
+{	SF_PRIVATE sf_data, *psf ;
+	unsigned char buffer [256] ;
+	int k ;
+
+	/*
+	** Open a new file and write two blocks of data to the file. After each
+	** write, test that psf_get_filelen() returns the new length.
+	*/
+
+	print_test_name ("Testing file truncate") ;
+
+	memset (&sf_data, 0, sizeof (sf_data)) ;
+	memset (buffer, 0xEE, sizeof (buffer)) ;
+
+	psf = &sf_data ;
+	snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", filename) ;
+
+	/*
+	** Open the file write mode, write 0xEE data and then extend the file
+	** using truncate (the extended data should be 0x00).
+	*/
+	psf->file.mode = SFM_WRITE ;
+	test_open_or_die (psf, __LINE__) ;
+	test_write_or_die (psf, buffer, sizeof (buffer) / 2, 1, sizeof (buffer) / 2, __LINE__) ;
+	psf_ftruncate (psf, sizeof (buffer)) ;
+	test_close_or_die (psf, __LINE__) ;
+
+	/* Open the file in read mode and check the data. */
+	psf->file.mode = SFM_READ ;
+	test_open_or_die (psf, __LINE__) ;
+	test_read_or_die (psf, buffer, sizeof (buffer), 1, sizeof (buffer), __LINE__) ;
+	test_close_or_die (psf, __LINE__) ;
+
+	for (k = 0 ; k < SIGNED_SIZEOF (buffer) / 2 ; k++)
+		if (buffer [k] != 0xEE)
+		{	printf ("\n\nLine %d : buffer [%d] = %d (should be 0xEE)\n\n", __LINE__, k, buffer [k]) ;
+			exit (1) ;
+			} ;
+
+	for (k = SIGNED_SIZEOF (buffer) / 2 ; k < SIGNED_SIZEOF (buffer) ; k++)
+		if (buffer [k] != 0)
+		{	printf ("\n\nLine %d : buffer [%d] = %d (should be 0)\n\n", __LINE__, k, buffer [k]) ;
+			exit (1) ;
+			} ;
+
+	/* Open the file in read/write and shorten the file using truncate. */
+	psf->file.mode = SFM_RDWR ;
+	test_open_or_die (psf, __LINE__) ;
+	psf_ftruncate (psf, sizeof (buffer) / 4) ;
+	test_close_or_die (psf, __LINE__) ;
+
+	/* Check the file length. */
+	psf->file.mode = SFM_READ ;
+	test_open_or_die (psf, __LINE__) ;
+	test_seek_or_die (psf, 0, SEEK_END, SIGNED_SIZEOF (buffer) / 4, __LINE__) ;
+	test_close_or_die (psf, __LINE__) ;
+
+	puts ("ok") ;
+} /* file_truncate_test */
+
+/*==============================================================================
+** Testing helper functions.
+*/
+
+static void
+test_open_or_die (SF_PRIVATE *psf, int linenum)
+{	int		error ;
+
+	/* Test that open for read fails if the file doesn't exist. */
+	error = psf_fopen (psf) ;
+	if (error)
+	{	printf ("\n\nLine %d: psf_fopen() failed : %s\n\n", linenum, strerror (errno)) ;
+		exit (1) ;
+		} ;
+
+} /* test_open_or_die */
+
+static void
+test_close_or_die (SF_PRIVATE *psf, int linenum)
+{
+	psf_fclose (psf) ;
+	if (psf_file_valid (psf))
+	{	printf ("\n\nLine %d: psf->file.filedes should not be valid.\n\n", linenum) ;
+		exit (1) ;
+		} ;
+
+} /* test_close_or_die */
+
+static void
+test_write_or_die (SF_PRIVATE *psf, void *data, sf_count_t bytes, sf_count_t items, sf_count_t new_position, int linenum)
+{	sf_count_t	retval ;
+
+	retval = psf_fwrite (data, bytes, items, psf) ;
+	if (retval != items)
+	{	printf ("\n\nLine %d: psf_write() returned %" PRId64 " (should be %" PRId64 ")\n\n", linenum, retval, items) ;
+		exit (1) ;
+		} ;
+
+	if ((retval = psf_ftell (psf)) != new_position)
+	{	printf ("\n\nLine %d: file length after write is not correct. (%" PRId64 " should be %" PRId64 ")\n\n", linenum, retval, new_position) ;
+		exit (1) ;
+		} ;
+
+	return ;
+} /* test_write_or_die */
+
+static void
+test_read_or_die (SF_PRIVATE *psf, void *data, sf_count_t bytes, sf_count_t items, sf_count_t new_position, int linenum)
+{	sf_count_t	retval ;
+
+	retval = psf_fread (data, bytes, items, psf) ;
+	if (retval != items)
+	{	printf ("\n\nLine %d: psf_write() returned %" PRId64 " (should be %" PRId64 ")\n\n", linenum, retval, items) ;
+		exit (1) ;
+		} ;
+
+	if ((retval = psf_ftell (psf)) != new_position)
+	{	printf ("\n\nLine %d: file length after write is not correct. (%" PRId64 " should be %" PRId64 ")\n\n", linenum, retval, new_position) ;
+		exit (1) ;
+		} ;
+
+	return ;
+} /* test_write_or_die */
+
+static void
+test_seek_or_die (SF_PRIVATE *psf, sf_count_t offset, int whence, sf_count_t new_position, int linenum)
+{	sf_count_t retval ;
+
+	retval = psf_fseek (psf, offset, whence) ;
+
+	if (retval != new_position)
+	{	printf ("\n\nLine %d: psf_fseek() failed. New position is %" PRId64 " (should be %" PRId64 ").\n\n",
+			linenum, retval, new_position) ;
+		exit (1) ;
+		} ;
+
+} /* test_seek_or_die */
+
+static void
+test_equal_or_die	(int *array1, int *array2, int len, int linenum)
+{	int k ;
+
+	for (k = 0 ; k < len ; k++)
+		if (array1 [k] != array2 [k])
+			printf ("\n\nLine %d: error at index %d (%d != %d).\n\n",
+				linenum, k, array1 [k], array2 [k]) ;
+
+	return ;
+} /* test_equal_or_die */
+
+static void
+make_data (int *data, int len, int seed)
+{	int k ;
+
+	srand (seed * 3333333 + 14756123) ;
+
+	for (k = 0 ; k < len ; k++)
+		data [k] = rand () ;
+
+} /* make_data */
+
+void
+test_file_io (void)
+{	const char *filename = "file_io.dat" ;
+
+	file_open_test	(filename) ;
+	file_read_write_test	(filename) ;
+	file_truncate_test (filename) ;
+
+	unlink (filename) ;
+} /* main */
+
diff --git a/jni/libsndfile-1.0.25/src/test_float.c b/jni/libsndfile-1.0.25/src/test_float.c
new file mode 100644
index 0000000..9d0b09d
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/test_float.c
@@ -0,0 +1,104 @@
+/*
+** Copyright (C) 2006-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <math.h>
+
+#include "common.h"
+#include "test_main.h"
+
+void
+test_float_convert (void)
+{	static float data [] =
+	{	0.0, 1.0, -1.0, 1.0 * M_PI, -1.0 * M_PI,
+		1e9, -1e9, 1e-9, -1e-9, 1e-10, -1e-10,
+		1e-19, -1e-19, 1e19, -1e19, 1e-20, -1e-20,
+		} ;
+
+	int k ;
+
+	print_test_name (__func__) ;
+
+	for (k = 0 ; k < ARRAY_LEN (data) ; k++)
+	{	unsigned char bytes [4] ;
+		float test ;
+
+		float32_le_write (data [k], bytes) ;
+		test = float32_le_read (bytes) ;
+
+		if (fabs (data [k] - test) > 1e-20)
+		{	printf ("\n\nLine %d : Test %d, little endian error %.15g -> %.15g.\n\n", __LINE__, k, data [k], test ) ;
+			exit (1) ;
+			} ;
+
+		float32_be_write (data [k], bytes) ;
+		test = float32_be_read (bytes) ;
+
+		if (fabs (data [k] - test) > 1e-20)
+		{	printf ("\n\nLine %d : Test %d, big endian error %.15g -> %.15g.\n\n", __LINE__, k, data [k], test) ;
+			exit (1) ;
+			} ;
+
+		} ;
+
+	puts ("ok") ;
+} /* test_float_convert */
+
+void
+test_double_convert (void)
+{	static double data [] =
+	{	0.0, 1.0, -1.0, 1.0 * M_PI, -1.0 * M_PI,
+		1e9, -1e9, 1e-9, -1e-9, 1e-10, -1e-10,
+		1e-19, -1e-19, 1e19, -1e19, 1e-20, -1e-20,
+		} ;
+
+	int k ;
+
+	print_test_name (__func__) ;
+
+	for (k = 0 ; k < ARRAY_LEN (data) ; k++)
+	{	unsigned char bytes [8] ;
+		double test ;
+
+		double64_le_write (data [k], bytes) ;
+		test = double64_le_read (bytes) ;
+
+		if (fabs (data [k] - test) > 1e-20)
+		{	printf ("\n\nLine %d : Test %d, little endian error %.15g -> %.15g.\n\n", __LINE__, k, data [k], test ) ;
+			exit (1) ;
+			} ;
+
+		double64_be_write (data [k], bytes) ;
+		test = double64_be_read (bytes) ;
+
+		if (fabs (data [k] - test) > 1e-20)
+		{	printf ("\n\nLine %d : Test %d, big endian error %.15g -> %.15g.\n\n", __LINE__, k, data [k], test) ;
+			exit (1) ;
+			} ;
+
+		} ;
+
+	puts ("ok") ;
+} /* test_double_convert */
+
diff --git a/jni/libsndfile-1.0.25/src/test_ima_oki_adpcm.c b/jni/libsndfile-1.0.25/src/test_ima_oki_adpcm.c
new file mode 100644
index 0000000..6c937d1
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/test_ima_oki_adpcm.c
@@ -0,0 +1,157 @@
+/*
+** Copyright (C) 2007-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (c) 2007 <robs@users.sourceforge.net>
+**
+** This library is free software; you can redistribute it and/or modify it
+** under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or (at
+** your option) any later version.
+**
+** This library 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 library.  If not, write to the Free Software Foundation,
+** Fifth Floor, 51 Franklin Street, Boston, MA 02111-1301, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+
+#include "test_main.h"
+
+#include "ima_oki_adpcm.c"
+
+static const unsigned char test_codes [] =
+{	0x08, 0x08, 0x04, 0x7f, 0x72, 0xf7, 0x9f, 0x7c, 0xd7, 0xbc, 0x7a, 0xa7, 0xb8,
+	0x4b, 0x0b, 0x38, 0xf6, 0x9d, 0x7a, 0xd7, 0xbc, 0x7a, 0xd7, 0xa8, 0x6c, 0x81,
+	0x98, 0xe4, 0x0e, 0x7a, 0xd7, 0x9e, 0x7b, 0xc7, 0xab, 0x7a, 0x85, 0xc0, 0xb3,
+	0x8f, 0x58, 0xd7, 0xad, 0x7a, 0xd7, 0xad, 0x7a, 0x87, 0xd0, 0x2b, 0x0e, 0x48,
+	0xd7, 0xad, 0x78, 0xf7, 0xbc, 0x7a, 0xb7, 0xa8, 0x4b, 0x88, 0x18, 0xd5, 0x8d,
+	0x6a, 0xa4, 0x98, 0x08, 0x00, 0x80, 0x88,
+} ;
+
+static const short test_pcm [] =
+{	32, 0, 32, 0, 32, 320, 880, -336, 2304, 4192, -992, 10128, 5360, -16352,
+	30208, 2272, -31872, 14688, -7040, -32432, 14128, -1392, -15488, 22960,
+	1232, -1584, 21488, -240, 2576, -15360, 960, -1152, -30032, 10320, 1008,
+	-30032, 16528, 1008, -30032, 16528, -5200, -30592, 15968, 448, -30592,
+	15968, 448, -2368, 30960, 3024, -80, 8384, 704, -1616, -29168, -1232, 1872,
+	-32768, 13792, -1728, -32768, 13792, 4480, -32192, 14368, -7360, -32752,
+	13808, -1712, -21456, 16992, 1472, -1344, 26848, -1088, 2016, -17728, 208,
+	-2112, -32768, 1376, -1728, -32768, 13792, -1728, -32768, 13792, -1728,
+	-32768, 13792, -1728, -32768, 13792, -1728, -4544, 32767, -1377, 1727,
+	15823, -2113, 207, -27345, 591, -2513, -32768, 13792, -1728, -32768, 13792,
+	10688, -31632, 14928, -6800, -32192, 14368, -1152, -20896, 17552, 2032,
+	-784, 22288, 560, -2256, -4816, 2176, 64, -21120, 9920, 6816, -24224, 16128,
+	608, -13488, 9584, 272, -2544, 16, -2304, -192, 1728, -16, 1568, 128, -1184,
+} ;
+
+
+static void
+test_oki_adpcm (void)
+{
+	IMA_OKI_ADPCM adpcm ;
+	unsigned char code ;
+	int i, j ;
+
+	print_test_name ("Testing ima/oki encoder") ;
+
+	ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ;
+	for (i = 0 ; i < ARRAY_LEN (test_codes) ; i++)
+		for (j = 0, code = test_codes [i] ; j < 2 ; j++, code <<= 4)
+			if (adpcm_decode (&adpcm, code >> 4) != test_pcm [2 * i + j])
+			{	printf ("\n\nFail at i = %d, j = %d.\n\n", i, j) ;
+				exit (1) ;
+				} ;
+
+	puts ("ok") ;
+
+	print_test_name ("Testing ima/oki decoder") ;
+
+	ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ;
+	for (i = 0 ; i < ARRAY_LEN (test_pcm) - 1 ; i += 2)
+	{	code = adpcm_encode (&adpcm, test_pcm [i]) ;
+		code = (code << 4) | adpcm_encode (&adpcm, test_pcm [i + 1]) ;
+		if (code != test_codes [i / 2])
+			{	printf ("\n\nFail at i = %d, %d should be %d\n\n", i, code, test_codes [i / 2]) ;
+				exit (1) ;
+				} ;
+		} ;
+
+	puts ("ok") ;
+} /* test_oki_adpcm */
+
+static void
+test_oki_adpcm_block (void)
+{
+	IMA_OKI_ADPCM adpcm ;
+	int k ;
+
+	if (ARRAY_LEN (adpcm.pcm) < ARRAY_LEN (test_pcm))
+	{	printf ("\n\nLine %d : ARRAY_LEN (adpcm->pcm) > ARRAY_LEN (test_pcm) (%d > %d).\n\n", __LINE__, ARRAY_LEN (adpcm.pcm), ARRAY_LEN (test_pcm)) ;
+		exit (1) ;
+		} ;
+
+	if (ARRAY_LEN (adpcm.codes) < ARRAY_LEN (test_codes))
+	{	printf ("\n\nLine %d : ARRAY_LEN (adcodes->codes) > ARRAY_LEN (test_codes).n", __LINE__) ;
+		exit (1) ;
+		} ;
+
+	print_test_name ("Testing ima/oki block encoder") ;
+
+	ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ;
+
+	memcpy (adpcm.pcm, test_pcm, sizeof (adpcm.pcm [0]) * ARRAY_LEN (test_pcm)) ;
+	adpcm.pcm_count = ARRAY_LEN (test_pcm) ;
+	adpcm.code_count = 13 ;
+
+	ima_oki_adpcm_encode_block (&adpcm) ;
+
+	if (adpcm.code_count * 2 != ARRAY_LEN (test_pcm))
+	{	printf ("\n\nLine %d : %d * 2 != %d\n\n", __LINE__, adpcm.code_count * 2, ARRAY_LEN (test_pcm)) ;
+		exit (1) ;
+		} ;
+
+	for (k = 0 ; k < ARRAY_LEN (test_codes) ; k++)
+		if (adpcm.codes [k] != test_codes [k])
+		{	printf ("\n\nLine %d : Fail at k = %d, %d should be %d\n\n", __LINE__, k, adpcm.codes [k], test_codes [k]) ;
+			exit (1) ;
+			} ;
+
+	puts ("ok") ;
+
+	print_test_name ("Testing ima/oki block decoder") ;
+
+	ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ;
+
+	memcpy (adpcm.codes, test_codes, sizeof (adpcm.codes [0]) * ARRAY_LEN (test_codes)) ;
+	adpcm.code_count = ARRAY_LEN (test_codes) ;
+	adpcm.pcm_count = 13 ;
+
+	ima_oki_adpcm_decode_block (&adpcm) ;
+
+	if (adpcm.pcm_count != 2 * ARRAY_LEN (test_codes))
+	{	printf ("\n\nLine %d : %d * 2 != %d\n\n", __LINE__, adpcm.pcm_count, 2 * ARRAY_LEN (test_codes)) ;
+		exit (1) ;
+		} ;
+
+	for (k = 0 ; k < ARRAY_LEN (test_pcm) ; k++)
+		if (adpcm.pcm [k] != test_pcm [k])
+		{	printf ("\n\nLine %d : Fail at i = %d, %d should be %d.\n\n", __LINE__, k, adpcm.pcm [k], test_pcm [k]) ;
+			exit (1) ;
+			} ;
+
+	puts ("ok") ;
+} /* test_oki_adpcm_block */
+
+void
+test_ima_oki_adpcm (void)
+{
+	test_oki_adpcm () ;
+	test_oki_adpcm_block () ;
+} /* main */
+
diff --git a/jni/libsndfile-1.0.25/src/test_log_printf.c b/jni/libsndfile-1.0.25/src/test_log_printf.c
new file mode 100644
index 0000000..de9d45b
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/test_log_printf.c
@@ -0,0 +1,123 @@
+/*
+** Copyright (C) 2003-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <errno.h>
+
+#include "common.h"
+
+#include "test_main.h"
+
+#define	CMP_0_ARGS(line,err,fmt)	\
+	{	psf->logindex = 0 ;			\
+		snprintf (buffer, sizeof (buffer), (fmt)) ;	\
+		psf_log_printf (psf, (fmt)) ;				\
+		err += compare_strings_or_die (line, fmt, buffer, psf->logbuffer) ;	\
+		}
+
+#define	CMP_2_ARGS(line,err,fmt,a)	\
+	{	psf->logindex = 0 ;			\
+		snprintf (buffer, sizeof (buffer), (fmt), (a), (a)) ;	\
+		psf_log_printf (psf, (fmt), (a), (a)) ;					\
+		err += compare_strings_or_die (line, fmt, buffer, psf->logbuffer) ;	\
+		}
+
+#define	CMP_4_ARGS(line,err,fmt,a)	\
+	{	psf->logindex = 0 ;			\
+		snprintf (buffer, sizeof (buffer), (fmt), (a), (a), (a), (a)) ;	\
+		psf_log_printf (psf, (fmt), (a), (a), (a), (a)) ;				\
+		err += compare_strings_or_die (line, fmt, buffer, psf->logbuffer) ;	\
+		}
+
+#define	CMP_5_ARGS(line,err,fmt,a)	\
+	{	psf->logindex = 0 ;			\
+		snprintf (buffer, sizeof (buffer), (fmt), (a), (a), (a), (a), (a)) ;	\
+		psf_log_printf (psf, (fmt), (a), (a), (a), (a), (a)) ;					\
+		err += compare_strings_or_die (line, fmt, buffer, psf->logbuffer) ;		\
+		}
+
+#define	CMP_6_ARGS(line,err,fmt,a)	\
+	{	psf->logindex = 0 ;			\
+		snprintf (buffer, sizeof (buffer), (fmt), (a), (a), (a), (a), (a), (a)) ;	\
+		psf_log_printf (psf, (fmt), (a), (a), (a), (a), (a), (a)) ;					\
+		err += compare_strings_or_die (line, fmt, buffer, psf->logbuffer) ;			\
+		}
+
+static int
+compare_strings_or_die (int linenum, const char *fmt, const char* s1, const char* s2)
+{	int errors = 0 ;
+/*-puts (s1) ;puts (s2) ;-*/
+
+	if (strcmp (s1, s2) != 0)
+	{	printf ("\n\nLine %d: string compare mismatch:\n\t", linenum) ;
+		printf ("\"%s\"\n", fmt) ;
+		printf ("\t\"%s\"\n\t\"%s\"\n", s1, s2) ;
+		errors ++ ;
+		} ;
+
+	return errors ;
+} /* compare_strings_or_die */
+
+void
+test_log_printf (void)
+{	static char buffer [2048] ;
+	SF_PRIVATE	sf_private, *psf ;
+	int			k, errors = 0 ;
+	int			int_values [] = { 0, 1, 12, 123, 1234, 123456, -1, -12, -123, -1234, -123456 } ;
+
+	print_test_name ("Testing psf_log_printf") ;
+
+	psf = &sf_private ;
+	memset (psf, 0, sizeof (sf_private)) ;
+
+	CMP_0_ARGS (__LINE__, errors, " ->%%<- ") ;
+
+	/* Test printing of ints. */
+	for (k = 0 ; k < ARRAY_LEN (int_values) ; k++)
+		CMP_6_ARGS (__LINE__, errors, "int A : %d, % d, %4d, % 4d, %04d, % 04d", int_values [k]) ;
+
+	for (k = 0 ; k < ARRAY_LEN (int_values) ; k++)
+		CMP_5_ARGS (__LINE__, errors, "int B : %+d, %+4d, %+04d, %-d, %-4d", int_values [k]) ;
+
+	for (k = 0 ; k < ARRAY_LEN (int_values) ; k++)
+		CMP_2_ARGS (__LINE__, errors, "int C : %- d, %- 4d", int_values [k]) ;
+
+	/* Test printing of unsigned ints. */
+	for (k = 0 ; k < ARRAY_LEN (int_values) ; k++)
+		CMP_4_ARGS (__LINE__, errors, "D : %u, %4u, %04u, %0u", int_values [k]) ;
+
+	/* Test printing of hex ints. */
+	for (k = 0 ; k < ARRAY_LEN (int_values) ; k++)
+		CMP_4_ARGS (__LINE__, errors, "E : %X, %4X, %04X, %0X", int_values [k]) ;
+
+	/* Test printing of strings. */
+	CMP_4_ARGS (__LINE__, errors, "B %s, %3s, %8s, %-8s", "str") ;
+
+	if (errors)
+	{	puts ("\nExiting due to errors.\n") ;
+		exit (1) ;
+		} ;
+
+	puts ("ok") ;
+} /* test_log_printf */
+
diff --git a/jni/libsndfile-1.0.25/src/test_main.c b/jni/libsndfile-1.0.25/src/test_main.c
new file mode 100644
index 0000000..6692514
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/test_main.c
@@ -0,0 +1,48 @@
+/*
+** Copyright (C) 2008-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <errno.h>
+
+#include "test_main.h"
+
+int
+main (void)
+{
+	test_conversions () ;
+	test_endswap () ;
+	test_float_convert () ;
+	test_double_convert () ;
+
+	test_log_printf () ;
+	test_file_io () ;
+
+	test_audio_detect () ;
+	test_ima_oki_adpcm () ;
+
+	test_psf_strlcpy_crlf () ;
+	test_broadcast_var () ;
+
+	return 0 ;
+} /* main */
+
diff --git a/jni/libsndfile-1.0.25/src/test_main.h b/jni/libsndfile-1.0.25/src/test_main.h
new file mode 100644
index 0000000..53b7311
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/test_main.h
@@ -0,0 +1,39 @@
+/*
+** Copyright (C) 2008-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+static inline void
+print_test_name (const char * name)
+{	printf ("    %-40s : ", name) ;
+	fflush (stdout) ;
+} /* print_test_name */
+
+
+
+void test_conversions (void) ;
+void test_endswap (void) ;
+void test_log_printf (void) ;
+void test_file_io (void) ;
+
+void test_float_convert (void) ;
+void test_double_convert (void) ;
+
+void test_audio_detect (void) ;
+void test_ima_oki_adpcm (void) ;
+
+void test_psf_strlcpy_crlf (void) ;
+void test_broadcast_var (void) ;
diff --git a/jni/libsndfile-1.0.25/src/test_strncpy_crlf.c b/jni/libsndfile-1.0.25/src/test_strncpy_crlf.c
new file mode 100644
index 0000000..1bb1837
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/test_strncpy_crlf.c
@@ -0,0 +1,56 @@
+/*
+** Copyright (C) 2010-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "common.h"
+
+#include "test_main.h"
+
+void
+test_psf_strlcpy_crlf (void)
+{	const char *src = "a\nb\nc\n" ;
+	char *dest ;
+	int dest_len ;
+
+	print_test_name ("Testing psf_strlcpy_crlf") ;
+
+	for (dest_len = 3 ; dest_len < 30 ; dest_len++)
+	{	dest = calloc (1, dest_len + 1) ;
+		if (dest == NULL)
+		{	printf ("\n\nLine %d: calloc failed!\n\n", __LINE__) ;
+			exit (1) ;
+			} ;
+
+		dest [dest_len] = '\xea' ;
+
+		psf_strlcpy_crlf (dest, src, dest_len, sizeof (src)) ;
+
+		if (dest [dest_len] != '\xea')
+		{	printf ("\n\nLine %d: buffer overrun for dest_len == %d\n\n", __LINE__, dest_len) ;
+			exit (1) ;
+			} ;
+
+		free (dest) ;
+		} ;
+
+	puts ("ok") ;
+} /* test_psf_strlcpy_crlf */
diff --git a/jni/libsndfile-1.0.25/src/txw.c b/jni/libsndfile-1.0.25/src/txw.c
new file mode 100644
index 0000000..fce1095
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/txw.c
@@ -0,0 +1,372 @@
+/*
+** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/*===========================================================================
+** Yamaha TX16 Sampler Files.
+**
+** This header parser was written using information from the SoX source code
+** and trial and error experimentation. The code here however is all original.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+#if (ENABLE_EXPERIMENTAL_CODE == 0)
+
+int
+txw_open	(SF_PRIVATE *psf)
+{	if (psf)
+		return SFE_UNIMPLEMENTED ;
+	return 0 ;
+} /* txw_open */
+
+#else
+
+/*------------------------------------------------------------------------------
+** Markers.
+*/
+
+#define TXW_DATA_OFFSET		32
+
+#define	TXW_LOOPED		 	0x49
+#define	TXW_NO_LOOP		 	0xC9
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static int txw_read_header (SF_PRIVATE *psf) ;
+
+static sf_count_t txw_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t txw_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t txw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t txw_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t txw_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+
+/*------------------------------------------------------------------------------
+** Public functions.
+*/
+
+/*
+ * ftp://ftp.t0.or.at/pub/sound/tx16w/samples.yamaha
+ * ftp://ftp.t0.or.at/pub/sound/tx16w/faq/tx16w.tec
+ * http://www.t0.or.at/~mpakesch/tx16w/
+ *
+ * from tx16w.c sox 12.15: (7-Oct-98) (Mark Lakata and Leigh Smith)
+ *  char filetype[6] "LM8953"
+ *  nulls[10],
+ *  dummy_aeg[6]
+ *  format 0x49 = looped, 0xC9 = non-looped
+ *  sample_rate 1 = 33 kHz, 2 = 50 kHz, 3 = 16 kHz
+ *  atc_length[3] if sample rate 0, [2]&0xfe = 6: 33kHz, 0x10:50, 0xf6: 16,
+ *					depending on [5] but to heck with it
+ *  rpt_length[3] (these are for looped samples, attack and loop lengths)
+ *  unused[2]
+ */
+
+typedef struct
+{	unsigned char	format, srate, sr2, sr3 ;
+	unsigned short	srhash ;
+	unsigned int	attacklen, repeatlen ;
+} TXW_HEADER ;
+
+#define	ERROR_666	666
+
+int
+txw_open	(SF_PRIVATE *psf)
+{	int error ;
+
+	if (psf->file.mode != SFM_READ)
+		return SFE_UNIMPLEMENTED ;
+
+	if ((error = txw_read_header (psf)))
+			return error ;
+
+ 	if (psf_fseek (psf, psf->dataoffset, SEEK_SET) != psf->dataoffset)
+		return SFE_BAD_SEEK ;
+
+	psf->read_short		= txw_read_s ;
+	psf->read_int		= txw_read_i ;
+	psf->read_float		= txw_read_f ;
+	psf->read_double	= txw_read_d ;
+
+	psf->seek = txw_seek ;
+
+	return 0 ;
+} /* txw_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+txw_read_header	(SF_PRIVATE *psf)
+{	TXW_HEADER txwh ;
+	const char	*strptr ;
+
+	memset (&txwh, 0, sizeof (txwh)) ;
+	memset (psf->u.cbuf, 0, sizeof (psf->u.cbuf)) ;
+	psf_binheader_readf (psf, "pb", 0, psf->u.cbuf, 16) ;
+
+	if (memcmp (psf->u.cbuf, "LM8953\0\0\0\0\0\0\0\0\0\0", 16) != 0)
+		return ERROR_666 ;
+
+	psf_log_printf (psf, "Read only : Yamaha TX-16 Sampler (.txw)\nLM8953\n") ;
+
+	/* Jump 6 bytes (dummp_aeg), read format, read sample rate. */
+	psf_binheader_readf (psf, "j11", 6, &txwh.format, &txwh.srate) ;
+
+	/* 8 bytes (atc_length[3], rpt_length[3], unused[2]). */
+	psf_binheader_readf (psf, "e33j", &txwh.attacklen, &txwh.repeatlen, 2) ;
+	txwh.sr2 = (txwh.attacklen >> 16) & 0xFE ;
+	txwh.sr3 = (txwh.repeatlen >> 16) & 0xFE ;
+	txwh.attacklen &= 0x1FFFF ;
+	txwh.repeatlen &= 0x1FFFF ;
+
+	switch (txwh.format)
+	{	case TXW_LOOPED :
+				strptr = "looped" ;
+				break ;
+
+		case TXW_NO_LOOP :
+				strptr = "non-looped" ;
+				break ;
+
+		default :
+				psf_log_printf (psf, " Format      : 0x%02x => ?????\n", txwh.format) ;
+				return ERROR_666 ;
+		} ;
+
+	psf_log_printf (psf, " Format      : 0x%02X => %s\n", txwh.format, strptr) ;
+
+	strptr = NULL ;
+
+	switch (txwh.srate)
+	{	case 1 :
+				psf->sf.samplerate = 33333 ;
+				break ;
+
+		case 2 :
+				psf->sf.samplerate = 50000 ;
+				break ;
+
+		case 3 :
+				psf->sf.samplerate = 16667 ;
+				break ;
+
+		default :
+			/* This is ugly and braindead. */
+			txwh.srhash = ((txwh.sr2 & 0xFE) << 8) | (txwh.sr3 & 0xFE) ;
+			switch (txwh.srhash)
+			{	case ((0x6 << 8) | 0x52) :
+						psf->sf.samplerate = 33333 ;
+						break ;
+
+				case ((0x10 << 8) | 0x52) :
+						psf->sf.samplerate = 50000 ;
+						break ;
+
+				case ((0xF6 << 8) | 0x52) :
+						psf->sf.samplerate = 166667 ;
+						break ;
+
+				default :
+						strptr = " Sample Rate : Unknown : forcing to 33333\n" ;
+						psf->sf.samplerate = 33333 ;
+						break ;
+				} ;
+		} ;
+
+
+	if (strptr)
+		psf_log_printf (psf, strptr) ;
+	else if (txwh.srhash)
+		psf_log_printf (psf, " Sample Rate : %d (0x%X) => %d\n", txwh.srate, txwh.srhash, psf->sf.samplerate) ;
+	else
+		psf_log_printf (psf, " Sample Rate : %d => %d\n", txwh.srate, psf->sf.samplerate) ;
+
+	if (txwh.format == TXW_LOOPED)
+	{	psf_log_printf (psf, " Attack Len  : %d\n", txwh.attacklen) ;
+		psf_log_printf (psf, " Repeat Len  : %d\n", txwh.repeatlen) ;
+		} ;
+
+	psf->dataoffset = TXW_DATA_OFFSET ;
+	psf->datalength = psf->filelength - TXW_DATA_OFFSET ;
+	psf->sf.frames	= 2 * psf->datalength / 3 ;
+
+
+	if (psf->datalength % 3 == 1)
+		psf_log_printf (psf, "*** File seems to be truncated, %d extra bytes.\n",
+			(int) (psf->datalength % 3)) ;
+
+	if (txwh.attacklen + txwh.repeatlen > psf->sf.frames)
+		psf_log_printf (psf, "*** File has been truncated.\n") ;
+
+	psf->sf.format = SF_FORMAT_TXW | SF_FORMAT_PCM_16 ;
+	psf->sf.channels = 1 ;
+	psf->sf.sections = 1 ;
+	psf->sf.seekable = SF_TRUE ;
+
+	return 0 ;
+} /* txw_read_header */
+
+static sf_count_t
+txw_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	unsigned char	*ucptr ;
+	short			sample ;
+	int				k, bufferlen, readcount, count ;
+	sf_count_t		total = 0 ;
+
+	bufferlen = sizeof (psf->u.cbuf) / 3 ;
+	bufferlen -= (bufferlen & 1) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = psf_fread (psf->u.cbuf, 3, readcount, psf) ;
+
+		ucptr = psf->u.ucbuf ;
+		for (k = 0 ; k < readcount ; k += 2)
+		{	sample = (ucptr [0] << 8) | (ucptr [1] & 0xF0) ;
+			ptr [total + k] = sample ;
+			sample = (ucptr [2] << 8) | ((ucptr [1] & 0xF) << 4) ;
+			ptr [total + k + 1] = sample ;
+			ucptr += 3 ;
+			} ;
+
+		total += count ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* txw_read_s */
+
+static sf_count_t
+txw_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	unsigned char	*ucptr ;
+	short			sample ;
+	int				k, bufferlen, readcount, count ;
+	sf_count_t		total = 0 ;
+
+	bufferlen = sizeof (psf->u.cbuf) / 3 ;
+	bufferlen -= (bufferlen & 1) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = psf_fread (psf->u.cbuf, 3, readcount, psf) ;
+
+		ucptr = psf->u.ucbuf ;
+		for (k = 0 ; k < readcount ; k += 2)
+		{	sample = (ucptr [0] << 8) | (ucptr [1] & 0xF0) ;
+			ptr [total + k] = sample << 16 ;
+			sample = (ucptr [2] << 8) | ((ucptr [1] & 0xF) << 4) ;
+			ptr [total + k + 1] = sample << 16 ;
+			ucptr += 3 ;
+			} ;
+
+		total += count ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* txw_read_i */
+
+static sf_count_t
+txw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	unsigned char	*ucptr ;
+	short			sample ;
+	int				k, bufferlen, readcount, count ;
+	sf_count_t		total = 0 ;
+	float			normfact ;
+
+	if (psf->norm_float == SF_TRUE)
+		normfact = 1.0 / 0x8000 ;
+	else
+		normfact = 1.0 / 0x10 ;
+
+	bufferlen = sizeof (psf->u.cbuf) / 3 ;
+	bufferlen -= (bufferlen & 1) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = psf_fread (psf->u.cbuf, 3, readcount, psf) ;
+
+		ucptr = psf->u.ucbuf ;
+		for (k = 0 ; k < readcount ; k += 2)
+		{	sample = (ucptr [0] << 8) | (ucptr [1] & 0xF0) ;
+			ptr [total + k] = normfact * sample ;
+			sample = (ucptr [2] << 8) | ((ucptr [1] & 0xF) << 4) ;
+			ptr [total + k + 1] = normfact * sample ;
+			ucptr += 3 ;
+			} ;
+
+		total += count ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* txw_read_f */
+
+static sf_count_t
+txw_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	unsigned char	*ucptr ;
+	short			sample ;
+	int				k, bufferlen, readcount, count ;
+	sf_count_t		total = 0 ;
+	double			normfact ;
+
+	if (psf->norm_double == SF_TRUE)
+		normfact = 1.0 / 0x8000 ;
+	else
+		normfact = 1.0 / 0x10 ;
+
+	bufferlen = sizeof (psf->u.cbuf) / 3 ;
+	bufferlen -= (bufferlen & 1) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = psf_fread (psf->u.cbuf, 3, readcount, psf) ;
+
+		ucptr = psf->u.ucbuf ;
+		for (k = 0 ; k < readcount ; k += 2)
+		{	sample = (ucptr [0] << 8) | (ucptr [1] & 0xF0) ;
+			ptr [total + k] = normfact * sample ;
+			sample = (ucptr [2] << 8) | ((ucptr [1] & 0xF) << 4) ;
+			ptr [total + k + 1] = normfact * sample ;
+			ucptr += 3 ;
+			} ;
+
+		total += count ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* txw_read_d */
+
+static sf_count_t
+txw_seek (SF_PRIVATE *psf, int mode, sf_count_t offset)
+{	if (psf && mode)
+		return offset ;
+
+	return 0 ;
+} /* txw_seek */
+
+#endif
diff --git a/jni/libsndfile-1.0.25/src/txw.lo b/jni/libsndfile-1.0.25/src/txw.lo
new file mode 100644
index 0000000..8b1fbda
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/txw.lo
@@ -0,0 +1,12 @@
+# txw.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/txw.o'
+
+# Name of the non-PIC object
+non_pic_object='txw.o'
+
diff --git a/jni/libsndfile-1.0.25/src/txw.o b/jni/libsndfile-1.0.25/src/txw.o
new file mode 100644
index 0000000..a09eb88
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/txw.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/ulaw.c b/jni/libsndfile-1.0.25/src/ulaw.c
new file mode 100644
index 0000000..c6ff7b8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ulaw.c
@@ -0,0 +1,1043 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<math.h>
+
+#include	"sndfile.h"
+#include	"common.h"
+
+static sf_count_t ulaw_read_ulaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t ulaw_read_ulaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t ulaw_read_ulaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t ulaw_read_ulaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t ulaw_write_s2ulaw (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t ulaw_write_i2ulaw (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t ulaw_write_f2ulaw (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t ulaw_write_d2ulaw (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+int
+ulaw_init (SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR)
+	{	psf->read_short		= ulaw_read_ulaw2s ;
+		psf->read_int		= ulaw_read_ulaw2i ;
+		psf->read_float		= ulaw_read_ulaw2f ;
+		psf->read_double	= ulaw_read_ulaw2d ;
+		} ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	psf->write_short	= ulaw_write_s2ulaw ;
+		psf->write_int		= ulaw_write_i2ulaw ;
+		psf->write_float	= ulaw_write_f2ulaw ;
+		psf->write_double	= ulaw_write_d2ulaw ;
+		} ;
+
+	psf->bytewidth = 1 ;
+	psf->blockwidth = psf->sf.channels ;
+
+	if (psf->filelength > psf->dataoffset)
+		psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset :
+							psf->filelength - psf->dataoffset ;
+	else
+		psf->datalength = 0 ;
+
+	psf->sf.frames = psf->blockwidth > 0 ? psf->datalength / psf->blockwidth : 0 ;
+
+	return 0 ;
+} /* ulaw_init */
+
+/*==============================================================================
+*/
+
+static short ulaw_decode [256] =
+{	-32124,	-31100,	-30076,	-29052,	-28028,	-27004,	-25980,	-24956,
+	-23932,	-22908,	-21884,	-20860,	-19836,	-18812,	-17788,	-16764,
+	-15996,	-15484,	-14972,	-14460,	-13948,	-13436,	-12924,	-12412,
+	-11900,	-11388,	-10876,	-10364,	-9852,	-9340,	-8828,	-8316,
+	-7932,	-7676,	-7420,	-7164,	-6908,	-6652,	-6396,	-6140,
+	-5884,	-5628,	-5372,	-5116,	-4860,	-4604,	-4348,	-4092,
+	-3900,	-3772,	-3644,	-3516,	-3388,	-3260,	-3132,	-3004,
+	-2876,	-2748,	-2620,	-2492,	-2364,	-2236,	-2108,	-1980,
+	-1884,	-1820,	-1756,	-1692,	-1628,	-1564,	-1500,	-1436,
+	-1372,	-1308,	-1244,	-1180,	-1116,	-1052,	-988,	-924,
+	-876,	-844,	-812,	-780,	-748,	-716,	-684,	-652,
+	-620,	-588,	-556,	-524,	-492,	-460,	-428,	-396,
+	-372,	-356,	-340,	-324,	-308,	-292,	-276,	-260,
+	-244,	-228,	-212,	-196,	-180,	-164,	-148,	-132,
+	-120,	-112,	-104,	-96,	-88,	-80,	-72,	-64,
+	-56,	-48,	-40,	-32,	-24,	-16,	-8,		0,
+
+	32124,	31100,	30076,	29052,	28028,	27004,	25980,	24956,
+	23932,	22908,	21884,	20860,	19836,	18812,	17788,	16764,
+	15996,	15484,	14972,	14460,	13948,	13436,	12924,	12412,
+	11900,	11388,	10876,	10364,	9852,	9340,	8828,	8316,
+	7932,	7676,	7420,	7164,	6908,	6652,	6396,	6140,
+	5884,	5628,	5372,	5116,	4860,	4604,	4348,	4092,
+	3900,	3772,	3644,	3516,	3388,	3260,	3132,	3004,
+	2876,	2748,	2620,	2492,	2364,	2236,	2108,	1980,
+	1884,	1820,	1756,	1692,	1628,	1564,	1500,	1436,
+	1372,	1308,	1244,	1180,	1116,	1052,	988,	924,
+	876,	844,	812,	780,	748,	716,	684,	652,
+	620,	588,	556,	524,	492,	460,	428,	396,
+	372,	356,	340,	324,	308,	292,	276,	260,
+	244,	228,	212,	196,	180,	164,	148,	132,
+	120,	112,	104,	96,		88,		80,		72,		64,
+	56,		48,		40,		32,		24,		16,		8,		0
+} ;
+
+static
+unsigned char ulaw_encode [8193] =
+{	0xff, 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xfc, 0xfb, 0xfb, 0xfa, 0xfa, 0xf9,
+	0xf9, 0xf8, 0xf8, 0xf7, 0xf7, 0xf6, 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3,
+	0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xee,
+	0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xeb,
+	0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8,
+	0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe5,
+	0xe5, 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4, 0xe3, 0xe3, 0xe3, 0xe3, 0xe2,
+	0xe2, 0xe2, 0xe2, 0xe1, 0xe1, 0xe1, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf,
+	0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xde, 0xde, 0xde, 0xde, 0xde,
+	0xde, 0xde, 0xde, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc,
+	0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
+	0xdb, 0xdb, 0xdb, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xd9,
+	0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8,
+	0xd8, 0xd8, 0xd8, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd6,
+	0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5,
+	0xd5, 0xd5, 0xd5, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd3,
+	0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2,
+	0xd2, 0xd2, 0xd2, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd0,
+	0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf,
+	0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xce,
+	0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce,
+	0xce, 0xce, 0xce, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
+	0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
+	0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb,
+	0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb,
+	0xcb, 0xcb, 0xcb, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca,
+	0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9,
+	0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc8,
+	0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8,
+	0xc8, 0xc8, 0xc8, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7,
+	0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
+	0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc5,
+	0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5,
+	0xc5, 0xc5, 0xc5, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4,
+	0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3,
+	0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc2,
+	0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2,
+	0xc2, 0xc2, 0xc2, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1,
+	0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
+	0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xbf,
+	0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf,
+	0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf,
+	0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe,
+	0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe,
+	0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe,
+	0xbe, 0xbe, 0xbe, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd,
+	0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd,
+	0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbc,
+	0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc,
+	0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc,
+	0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+	0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+	0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+	0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+	0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+	0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9,
+	0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9,
+	0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9,
+	0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8,
+	0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8,
+	0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8,
+	0xb8, 0xb8, 0xb8, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7,
+	0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7,
+	0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb6,
+	0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6,
+	0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6,
+	0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5,
+	0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5,
+	0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5,
+	0xb5, 0xb5, 0xb5, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4,
+	0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4,
+	0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb3,
+	0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3,
+	0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3,
+	0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2,
+	0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2,
+	0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2,
+	0xb2, 0xb2, 0xb2, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1,
+	0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1,
+	0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb0,
+	0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0,
+	0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0,
+	0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
+	0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
+	0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
+	0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
+	0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
+	0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xae,
+	0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
+	0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
+	0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
+	0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
+	0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
+	0xae, 0xae, 0xae, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad,
+	0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad,
+	0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad,
+	0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad,
+	0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad,
+	0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xac, 0xac, 0xac, 0xac, 0xac,
+	0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
+	0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
+	0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
+	0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
+	0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab,
+	0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
+	0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
+	0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
+	0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
+	0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
+	0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
+	0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
+	0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
+	0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
+	0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
+	0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8,
+	0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
+	0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
+	0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
+	0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
+	0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
+	0xa8, 0xa8, 0xa8, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7,
+	0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7,
+	0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7,
+	0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7,
+	0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7,
+	0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
+	0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
+	0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
+	0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
+	0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
+	0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa5,
+	0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
+	0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
+	0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
+	0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
+	0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
+	0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
+	0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
+	0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
+	0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
+	0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
+	0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
+	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
+	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
+	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
+	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
+	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa2,
+	0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2,
+	0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2,
+	0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2,
+	0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2,
+	0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2,
+	0xa2, 0xa2, 0xa2, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
+	0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
+	0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
+	0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
+	0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
+	0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0,
+	0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0,
+	0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0,
+	0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0,
+	0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0,
+	0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0x9f,
+	0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f,
+	0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f,
+	0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f,
+	0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f,
+	0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f,
+	0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f,
+	0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f,
+	0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f,
+	0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f,
+	0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f,
+	0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e,
+	0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e,
+	0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e,
+	0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e,
+	0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e,
+	0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e,
+	0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e,
+	0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e,
+	0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e,
+	0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e,
+	0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e,
+	0x9e, 0x9e, 0x9e, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d,
+	0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d,
+	0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d,
+	0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d,
+	0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d,
+	0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d,
+	0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d,
+	0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d,
+	0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d,
+	0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d,
+	0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9c,
+	0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c,
+	0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c,
+	0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c,
+	0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c,
+	0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c,
+	0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c,
+	0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c,
+	0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c,
+	0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c,
+	0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c,
+	0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b,
+	0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b,
+	0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b,
+	0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b,
+	0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b,
+	0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b,
+	0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b,
+	0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b,
+	0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b,
+	0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b,
+	0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b,
+	0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a,
+	0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a,
+	0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a,
+	0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a,
+	0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a,
+	0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a,
+	0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a,
+	0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a,
+	0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a,
+	0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a,
+	0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x99,
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, 0x98, 0x98,
+	0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
+	0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
+	0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
+	0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
+	0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
+	0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
+	0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
+	0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
+	0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
+	0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
+	0x98, 0x98, 0x98, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97,
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97,
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97,
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97,
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97,
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97,
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97,
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97,
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97,
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97,
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96,
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96,
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96,
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96,
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96,
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96,
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96,
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96,
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96,
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96,
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96,
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x95, 0x95, 0x95, 0x95, 0x95,
+	0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95,
+	0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95,
+	0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95,
+	0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95,
+	0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95,
+	0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95,
+	0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95,
+	0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95,
+	0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95,
+	0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95,
+	0x95, 0x95, 0x95, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94,
+	0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94,
+	0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94,
+	0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94,
+	0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94,
+	0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94,
+	0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94,
+	0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94,
+	0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94,
+	0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94,
+	0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x93,
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93,
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93,
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93,
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93,
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93,
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93,
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93,
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93,
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93,
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93,
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92,
+	0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
+	0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
+	0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
+	0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
+	0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
+	0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
+	0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
+	0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
+	0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
+	0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
+	0x92, 0x92, 0x92, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
+	0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
+	0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
+	0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
+	0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
+	0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
+	0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
+	0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
+	0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
+	0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
+	0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x90,
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
+	0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
+	0x8e, 0x8e, 0x8e, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
+	0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
+	0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
+	0x8b, 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
+	0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+	0x88, 0x88, 0x88, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
+	0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
+	0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00
+} ;
+
+static inline void
+ulaw2s_array (unsigned char *buffer, int count, short *ptr)
+{	while (--count >= 0)
+		ptr [count] = ulaw_decode [(int) buffer [count]] ;
+} /* ulaw2s_array */
+
+static inline void
+ulaw2i_array (unsigned char *buffer, int count, int *ptr)
+{	while (--count >= 0)
+		ptr [count] = ulaw_decode [buffer [count]] << 16 ;
+} /* ulaw2i_array */
+
+static inline void
+ulaw2f_array (unsigned char *buffer, int count, float *ptr, float normfact)
+{	while (--count >= 0)
+		ptr [count] = normfact * ulaw_decode [(int) buffer [count]] ;
+} /* ulaw2f_array */
+
+static inline void
+ulaw2d_array (const unsigned char *buffer, int count, double *ptr, double normfact)
+{	while (--count >= 0)
+		ptr [count] = normfact * ulaw_decode [(int) buffer [count]] ;
+} /* ulaw2d_array */
+
+static inline void
+s2ulaw_array (const short *ptr, int count, unsigned char *buffer)
+{	while (--count >= 0)
+	{	if (ptr [count] >= 0)
+			buffer [count] = ulaw_encode [ptr [count] / 4] ;
+		else
+			buffer [count] = 0x7F & ulaw_encode [ptr [count] / -4] ;
+		} ;
+} /* s2ulaw_array */
+
+static inline void
+i2ulaw_array (const int *ptr, int count, unsigned char *buffer)
+{	while (--count >= 0)
+	{	if (ptr [count] >= 0)
+			buffer [count] = ulaw_encode [ptr [count] >> (16 + 2)] ;
+		else
+			buffer [count] = 0x7F & ulaw_encode [-ptr [count] >> (16 + 2)] ;
+		} ;
+} /* i2ulaw_array */
+
+static inline void
+f2ulaw_array (const float *ptr, int count, unsigned char *buffer, float normfact)
+{	while (--count >= 0)
+	{	if (ptr [count] >= 0)
+			buffer [count] = ulaw_encode [lrintf (normfact * ptr [count])] ;
+		else
+			buffer [count] = 0x7F & ulaw_encode [- lrintf (normfact * ptr [count])] ;
+		} ;
+} /* f2ulaw_array */
+
+static inline void
+d2ulaw_array (const double *ptr, int count, unsigned char *buffer, double normfact)
+{	while (--count >= 0)
+	{	if (ptr [count] >= 0)
+			buffer [count] = ulaw_encode [lrint (normfact * ptr [count])] ;
+		else
+			buffer [count] = 0x7F & ulaw_encode [- lrint (normfact * ptr [count])] ;
+		} ;
+} /* d2ulaw_array */
+
+/*==============================================================================
+*/
+
+static sf_count_t
+ulaw_read_ulaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ucbuf, 1, bufferlen, psf) ;
+		ulaw2s_array (psf->u.ucbuf, readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* ulaw_read_ulaw2s */
+
+static sf_count_t
+ulaw_read_ulaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ucbuf, 1, bufferlen, psf) ;
+		ulaw2i_array (psf->u.ucbuf, readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* ulaw_read_ulaw2i */
+
+static sf_count_t
+ulaw_read_ulaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ucbuf, 1, bufferlen, psf) ;
+		ulaw2f_array (psf->u.ucbuf, readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* ulaw_read_ulaw2f */
+
+static sf_count_t
+ulaw_read_ulaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	double	normfact ;
+
+	normfact = (psf->norm_double) ? 1.0 / ((double) 0x8000) : 1.0 ;
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.ucbuf, 1, bufferlen, psf) ;
+		ulaw2d_array (psf->u.ucbuf, readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* ulaw_read_ulaw2d */
+
+/*=============================================================================================
+*/
+
+static sf_count_t
+ulaw_write_s2ulaw	(SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		s2ulaw_array (ptr + total, bufferlen, psf->u.ucbuf) ;
+		writecount = psf_fwrite (psf->u.ucbuf, 1, bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* ulaw_write_s2ulaw */
+
+static sf_count_t
+ulaw_write_i2ulaw	(SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		i2ulaw_array (ptr + total, bufferlen, psf->u.ucbuf) ;
+		writecount = psf_fwrite (psf->u.ucbuf, 1, bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* ulaw_write_i2ulaw */
+
+static sf_count_t
+ulaw_write_f2ulaw	(SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+	float	normfact ;
+
+	/* Factor in a divide by 4. */
+	normfact = (psf->norm_float == SF_TRUE) ? (0.25 * 0x7FFF) : 0.25 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		f2ulaw_array (ptr + total, bufferlen, psf->u.ucbuf, normfact) ;
+		writecount = psf_fwrite (psf->u.ucbuf, 1, bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* ulaw_write_f2ulaw */
+
+static sf_count_t
+ulaw_write_d2ulaw	(SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+	double	normfact ;
+
+	/* Factor in a divide by 4. */
+	normfact = (psf->norm_double) ? (0.25 * 0x7FFF) : 0.25 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		d2ulaw_array (ptr + total, bufferlen, psf->u.ucbuf, normfact) ;
+		writecount = psf_fwrite (psf->u.ucbuf, 1, bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* ulaw_write_d2ulaw */
+
diff --git a/jni/libsndfile-1.0.25/src/ulaw.lo b/jni/libsndfile-1.0.25/src/ulaw.lo
new file mode 100644
index 0000000..b0ca9e7
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ulaw.lo
@@ -0,0 +1,12 @@
+# ulaw.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/ulaw.o'
+
+# Name of the non-PIC object
+non_pic_object='ulaw.o'
+
diff --git a/jni/libsndfile-1.0.25/src/ulaw.o b/jni/libsndfile-1.0.25/src/ulaw.o
new file mode 100644
index 0000000..b0b5ade
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/ulaw.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/version-metadata.rc b/jni/libsndfile-1.0.25/src/version-metadata.rc
new file mode 100644
index 0000000..225ccbd
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/version-metadata.rc
@@ -0,0 +1,32 @@
+#include <windows.h>
+
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_AUS
+1 VERSIONINFO
+	FILEVERSION		1,0,25,0
+	PRODUCTVERSION	1,0,25,0
+	FILEOS			VOS__WINDOWS32
+	FILETYPE		VFT_DLL
+	FILESUBTYPE		VFT2_UNKNOWN
+	FILEFLAGSMASK	0x00000000
+	FILEFLAGS		0x00000000
+{
+	BLOCK "StringFileInfo"
+	{
+		BLOCK "040904e4"
+		{
+			VALUE "FileDescription", "A library for reading and writing audio files."
+			VALUE "FileVersion", "1.0.25.0\0"
+			VALUE "Full Version", "1.0.25"
+			VALUE "InternalName", "libsndfile"
+			VALUE "LegalCopyright", "Copyright (C) 1999-2010, Licensed LGPL"
+			VALUE "OriginalFilename", "libsndfile-1.dll"
+			VALUE "ProductName", "libsndfile-1 DLL"
+			VALUE "ProductVersion", "1.0.25.0\0"
+			VALUE "Language", "Language Neutral"
+		}
+	}
+	BLOCK "VarFileInfo"
+	{
+		VALUE "Translation", 0x0409, 0x04E4
+	}
+}
diff --git a/jni/libsndfile-1.0.25/src/version-metadata.rc.in b/jni/libsndfile-1.0.25/src/version-metadata.rc.in
new file mode 100644
index 0000000..06f64c0
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/version-metadata.rc.in
@@ -0,0 +1,32 @@
+#include <windows.h>
+
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_AUS
+1 VERSIONINFO
+	FILEVERSION		@WIN_RC_VERSION@,0
+	PRODUCTVERSION	@WIN_RC_VERSION@,0
+	FILEOS			VOS__WINDOWS32
+	FILETYPE		VFT_DLL
+	FILESUBTYPE		VFT2_UNKNOWN
+	FILEFLAGSMASK	0x00000000
+	FILEFLAGS		0x00000000
+{
+	BLOCK "StringFileInfo"
+	{
+		BLOCK "040904e4"
+		{
+			VALUE "FileDescription", "A library for reading and writing audio files."
+			VALUE "FileVersion", "@CLEAN_VERSION@.0\0"
+			VALUE "Full Version", "@PACKAGE_VERSION@"
+			VALUE "InternalName", "libsndfile"
+			VALUE "LegalCopyright", "Copyright (C) 1999-2010, Licensed LGPL"
+			VALUE "OriginalFilename", "libsndfile-1.dll"
+			VALUE "ProductName", "libsndfile-1 DLL"
+			VALUE "ProductVersion", "@CLEAN_VERSION@.0\0"
+			VALUE "Language", "Language Neutral"
+		}
+	}
+	BLOCK "VarFileInfo"
+	{
+		VALUE "Translation", 0x0409, 0x04E4
+	}
+}
diff --git a/jni/libsndfile-1.0.25/src/voc.c b/jni/libsndfile-1.0.25/src/voc.c
new file mode 100644
index 0000000..d13b033
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/voc.c
@@ -0,0 +1,882 @@
+/*
+** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/*	RANT:
+**	The VOC file format is the most brain damaged format I have yet had to deal
+**	with. No one programmer could have bee stupid enough to put this together.
+**	Instead it looks like a series of manic, dyslexic assembly language programmers
+**	hacked it to fit their needs.
+**	Utterly woeful.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "sndfile.h"
+#include "sfendian.h"
+#include "common.h"
+
+
+/*------------------------------------------------------------------------------
+ * Typedefs for file chunks.
+*/
+
+#define	VOC_MAX_SECTIONS	200
+
+enum
+{	VOC_TERMINATOR		= 0,
+	VOC_SOUND_DATA		= 1,
+	VOC_SOUND_CONTINUE	= 2,
+	VOC_SILENCE			= 3,
+	VOC_MARKER			= 4,
+	VOC_ASCII			= 5,
+	VOC_REPEAT			= 6,
+	VOC_END_REPEAT		= 7,
+	VOC_EXTENDED		= 8,
+	VOC_EXTENDED_II		= 9
+} ;
+
+typedef struct
+{	int 	samples ;
+	int		offset ;	/* Offset of zero => silence. */
+} SND_DATA_BLOCKS ;
+
+typedef struct
+{	unsigned int 	sections, section_types ;
+	int				samplerate, channels, bitwidth ;
+	SND_DATA_BLOCKS	blocks [VOC_MAX_SECTIONS] ;
+} VOC_DATA ;
+
+/*------------------------------------------------------------------------------
+ * Private static functions.
+*/
+
+static	int	voc_close	(SF_PRIVATE *psf) ;
+static	int voc_write_header (SF_PRIVATE *psf, int calc_length) ;
+static	int voc_read_header	(SF_PRIVATE *psf) ;
+
+static const char* voc_encoding2str (int encoding) ;
+
+#if 0
+
+/*	These functions would be required for files with more than one VOC_SOUND_DATA
+**	segment. Not sure whether to bother implementing this.
+*/
+
+static int	voc_multi_init (SF_PRIVATE *psf, VOC_DATA *pvoc) ;
+
+static int	voc_multi_read_uc2s		(SF_PRIVATE *psf, short *ptr, int len) ;
+static int	voc_multi_read_les2s	(SF_PRIVATE *psf, short *ptr, int len) ;
+
+static int	voc_multi_read_uc2i		(SF_PRIVATE *psf, int *ptr, int len) ;
+static int	voc_multi_read_les2i	(SF_PRIVATE *psf, int *ptr, int len) ;
+
+static int	voc_multi_read_uc2f		(SF_PRIVATE *psf, float *ptr, int len) ;
+static int	voc_multi_read_les2f	(SF_PRIVATE *psf, float *ptr, int len) ;
+
+static int	voc_multi_read_uc2d		(SF_PRIVATE *psf, double *ptr, int len) ;
+static int	voc_multi_read_les2d	(SF_PRIVATE *psf, double *ptr, int len) ;
+#endif
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+voc_open	(SF_PRIVATE *psf)
+{	int subformat, error = 0 ;
+
+	if (psf->is_pipe)
+		return SFE_VOC_NO_PIPE ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = voc_read_header (psf)))
+			return error ;
+		} ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_VOC)
+			return	SFE_BAD_OPEN_FORMAT ;
+
+		psf->endian = SF_ENDIAN_LITTLE ;
+
+		if ((error = voc_write_header (psf, SF_FALSE)))
+			return error ;
+
+		psf->write_header = voc_write_header ;
+		} ;
+
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+	psf->container_close = voc_close ;
+
+	switch (subformat)
+	{	case SF_FORMAT_PCM_U8 :
+		case SF_FORMAT_PCM_16 :
+				error = pcm_init (psf) ;
+				break ;
+
+		case SF_FORMAT_ALAW :
+				error = alaw_init (psf) ;
+				break ;
+
+		case SF_FORMAT_ULAW :
+				error = ulaw_init (psf) ;
+				break ;
+
+		default : return SFE_UNIMPLEMENTED ;
+		} ;
+
+	return error ;
+} /* voc_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+voc_read_header	(SF_PRIVATE *psf)
+{	VOC_DATA	*pvoc ;
+	char	creative [20] ;
+	unsigned char block_type, rate_byte ;
+	short	version, checksum, encoding, dataoffset ;
+	int		offset ;
+
+	/* Set position to start of file to begin reading header. */
+	offset = psf_binheader_readf (psf, "pb", 0, creative, SIGNED_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) ;
+
+	offset += psf_binheader_readf (psf, "e222", &dataoffset, &version, &checksum) ;
+
+	psf->dataoffset = dataoffset ;
+
+	psf_log_printf (psf, 	"dataoffset : %d\n"
+							"version    : 0x%X\n"
+							"checksum   : 0x%X\n", psf->dataoffset, version, checksum) ;
+
+	if (version != 0x010A && version != 0x0114)
+		return SFE_VOC_BAD_VERSION ;
+
+	if (! (psf->codec_data = malloc (sizeof (VOC_DATA))))
+		return SFE_MALLOC_FAILED ;
+
+	pvoc = (VOC_DATA*) psf->codec_data ;
+
+	memset (pvoc, 0, sizeof (VOC_DATA)) ;
+
+	/* Set the default encoding now. */
+	psf->sf.format = SF_FORMAT_VOC ; /* Major format */
+	encoding = SF_FORMAT_PCM_U8 ; /* Minor format */
+	psf->endian = SF_ENDIAN_LITTLE ;
+
+	while (1)
+	{	unsigned size ;
+		short count ;
+
+		block_type = 0 ;
+		offset += psf_binheader_readf (psf, "1", &block_type) ;
+
+		switch (block_type)
+		{	case VOC_ASCII :
+					offset += psf_binheader_readf (psf, "e3", &size) ;
+
+					psf_log_printf (psf, " ASCII : %d\n", size) ;
+
+					if (size < sizeof (psf->header) - 1)
+					{	offset += psf_binheader_readf (psf, "b", psf->header, size) ;
+						psf->header [size] = 0 ;
+						psf_log_printf (psf, "  text : %s\n", psf->header) ;
+						continue ;
+						}
+
+					offset += psf_binheader_readf (psf, "j", size) ;
+					continue ;
+
+			case VOC_REPEAT :
+					offset += psf_binheader_readf (psf, "e32", &size, &count) ;
+					psf_log_printf (psf, " Repeat : %d\n", count) ;
+					continue ;
+
+			case VOC_SOUND_DATA :
+			case VOC_EXTENDED :
+			case VOC_EXTENDED_II :
+					break ;
+
+			default : psf_log_printf (psf, "*** Weird block marker (%d)\n", block_type) ;
+			} ;
+
+		break ;
+		} ;
+
+	if (block_type == VOC_SOUND_DATA)
+	{	unsigned char compression ;
+		int 	size ;
+
+		offset += psf_binheader_readf (psf, "e311", &size, &rate_byte, &compression) ;
+
+		psf->sf.samplerate = 1000000 / (256 - (rate_byte & 0xFF)) ;
+
+		psf_log_printf (psf, " Sound Data : %d\n  sr   : %d => %dHz\n  comp : %d\n",
+								size, rate_byte, psf->sf.samplerate, compression) ;
+
+		if (offset + size - 1 > psf->filelength)
+		{	psf_log_printf (psf, "Seems to be a truncated file.\n") ;
+			psf_log_printf (psf, "offset: %d    size: %d    sum: %d    filelength: %D\n", offset, size, offset + size, psf->filelength) ;
+			return SFE_VOC_BAD_SECTIONS ;
+			}
+		else if (psf->filelength - offset - size > 4)
+		{	psf_log_printf (psf, "Seems to be a multi-segment file (#1).\n") ;
+			psf_log_printf (psf, "offset: %d    size: %d    sum: %d    filelength: %D\n", offset, size, offset + size, psf->filelength) ;
+			return SFE_VOC_BAD_SECTIONS ;
+			} ;
+
+		psf->dataoffset = offset ;
+		psf->dataend	= psf->filelength - 1 ;
+
+		psf->sf.channels = 1 ;
+		psf->bytewidth = 1 ;
+
+		psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_PCM_U8 ;
+
+		return 0 ;
+		} ;
+
+	if (block_type == VOC_EXTENDED)
+	{	unsigned char pack, stereo, compression ;
+		unsigned short rate_short ;
+		int		size ;
+
+		offset += psf_binheader_readf (psf, "e3211", &size, &rate_short, &pack, &stereo) ;
+
+		psf_log_printf (psf, " Extended : %d\n", size) ;
+		if (size == 4)
+			psf_log_printf (psf, "  size   : 4\n") ;
+		else
+			psf_log_printf (psf, "  size   : %d (should be 4)\n", size) ;
+
+		psf_log_printf (psf,	"  pack   : %d\n"
+								"  stereo : %s\n", pack, (stereo ? "yes" : "no")) ;
+
+		if (stereo)
+		{	psf->sf.channels = 2 ;
+			psf->sf.samplerate = 128000000 / (65536 - rate_short) ;
+			}
+		else
+		{	psf->sf.channels = 1 ;
+			psf->sf.samplerate = 256000000 / (65536 - rate_short) ;
+			} ;
+
+		psf_log_printf (psf, "  sr     : %d => %dHz\n", (rate_short & 0xFFFF), psf->sf.samplerate) ;
+
+		offset += psf_binheader_readf (psf, "1", &block_type) ;
+
+		if (block_type != VOC_SOUND_DATA)
+		{	psf_log_printf (psf, "*** Expecting VOC_SOUND_DATA section.\n") ;
+			return SFE_VOC_BAD_FORMAT ;
+			} ;
+
+		offset += psf_binheader_readf (psf, "e311", &size, &rate_byte, &compression) ;
+
+		psf_log_printf (psf,	" Sound Data : %d\n"
+								"  sr     : %d\n"
+								"  comp   : %d\n", size, rate_byte, compression) ;
+
+
+		if (offset + size - 1 > psf->filelength)
+		{	psf_log_printf (psf, "Seems to be a truncated file.\n") ;
+			psf_log_printf (psf, "offset: %d    size: %d    sum: %d    filelength: %D\n", offset, size, offset + size, psf->filelength) ;
+			return SFE_VOC_BAD_SECTIONS ;
+			}
+		else if (offset + size - 1 < psf->filelength)
+		{	psf_log_printf (psf, "Seems to be a multi-segment file (#2).\n") ;
+			psf_log_printf (psf, "offset: %d    size: %d    sum: %d    filelength: %D\n", offset, size, offset + size, psf->filelength) ;
+			return SFE_VOC_BAD_SECTIONS ;
+			} ;
+
+		psf->dataoffset = offset ;
+		psf->dataend = psf->filelength - 1 ;
+
+		psf->bytewidth = 1 ;
+
+		psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_PCM_U8 ;
+
+		return 0 ;
+		}
+
+	if (block_type == VOC_EXTENDED_II)
+	{	unsigned char bitwidth, channels ;
+		int size, fourbytes ;
+
+		offset += psf_binheader_readf (psf, "e341124", &size, &psf->sf.samplerate,
+								&bitwidth, &channels, &encoding, &fourbytes) ;
+
+		if (size * 2 == psf->filelength - 39)
+		{	int temp_size = psf->filelength - 31 ;
+
+			psf_log_printf (psf, " Extended II : %d (SoX bug: should be %d)\n", size, temp_size) ;
+			size = temp_size ;
+			}
+		else
+			psf_log_printf (psf, " Extended II : %d\n", size) ;
+
+		psf_log_printf (psf,	"  sample rate : %d\n"
+								"  bit width   : %d\n"
+								"  channels    : %d\n", psf->sf.samplerate, bitwidth, channels) ;
+
+		if (bitwidth == 16 && encoding == 0)
+		{	encoding = 4 ;
+			psf_log_printf (psf, "  encoding    : 0 (SoX bug: should be 4 for 16 bit signed PCM)\n") ;
+			}
+		else
+			psf_log_printf (psf, "  encoding    : %d => %s\n", encoding, voc_encoding2str (encoding)) ;
+
+
+		psf_log_printf (psf, "  fourbytes   : %X\n", fourbytes) ;
+
+		psf->sf.channels = channels ;
+
+		psf->dataoffset = offset ;
+		psf->dataend	= psf->filelength - 1 ;
+
+		if (size + 31 == psf->filelength + 1)
+		{	/* Hack for reading files produced using
+			** sf_command (SFC_UPDATE_HEADER_NOW).
+			*/
+			psf_log_printf (psf, "Missing zero byte at end of file.\n") ;
+			size = psf->filelength - 30 ;
+			psf->dataend = 0 ;
+			}
+		else if (size + 31 > psf->filelength)
+		{	psf_log_printf (psf, "Seems to be a truncated file.\n") ;
+			size = psf->filelength - 31 ;
+			}
+		else if (size + 31 < psf->filelength)
+			psf_log_printf (psf, "Seems to be a multi-segment file (#3).\n") ;
+
+		switch (encoding)
+		{	case 0 :
+					psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_PCM_U8 ;
+					psf->bytewidth = 1 ;
+					break ;
+
+			case 4 :
+					psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_PCM_16 ;
+					psf->bytewidth = 2 ;
+					break ;
+
+			case 6 :
+					psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_ALAW ;
+					psf->bytewidth = 1 ;
+					break ;
+
+			case 7 :
+					psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_ULAW ;
+					psf->bytewidth = 1 ;
+					break ;
+
+			default : /* Unknown */
+					return SFE_UNKNOWN_FORMAT ;
+					break ;
+			} ;
+
+		} ;
+
+	return 0 ;
+} /* voc_read_header */
+
+/*====================================================================================
+*/
+
+static int
+voc_write_header (SF_PRIVATE *psf, int calc_length)
+{	sf_count_t	current ;
+	int			rate_const, subformat ;
+
+	current = psf_ftell (psf) ;
+
+	if (calc_length)
+	{	psf->filelength = psf_get_filelen (psf) ;
+
+		psf->datalength = psf->filelength - psf->dataoffset ;
+		if (psf->dataend)
+			psf->datalength -= psf->filelength - psf->dataend ;
+
+		psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+		} ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	psf_fseek (psf, 0, SEEK_SET) ;
+
+	/* VOC marker and 0x1A byte. */
+	psf_binheader_writef (psf, "eb1", "Creative Voice File", make_size_t (19), 0x1A) ;
+
+	/* Data offset, version and other. */
+	psf_binheader_writef (psf, "e222", 26, 0x0114, 0x111F) ;
+
+	/*	Use same logic as SOX.
+	**	If the file is mono 8 bit data, use VOC_SOUND_DATA.
+	**	If the file is mono 16 bit data, use VOC_EXTENED.
+	**	Otherwise use VOC_EXTENED_2.
+	*/
+
+	if (subformat == SF_FORMAT_PCM_U8 && psf->sf.channels == 1)
+	{	/* samplerate = 1000000 / (256 - rate_const) ; */
+		rate_const = 256 - 1000000 / psf->sf.samplerate ;
+
+		/* First type marker, length, rate_const and compression */
+		psf_binheader_writef (psf, "e1311", VOC_SOUND_DATA, (int) (psf->datalength + 1), rate_const, 0) ;
+		}
+	else if (subformat == SF_FORMAT_PCM_U8 && psf->sf.channels == 2)
+	{	/* sample_rate = 128000000 / (65536 - rate_short) ; */
+		rate_const = 65536 - 128000000 / psf->sf.samplerate ;
+
+		/* First write the VOC_EXTENDED section
+		** 		marker, length, rate_const and compression
+		*/
+		psf_binheader_writef (psf, "e13211", VOC_EXTENDED, 4, rate_const, 0, 1) ;
+
+		/* samplerate = 1000000 / (256 - rate_const) ; */
+		rate_const = 256 - 1000000 / psf->sf.samplerate ;
+
+		/*	Now write the VOC_SOUND_DATA section
+		** 		marker, length, rate_const and compression
+		*/
+		psf_binheader_writef (psf, "e1311", VOC_SOUND_DATA, (int) (psf->datalength + 1), rate_const, 0) ;
+		}
+	else
+	{	int length ;
+
+		if (psf->sf.channels < 1 || psf->sf.channels > 2)
+			return SFE_CHANNEL_COUNT ;
+
+		switch (subformat)
+		{	case SF_FORMAT_PCM_U8 :
+					psf->bytewidth = 1 ;
+					length = psf->sf.frames * psf->sf.channels * psf->bytewidth + 12 ;
+					/* Marker, length, sample rate, bitwidth, stereo flag, encoding and fourt zero bytes. */
+					psf_binheader_writef (psf, "e1341124", VOC_EXTENDED_II, length, psf->sf.samplerate, 16, psf->sf.channels, 4, 0) ;
+					break ;
+
+			case SF_FORMAT_PCM_16 :
+					psf->bytewidth = 2 ;
+					length = psf->sf.frames * psf->sf.channels * psf->bytewidth + 12 ;
+					/* Marker, length, sample rate, bitwidth, stereo flag, encoding and fourt zero bytes. */
+					psf_binheader_writef (psf, "e1341124", VOC_EXTENDED_II, length, psf->sf.samplerate, 16, psf->sf.channels, 4, 0) ;
+					break ;
+
+			case SF_FORMAT_ALAW :
+					psf->bytewidth = 1 ;
+					length = psf->sf.frames * psf->sf.channels * psf->bytewidth + 12 ;
+					psf_binheader_writef (psf, "e1341124", VOC_EXTENDED_II, length, psf->sf.samplerate, 8, psf->sf.channels, 6, 0) ;
+					break ;
+
+			case SF_FORMAT_ULAW :
+					psf->bytewidth = 1 ;
+					length = psf->sf.frames * psf->sf.channels * psf->bytewidth + 12 ;
+					psf_binheader_writef (psf, "e1341124", VOC_EXTENDED_II, length, psf->sf.samplerate, 8, psf->sf.channels, 7, 0) ;
+					break ;
+
+			default : return SFE_UNIMPLEMENTED ;
+			} ;
+		} ;
+
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+
+	if (psf->error)
+		return psf->error ;
+
+	psf->dataoffset = psf->headindex ;
+
+	if (current > 0)
+		psf_fseek (psf, current, SEEK_SET) ;
+
+	return psf->error ;
+} /* voc_write_header */
+
+static int
+voc_close	(SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	/*  Now we know for certain the length of the file we can re-write
+		**	correct values for the FORM, 8SVX and BODY chunks.
+		*/
+		unsigned char byte = VOC_TERMINATOR ;
+
+
+		psf_fseek (psf, 0, SEEK_END) ;
+
+		/* Write terminator */
+		psf_fwrite (&byte, 1, 1, psf) ;
+
+		voc_write_header (psf, SF_TRUE) ;
+		} ;
+
+	return 0 ;
+} /* voc_close */
+
+static const 	char*
+voc_encoding2str (int encoding)
+{
+	switch (encoding)
+	{	case 0 :	return "8 bit unsigned PCM" ;
+		case 4 :	return "16 bit signed PCM" ;
+		case 6 :	return "A-law" ;
+		case 7 :	return "u-law" ;
+		default :	break ;
+		}
+	return "*** Unknown ***" ;
+} /* voc_encoding2str */
+
+/*====================================================================================
+*/
+
+#if 0
+static int
+voc_multi_init (SF_PRIVATE *psf, VOC_DATA *pvoc)
+{
+	psf->sf.frames = 0 ;
+
+	if (pvoc->bitwidth == 8)
+	{	psf->read_short		= voc_multi_read_uc2s ;
+		psf->read_int		= voc_multi_read_uc2i ;
+		psf->read_float		= voc_multi_read_uc2f ;
+		psf->read_double	= voc_multi_read_uc2d ;
+		return 0 ;
+		} ;
+
+	if (pvoc->bitwidth == 16)
+	{	psf->read_short		= voc_multi_read_les2s ;
+		psf->read_int		= voc_multi_read_les2i ;
+		psf->read_float		= voc_multi_read_les2f ;
+		psf->read_double	= voc_multi_read_les2d ;
+		return 0 ;
+		} ;
+
+	psf_log_printf (psf, "Error : bitwith != 8 && bitwidth != 16.\n") ;
+
+	return SFE_UNIMPLEMENTED ;
+} /* voc_multi_read_int */
+
+/*------------------------------------------------------------------------------------
+*/
+
+static int
+voc_multi_read_uc2s (SF_PRIVATE *psf, short *ptr, int len)
+{
+
+	return 0 ;
+} /* voc_multi_read_uc2s */
+
+static int
+voc_multi_read_les2s (SF_PRIVATE *psf, short *ptr, int len)
+{
+
+	return 0 ;
+} /* voc_multi_read_les2s */
+
+
+static int
+voc_multi_read_uc2i (SF_PRIVATE *psf, int *ptr, int len)
+{
+
+	return 0 ;
+} /* voc_multi_read_uc2i */
+
+static int
+voc_multi_read_les2i (SF_PRIVATE *psf, int *ptr, int len)
+{
+
+	return 0 ;
+} /* voc_multi_read_les2i */
+
+
+static int
+voc_multi_read_uc2f (SF_PRIVATE *psf, float *ptr, int len)
+{
+
+	return 0 ;
+} /* voc_multi_read_uc2f */
+
+static int
+voc_multi_read_les2f (SF_PRIVATE *psf, float *ptr, int len)
+{
+
+	return 0 ;
+} /* voc_multi_read_les2f */
+
+
+static int
+voc_multi_read_uc2d (SF_PRIVATE *psf, double *ptr, int len)
+{
+
+	return 0 ;
+} /* voc_multi_read_uc2d */
+
+static int
+voc_multi_read_les2d (SF_PRIVATE *psf, double *ptr, int len)
+{
+
+	return 0 ;
+} /* voc_multi_read_les2d */
+
+#endif
+
+/*------------------------------------------------------------------------------------
+
+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
+
+
+-------------------------------------------------------------------------------------*/
+
+/*=====================================================================================
+**=====================================================================================
+**=====================================================================================
+**=====================================================================================
+*/
+
+/*------------------------------------------------------------------------
+The following is taken from the Audio File Formats FAQ dated 2-Jan-1995
+and submitted by Guido van Rossum <guido@cwi.nl>.
+--------------------------------------------------------------------------
+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      2'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:       **Silence Info Format:
+       ---------------------      ----------------------------
+       00   Sample Rate           00-01  Length of silence - 1
+       01   Compression Type      02     Sample Rate
+       02+  Voice Data
+
+    ***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]
+
+Detailed description of new data blocks (VOC files version 1.20 and above):
+
+        (Source is fax from Barry Boone at Creative Labs, 405/742-6622)
+
+BLOCK 8 - digitized sound attribute extension, must preceed block 1.
+          Used to define stereo, 8 bit audio
+        BYTE bBlockID;       // = 8
+        BYTE nBlockLen[3];   // 3 byte length
+        WORD wTimeConstant;  // time constant = same as block 1
+        BYTE bPackMethod;    // same as in block 1
+        BYTE bVoiceMode;     // 0-mono, 1-stereo
+
+        Data is stored left, right
+
+BLOCK 9 - data block that supersedes blocks 1 and 8.
+          Used for stereo, 16 bit.
+
+        BYTE bBlockID;          // = 9
+        BYTE nBlockLen[3];      // length 12 plus length of sound
+        DWORD dwSamplesPerSec;  // samples per second, not time const.
+        BYTE bBitsPerSample;    // e.g., 8 or 16
+        BYTE bChannels;         // 1 for mono, 2 for stereo
+        WORD wFormat;           // see below
+        BYTE reserved[4];       // pad to make block w/o data
+                                // have a size of 16 bytes
+
+        Valid values of wFormat are:
+
+                0x0000  8-bit unsigned PCM
+                0x0001  Creative 8-bit to 4-bit ADPCM
+                0x0002  Creative 8-bit to 3-bit ADPCM
+                0x0003  Creative 8-bit to 2-bit ADPCM
+                0x0004  16-bit signed PCM
+                0x0006  CCITT a-Law
+                0x0007  CCITT u-Law
+                0x02000 Creative 16-bit to 4-bit ADPCM
+
+        Data is stored left, right
+
+------------------------------------------------------------------------*/
diff --git a/jni/libsndfile-1.0.25/src/voc.lo b/jni/libsndfile-1.0.25/src/voc.lo
new file mode 100644
index 0000000..aefeaa8
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/voc.lo
@@ -0,0 +1,12 @@
+# voc.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/voc.o'
+
+# Name of the non-PIC object
+non_pic_object='voc.o'
+
diff --git a/jni/libsndfile-1.0.25/src/voc.o b/jni/libsndfile-1.0.25/src/voc.o
new file mode 100644
index 0000000..2ef4acf
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/voc.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/vox_adpcm.c b/jni/libsndfile-1.0.25/src/vox_adpcm.c
new file mode 100644
index 0000000..579a5d0
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/vox_adpcm.c
@@ -0,0 +1,394 @@
+/*
+** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/*
+**	This is the OKI / Dialogic ADPCM encoder/decoder. It converts from
+**	12 bit linear sample data to a 4 bit ADPCM.
+*/
+
+/*
+ * Note: some early Dialogic hardware does not always reset the ADPCM encoder
+ * at the start of each vox file. This can result in clipping and/or DC offset
+ * problems when it comes to decoding the audio. Whilst little can be done
+ * about the clipping, a DC offset can be removed by passing the decoded audio
+ * through a high-pass filter at e.g. 10Hz.
+ */
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<stdlib.h>
+#include	<string.h>
+#include	<math.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+#include	"ima_oki_adpcm.h"
+
+
+static sf_count_t vox_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t vox_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t vox_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t vox_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t vox_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t vox_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t vox_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t vox_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+static int vox_read_block (SF_PRIVATE *psf, IMA_OKI_ADPCM *pvox, short *ptr, int len) ;
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+codec_close (SF_PRIVATE * psf)
+{
+	IMA_OKI_ADPCM * p = (IMA_OKI_ADPCM *) psf->codec_data ;
+
+	if (p->errors)
+		psf_log_printf (psf, "*** Warning : ADPCM state errors: %d\n", p->errors) ;
+	return p->errors ;
+} /* code_close */
+
+int
+vox_adpcm_init (SF_PRIVATE *psf)
+{	IMA_OKI_ADPCM *pvox = NULL ;
+
+	if (psf->file.mode == SFM_RDWR)
+		return SFE_BAD_MODE_RW ;
+
+	if (psf->file.mode == SFM_WRITE && psf->sf.channels != 1)
+		return SFE_CHANNEL_COUNT ;
+
+	if ((pvox = malloc (sizeof (IMA_OKI_ADPCM))) == NULL)
+		return SFE_MALLOC_FAILED ;
+
+	psf->codec_data = (void*) pvox ;
+	memset (pvox, 0, sizeof (IMA_OKI_ADPCM)) ;
+
+	if (psf->file.mode == SFM_WRITE)
+	{	psf->write_short	= vox_write_s ;
+		psf->write_int		= vox_write_i ;
+		psf->write_float	= vox_write_f ;
+		psf->write_double	= vox_write_d ;
+		}
+	else
+	{	psf_log_printf (psf, "Header-less OKI Dialogic ADPCM encoded file.\n") ;
+		psf_log_printf (psf, "Setting up for 8kHz, mono, Vox ADPCM.\n") ;
+
+		psf->read_short		= vox_read_s ;
+		psf->read_int		= vox_read_i ;
+		psf->read_float		= vox_read_f ;
+		psf->read_double	= vox_read_d ;
+		} ;
+
+	/* Standard sample rate chennels etc. */
+	if (psf->sf.samplerate < 1)
+		psf->sf.samplerate	= 8000 ;
+	psf->sf.channels	= 1 ;
+
+	psf->sf.frames = psf->filelength * 2 ;
+
+	psf->sf.seekable = SF_FALSE ;
+	psf->codec_close = codec_close ;
+
+	/* Seek back to start of data. */
+	if (psf_fseek (psf, 0 , SEEK_SET) == -1)
+		return SFE_BAD_SEEK ;
+
+	ima_oki_adpcm_init (pvox, IMA_OKI_ADPCM_TYPE_OKI) ;
+
+	return 0 ;
+} /* vox_adpcm_init */
+
+/*==============================================================================
+*/
+
+static int
+vox_read_block (SF_PRIVATE *psf, IMA_OKI_ADPCM *pvox, short *ptr, int len)
+{	int	indx = 0, k ;
+
+	while (indx < len)
+	{	pvox->code_count = (len - indx > IMA_OKI_ADPCM_PCM_LEN) ? IMA_OKI_ADPCM_CODE_LEN : (len - indx + 1) / 2 ;
+
+		if ((k = psf_fread (pvox->codes, 1, pvox->code_count, psf)) != pvox->code_count)
+		{	if (psf_ftell (psf) != psf->filelength)
+				psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pvox->code_count) ;
+			if (k == 0)
+				break ;
+			} ;
+
+		pvox->code_count = k ;
+
+		ima_oki_adpcm_decode_block (pvox) ;
+
+		memcpy (&(ptr [indx]), pvox->pcm, pvox->pcm_count * sizeof (short)) ;
+		indx += pvox->pcm_count ;
+		} ;
+
+	return indx ;
+} /* vox_read_block */
+
+
+static sf_count_t
+vox_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	IMA_OKI_ADPCM 	*pvox ;
+	int			readcount, count ;
+	sf_count_t	total = 0 ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pvox = (IMA_OKI_ADPCM*) psf->codec_data ;
+
+	while (len > 0)
+	{	readcount = (len > 0x10000000) ? 0x10000000 : (int) len ;
+
+		count = vox_read_block (psf, pvox, ptr, readcount) ;
+
+		total += count ;
+		len -= count ;
+		if (count != readcount)
+			break ;
+		} ;
+
+	return total ;
+} /* vox_read_s */
+
+static sf_count_t
+vox_read_i	(SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	IMA_OKI_ADPCM *pvox ;
+	short		*sptr ;
+	int			k, bufferlen, readcount, count ;
+	sf_count_t	total = 0 ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pvox = (IMA_OKI_ADPCM*) psf->codec_data ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : (int) len ;
+		count = vox_read_block (psf, pvox, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = ((int) sptr [k]) << 16 ;
+		total += count ;
+		len -= readcount ;
+		if (count != readcount)
+			break ;
+		} ;
+
+	return total ;
+} /* vox_read_i */
+
+static sf_count_t
+vox_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	IMA_OKI_ADPCM *pvox ;
+	short		*sptr ;
+	int			k, bufferlen, readcount, count ;
+	sf_count_t	total = 0 ;
+	float		normfact ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pvox = (IMA_OKI_ADPCM*) psf->codec_data ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : (int) len ;
+		count = vox_read_block (psf, pvox, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = normfact * (float) (sptr [k]) ;
+		total += count ;
+		len -= readcount ;
+		if (count != readcount)
+			break ;
+		} ;
+
+	return total ;
+} /* vox_read_f */
+
+static sf_count_t
+vox_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	IMA_OKI_ADPCM *pvox ;
+	short		*sptr ;
+	int			k, bufferlen, readcount, count ;
+	sf_count_t	total = 0 ;
+	double 		normfact ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pvox = (IMA_OKI_ADPCM*) psf->codec_data ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : (int) len ;
+		count = vox_read_block (psf, pvox, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [total + k] = normfact * (double) (sptr [k]) ;
+		total += count ;
+		len -= readcount ;
+		if (count != readcount)
+			break ;
+		} ;
+
+	return total ;
+} /* vox_read_d */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+vox_write_block (SF_PRIVATE *psf, IMA_OKI_ADPCM *pvox, const short *ptr, int len)
+{	int	indx = 0, k ;
+
+	while (indx < len)
+	{	pvox->pcm_count = (len - indx > IMA_OKI_ADPCM_PCM_LEN) ? IMA_OKI_ADPCM_PCM_LEN : len - indx ;
+
+		memcpy (pvox->pcm, &(ptr [indx]), pvox->pcm_count * sizeof (short)) ;
+
+		ima_oki_adpcm_encode_block (pvox) ;
+
+		if ((k = psf_fwrite (pvox->codes, 1, pvox->code_count, psf)) != pvox->code_count)
+			psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pvox->code_count) ;
+
+		indx += pvox->pcm_count ;
+		} ;
+
+	return indx ;
+} /* vox_write_block */
+
+static sf_count_t
+vox_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	IMA_OKI_ADPCM 	*pvox ;
+	int			writecount, count ;
+	sf_count_t	total = 0 ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pvox = (IMA_OKI_ADPCM*) psf->codec_data ;
+
+	while (len)
+	{	writecount = (len > 0x10000000) ? 0x10000000 : (int) len ;
+
+		count = vox_write_block (psf, pvox, ptr, writecount) ;
+
+		total += count ;
+		len -= count ;
+		if (count != writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* vox_write_s */
+
+static sf_count_t
+vox_write_i	(SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	IMA_OKI_ADPCM *pvox ;
+	short		*sptr ;
+	int			k, bufferlen, writecount, count ;
+	sf_count_t	total = 0 ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pvox = (IMA_OKI_ADPCM*) psf->codec_data ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : (int) len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = ptr [total + k] >> 16 ;
+		count = vox_write_block (psf, pvox, sptr, writecount) ;
+		total += count ;
+		len -= writecount ;
+		if (count != writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* vox_write_i */
+
+static sf_count_t
+vox_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	IMA_OKI_ADPCM *pvox ;
+	short		*sptr ;
+	int			k, bufferlen, writecount, count ;
+	sf_count_t	total = 0 ;
+	float		normfact ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pvox = (IMA_OKI_ADPCM*) psf->codec_data ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : (int) len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = lrintf (normfact * ptr [total + k]) ;
+		count = vox_write_block (psf, pvox, sptr, writecount) ;
+		total += count ;
+		len -= writecount ;
+		if (count != writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* vox_write_f */
+
+static sf_count_t
+vox_write_d	(SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	IMA_OKI_ADPCM *pvox ;
+	short		*sptr ;
+	int			k, bufferlen, writecount, count ;
+	sf_count_t	total = 0 ;
+	double 		normfact ;
+
+	if (! psf->codec_data)
+		return 0 ;
+	pvox = (IMA_OKI_ADPCM*) psf->codec_data ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
+
+	sptr = psf->u.sbuf ;
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : (int) len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = lrint (normfact * ptr [total + k]) ;
+		count = vox_write_block (psf, pvox, sptr, writecount) ;
+		total += count ;
+		len -= writecount ;
+		if (count != writecount)
+			break ;
+		} ;
+
+	return total ;
+} /* vox_write_d */
+
diff --git a/jni/libsndfile-1.0.25/src/vox_adpcm.lo b/jni/libsndfile-1.0.25/src/vox_adpcm.lo
new file mode 100644
index 0000000..41a4a9f
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/vox_adpcm.lo
@@ -0,0 +1,12 @@
+# vox_adpcm.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/vox_adpcm.o'
+
+# Name of the non-PIC object
+non_pic_object='vox_adpcm.o'
+
diff --git a/jni/libsndfile-1.0.25/src/vox_adpcm.o b/jni/libsndfile-1.0.25/src/vox_adpcm.o
new file mode 100644
index 0000000..d768d89
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/vox_adpcm.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/w64.c b/jni/libsndfile-1.0.25/src/w64.c
new file mode 100644
index 0000000..d561906
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/w64.c
@@ -0,0 +1,639 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<string.h>
+#include	<ctype.h>
+#include	<time.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+#include	"wav_w64.h"
+
+/*------------------------------------------------------------------------------
+** W64 files use 16 byte markers as opposed to the four byte marker of
+** WAV files.
+** For comparison purposes, an integer is required, so make an integer
+** hash for the 16 bytes using MAKE_HASH16 macro, but also create a 16
+** byte array containing the complete 16 bytes required when writing the
+** header.
+*/
+
+#define MAKE_HASH16(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,xa,xb,xc,xd,xe,xf)	\
+			(	(x0)			^ ((x1) << 1)	^ ((x2) << 2)	^ ((x3) << 3) ^	\
+				((x4) << 4) 	^ ((x5) << 5)	^ ((x6) << 6)	^ ((x7) << 7) ^	\
+				((x8) << 8) 	^ ((x9) << 9)	^ ((xa) << 10)	^ ((xb) << 11) ^ \
+				((xc) << 12) 	^ ((xd) << 13)	^ ((xe) << 14)	^ ((xf) << 15)	)
+
+#define MAKE_MARKER16(name,x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,xa,xb,xc,xd,xe,xf)	\
+			static unsigned char name [16] = { (x0), (x1), (x2), (x3), (x4), (x5), \
+				(x6), (x7), (x8), (x9), (xa), (xb), (xc), (xd), (xe), (xf) }
+
+#define	riff_HASH16 MAKE_HASH16 ('r', 'i', 'f', 'f', 0x2E, 0x91, 0xCF, 0x11, \
+								0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00)
+
+#define	wave_HASH16 	MAKE_HASH16 ('w', 'a', 'v', 'e', 0xF3, 0xAC, 0xD3, 0x11, \
+								0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A)
+
+#define	fmt_HASH16 		MAKE_HASH16 ('f', 'm', 't', ' ', 0xF3, 0xAC, 0xD3, 0x11, \
+								0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A)
+
+#define	fact_HASH16 	MAKE_HASH16 ('f', 'a', 'c', 't', 0xF3, 0xAC, 0xD3, 0x11, \
+								0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A)
+
+#define	data_HASH16 	MAKE_HASH16 ('d', 'a', 't', 'a', 0xF3, 0xAC, 0xD3, 0x11, \
+								0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A)
+
+#define	ACID_HASH16 	MAKE_HASH16 (0x6D, 0x07, 0x1C, 0xEA, 0xA3, 0xEF, 0x78, 0x4C, \
+								0x90, 0x57, 0x7F, 0x79, 0xEE, 0x25, 0x2A, 0xAE)
+
+#define	levl_HASH16		MAKE_HASH16 (0x6c, 0x65, 0x76, 0x6c, 0xf3, 0xac, 0xd3, 0x11, \
+								0xd1, 0x8c, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A)
+
+#define list_HASH16		MAKE_HASH16 (0x6C, 0x69, 0x73, 0x74, 0x2F, 0x91, 0xCF, 0x11, \
+								0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00)
+
+#define junk_HASH16		MAKE_HASH16 (0x6A, 0x75, 0x6E, 0x6b, 0xF3, 0xAC, 0xD3, 0x11, \
+								0x8C, 0xD1, 0x00, 0xC0, 0x4f, 0x8E, 0xDB, 0x8A)
+
+#define bext_MARKER		MAKE_HASH16 (0x62, 0x65, 0x78, 0x74, 0xf3, 0xac, 0xd3, 0xaa, \
+								0xd1, 0x8c, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A)
+
+#define MARKER_HASH16	MAKE_HASH16 (0x56, 0x62, 0xf7, 0xab, 0x2d, 0x39, 0xd2, 0x11, \
+								0x86, 0xc7, 0x00, 0xc0, 0x4f, 0x8e, 0xdb, 0x8a)
+
+#define	SUMLIST_HASH16	MAKE_HASH16 (0xBC, 0x94, 0x5F, 0x92, 0x5A, 0x52, 0xD2, 0x11, \
+								0x86, 0xDC, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A)
+
+
+MAKE_MARKER16 (riff_MARKER16, 'r', 'i', 'f', 'f', 0x2E, 0x91, 0xCF, 0x11,
+								0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00) ;
+
+
+MAKE_MARKER16 (wave_MARKER16, 'w', 'a', 'v', 'e', 0xF3, 0xAC, 0xD3, 0x11,
+								0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) ;
+
+MAKE_MARKER16 (fmt_MARKER16, 'f', 'm', 't', ' ', 0xF3, 0xAC, 0xD3, 0x11,
+								0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) ;
+
+MAKE_MARKER16 (fact_MARKER16, 'f', 'a', 'c', 't', 0xF3, 0xAC, 0xD3, 0x11,
+								0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) ;
+
+MAKE_MARKER16 (data_MARKER16, 'd', 'a', 't', 'a', 0xF3, 0xAC, 0xD3, 0x11,
+								0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) ;
+
+enum
+{	HAVE_riff	= 0x01,
+	HAVE_wave	= 0x02,
+	HAVE_fmt	= 0x04,
+	HAVE_fact	= 0x08,
+	HAVE_data	= 0x20
+} ;
+
+/*------------------------------------------------------------------------------
+ * Private static functions.
+ */
+
+static int	w64_read_header	(SF_PRIVATE *psf, int *blockalign, int *framesperblock) ;
+static int	w64_write_header (SF_PRIVATE *psf, int calc_length) ;
+static int	w64_close (SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+w64_open	(SF_PRIVATE *psf)
+{	WAV_PRIVATE * wpriv ;
+	int	subformat, error, blockalign = 0, framesperblock = 0 ;
+
+	if ((wpriv = calloc (1, sizeof (WAV_PRIVATE))) == NULL)
+		return SFE_MALLOC_FAILED ;
+	psf->container_data = wpriv ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR &&psf->filelength > 0))
+	{	if ((error = w64_read_header (psf, &blockalign, &framesperblock)))
+			return error ;
+		} ;
+
+	if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_W64)
+		return	SFE_BAD_OPEN_FORMAT ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	if (psf->is_pipe)
+			return SFE_NO_PIPE_WRITE ;
+
+		psf->endian = SF_ENDIAN_LITTLE ;		/* All W64 files are little endian. */
+
+		psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+		if (subformat == SF_FORMAT_IMA_ADPCM || subformat == SF_FORMAT_MS_ADPCM)
+		{	blockalign = wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;
+			framesperblock = -1 ;
+
+			/* FIXME : This block must go */
+			psf->filelength = SF_COUNT_MAX ;
+			psf->datalength = psf->filelength ;
+			if (psf->sf.frames <= 0)
+				psf->sf.frames = (psf->blockwidth) ? psf->filelength / psf->blockwidth : psf->filelength ;
+			/* EMXIF : This block must go */
+			} ;
+
+		if ((error = w64_write_header (psf, SF_FALSE)))
+			return error ;
+
+		psf->write_header = w64_write_header ;
+		} ;
+
+	psf->container_close = w64_close ;
+
+	switch (subformat)
+	{	case SF_FORMAT_PCM_U8 :
+					error = pcm_init (psf) ;
+					break ;
+
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_24 :
+		case SF_FORMAT_PCM_32 :
+					error = pcm_init (psf) ;
+					break ;
+
+		case SF_FORMAT_ULAW :
+					error = ulaw_init (psf) ;
+					break ;
+
+		case SF_FORMAT_ALAW :
+					error = alaw_init (psf) ;
+					break ;
+
+		/* Lite remove start */
+		case SF_FORMAT_FLOAT :
+					error = float32_init (psf) ;
+					break ;
+
+		case SF_FORMAT_DOUBLE :
+					error = double64_init (psf) ;
+					break ;
+
+		case SF_FORMAT_IMA_ADPCM :
+					error = wav_w64_ima_init (psf, blockalign, framesperblock) ;
+					break ;
+
+		case SF_FORMAT_MS_ADPCM :
+					error = wav_w64_msadpcm_init (psf, blockalign, framesperblock) ;
+					break ;
+		/* Lite remove end */
+
+		case SF_FORMAT_GSM610 :
+					error = gsm610_init (psf) ;
+					break ;
+
+		default : 	return SFE_UNIMPLEMENTED ;
+		} ;
+
+	return error ;
+} /* w64_open */
+
+/*=========================================================================
+** Private functions.
+*/
+
+static int
+w64_read_header	(SF_PRIVATE *psf, int *blockalign, int *framesperblock)
+{	WAV_PRIVATE *wpriv ;
+	WAV_FMT 	*wav_fmt ;
+	int			dword = 0, marker, format = 0 ;
+	sf_count_t	chunk_size, bytesread = 0 ;
+	int			parsestage = 0, error, done = 0 ;
+
+	if ((wpriv = psf->container_data) == NULL)
+		return SFE_INTERNAL ;
+	wav_fmt = &wpriv->wav_fmt ;
+
+	/* Set position to start of file to begin reading header. */
+	psf_binheader_readf (psf, "p", 0) ;
+
+	while (! done)
+	{	/* Each new chunk must start on an 8 byte boundary, so jump if needed. */
+		if (psf->headindex & 0x7)
+			psf_binheader_readf (psf, "j", 8 - (psf->headindex & 0x7)) ;
+
+		/* Generate hash of 16 byte marker. */
+		bytesread += psf_binheader_readf (psf, "h", &marker) ;
+		chunk_size = 0 ;
+
+		switch (marker)
+		{	case riff_HASH16 :
+					if (parsestage)
+						return SFE_W64_NO_RIFF ;
+
+					bytesread += psf_binheader_readf (psf, "e8", &chunk_size) ;
+
+					if (psf->filelength != chunk_size)
+						psf_log_printf (psf, "riff : %D (should be %D)\n", chunk_size, psf->filelength) ;
+					else
+						psf_log_printf (psf, "riff : %D\n", chunk_size) ;
+
+					parsestage |= HAVE_riff ;
+					break ;
+
+			case ACID_HASH16:
+					psf_log_printf (psf, "Looks like an ACID file. Exiting.\n") ;
+					return SFE_UNIMPLEMENTED ;
+
+			case wave_HASH16 :
+					if ((parsestage & HAVE_riff) != HAVE_riff)
+						return SFE_W64_NO_WAVE ;
+					psf_log_printf (psf, "wave\n") ;
+					parsestage |= HAVE_wave ;
+					break ;
+
+			case fmt_HASH16 :
+					if ((parsestage & (HAVE_riff | HAVE_wave)) != (HAVE_riff | HAVE_wave))
+						return SFE_WAV_NO_FMT ;
+
+					bytesread += psf_binheader_readf (psf, "e8", &chunk_size) ;
+					psf_log_printf (psf, " fmt : %D\n", chunk_size) ;
+
+					/* size of 16 byte marker and 8 byte chunk_size value. */
+					chunk_size -= 24 ;
+
+					if ((error = wav_w64_read_fmt_chunk (psf, (int) chunk_size)))
+						return error ;
+
+					if (chunk_size % 8)
+						psf_binheader_readf (psf, "j", 8 - (chunk_size % 8)) ;
+
+					format		= wav_fmt->format ;
+					parsestage |= HAVE_fmt ;
+					break ;
+
+			case fact_HASH16:
+					{	sf_count_t frames ;
+
+						psf_binheader_readf (psf, "e88", &chunk_size, &frames) ;
+						psf_log_printf (psf, "   fact : %D\n     frames : %D\n",
+										chunk_size, frames) ;
+						} ;
+					break ;
+
+
+			case data_HASH16 :
+					if ((parsestage & (HAVE_riff | HAVE_wave | HAVE_fmt)) != (HAVE_riff | HAVE_wave | HAVE_fmt))
+						return SFE_W64_NO_DATA ;
+
+					psf_binheader_readf (psf, "e8", &chunk_size) ;
+
+					psf->dataoffset = psf_ftell (psf) ;
+
+					psf->datalength = chunk_size - 24 ;
+
+					if (chunk_size % 8)
+						chunk_size += 8 - (chunk_size % 8) ;
+
+					psf_log_printf (psf, "data : %D\n", chunk_size) ;
+
+					parsestage |= HAVE_data ;
+
+					if (! psf->sf.seekable)
+						break ;
+
+					/* Seek past data and continue reading header. */
+					psf_fseek (psf, chunk_size, SEEK_CUR) ;
+					break ;
+
+			case levl_HASH16 :
+					psf_binheader_readf (psf, "e8", &chunk_size) ;
+					psf_log_printf (psf, "levl : %D\n", chunk_size) ;
+					dword = chunk_size ;
+					psf_binheader_readf (psf, "j", dword - 24) ;
+					break ;
+
+			case list_HASH16 :
+					psf_binheader_readf (psf, "e8", &chunk_size) ;
+					psf_log_printf (psf, "list : %D\n", chunk_size) ;
+					dword = chunk_size ;
+					psf_binheader_readf (psf, "j", dword - 24) ;
+					break ;
+
+			case junk_HASH16 :
+					psf_binheader_readf (psf, "e8", &chunk_size) ;
+					psf_log_printf (psf, "junk : %D\n", chunk_size) ;
+					dword = chunk_size ;
+					psf_binheader_readf (psf, "j", dword - 24) ;
+					break ;
+
+			case bext_MARKER :
+					psf_binheader_readf (psf, "e8", &chunk_size) ;
+					psf_log_printf (psf, "bext : %D\n", chunk_size) ;
+					dword = chunk_size ;
+					psf_binheader_readf (psf, "j", dword - 24) ;
+					break ;
+
+			case MARKER_HASH16 :
+					psf_binheader_readf (psf, "e8", &chunk_size) ;
+					psf_log_printf (psf, "marker : %D\n", chunk_size) ;
+					dword = chunk_size ;
+					psf_binheader_readf (psf, "j", dword - 24) ;
+					break ;
+
+			case SUMLIST_HASH16 :
+					psf_binheader_readf (psf, "e8", &chunk_size) ;
+					psf_log_printf (psf, "summary list : %D\n", chunk_size) ;
+					dword = chunk_size ;
+					psf_binheader_readf (psf, "j", dword - 24) ;
+					break ;
+
+			default :
+					psf_log_printf (psf, "*** Unknown chunk marker : %X. Exiting parser.\n", marker) ;
+					done = SF_TRUE ;
+					break ;
+			} ;	/* switch (dword) */
+
+		if (psf->sf.seekable == 0 && (parsestage & HAVE_data))
+			break ;
+
+		if (psf_ftell (psf) >= (psf->filelength - (2 * SIGNED_SIZEOF (dword))))
+			break ;
+		} ; /* while (1) */
+
+	if (psf->dataoffset <= 0)
+		return SFE_W64_NO_DATA ;
+
+	psf->endian = SF_ENDIAN_LITTLE ;		/* All W64 files are little endian. */
+
+	if (psf_ftell (psf) != psf->dataoffset)
+		psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+
+	if (psf->blockwidth)
+	{	if (psf->filelength - psf->dataoffset < psf->datalength)
+			psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ;
+		else
+			psf->sf.frames = psf->datalength / psf->blockwidth ;
+		} ;
+
+	switch (format)
+	{	case WAVE_FORMAT_PCM :
+		case WAVE_FORMAT_EXTENSIBLE :
+					/* extensible might be FLOAT, MULAW, etc as well! */
+					psf->sf.format = SF_FORMAT_W64 | u_bitwidth_to_subformat (psf->bytewidth * 8) ;
+					break ;
+
+		case WAVE_FORMAT_MULAW :
+					psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_ULAW) ;
+					break ;
+
+		case WAVE_FORMAT_ALAW :
+					psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_ALAW) ;
+					break ;
+
+		case WAVE_FORMAT_MS_ADPCM :
+					psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM) ;
+					*blockalign = wav_fmt->msadpcm.blockalign ;
+					*framesperblock = wav_fmt->msadpcm.samplesperblock ;
+					break ;
+
+		case WAVE_FORMAT_IMA_ADPCM :
+					psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM) ;
+					*blockalign = wav_fmt->ima.blockalign ;
+					*framesperblock = wav_fmt->ima.samplesperblock ;
+					break ;
+
+		case WAVE_FORMAT_GSM610 :
+					psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_GSM610) ;
+					break ;
+
+		case WAVE_FORMAT_IEEE_FLOAT :
+					psf->sf.format = SF_FORMAT_W64 ;
+					psf->sf.format |= (psf->bytewidth == 8) ? SF_FORMAT_DOUBLE : SF_FORMAT_FLOAT ;
+					break ;
+
+		default : return SFE_UNIMPLEMENTED ;
+		} ;
+
+	return 0 ;
+} /* w64_read_header */
+
+static int
+w64_write_header (SF_PRIVATE *psf, int calc_length)
+{	sf_count_t 	fmt_size, current ;
+	size_t		fmt_pad = 0 ;
+	int 		subformat, add_fact_chunk = SF_FALSE ;
+
+	current = psf_ftell (psf) ;
+
+	if (calc_length)
+	{	psf->filelength = psf_get_filelen (psf) ;
+
+		psf->datalength = psf->filelength - psf->dataoffset ;
+		if (psf->dataend)
+			psf->datalength -= psf->filelength - psf->dataend ;
+
+		if (psf->bytewidth)
+			psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+		} ;
+
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	psf_fseek (psf, 0, SEEK_SET) ;
+
+	/* riff marker, length, wave and 'fmt ' markers. */
+	psf_binheader_writef (psf, "eh8hh", riff_MARKER16, psf->filelength, wave_MARKER16, fmt_MARKER16) ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+
+	switch (subformat)
+	{	case	SF_FORMAT_PCM_U8 :
+		case	SF_FORMAT_PCM_16 :
+		case	SF_FORMAT_PCM_24 :
+		case	SF_FORMAT_PCM_32 :
+					fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 ;
+					fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ;
+					fmt_size += fmt_pad ;
+
+					/* fmt : format, channels, samplerate */
+					psf_binheader_writef (psf, "e8224", fmt_size, WAVE_FORMAT_PCM, psf->sf.channels, psf->sf.samplerate) ;
+					/*  fmt : bytespersec */
+					psf_binheader_writef (psf, "e4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+					/*  fmt : blockalign, bitwidth */
+					psf_binheader_writef (psf, "e22", psf->bytewidth * psf->sf.channels, psf->bytewidth * 8) ;
+					break ;
+
+		case SF_FORMAT_FLOAT :
+		case SF_FORMAT_DOUBLE :
+					fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 ;
+					fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ;
+					fmt_size += fmt_pad ;
+
+					/* fmt : format, channels, samplerate */
+					psf_binheader_writef (psf, "e8224", fmt_size, WAVE_FORMAT_IEEE_FLOAT, psf->sf.channels, psf->sf.samplerate) ;
+					/*  fmt : bytespersec */
+					psf_binheader_writef (psf, "e4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+					/*  fmt : blockalign, bitwidth */
+					psf_binheader_writef (psf, "e22", psf->bytewidth * psf->sf.channels, psf->bytewidth * 8) ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
+		case SF_FORMAT_ULAW :
+					fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 ;
+					fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ;
+					fmt_size += fmt_pad ;
+
+					/* fmt : format, channels, samplerate */
+					psf_binheader_writef (psf, "e8224", fmt_size, WAVE_FORMAT_MULAW, psf->sf.channels, psf->sf.samplerate) ;
+					/*  fmt : bytespersec */
+					psf_binheader_writef (psf, "e4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+					/*  fmt : blockalign, bitwidth */
+					psf_binheader_writef (psf, "e22", psf->bytewidth * psf->sf.channels, 8) ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
+		case SF_FORMAT_ALAW :
+					fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 ;
+					fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ;
+					fmt_size += fmt_pad ;
+
+					/* fmt : format, channels, samplerate */
+					psf_binheader_writef (psf, "e8224", fmt_size, WAVE_FORMAT_ALAW, psf->sf.channels, psf->sf.samplerate) ;
+					/*  fmt : bytespersec */
+					psf_binheader_writef (psf, "e4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+					/*  fmt : blockalign, bitwidth */
+					psf_binheader_writef (psf, "e22", psf->bytewidth * psf->sf.channels, 8) ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
+		/* Lite remove start */
+		case SF_FORMAT_IMA_ADPCM :
+					{	int		blockalign, framesperblock, bytespersec ;
+
+						blockalign		= wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;
+						framesperblock	= 2 * (blockalign - 4 * psf->sf.channels) / psf->sf.channels + 1 ;
+						bytespersec		= (psf->sf.samplerate * blockalign) / framesperblock ;
+
+						/* fmt chunk. */
+						fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ;
+						fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ;
+						fmt_size += fmt_pad ;
+
+						/* fmt : size, WAV format type, channels. */
+						psf_binheader_writef (psf, "e822", fmt_size, WAVE_FORMAT_IMA_ADPCM, psf->sf.channels) ;
+
+						/* fmt : samplerate, bytespersec. */
+						psf_binheader_writef (psf, "e44", psf->sf.samplerate, bytespersec) ;
+
+						/* fmt : blockalign, bitwidth, extrabytes, framesperblock. */
+						psf_binheader_writef (psf, "e2222", blockalign, 4, 2, framesperblock) ;
+						} ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
+		case SF_FORMAT_MS_ADPCM :
+					{	int blockalign, framesperblock, bytespersec, extrabytes ;
+
+						blockalign		= wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;
+						framesperblock	= 2 + 2 * (blockalign - 7 * psf->sf.channels) / psf->sf.channels ;
+						bytespersec		= (psf->sf.samplerate * blockalign) / framesperblock ;
+
+						/* fmt chunk. */
+						extrabytes	= 2 + 2 + MSADPCM_ADAPT_COEFF_COUNT * (2 + 2) ;
+						fmt_size	= 24 + 2 + 2 + 4 + 4 + 2 + 2 + 2 + extrabytes ;
+						fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ;
+						fmt_size += fmt_pad ;
+
+						/* fmt : size, W64 format type, channels. */
+						psf_binheader_writef (psf, "e822", fmt_size, WAVE_FORMAT_MS_ADPCM, psf->sf.channels) ;
+
+						/* fmt : samplerate, bytespersec. */
+						psf_binheader_writef (psf, "e44", psf->sf.samplerate, bytespersec) ;
+
+						/* fmt : blockalign, bitwidth, extrabytes, framesperblock. */
+						psf_binheader_writef (psf, "e22222", blockalign, 4, extrabytes, framesperblock, 7) ;
+
+						msadpcm_write_adapt_coeffs (psf) ;
+						} ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+		/* Lite remove end */
+
+		case SF_FORMAT_GSM610 :
+					{	int bytespersec ;
+
+						bytespersec = (psf->sf.samplerate * WAV_W64_GSM610_BLOCKSIZE) / WAV_W64_GSM610_SAMPLES ;
+
+						/* fmt chunk. */
+						fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ;
+						fmt_pad = (size_t) (8 - (fmt_size & 0x7)) ;
+						fmt_size += fmt_pad ;
+
+						/* fmt : size, WAV format type, channels. */
+						psf_binheader_writef (psf, "e822", fmt_size, WAVE_FORMAT_GSM610, psf->sf.channels) ;
+
+						/* fmt : samplerate, bytespersec. */
+						psf_binheader_writef (psf, "e44", psf->sf.samplerate, bytespersec) ;
+
+						/* fmt : blockalign, bitwidth, extrabytes, framesperblock. */
+						psf_binheader_writef (psf, "e2222", WAV_W64_GSM610_BLOCKSIZE, 0, 2, WAV_W64_GSM610_SAMPLES) ;
+						} ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
+		default : 	return SFE_UNIMPLEMENTED ;
+		} ;
+
+	/* Pad to 8 bytes with zeros. */
+	if (fmt_pad > 0)
+		psf_binheader_writef (psf, "z", fmt_pad) ;
+
+	if (add_fact_chunk)
+		psf_binheader_writef (psf, "eh88", fact_MARKER16, (sf_count_t) (16 + 8 + 8), psf->sf.frames) ;
+
+	psf_binheader_writef (psf, "eh8", data_MARKER16, psf->datalength + 24) ;
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+
+	if (psf->error)
+		return psf->error ;
+
+	psf->dataoffset = psf->headindex ;
+
+	if (current > 0)
+		psf_fseek (psf, current, SEEK_SET) ;
+
+	return psf->error ;
+} /* w64_write_header */
+
+static int
+w64_close (SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+		w64_write_header (psf, SF_TRUE) ;
+
+	return 0 ;
+} /* w64_close */
+
diff --git a/jni/libsndfile-1.0.25/src/w64.lo b/jni/libsndfile-1.0.25/src/w64.lo
new file mode 100644
index 0000000..0ec8158
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/w64.lo
@@ -0,0 +1,12 @@
+# w64.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/w64.o'
+
+# Name of the non-PIC object
+non_pic_object='w64.o'
+
diff --git a/jni/libsndfile-1.0.25/src/w64.o b/jni/libsndfile-1.0.25/src/w64.o
new file mode 100644
index 0000000..5e21209
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/w64.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/wav.c b/jni/libsndfile-1.0.25/src/wav.c
new file mode 100644
index 0000000..f863096
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/wav.c
@@ -0,0 +1,1820 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2004-2005 David Viens <davidv@plogue.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<stdlib.h>
+#include	<string.h>
+#include	<ctype.h>
+#include	<time.h>
+#include	<inttypes.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+#include	"wav_w64.h"
+
+/*------------------------------------------------------------------------------
+ * Macros to handle big/little endian issues.
+ */
+
+#define RIFF_MARKER	 (MAKE_MARKER ('R', 'I', 'F', 'F'))
+#define RIFX_MARKER	 (MAKE_MARKER ('R', 'I', 'F', 'X'))
+#define WAVE_MARKER	 (MAKE_MARKER ('W', 'A', 'V', 'E'))
+#define fmt_MARKER	 (MAKE_MARKER ('f', 'm', 't', ' '))
+#define data_MARKER	 (MAKE_MARKER ('d', 'a', 't', 'a'))
+#define fact_MARKER	 (MAKE_MARKER ('f', 'a', 'c', 't'))
+#define PEAK_MARKER	 (MAKE_MARKER ('P', 'E', 'A', 'K'))
+
+#define cue_MARKER	 (MAKE_MARKER ('c', 'u', 'e', ' '))
+#define LIST_MARKER	 (MAKE_MARKER ('L', 'I', 'S', 'T'))
+#define slnt_MARKER	 (MAKE_MARKER ('s', 'l', 'n', 't'))
+#define wavl_MARKER	 (MAKE_MARKER ('w', 'a', 'v', 'l'))
+#define INFO_MARKER	 (MAKE_MARKER ('I', 'N', 'F', 'O'))
+#define plst_MARKER	 (MAKE_MARKER ('p', 'l', 's', 't'))
+#define adtl_MARKER	 (MAKE_MARKER ('a', 'd', 't', 'l'))
+#define labl_MARKER	 (MAKE_MARKER ('l', 'a', 'b', 'l'))
+#define ltxt_MARKER	 (MAKE_MARKER ('l', 't', 'x', 't'))
+#define note_MARKER	 (MAKE_MARKER ('n', 'o', 't', 'e'))
+#define smpl_MARKER	 (MAKE_MARKER ('s', 'm', 'p', 'l'))
+#define bext_MARKER	 (MAKE_MARKER ('b', 'e', 'x', 't'))
+#define iXML_MARKER	 (MAKE_MARKER ('i', 'X', 'M', 'L'))
+#define levl_MARKER	 (MAKE_MARKER ('l', 'e', 'v', 'l'))
+#define MEXT_MARKER	 (MAKE_MARKER ('M', 'E', 'X', 'T'))
+#define DISP_MARKER	 (MAKE_MARKER ('D', 'I', 'S', 'P'))
+#define acid_MARKER	 (MAKE_MARKER ('a', 'c', 'i', 'd'))
+#define strc_MARKER	 (MAKE_MARKER ('s', 't', 'r', 'c'))
+#define PAD_MARKER	 (MAKE_MARKER ('P', 'A', 'D', ' '))
+#define afsp_MARKER	 (MAKE_MARKER ('a', 'f', 's', 'p'))
+#define clm_MARKER	 (MAKE_MARKER ('c', 'l', 'm', ' '))
+#define elmo_MARKER	 (MAKE_MARKER ('e', 'l', 'm', 'o'))
+#define cart_MARKER	 (MAKE_MARKER ('c', 'a', 'r', 't'))
+#define FLLR_MARKER	 (MAKE_MARKER ('F', 'L', 'L', 'R'))
+
+#define exif_MARKER	 (MAKE_MARKER ('e', 'x', 'i', 'f'))
+#define ever_MARKER	 (MAKE_MARKER ('e', 'v', 'e', 'r'))
+#define etim_MARKER	 (MAKE_MARKER ('e', 't', 'i', 'm'))
+#define ecor_MARKER	 (MAKE_MARKER ('e', 'c', 'o', 'r'))
+#define emdl_MARKER	 (MAKE_MARKER ('e', 'm', 'd', 'l'))
+#define emnt_MARKER	 (MAKE_MARKER ('e', 'm', 'n', 't'))
+#define erel_MARKER	 (MAKE_MARKER ('e', 'r', 'e', 'l'))
+#define eucm_MARKER	 (MAKE_MARKER ('e', 'u', 'c', 'm'))
+
+#define ISFT_MARKER	 (MAKE_MARKER ('I', 'S', 'F', 'T'))
+#define ICRD_MARKER	 (MAKE_MARKER ('I', 'C', 'R', 'D'))
+#define ICOP_MARKER	 (MAKE_MARKER ('I', 'C', 'O', 'P'))
+#define IARL_MARKER	 (MAKE_MARKER ('I', 'A', 'R', 'L'))
+#define IART_MARKER	 (MAKE_MARKER ('I', 'A', 'R', 'T'))
+#define INAM_MARKER	 (MAKE_MARKER ('I', 'N', 'A', 'M'))
+#define IENG_MARKER	 (MAKE_MARKER ('I', 'E', 'N', 'G'))
+#define IGNR_MARKER	 (MAKE_MARKER ('I', 'G', 'N', 'R'))
+#define ICOP_MARKER	 (MAKE_MARKER ('I', 'C', 'O', 'P'))
+#define IPRD_MARKER	 (MAKE_MARKER ('I', 'P', 'R', 'D'))
+#define ISRC_MARKER	 (MAKE_MARKER ('I', 'S', 'R', 'C'))
+#define ISBJ_MARKER	 (MAKE_MARKER ('I', 'S', 'B', 'J'))
+#define ICMT_MARKER	 (MAKE_MARKER ('I', 'C', 'M', 'T'))
+
+/* Weird WAVPACK marker which can show up at the start of the DATA section. */
+#define wvpk_MARKER (MAKE_MARKER ('w', 'v', 'p', 'k'))
+#define OggS_MARKER (MAKE_MARKER ('O', 'g', 'g', 'S'))
+
+#define WAV_PEAK_CHUNK_SIZE(ch) 	(2 * sizeof (int) + ch * (sizeof (float) + sizeof (int)))
+#define WAV_BEXT_MIN_CHUNK_SIZE		602
+#define WAV_BEXT_MAX_CHUNK_SIZE		(10 * 1024)
+
+enum
+{	HAVE_RIFF	= 0x01,
+	HAVE_WAVE	= 0x02,
+	HAVE_fmt	= 0x04,
+	HAVE_fact	= 0x08,
+	HAVE_PEAK	= 0x10,
+	HAVE_data	= 0x20,
+	HAVE_other	= 0x80000000
+} ;
+
+
+
+/*  known WAVEFORMATEXTENSIBLE GUIDS  */
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_PCM =
+{	0x00000001, 0x0000, 0x0010, {	0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+} ;
+
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_MS_ADPCM =
+{	0x00000002, 0x0000, 0x0010, {	0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+} ;
+
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_IEEE_FLOAT =
+{	0x00000003, 0x0000, 0x0010, {	0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+} ;
+
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_ALAW =
+{	0x00000006, 0x0000, 0x0010, {	0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+} ;
+
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_MULAW =
+{	0x00000007, 0x0000, 0x0010, {	0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+} ;
+
+/*
+** the next two are from
+** http://dream.cs.bath.ac.uk/researchdev/wave-ex/bformat.html
+*/
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_PCM =
+{	0x00000001, 0x0721, 0x11d3, {	0x86, 0x44, 0xC8, 0xC1, 0xCA, 0x00, 0x00, 0x00 }
+} ;
+
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT =
+{	0x00000003, 0x0721, 0x11d3, {	0x86, 0x44, 0xC8, 0xC1, 0xCA, 0x00, 0x00, 0x00 }
+} ;
+
+
+#if 0
+/* maybe interesting one day to read the following through sf_read_raw */
+/* http://www.bath.ac.uk/~masrwd/pvocex/pvocex.html */
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_PVOCEX =
+{	0x8312B9C2, 0x2E6E, 0x11d4, {	0xA8, 0x24, 0xDE, 0x5B, 0x96, 0xC3, 0xAB, 0x21 }
+} ;
+#endif
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static int	wav_read_header	 (SF_PRIVATE *psf, int *blockalign, int *framesperblock) ;
+static int	wav_write_header (SF_PRIVATE *psf, int calc_length) ;
+
+static int	wav_write_tailer (SF_PRIVATE *psf) ;
+static void wav_write_strings (SF_PRIVATE *psf, int location) ;
+static int	wav_command (SF_PRIVATE *psf, int command, void *data, int datasize) ;
+static int	wav_close (SF_PRIVATE *psf) ;
+
+static int 	wav_subchunk_parse	 (SF_PRIVATE *psf, int chunk) ;
+static int 	exif_subchunk_parse	 (SF_PRIVATE *psf, unsigned int length) ;
+static int	wav_read_smpl_chunk (SF_PRIVATE *psf, unsigned int chunklen) ;
+static int	wav_read_acid_chunk (SF_PRIVATE *psf, unsigned int chunklen) ;
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+wav_open	 (SF_PRIVATE *psf)
+{	WAV_PRIVATE * wpriv ;
+	int	format, subformat, error, blockalign = 0, framesperblock = 0 ;
+
+	if ((wpriv = calloc (1, sizeof (WAV_PRIVATE))) == NULL)
+		return SFE_MALLOC_FAILED ;
+	psf->container_data = wpriv ;
+
+	wpriv->wavex_ambisonic = SF_AMBISONIC_NONE ;
+	psf->str_flags = SF_STR_ALLOW_START | SF_STR_ALLOW_END ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = wav_read_header (psf, &blockalign, &framesperblock)))
+			return error ;
+		} ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	if (psf->is_pipe)
+			return SFE_NO_PIPE_WRITE ;
+
+		wpriv->wavex_ambisonic = SF_AMBISONIC_NONE ;
+
+		format = SF_CONTAINER (psf->sf.format) ;
+		if (format != SF_FORMAT_WAV && format != SF_FORMAT_WAVEX)
+			return	SFE_BAD_OPEN_FORMAT ;
+
+		psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+		/* RIFF WAVs are little-endian, RIFX WAVs are big-endian, default to little */
+		psf->endian = SF_ENDIAN (psf->sf.format) ;
+		if (CPU_IS_BIG_ENDIAN && psf->endian == SF_ENDIAN_CPU)
+			psf->endian = SF_ENDIAN_BIG ;
+		else if (psf->endian != SF_ENDIAN_BIG)
+			psf->endian = SF_ENDIAN_LITTLE ;
+
+		if (psf->file.mode != SFM_RDWR || psf->filelength < 44)
+		{	psf->filelength = 0 ;
+			psf->datalength = 0 ;
+			psf->dataoffset = 0 ;
+			psf->sf.frames = 0 ;
+			} ;
+
+		if (subformat == SF_FORMAT_IMA_ADPCM || subformat == SF_FORMAT_MS_ADPCM)
+		{	blockalign = wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;
+			framesperblock = -1 ; /* Corrected later. */
+			} ;
+
+		/* By default, add the peak chunk to floating point files. Default behaviour
+		** can be switched off using sf_command (SFC_SET_PEAK_CHUNK, SF_FALSE).
+		*/
+		if (psf->file.mode == SFM_WRITE && (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE))
+		{	if ((psf->peak_info = peak_info_calloc (psf->sf.channels)) == NULL)
+				return SFE_MALLOC_FAILED ;
+			psf->peak_info->peak_loc = SF_PEAK_START ;
+			} ;
+
+		psf->write_header = wav_write_header ;
+		} ;
+
+	psf->container_close = wav_close ;
+	psf->command = wav_command ;
+
+	switch (subformat)
+	{	case SF_FORMAT_PCM_U8 :
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_24 :
+		case SF_FORMAT_PCM_32 :
+					error = pcm_init (psf) ;
+					break ;
+
+		case SF_FORMAT_ULAW :
+					error = ulaw_init (psf) ;
+					break ;
+
+		case SF_FORMAT_ALAW :
+					error = alaw_init (psf) ;
+					break ;
+
+		/* Lite remove start */
+		case SF_FORMAT_FLOAT :
+					error = float32_init (psf) ;
+					break ;
+
+		case SF_FORMAT_DOUBLE :
+					error = double64_init (psf) ;
+					break ;
+
+		case SF_FORMAT_IMA_ADPCM :
+					error = wav_w64_ima_init (psf, blockalign, framesperblock) ;
+					break ;
+
+		case SF_FORMAT_MS_ADPCM :
+					error = wav_w64_msadpcm_init (psf, blockalign, framesperblock) ;
+					break ;
+
+		case SF_FORMAT_G721_32 :
+					error = g72x_init (psf) ;
+					break ;
+		/* Lite remove end */
+
+		case SF_FORMAT_GSM610 :
+					error = gsm610_init (psf) ;
+					break ;
+
+		default : 	return SFE_UNIMPLEMENTED ;
+		} ;
+
+	if (psf->file.mode == SFM_WRITE || (psf->file.mode == SFM_RDWR && psf->filelength == 0))
+		return psf->write_header (psf, SF_FALSE) ;
+
+	return error ;
+} /* wav_open */
+
+/*=========================================================================
+** Private functions.
+*/
+
+static int
+wav_read_header	 (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
+{	WAV_PRIVATE	*wpriv ;
+	WAV_FMT		*wav_fmt ;
+	FACT_CHUNK	fact_chunk ;
+	unsigned	dword = 0, marker, RIFFsize = 0, done = 0 ;
+	int			parsestage = 0, error, format = 0 ;
+	char		*cptr ;
+
+	if (psf->filelength > SF_PLATFORM_S64 (0xffffffff))
+		psf_log_printf (psf, "Warning : filelength > 0xffffffff. This is bad!!!!\n") ;
+
+	if ((wpriv = psf->container_data) == NULL)
+		return SFE_INTERNAL ;
+	wav_fmt = &wpriv->wav_fmt ;
+
+	/* Set position to start of file to begin reading header. */
+	psf_binheader_readf (psf, "p", 0) ;
+
+	while (! done)
+	{	psf_binheader_readf (psf, "m", &marker) ;
+
+		switch (marker)
+		{	case RIFF_MARKER :
+			case RIFX_MARKER :
+					if (parsestage)
+						return SFE_WAV_NO_RIFF ;
+
+					parsestage |= HAVE_RIFF ;
+
+					/* RIFX signifies big-endian format for all header and data
+					** to prevent lots of code copying here, we'll set the psf->rwf_endian
+					** flag once here, and never specify endian-ness for all other header ops
+					*/
+					if (marker == RIFF_MARKER)
+						psf->rwf_endian = SF_ENDIAN_LITTLE ;
+					else
+						psf->rwf_endian = SF_ENDIAN_BIG ;
+
+					psf_binheader_readf (psf, "4", &RIFFsize) ;
+
+					if (psf->fileoffset > 0 && psf->filelength > RIFFsize + 8)
+					{	/* Set file length. */
+						psf->filelength = RIFFsize + 8 ;
+						if (marker == RIFF_MARKER)
+							psf_log_printf (psf, "RIFF : %u\n", RIFFsize) ;
+						else
+							psf_log_printf (psf, "RIFX : %u\n", RIFFsize) ;
+						}
+					else if (psf->filelength < RIFFsize + 2 * SIGNED_SIZEOF (dword))
+					{	if (marker == RIFF_MARKER)
+							psf_log_printf (psf, "RIFF : %u (should be %D)\n", RIFFsize, psf->filelength - 2 * SIGNED_SIZEOF (dword)) ;
+						else
+							psf_log_printf (psf, "RIFX : %u (should be %D)\n", RIFFsize, psf->filelength - 2 * SIGNED_SIZEOF (dword)) ;
+
+						RIFFsize = dword ;
+						}
+					else
+					{	if (marker == RIFF_MARKER)
+							psf_log_printf (psf, "RIFF : %u\n", RIFFsize) ;
+						else
+							psf_log_printf (psf, "RIFX : %u\n", RIFFsize) ;
+					} ;
+					break ;
+
+			case WAVE_MARKER :
+					if ((parsestage & HAVE_RIFF) != HAVE_RIFF)
+						return SFE_WAV_NO_WAVE ;
+					parsestage |= HAVE_WAVE ;
+
+					psf_log_printf (psf, "WAVE\n") ;
+					break ;
+
+			case fmt_MARKER :
+					if ((parsestage & (HAVE_RIFF | HAVE_WAVE)) != (HAVE_RIFF | HAVE_WAVE))
+						return SFE_WAV_NO_FMT ;
+
+					/* If this file has a SECOND fmt chunk, I don't want to know about it. */
+					if (parsestage & HAVE_fmt)
+						break ;
+
+					parsestage |= HAVE_fmt ;
+
+					psf_binheader_readf (psf, "4", &dword) ;
+					psf_log_printf (psf, "fmt  : %d\n", dword) ;
+
+					if ((error = wav_w64_read_fmt_chunk (psf, dword)))
+						return error ;
+
+					format = wav_fmt->format ;
+					break ;
+
+			case data_MARKER :
+					if ((parsestage & (HAVE_RIFF | HAVE_WAVE | HAVE_fmt)) != (HAVE_RIFF | HAVE_WAVE | HAVE_fmt))
+						return SFE_WAV_NO_DATA ;
+
+					if (psf->file.mode == SFM_RDWR && (parsestage & HAVE_other) != 0)
+						return SFE_RDWR_BAD_HEADER ;
+
+					parsestage |= HAVE_data ;
+
+					psf_binheader_readf (psf, "4", &dword) ;
+
+					psf->datalength = dword ;
+					psf->dataoffset = psf_ftell (psf) ;
+
+					if (psf->dataoffset > 0)
+					{	if (dword == 0 && RIFFsize == 8 && psf->filelength > 44)
+						{	psf_log_printf (psf, "*** Looks like a WAV file which wasn't closed properly. Fixing it.\n") ;
+							psf->datalength = psf->filelength - psf->dataoffset ;
+							} ;
+
+						if (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_log_printf (psf, "data : %D\n", psf->datalength) ;
+
+						/* Only set dataend if there really is data at the end. */
+						if (psf->datalength + psf->dataoffset < psf->filelength)
+							psf->dataend = psf->datalength + psf->dataoffset ;
+
+						if (format == WAVE_FORMAT_MS_ADPCM && psf->datalength % 2)
+						{	psf->datalength ++ ;
+							psf_log_printf (psf, "*** Data length odd. Increasing it by 1.\n") ;
+							} ;
+						} ;
+
+					if (! psf->sf.seekable || psf->dataoffset < 0)
+						break ;
+
+					/* Seek past data and continue reading header. */
+					psf_fseek (psf, psf->datalength, SEEK_CUR) ;
+
+					if (psf_ftell (psf) != psf->datalength + psf->dataoffset)
+						psf_log_printf (psf, "*** psf_fseek past end error ***\n") ;
+					break ;
+
+			case fact_MARKER :
+					if ((parsestage & (HAVE_RIFF | HAVE_WAVE)) != (HAVE_RIFF | HAVE_WAVE))
+						return SFE_WAV_BAD_FACT ;
+
+					parsestage |= HAVE_fact ;
+
+					if ((parsestage & HAVE_fmt) != HAVE_fmt)
+						psf_log_printf (psf, "*** Should have 'fmt ' chunk before 'fact'\n") ;
+
+					psf_binheader_readf (psf, "44", &dword, & (fact_chunk.frames)) ;
+
+					if (dword > SIGNED_SIZEOF (fact_chunk))
+						psf_binheader_readf (psf, "j", (int) (dword - SIGNED_SIZEOF (fact_chunk))) ;
+
+					if (dword)
+						psf_log_printf (psf, "%M : %d\n", marker, dword) ;
+					else
+						psf_log_printf (psf, "%M : %d (should not be zero)\n", marker, dword) ;
+
+					psf_log_printf (psf, "  frames  : %d\n", fact_chunk.frames) ;
+					break ;
+
+			case PEAK_MARKER :
+					if ((parsestage & (HAVE_RIFF | HAVE_WAVE | HAVE_fmt)) != (HAVE_RIFF | HAVE_WAVE | HAVE_fmt))
+						return SFE_WAV_PEAK_B4_FMT ;
+
+					parsestage |= HAVE_PEAK ;
+
+					psf_binheader_readf (psf, "4", &dword) ;
+
+					psf_log_printf (psf, "%M : %d\n", marker, dword) ;
+					if (dword != WAV_PEAK_CHUNK_SIZE (psf->sf.channels))
+					{	psf_binheader_readf (psf, "j", dword) ;
+						psf_log_printf (psf, "*** File PEAK chunk size doesn't fit with number of channels (%d).\n", psf->sf.channels) ;
+						return SFE_WAV_BAD_PEAK ;
+						} ;
+
+					if ((psf->peak_info = peak_info_calloc (psf->sf.channels)) == NULL)
+						return SFE_MALLOC_FAILED ;
+
+					/* read in rest of PEAK chunk. */
+					psf_binheader_readf (psf, "44", & (psf->peak_info->version), & (psf->peak_info->timestamp)) ;
+
+					if (psf->peak_info->version != 1)
+						psf_log_printf (psf, "  version    : %d *** (should be version 1)\n", psf->peak_info->version) ;
+					else
+						psf_log_printf (psf, "  version    : %d\n", psf->peak_info->version) ;
+
+					psf_log_printf (psf, "  time stamp : %d\n", psf->peak_info->timestamp) ;
+					psf_log_printf (psf, "    Ch   Position       Value\n") ;
+
+					cptr = psf->u.cbuf ;
+					for (dword = 0 ; dword < (unsigned) psf->sf.channels ; dword++)
+					{	float value ;
+						unsigned int position ;
+
+						psf_binheader_readf (psf, "f4", &value, &position) ;
+						psf->peak_info->peaks [dword].value = value ;
+						psf->peak_info->peaks [dword].position = position ;
+
+						snprintf (cptr, sizeof (psf->u.cbuf), "    %2d   %-12" PRId64 "   %g\n",
+								dword, psf->peak_info->peaks [dword].position, psf->peak_info->peaks [dword].value) ;
+						cptr [sizeof (psf->u.cbuf) - 1] = 0 ;
+						psf_log_printf (psf, "%s", cptr) ;
+						} ;
+
+					psf->peak_info->peak_loc = ((parsestage & HAVE_data) == 0) ? SF_PEAK_START : SF_PEAK_END ;
+					break ;
+
+			case cue_MARKER :
+					parsestage |= HAVE_other ;
+
+					{	unsigned bytesread, cue_count ;
+						int id, position, chunk_id, chunk_start, block_start, offset ;
+
+						bytesread = psf_binheader_readf (psf, "44", &dword, &cue_count) ;
+						bytesread -= 4 ; /* Remove bytes for first dword. */
+						psf_log_printf (psf, "%M : %u\n", marker, dword) ;
+
+						if (cue_count > 10)
+						{	psf_log_printf (psf, "  Count : %d (skipping)\n", cue_count) ;
+							psf_binheader_readf (psf, "j", cue_count * 24) ;
+							break ;
+							} ;
+
+						psf_log_printf (psf, "  Count : %d\n", cue_count) ;
+
+						while (cue_count)
+						{	bytesread += psf_binheader_readf (psf, "444444", &id, &position,
+									&chunk_id, &chunk_start, &block_start, &offset) ;
+							psf_log_printf (psf, "   Cue ID : %2d"
+												 "  Pos : %5u  Chunk : %M"
+												 "  Chk Start : %d  Blk Start : %d"
+												 "  Offset : %5d\n",
+									id, position, chunk_id, chunk_start, block_start, offset) ;
+							cue_count -- ;
+							} ;
+
+						if (bytesread != dword)
+						{	psf_log_printf (psf, "**** Chunk size weirdness (%d != %d)\n", dword, bytesread) ;
+							psf_binheader_readf (psf, "j", dword - bytesread) ;
+							} ;
+						} ;
+					break ;
+
+			case smpl_MARKER :
+					parsestage |= HAVE_other ;
+
+					psf_binheader_readf (psf, "4", &dword) ;
+					psf_log_printf (psf, "smpl : %u\n", dword) ;
+
+					if ((error = wav_read_smpl_chunk (psf, dword)))
+						return error ;
+					break ;
+
+			case acid_MARKER :
+					parsestage |= HAVE_other ;
+
+					psf_binheader_readf (psf, "4", &dword) ;
+					psf_log_printf (psf, "acid : %u\n", dword) ;
+
+					if ((error = wav_read_acid_chunk (psf, dword)))
+						return error ;
+					break ;
+
+			case INFO_MARKER :
+			case LIST_MARKER :
+					parsestage |= HAVE_other ;
+
+					if ((error = wav_subchunk_parse (psf, marker)) != 0)
+						return error ;
+					break ;
+
+			case bext_MARKER :
+					/*
+					The 'bext' chunk can actually be updated, so don't need to set this.
+					parsestage |= HAVE_other ;
+					*/
+					psf_binheader_readf (psf, "4", &dword) ;
+					if ((error = wav_read_bext_chunk (psf, dword)))
+						return error ;
+					break ;
+
+			case PAD_MARKER :
+					/*
+					We can eat into a 'PAD ' chunk if we need to.
+					parsestage |= HAVE_other ;
+					*/
+					psf_binheader_readf (psf, "4", &dword) ;
+					psf_log_printf (psf, "%M : %u\n", marker, dword) ;
+					dword += (dword & 1) ;
+					psf_binheader_readf (psf, "j", dword) ;
+					break ;
+
+			case iXML_MARKER : /* See http://en.wikipedia.org/wiki/IXML */
+			case strc_MARKER : /* Multiple of 32 bytes. */
+			case afsp_MARKER :
+			case clm_MARKER :
+			case elmo_MARKER :
+			case cart_MARKER :
+			case levl_MARKER :
+			case plst_MARKER :
+			case DISP_MARKER :
+			case MEXT_MARKER :
+			case FLLR_MARKER :
+					psf_binheader_readf (psf, "4", &dword) ;
+					psf_log_printf (psf, "%M : %u\n", marker, dword) ;
+					dword += (dword & 1) ;
+					psf_binheader_readf (psf, "j", dword) ;
+					break ;
+
+			default :
+					if (psf_isprint ((marker >> 24) & 0xFF) && psf_isprint ((marker >> 16) & 0xFF)
+						&& psf_isprint ((marker >> 8) & 0xFF) && psf_isprint (marker & 0xFF))
+					{	psf_binheader_readf (psf, "4", &dword) ;
+						psf_log_printf (psf, "*** %M : %d (unknown marker)\n", marker, dword) ;
+						psf_binheader_readf (psf, "j", dword) ;
+						break ;
+						} ;
+					if (psf_ftell (psf) & 0x03)
+					{	psf_log_printf (psf, "  Unknown chunk marker at position %d. Resynching.\n", dword - 4) ;
+						psf_binheader_readf (psf, "j", -3) ;
+						/* File is too messed up so we prevent editing in RDWR mode here. */
+						parsestage |= HAVE_other ;
+						break ;
+						} ;
+					psf_log_printf (psf, "*** Unknown chunk marker (%X) at position %D. Exiting parser.\n", marker, psf_ftell (psf) - 4) ;
+					done = SF_TRUE ;
+					break ;
+			} ;	/* switch (dword) */
+
+		if (! psf->sf.seekable && (parsestage & HAVE_data))
+			break ;
+
+		if (psf_ftell (psf) >= psf->filelength - SIGNED_SIZEOF (dword))
+		{	psf_log_printf (psf, "End\n") ;
+			break ;
+			} ;
+		} ; /* while (1) */
+
+	if (psf->dataoffset <= 0)
+		return SFE_WAV_NO_DATA ;
+
+	/* WAVs can be little or big endian */
+	psf->endian = psf->rwf_endian ;
+
+	psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+
+	if (psf->is_pipe == 0)
+	{	/*
+		** Check for 'wvpk' at the start of the DATA section. Not able to
+		** handle this.
+		*/
+		psf_binheader_readf (psf, "4", &marker) ;
+		if (marker == wvpk_MARKER || marker == OggS_MARKER)
+			return SFE_WAV_WVPK_DATA ;
+		} ;
+
+	/* Seek to start of DATA section. */
+	psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+
+	if (psf->blockwidth)
+	{	if (psf->filelength - psf->dataoffset < psf->datalength)
+			psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ;
+		else
+			psf->sf.frames = psf->datalength / psf->blockwidth ;
+		} ;
+
+	switch (format)
+	{	case WAVE_FORMAT_EXTENSIBLE :
+			if (psf->sf.format == (SF_FORMAT_WAVEX | SF_FORMAT_MS_ADPCM))
+			{	*blockalign = wav_fmt->msadpcm.blockalign ;
+				*framesperblock = wav_fmt->msadpcm.samplesperblock ;
+				} ;
+			break ;
+
+		case WAVE_FORMAT_PCM :
+					psf->sf.format = SF_FORMAT_WAV | u_bitwidth_to_subformat (psf->bytewidth * 8) ;
+					break ;
+
+		case WAVE_FORMAT_MULAW :
+		case IBM_FORMAT_MULAW :
+					psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_ULAW) ;
+					break ;
+
+		case WAVE_FORMAT_ALAW :
+		case IBM_FORMAT_ALAW :
+					psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_ALAW) ;
+					break ;
+
+		case WAVE_FORMAT_MS_ADPCM :
+					psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM) ;
+					*blockalign = wav_fmt->msadpcm.blockalign ;
+					*framesperblock = wav_fmt->msadpcm.samplesperblock ;
+					break ;
+
+		case WAVE_FORMAT_IMA_ADPCM :
+					psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM) ;
+					*blockalign = wav_fmt->ima.blockalign ;
+					*framesperblock = wav_fmt->ima.samplesperblock ;
+					break ;
+
+		case WAVE_FORMAT_GSM610 :
+					psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_GSM610) ;
+					break ;
+
+		case WAVE_FORMAT_IEEE_FLOAT :
+					psf->sf.format = SF_FORMAT_WAV ;
+					psf->sf.format |= (psf->bytewidth == 8) ? SF_FORMAT_DOUBLE : SF_FORMAT_FLOAT ;
+					break ;
+
+		case WAVE_FORMAT_G721_ADPCM :
+					psf->sf.format = SF_FORMAT_WAV | SF_FORMAT_G721_32 ;
+					break ;
+
+		default : return SFE_UNIMPLEMENTED ;
+		} ;
+
+	if (wpriv->fmt_is_broken)
+		wav_w64_analyze (psf) ;
+
+	/* Only set the format endian-ness if its non-standard big-endian. */
+	if (psf->endian == SF_ENDIAN_BIG)
+		psf->sf.format |= SF_ENDIAN_BIG ;
+
+	return 0 ;
+} /* wav_read_header */
+
+static int
+wav_write_fmt_chunk (SF_PRIVATE *psf)
+{	int subformat, fmt_size, add_fact_chunk = 0 ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+
+	switch (subformat)
+	{	case SF_FORMAT_PCM_U8 :
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_24 :
+		case SF_FORMAT_PCM_32 :
+					fmt_size = 2 + 2 + 4 + 4 + 2 + 2 ;
+
+					/* fmt : format, channels, samplerate */
+					psf_binheader_writef (psf, "4224", fmt_size, WAVE_FORMAT_PCM, psf->sf.channels, psf->sf.samplerate) ;
+					/*  fmt : bytespersec */
+					psf_binheader_writef (psf, "4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+					/*  fmt : blockalign, bitwidth */
+					psf_binheader_writef (psf, "22", psf->bytewidth * psf->sf.channels, psf->bytewidth * 8) ;
+					break ;
+
+		case SF_FORMAT_FLOAT :
+		case SF_FORMAT_DOUBLE :
+					fmt_size = 2 + 2 + 4 + 4 + 2 + 2 ;
+
+					/* fmt : format, channels, samplerate */
+					psf_binheader_writef (psf, "4224", fmt_size, WAVE_FORMAT_IEEE_FLOAT, psf->sf.channels, psf->sf.samplerate) ;
+					/*  fmt : bytespersec */
+					psf_binheader_writef (psf, "4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+					/*  fmt : blockalign, bitwidth */
+					psf_binheader_writef (psf, "22", psf->bytewidth * psf->sf.channels, psf->bytewidth * 8) ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
+		case SF_FORMAT_ULAW :
+					fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 ;
+
+					/* fmt : format, channels, samplerate */
+					psf_binheader_writef (psf, "4224", fmt_size, WAVE_FORMAT_MULAW, psf->sf.channels, psf->sf.samplerate) ;
+					/*  fmt : bytespersec */
+					psf_binheader_writef (psf, "4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+					/*  fmt : blockalign, bitwidth, extrabytes */
+					psf_binheader_writef (psf, "222", psf->bytewidth * psf->sf.channels, 8, 0) ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
+		case SF_FORMAT_ALAW :
+					fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 ;
+
+					/* fmt : format, channels, samplerate */
+					psf_binheader_writef (psf, "4224", fmt_size, WAVE_FORMAT_ALAW, psf->sf.channels, psf->sf.samplerate) ;
+					/*  fmt : bytespersec */
+					psf_binheader_writef (psf, "4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+					/*  fmt : blockalign, bitwidth, extrabytes */
+					psf_binheader_writef (psf, "222", psf->bytewidth * psf->sf.channels, 8, 0) ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
+		/* Lite remove start */
+		case SF_FORMAT_IMA_ADPCM :
+					{	int blockalign, framesperblock, bytespersec ;
+
+						blockalign		= wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;
+						framesperblock	= 2 * (blockalign - 4 * psf->sf.channels) / psf->sf.channels + 1 ;
+						bytespersec		= (psf->sf.samplerate * blockalign) / framesperblock ;
+
+						/* fmt chunk. */
+						fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ;
+
+						/* fmt : size, WAV format type, channels, samplerate, bytespersec */
+						psf_binheader_writef (psf, "42244", fmt_size, WAVE_FORMAT_IMA_ADPCM,
+									psf->sf.channels, psf->sf.samplerate, bytespersec) ;
+
+						/* fmt : blockalign, bitwidth, extrabytes, framesperblock. */
+						psf_binheader_writef (psf, "2222", blockalign, 4, 2, framesperblock) ;
+						} ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
+		case SF_FORMAT_MS_ADPCM :
+					{	int	blockalign, framesperblock, bytespersec, extrabytes ;
+
+						blockalign		= wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;
+						framesperblock	= 2 + 2 * (blockalign - 7 * psf->sf.channels) / psf->sf.channels ;
+						bytespersec		= (psf->sf.samplerate * blockalign) / framesperblock ;
+
+						/* fmt chunk. */
+						extrabytes	= 2 + 2 + MSADPCM_ADAPT_COEFF_COUNT * (2 + 2) ;
+						fmt_size	= 2 + 2 + 4 + 4 + 2 + 2 + 2 + extrabytes ;
+
+						/* fmt : size, WAV format type, channels. */
+						psf_binheader_writef (psf, "422", fmt_size, WAVE_FORMAT_MS_ADPCM, psf->sf.channels) ;
+
+						/* fmt : samplerate, bytespersec. */
+						psf_binheader_writef (psf, "44", psf->sf.samplerate, bytespersec) ;
+
+						/* fmt : blockalign, bitwidth, extrabytes, framesperblock. */
+						psf_binheader_writef (psf, "22222", blockalign, 4, extrabytes, framesperblock, 7) ;
+
+						msadpcm_write_adapt_coeffs (psf) ;
+						} ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
+
+		case SF_FORMAT_G721_32 :
+					/* fmt chunk. */
+					fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ;
+
+					/* fmt : size, WAV format type, channels, samplerate, bytespersec */
+					psf_binheader_writef (psf, "42244", fmt_size, WAVE_FORMAT_G721_ADPCM,
+								psf->sf.channels, psf->sf.samplerate, psf->sf.samplerate * psf->sf.channels / 2) ;
+
+					/* fmt : blockalign, bitwidth, extrabytes, auxblocksize. */
+					psf_binheader_writef (psf, "2222", 64, 4, 2, 0) ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
+		/* Lite remove end */
+
+		case SF_FORMAT_GSM610 :
+					{	int	blockalign, framesperblock, bytespersec ;
+
+						blockalign		= WAV_W64_GSM610_BLOCKSIZE ;
+						framesperblock	= WAV_W64_GSM610_SAMPLES ;
+						bytespersec		= (psf->sf.samplerate * blockalign) / framesperblock ;
+
+						/* fmt chunk. */
+						fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ;
+
+						/* fmt : size, WAV format type, channels. */
+						psf_binheader_writef (psf, "422", fmt_size, WAVE_FORMAT_GSM610, psf->sf.channels) ;
+
+						/* fmt : samplerate, bytespersec. */
+						psf_binheader_writef (psf, "44", psf->sf.samplerate, bytespersec) ;
+
+						/* fmt : blockalign, bitwidth, extrabytes, framesperblock. */
+						psf_binheader_writef (psf, "2222", blockalign, 0, 2, framesperblock) ;
+						} ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
+		default : 	return SFE_UNIMPLEMENTED ;
+		} ;
+
+	if (add_fact_chunk)
+		psf_binheader_writef (psf, "tm48", fact_MARKER, 4, psf->sf.frames) ;
+
+	return 0 ;
+} /* wav_write_fmt_chunk */
+
+static int
+wavex_write_fmt_chunk (SF_PRIVATE *psf)
+{	WAV_PRIVATE	*wpriv ;
+	int subformat, fmt_size, add_fact_chunk = 0 ;
+
+	if ((wpriv = psf->container_data) == NULL)
+		return SFE_INTERNAL ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+
+	/* initial section (same for all, it appears) */
+	switch (subformat)
+	{	case SF_FORMAT_PCM_U8 :
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_24 :
+		case SF_FORMAT_PCM_32 :
+		case SF_FORMAT_FLOAT :
+		case SF_FORMAT_DOUBLE :
+		case SF_FORMAT_ULAW :
+		case SF_FORMAT_ALAW :
+			fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 + 4 + 4 + 2 + 2 + 8 ;
+
+			/* fmt : format, channels, samplerate */
+			psf_binheader_writef (psf, "4224", fmt_size, WAVE_FORMAT_EXTENSIBLE, psf->sf.channels, psf->sf.samplerate) ;
+			/*  fmt : bytespersec */
+			psf_binheader_writef (psf, "4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+			/*  fmt : blockalign, bitwidth */
+			psf_binheader_writef (psf, "22", psf->bytewidth * psf->sf.channels, psf->bytewidth * 8) ;
+
+			/* cbSize 22 is sizeof (WAVEFORMATEXTENSIBLE) - sizeof (WAVEFORMATEX) */
+			psf_binheader_writef (psf, "2", 22) ;
+
+			/* wValidBitsPerSample, for our use same as bitwidth as we use it fully */
+			psf_binheader_writef (psf, "2", psf->bytewidth * 8) ;
+
+			/* For an Ambisonic file set the channel mask to zero.
+			** Otherwise use a default based on the channel count.
+			*/
+			if (wpriv->wavex_ambisonic != SF_AMBISONIC_NONE)
+				psf_binheader_writef (psf, "4", 0) ;
+			else if (wpriv->wavex_channelmask != 0)
+				psf_binheader_writef (psf, "4", wpriv->wavex_channelmask) ;
+			else
+			{	/*
+				** Ok some liberty is taken here to use the most commonly used channel masks
+				** instead of "no mapping". If you really want to use "no mapping" for 8 channels and less
+				** please don't use wavex. (otherwise we'll have to create a new SF_COMMAND)
+				*/
+				switch (psf->sf.channels)
+				{	case 1 :	/* center channel mono */
+						psf_binheader_writef (psf, "4", 0x4) ;
+						break ;
+
+					case 2 :	/* front left and right */
+						psf_binheader_writef (psf, "4", 0x1 | 0x2) ;
+						break ;
+
+					case 4 :	/* Quad */
+						psf_binheader_writef (psf, "4", 0x1 | 0x2 | 0x10 | 0x20) ;
+						break ;
+
+					case 6 :	/* 5.1 */
+						psf_binheader_writef (psf, "4", 0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20) ;
+						break ;
+
+					case 8 :	/* 7.1 */
+						psf_binheader_writef (psf, "4", 0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20 | 0x40 | 0x80) ;
+						break ;
+
+					default :	/* 0 when in doubt , use direct out, ie NO mapping*/
+						psf_binheader_writef (psf, "4", 0x0) ;
+						break ;
+					} ;
+				} ;
+			break ;
+
+		case SF_FORMAT_MS_ADPCM : /* Todo, GUID exists might have different header as per wav_write_header */
+		default :
+			return SFE_UNIMPLEMENTED ;
+		} ;
+
+	/* GUID section, different for each */
+
+	switch (subformat)
+	{	case SF_FORMAT_PCM_U8 :
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_24 :
+		case SF_FORMAT_PCM_32 :
+			wavex_write_guid (psf, wpriv->wavex_ambisonic == SF_AMBISONIC_NONE ?
+						&MSGUID_SUBTYPE_PCM : &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_PCM) ;
+			break ;
+
+		case SF_FORMAT_FLOAT :
+		case SF_FORMAT_DOUBLE :
+			wavex_write_guid (psf, wpriv->wavex_ambisonic == SF_AMBISONIC_NONE ?
+						&MSGUID_SUBTYPE_IEEE_FLOAT : &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT) ;
+			add_fact_chunk = SF_TRUE ;
+			break ;
+
+		case SF_FORMAT_ULAW :
+			wavex_write_guid (psf, &MSGUID_SUBTYPE_MULAW) ;
+			add_fact_chunk = SF_TRUE ;
+			break ;
+
+		case SF_FORMAT_ALAW :
+			wavex_write_guid (psf, &MSGUID_SUBTYPE_ALAW) ;
+			add_fact_chunk = SF_TRUE ;
+			break ;
+
+#if 0
+		/* This is dead code due to return in previous switch statement. */
+		case SF_FORMAT_MS_ADPCM : /* todo, GUID exists */
+			wavex_write_guid (psf, &MSGUID_SUBTYPE_MS_ADPCM) ;
+			add_fact_chunk = SF_TRUE ;
+			break ;
+			return SFE_UNIMPLEMENTED ;
+#endif
+
+		default : return SFE_UNIMPLEMENTED ;
+		} ;
+
+	if (add_fact_chunk)
+		psf_binheader_writef (psf, "tm48", fact_MARKER, 4, psf->sf.frames) ;
+
+	return 0 ;
+} /* wavex_write_fmt_chunk */
+
+
+static int
+wav_write_header (SF_PRIVATE *psf, int calc_length)
+{	sf_count_t	current ;
+	int 		k, error, has_data = SF_FALSE ;
+
+	current = psf_ftell (psf) ;
+
+	if (current > psf->dataoffset)
+		has_data = SF_TRUE ;
+
+	if (calc_length)
+	{	psf->filelength = psf_get_filelen (psf) ;
+
+		psf->datalength = psf->filelength - psf->dataoffset ;
+
+		if (psf->dataend)
+			psf->datalength -= psf->filelength - psf->dataend ;
+
+		if (psf->bytewidth > 0)
+			psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+		} ;
+
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	psf_fseek (psf, 0, SEEK_SET) ;
+
+	/*
+	** RIFX signifies big-endian format for all header and data.
+	** To prevent lots of code copying here, we'll set the psf->rwf_endian flag
+	** once here, and never specify endian-ness for all other header operations.
+	*/
+
+	/* RIFF/RIFX marker, length, WAVE and 'fmt ' markers. */
+
+	if (psf->endian == SF_ENDIAN_LITTLE)
+		psf_binheader_writef (psf, "etm8", RIFF_MARKER, (psf->filelength < 8) ? 8 : psf->filelength - 8) ;
+	else
+		psf_binheader_writef (psf, "Etm8", RIFX_MARKER, (psf->filelength < 8) ? 8 : psf->filelength - 8) ;
+
+	/* WAVE and 'fmt ' markers. */
+	psf_binheader_writef (psf, "mm", WAVE_MARKER, fmt_MARKER) ;
+
+	/* Write the 'fmt ' chunk. */
+	switch (SF_CONTAINER (psf->sf.format))
+	{	case SF_FORMAT_WAV :
+				if ((error = wav_write_fmt_chunk (psf)) != 0)
+					return error ;
+				break ;
+
+		case SF_FORMAT_WAVEX :
+				if ((error = wavex_write_fmt_chunk (psf)) != 0)
+					return error ;
+				break ;
+
+		default :
+				return SFE_UNIMPLEMENTED ;
+		} ;
+
+	/* The LIST/INFO chunk. */
+	if (psf->str_flags & SF_STR_LOCATE_START)
+		wav_write_strings (psf, SF_STR_LOCATE_START) ;
+
+	if (psf->peak_info != NULL && psf->peak_info->peak_loc == SF_PEAK_START)
+	{	psf_binheader_writef (psf, "m4", PEAK_MARKER, WAV_PEAK_CHUNK_SIZE (psf->sf.channels)) ;
+		psf_binheader_writef (psf, "44", 1, time (NULL)) ;
+		for (k = 0 ; k < psf->sf.channels ; k++)
+			psf_binheader_writef (psf, "ft8", (float) psf->peak_info->peaks [k].value, psf->peak_info->peaks [k].position) ;
+		} ;
+
+	if (psf->broadcast_16k != NULL)
+		wav_write_bext_chunk (psf) ;
+
+	if (psf->instrument != NULL)
+	{	int		tmp ;
+		double	dtune = (double) (0x40000000) / 25.0 ;
+
+		psf_binheader_writef (psf, "m4", smpl_MARKER, 9 * 4 + psf->instrument->loop_count * 6 * 4) ;
+		psf_binheader_writef (psf, "44", 0, 0) ; /* Manufacturer zero is everyone */
+		tmp = (int) (1.0e9 / psf->sf.samplerate) ; /* Sample period in nano seconds */
+		psf_binheader_writef (psf, "44", tmp, psf->instrument->basenote) ;
+		tmp = (unsigned int) (psf->instrument->detune * dtune + 0.5) ;
+		psf_binheader_writef (psf, "4", tmp) ;
+		psf_binheader_writef (psf, "44", 0, 0) ; /* SMTPE format */
+		psf_binheader_writef (psf, "44", psf->instrument->loop_count, 0) ;
+
+		for (tmp = 0 ; tmp < psf->instrument->loop_count ; tmp++)
+		{	int type ;
+
+			type = psf->instrument->loops [tmp].mode ;
+			type = (type == SF_LOOP_FORWARD ? 0 : type==SF_LOOP_BACKWARD ? 2 : type == SF_LOOP_ALTERNATING ? 1 : 32) ;
+
+			psf_binheader_writef (psf, "44", tmp, type) ;
+			psf_binheader_writef (psf, "44", psf->instrument->loops [tmp].start, psf->instrument->loops [tmp].end - 1) ;
+			psf_binheader_writef (psf, "44", 0, psf->instrument->loops [tmp].count) ;
+			} ;
+		} ;
+
+	if (psf->headindex + 16 < psf->dataoffset)
+	{	/* Add PAD data if necessary. */
+		k = psf->dataoffset - (psf->headindex + 16) ;
+		psf_binheader_writef (psf, "m4z", PAD_MARKER, k, make_size_t (k)) ;
+		} ;
+
+	psf_binheader_writef (psf, "tm8", data_MARKER, psf->datalength) ;
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+	if (psf->error)
+		return psf->error ;
+
+	if (has_data && psf->dataoffset != psf->headindex)
+	{	psf_log_printf (psf, "Oooops : has_data && psf->dataoffset != psf->headindex\n") ;
+		return psf->error = SFE_INTERNAL ;
+		} ;
+
+	psf->dataoffset = psf->headindex ;
+
+	if (! has_data)
+		psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+	else if (current > 0)
+		psf_fseek (psf, current, SEEK_SET) ;
+
+	return psf->error ;
+} /* wav_write_header */
+
+
+static int
+wav_write_tailer (SF_PRIVATE *psf)
+{	int		k ;
+
+	/* Reset the current header buffer length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+
+	if (psf->dataend > 0)
+		psf_fseek (psf, psf->dataend, SEEK_SET) ;
+	else
+		psf->dataend = psf_fseek (psf, 0, SEEK_END) ;
+
+	/* Add a PEAK chunk if requested. */
+	if (psf->peak_info != NULL && psf->peak_info->peak_loc == SF_PEAK_END)
+	{	psf_binheader_writef (psf, "m4", PEAK_MARKER, WAV_PEAK_CHUNK_SIZE (psf->sf.channels)) ;
+		psf_binheader_writef (psf, "44", 1, time (NULL)) ;
+		for (k = 0 ; k < psf->sf.channels ; k++)
+			psf_binheader_writef (psf, "f4", psf->peak_info->peaks [k].value, psf->peak_info->peaks [k].position) ;
+		} ;
+
+	if (psf->str_flags & SF_STR_LOCATE_END)
+		wav_write_strings (psf, SF_STR_LOCATE_END) ;
+
+	/* Write the tailer. */
+	if (psf->headindex > 0)
+		psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+
+	return 0 ;
+} /* wav_write_tailer */
+
+static void
+wav_write_strings (SF_PRIVATE *psf, int location)
+{	int	k, prev_head_index, saved_head_index ;
+
+	if (psf_location_string_count (psf, location) == 0)
+		return ;
+
+	prev_head_index = psf->headindex + 4 ;
+
+	psf_binheader_writef (psf, "m4m", LIST_MARKER, 0xBADBAD, INFO_MARKER) ;
+
+	for (k = 0 ; k < SF_MAX_STRINGS ; k++)
+	{	if (psf->strings [k].type == 0)
+			break ;
+		if (psf->strings [k].type < 0 || psf->strings [k].flags != location)
+			continue ;
+
+		switch (psf->strings [k].type)
+		{	case SF_STR_SOFTWARE :
+				psf_binheader_writef (psf, "ms", ISFT_MARKER, psf->strings [k].str) ;
+				break ;
+
+			case SF_STR_TITLE :
+				psf_binheader_writef (psf, "ms", INAM_MARKER, psf->strings [k].str) ;
+				break ;
+
+			case SF_STR_COPYRIGHT :
+				psf_binheader_writef (psf, "ms", ICOP_MARKER, psf->strings [k].str) ;
+				break ;
+
+			case SF_STR_ARTIST :
+				psf_binheader_writef (psf, "ms", IART_MARKER, psf->strings [k].str) ;
+				break ;
+
+			case SF_STR_COMMENT :
+				psf_binheader_writef (psf, "ms", ICMT_MARKER, psf->strings [k].str) ;
+				break ;
+
+			case SF_STR_DATE :
+				psf_binheader_writef (psf, "ms", ICRD_MARKER, psf->strings [k].str) ;
+				break ;
+
+			case SF_STR_GENRE :
+				psf_binheader_writef (psf, "ms", IGNR_MARKER, psf->strings [k].str) ;
+				break ;
+
+			default :
+				break ;
+			} ;
+		} ;
+
+	saved_head_index = psf->headindex ;
+	psf->headindex = prev_head_index ;
+	psf_binheader_writef (psf, "4", saved_head_index - prev_head_index - 4) ;
+	psf->headindex = saved_head_index ;
+
+} /* wav_write_strings */
+
+static int
+wav_close (SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	wav_write_tailer (psf) ;
+
+		if (psf->file.mode == SFM_RDWR)
+		{	sf_count_t current = psf_ftell (psf) ;
+
+			/*
+			**	If the mode is RDWR and the current position is less than the
+			**	filelength, truncate the file.
+			*/
+
+			if (current < psf->filelength)
+			{	psf_ftruncate (psf, current) ;
+				psf->filelength = current ;
+				} ;
+			} ;
+
+		psf->write_header (psf, SF_TRUE) ;
+		} ;
+
+	return 0 ;
+} /* wav_close */
+
+static int
+wav_command (SF_PRIVATE *psf, int command, void * UNUSED (data), int datasize)
+{	WAV_PRIVATE	*wpriv ;
+
+	if ((wpriv = psf->container_data) == NULL)
+		return SFE_INTERNAL ;
+
+	switch (command)
+	{	case SFC_WAVEX_SET_AMBISONIC :
+			if ((SF_CONTAINER (psf->sf.format)) == SF_FORMAT_WAVEX)
+			{	if (datasize == SF_AMBISONIC_NONE)
+					wpriv->wavex_ambisonic = SF_AMBISONIC_NONE ;
+				else if (datasize == SF_AMBISONIC_B_FORMAT)
+					wpriv->wavex_ambisonic = SF_AMBISONIC_B_FORMAT ;
+				else
+					return 0 ;
+				} ;
+			return wpriv->wavex_ambisonic ;
+
+		case SFC_WAVEX_GET_AMBISONIC :
+			return wpriv->wavex_ambisonic ;
+
+		case SFC_SET_CHANNEL_MAP_INFO :
+			wpriv->wavex_channelmask = wavex_gen_channel_mask (psf->channel_map, psf->sf.channels) ;
+			return (wpriv->wavex_channelmask != 0) ;
+
+		default :
+			break ;
+	} ;
+
+	return 0 ;
+} /* wav_command */
+
+static int
+wav_subchunk_parse (SF_PRIVATE *psf, int chunk)
+{	sf_count_t	current_pos ;
+	char		*cptr ;
+	unsigned 	dword, bytesread, length ;
+
+	current_pos = psf_fseek (psf, 0, SEEK_CUR) ;
+
+	bytesread = psf_binheader_readf (psf, "4", &length) ;
+
+	if (length <= 8)
+	{	/* This case is for broken files generated by PEAK. */
+		psf_log_printf (psf, "%M : %d (weird length)\n", chunk, length) ;
+		psf_binheader_readf (psf, "mj", &chunk, length - 4) ;
+		psf_log_printf (psf, "  %M\n", chunk) ;
+		return 0 ;
+		} ;
+
+	if (psf->headindex + length > SIGNED_SIZEOF (psf->header))
+	{	psf_log_printf (psf, "%M : %d (too long)\n", chunk, length) ;
+		psf_binheader_readf (psf, "j", length) ;
+		return 0 ;
+		} ;
+
+	if (current_pos + length > psf->filelength)
+	{	psf_log_printf (psf, "%M : %d (should be %d)\n", chunk, length, (int) (psf->filelength - current_pos)) ;
+		length = psf->filelength - current_pos ;
+		}
+	else
+		psf_log_printf (psf, "%M : %d\n", chunk, length) ;
+
+	while (bytesread < length)
+	{	bytesread += psf_binheader_readf (psf, "m", &chunk) ;
+
+		switch (chunk)
+		{	case adtl_MARKER :
+			case INFO_MARKER :
+					/* These markers don't contain anything. */
+					psf_log_printf (psf, "  %M\n", chunk) ;
+					break ;
+
+			case data_MARKER :
+					psf_log_printf (psf, "  %M inside a LIST block??? Backing out.\n", chunk) ;
+					/* Jump back four bytes and return to caller. */
+					psf_binheader_readf (psf, "j", -4) ;
+					return 0 ;
+
+			case ISFT_MARKER :
+			case ICOP_MARKER :
+			case IARL_MARKER :
+			case IART_MARKER :
+			case ICMT_MARKER :
+			case ICRD_MARKER :
+			case IENG_MARKER :
+			case IGNR_MARKER :
+			case INAM_MARKER :
+			case IPRD_MARKER :
+			case ISBJ_MARKER :
+			case ISRC_MARKER :
+					bytesread += psf_binheader_readf (psf, "4", &dword) ;
+					dword += (dword & 1) ;
+					if (dword >= SIGNED_SIZEOF (psf->u.cbuf))
+					{	psf_log_printf (psf, "  *** %M : %d (too big)\n", chunk, dword) ;
+						psf_binheader_readf (psf, "j", dword) ;
+						break ;
+						} ;
+
+					cptr = psf->u.cbuf ;
+					psf_binheader_readf (psf, "b", cptr, dword) ;
+					bytesread += dword ;
+					cptr [dword] = 0 ;
+					psf_log_printf (psf, "    %M : %s\n", chunk, cptr) ;
+					break ;
+
+			case labl_MARKER :
+					{	int mark_id ;
+
+						bytesread += psf_binheader_readf (psf, "44", &dword, &mark_id) ;
+						dword -= 4 ;
+						dword += (dword & 1) ;
+						if (dword < 1 || dword >= SIGNED_SIZEOF (psf->u.cbuf))
+						{	psf_log_printf (psf, "  *** %M : %d (too big)\n", chunk, dword) ;
+							psf_binheader_readf (psf, "j", dword) ;
+							break ;
+							} ;
+
+						cptr = psf->u.cbuf ;
+						psf_binheader_readf (psf, "b", cptr, dword) ;
+						bytesread += dword ;
+						cptr [dword] = 0 ;
+						psf_log_printf (psf, "    %M : %d : %s\n", chunk, mark_id, cptr) ;
+						} ;
+					break ;
+
+
+			case DISP_MARKER :
+			case ltxt_MARKER :
+			case note_MARKER :
+					bytesread += psf_binheader_readf (psf, "4", &dword) ;
+					dword += (dword & 1) ;
+					psf_binheader_readf (psf, "j", dword) ;
+					bytesread += dword ;
+					psf_log_printf (psf, "    %M : %d\n", chunk, dword) ;
+					break ;
+
+			case exif_MARKER :
+					psf_log_printf (psf, "  %M\n", chunk) ;
+					bytesread += exif_subchunk_parse (psf, length - bytesread) ;
+					break ;
+
+			case 0 :
+					/*
+					**	Four zero bytes where a marker was expected. Assume this means
+					**	the rest of the chunk is garbage.
+					*/
+					psf_log_printf (psf, "    *** Found weird-ass zero marker. Jumping to end of chunk.\n") ;
+					if (bytesread < length)
+						bytesread += psf_binheader_readf (psf, "j", length - bytesread + 4) ;
+					psf_log_printf (psf, "    *** Offset is now : 0x%X\n", psf_fseek (psf, 0, SEEK_CUR)) ;
+					return 0 ;
+
+			default :
+					psf_binheader_readf (psf, "4", &dword) ;
+					bytesread += sizeof (dword) ;
+					dword += (dword & 1) ;
+					psf_binheader_readf (psf, "j", dword) ;
+					bytesread += dword ;
+					psf_log_printf (psf, "    *** %M : %d\n", chunk, dword) ;
+					if (dword > length)
+						return 0 ;
+					break ;
+			} ;
+
+		switch (chunk)
+		{	case ISFT_MARKER :
+					psf_store_string (psf, SF_STR_SOFTWARE, psf->u.cbuf) ;
+					break ;
+			case ICOP_MARKER :
+					psf_store_string (psf, SF_STR_COPYRIGHT, psf->u.cbuf) ;
+					break ;
+			case INAM_MARKER :
+					psf_store_string (psf, SF_STR_TITLE, psf->u.cbuf) ;
+					break ;
+			case IART_MARKER :
+					psf_store_string (psf, SF_STR_ARTIST, psf->u.cbuf) ;
+					break ;
+			case ICMT_MARKER :
+					psf_store_string (psf, SF_STR_COMMENT, psf->u.cbuf) ;
+					break ;
+			case ICRD_MARKER :
+					psf_store_string (psf, SF_STR_DATE, psf->u.cbuf) ;
+					break ;
+			case IGNR_MARKER :
+					psf_store_string (psf, SF_STR_GENRE, psf->u.cbuf) ;
+					break ;
+			} ;
+		} ;
+
+	current_pos = psf_fseek (psf, 0, SEEK_CUR) - current_pos ;
+
+	if (current_pos - 4 != length)
+		psf_log_printf (psf, "**** Bad chunk length %d sbould be %D\n", length, current_pos - 4) ;
+
+	return 0 ;
+} /* wav_subchunk_parse */
+
+static int
+wav_read_smpl_chunk (SF_PRIVATE *psf, unsigned int chunklen)
+{	unsigned int bytesread = 0, dword, sampler_data, loop_count ;
+	unsigned int note, start, end, type = -1, count ;
+	int j, k ;
+
+	chunklen += (chunklen & 1) ;
+
+	bytesread += psf_binheader_readf (psf, "4", &dword) ;
+	psf_log_printf (psf, "  Manufacturer : %X\n", dword) ;
+
+	bytesread += psf_binheader_readf (psf, "4", &dword) ;
+	psf_log_printf (psf, "  Product      : %u\n", dword) ;
+
+	bytesread += psf_binheader_readf (psf, "4", &dword) ;
+	psf_log_printf (psf, "  Period       : %u nsec\n", dword) ;
+
+	bytesread += psf_binheader_readf (psf, "4", &note) ;
+	psf_log_printf (psf, "  Midi Note    : %u\n", note) ;
+
+	bytesread += psf_binheader_readf (psf, "4", &dword) ;
+	if (dword != 0)
+	{	snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), "%f",
+				 (1.0 * 0x80000000) / ((unsigned int) dword)) ;
+		psf_log_printf (psf, "  Pitch Fract. : %s\n", psf->u.cbuf) ;
+		}
+	else
+		psf_log_printf (psf, "  Pitch Fract. : 0\n") ;
+
+	bytesread += psf_binheader_readf (psf, "4", &dword) ;
+	psf_log_printf (psf, "  SMPTE Format : %u\n", dword) ;
+
+	bytesread += psf_binheader_readf (psf, "4", &dword) ;
+	snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), "%02d:%02d:%02d %02d",
+		 (dword >> 24) & 0x7F, (dword >> 16) & 0x7F, (dword >> 8) & 0x7F, dword & 0x7F) ;
+	psf_log_printf (psf, "  SMPTE Offset : %s\n", psf->u.cbuf) ;
+
+	bytesread += psf_binheader_readf (psf, "4", &loop_count) ;
+	psf_log_printf (psf, "  Loop Count   : %u\n", loop_count) ;
+
+	/* Sampler Data holds the number of data bytes after the CUE chunks which
+	** is not actually CUE data. Display value after CUE data.
+	*/
+	bytesread += psf_binheader_readf (psf, "4", &sampler_data) ;
+
+	if ((psf->instrument = psf_instrument_alloc ()) == NULL)
+		return SFE_MALLOC_FAILED ;
+
+	psf->instrument->loop_count = loop_count ;
+
+	for (j = 0 ; loop_count > 0 && chunklen - bytesread >= 24 ; j ++)
+	{	bytesread += psf_binheader_readf (psf, "4", &dword) ;
+		psf_log_printf (psf, "    Cue ID : %2u", dword) ;
+
+		bytesread += psf_binheader_readf (psf, "4", &type) ;
+		psf_log_printf (psf, "  Type : %2u", type) ;
+
+		bytesread += psf_binheader_readf (psf, "4", &start) ;
+		psf_log_printf (psf, "  Start : %5u", start) ;
+
+		bytesread += psf_binheader_readf (psf, "4", &end) ;
+		psf_log_printf (psf, "  End : %5u", end) ;
+
+		bytesread += psf_binheader_readf (psf, "4", &dword) ;
+		psf_log_printf (psf, "  Fraction : %5u", dword) ;
+
+		bytesread += psf_binheader_readf (psf, "4", &count) ;
+		psf_log_printf (psf, "  Count : %5u\n", count) ;
+
+		if (j < ARRAY_LEN (psf->instrument->loops))
+		{	psf->instrument->loops [j].start = start ;
+			psf->instrument->loops [j].end = end + 1 ;
+			psf->instrument->loops [j].count = count ;
+
+			switch (type)
+			{	case 0 :
+					psf->instrument->loops [j].mode = SF_LOOP_FORWARD ;
+					break ;
+				case 1 :
+					psf->instrument->loops [j].mode = SF_LOOP_ALTERNATING ;
+					break ;
+				case 2 :
+					psf->instrument->loops [j].mode = SF_LOOP_BACKWARD ;
+					break ;
+				default:
+					psf->instrument->loops [j].mode = SF_LOOP_NONE ;
+					break ;
+				} ;
+			} ;
+
+		loop_count -- ;
+		} ;
+
+	if (chunklen - bytesread == 0)
+	{	if (sampler_data != 0)
+			psf_log_printf (psf, "  Sampler Data : %u (should be 0)\n", sampler_data) ;
+		else
+			psf_log_printf (psf, "  Sampler Data : %u\n", sampler_data) ;
+		}
+	else
+	{	if (sampler_data != chunklen - bytesread)
+		{	psf_log_printf (psf, "  Sampler Data : %u (should have been %u)\n", sampler_data, chunklen - bytesread) ;
+			sampler_data = chunklen - bytesread ;
+			}
+		else
+			psf_log_printf (psf, "  Sampler Data : %u\n", sampler_data) ;
+
+		psf_log_printf (psf, "      ") ;
+		for (k = 0 ; k < (int) sampler_data ; k++)
+		{	char ch ;
+
+			if (k > 0 && (k % 20) == 0)
+				psf_log_printf (psf, "\n      ") ;
+
+			bytesread += psf_binheader_readf (psf, "1", &ch) ;
+			psf_log_printf (psf, "%02X ", ch & 0xFF) ;
+			} ;
+
+		psf_log_printf (psf, "\n") ;
+		} ;
+
+	psf->instrument->basenote = note ;
+	psf->instrument->gain = 1 ;
+	psf->instrument->velocity_lo = psf->instrument->key_lo = 0 ;
+	psf->instrument->velocity_hi = psf->instrument->key_hi = 127 ;
+
+	return 0 ;
+} /* wav_read_smpl_chunk */
+
+/*
+** The acid chunk goes a little something like this:
+**
+** 4 bytes          'acid'
+** 4 bytes (int)     length of chunk starting at next byte
+**
+** 4 bytes (int)     type of file:
+**        this appears to be a bit mask,however some combinations
+**        are probably impossible and/or qualified as "errors"
+**
+**        0x01 On: One Shot         Off: Loop
+**        0x02 On: Root note is Set Off: No root
+**        0x04 On: Stretch is On,   Off: Strech is OFF
+**        0x08 On: Disk Based       Off: Ram based
+**        0x10 On: ??????????       Off: ????????? (Acidizer puts that ON)
+**
+** 2 bytes (short)      root note
+**        if type 0x10 is OFF : [C,C#,(...),B] -> [0x30 to 0x3B]
+**        if type 0x10 is ON  : [C,C#,(...),B] -> [0x3C to 0x47]
+**         (both types fit on same MIDI pitch albeit different octaves, so who cares)
+**
+** 2 bytes (short)      ??? always set to 0x8000
+** 4 bytes (float)      ??? seems to be always 0
+** 4 bytes (int)        number of beats
+** 2 bytes (short)      meter denominator   //always 4 in SF/ACID
+** 2 bytes (short)      meter numerator     //always 4 in SF/ACID
+**                      //are we sure about the order?? usually its num/denom
+** 4 bytes (float)      tempo
+**
+*/
+
+static int
+wav_read_acid_chunk (SF_PRIVATE *psf, unsigned int chunklen)
+{	unsigned int bytesread = 0 ;
+	int	beats, flags ;
+	short rootnote, q1, meter_denom, meter_numer ;
+	float q2, tempo ;
+
+	chunklen += (chunklen & 1) ;
+
+	bytesread += psf_binheader_readf (psf, "422f", &flags, &rootnote, &q1, &q2) ;
+
+	snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), "%f", q2) ;
+
+	psf_log_printf (psf, "  Flags     : 0x%04x (%s,%s,%s,%s,%s)\n", flags,
+			(flags & 0x01) ? "OneShot" : "Loop",
+			(flags & 0x02) ? "RootNoteValid" : "RootNoteInvalid",
+			(flags & 0x04) ? "StretchOn" : "StretchOff",
+			(flags & 0x08) ? "DiskBased" : "RAMBased",
+			(flags & 0x10) ? "??On" : "??Off") ;
+
+	psf_log_printf (psf, "  Root note : 0x%x\n  ????      : 0x%04x\n  ????      : %s\n",
+				rootnote, q1, psf->u.cbuf) ;
+
+	bytesread += psf_binheader_readf (psf, "422f", &beats, &meter_denom, &meter_numer, &tempo) ;
+	snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), "%f", tempo) ;
+	psf_log_printf (psf, "  Beats     : %d\n  Meter     : %d/%d\n  Tempo     : %s\n",
+				beats, meter_numer, meter_denom, psf->u.cbuf) ;
+
+	psf_binheader_readf (psf, "j", chunklen - bytesread) ;
+
+	if ((psf->loop_info = calloc (1, sizeof (SF_LOOP_INFO))) == NULL)
+		return SFE_MALLOC_FAILED ;
+
+	psf->loop_info->time_sig_num	= meter_numer ;
+	psf->loop_info->time_sig_den	= meter_denom ;
+	psf->loop_info->loop_mode		= (flags & 0x01) ? SF_LOOP_NONE : SF_LOOP_FORWARD ;
+	psf->loop_info->num_beats		= beats ;
+	psf->loop_info->bpm				= tempo ;
+	psf->loop_info->root_key		= (flags & 0x02) ? rootnote : -1 ;
+
+	return 0 ;
+} /* wav_read_acid_chunk */
+
+int
+wav_read_bext_chunk (SF_PRIVATE *psf, unsigned int chunksize)
+{
+	SF_BROADCAST_INFO_16K * b ;
+	unsigned int bytes = 0 ;
+
+	if (chunksize < WAV_BEXT_MIN_CHUNK_SIZE)
+	{	psf_log_printf (psf, "bext : %u (should be >= %d)\n", chunksize, WAV_BEXT_MIN_CHUNK_SIZE) ;
+		psf_binheader_readf (psf, "j", chunksize) ;
+		return 0 ;
+		} ;
+
+	if (chunksize > WAV_BEXT_MAX_CHUNK_SIZE)
+	{	psf_log_printf (psf, "bext : %u (should be < %d)\n", chunksize, WAV_BEXT_MAX_CHUNK_SIZE) ;
+		psf_binheader_readf (psf, "j", chunksize) ;
+		return 0 ;
+		} ;
+
+	if (chunksize >= sizeof (SF_BROADCAST_INFO_16K))
+	{	psf_log_printf (psf, "bext : %u too big to be handled\n", chunksize) ;
+		psf_binheader_readf (psf, "j", chunksize) ;
+		return 0 ;
+		} ;
+
+	psf_log_printf (psf, "bext : %u\n", chunksize) ;
+
+	if ((psf->broadcast_16k = broadcast_var_alloc ()) == NULL)
+	{	psf->error = SFE_MALLOC_FAILED ;
+		return psf->error ;
+		} ;
+
+	b = psf->broadcast_16k ;
+
+	bytes += psf_binheader_readf (psf, "b", b->description, sizeof (b->description)) ;
+	bytes += psf_binheader_readf (psf, "b", b->originator, sizeof (b->originator)) ;
+	bytes += psf_binheader_readf (psf, "b", b->originator_reference, sizeof (b->originator_reference)) ;
+	bytes += psf_binheader_readf (psf, "b", b->origination_date, sizeof (b->origination_date)) ;
+	bytes += psf_binheader_readf (psf, "b", b->origination_time, sizeof (b->origination_time)) ;
+	bytes += psf_binheader_readf (psf, "442", &b->time_reference_low, &b->time_reference_high, &b->version) ;
+	bytes += psf_binheader_readf (psf, "bj", &b->umid, sizeof (b->umid), 190) ;
+
+	if (chunksize > WAV_BEXT_MIN_CHUNK_SIZE)
+	{	/* File has coding history data. */
+
+		b->coding_history_size = chunksize - WAV_BEXT_MIN_CHUNK_SIZE ;
+
+		/* We do not parse the coding history */
+		bytes += psf_binheader_readf (psf, "b", b->coding_history, b->coding_history_size) ;
+		} ;
+
+	if (bytes < chunksize)
+		psf_binheader_readf (psf, "j", chunksize - bytes) ;
+
+	return 0 ;
+} /* wav_read_bext_chunk */
+
+int
+wav_write_bext_chunk (SF_PRIVATE *psf)
+{	SF_BROADCAST_INFO_16K *b ;
+
+	if (psf->broadcast_16k == NULL)
+		return -1 ;
+
+	b = psf->broadcast_16k ;
+
+	psf_binheader_writef (psf, "m4", bext_MARKER, WAV_BEXT_MIN_CHUNK_SIZE + b->coding_history_size) ;
+
+	/*
+	**	Note that it is very important the the field widths of the SF_BROADCAST_INFO
+	**	struct match those for the bext chunk fields.
+	*/
+
+	psf_binheader_writef (psf, "b", b->description, sizeof (b->description)) ;
+	psf_binheader_writef (psf, "b", b->originator, sizeof (b->originator)) ;
+	psf_binheader_writef (psf, "b", b->originator_reference, sizeof (b->originator_reference)) ;
+	psf_binheader_writef (psf, "b", b->origination_date, sizeof (b->origination_date)) ;
+	psf_binheader_writef (psf, "b", b->origination_time, sizeof (b->origination_time)) ;
+	psf_binheader_writef (psf, "442", b->time_reference_low, b->time_reference_high, b->version) ;
+	psf_binheader_writef (psf, "b", b->umid, sizeof (b->umid)) ;
+	psf_binheader_writef (psf, "z", make_size_t (190)) ;
+
+	if (b->coding_history_size > 0)
+		psf_binheader_writef (psf, "b", b->coding_history, make_size_t (b->coding_history_size)) ;
+
+	return 0 ;
+} /* wav_write_bext_chunk */
+
+static int
+exif_fill_and_sink (SF_PRIVATE *psf, char* buf, size_t bufsz, size_t toread)
+{
+	size_t bytesread = 0 ;
+
+	buf [0] = 0 ;
+	bufsz -= 1 ;
+	if (toread < bufsz)
+		bufsz = toread ;
+	bytesread = psf_binheader_readf (psf, "b", buf, bufsz) ;
+	buf [bufsz] = 0 ;
+
+	if (bytesread == bufsz && toread > bufsz)
+		bytesread += psf_binheader_readf (psf, "j", toread - bufsz) ;
+
+	return bytesread ;
+} /* exif_fill_and_sink */
+
+/*
+** Exif specification for audio files, at JEITA CP-3451 Exif 2.2 section 5
+** (Exif Audio File Specification) http://www.exif.org/Exif2-2.PDF
+*/
+static int
+exif_subchunk_parse (SF_PRIVATE *psf, unsigned int length)
+{	unsigned marker, dword, vmajor = -1, vminor = -1, bytesread = 0 ;
+	char buf [4096] ;
+
+	while (bytesread < length)
+	{
+		bytesread += psf_binheader_readf (psf, "m", &marker) ;
+
+		switch (marker)
+		{
+			case 0 : /* camera padding? */
+				break ;
+
+			case ever_MARKER :
+				bytesread += psf_binheader_readf (psf, "j4", 4, &dword) ;
+				vmajor = 10 * (((dword >> 24) & 0xff) - '0') + (((dword >> 16) & 0xff) - '0') ;
+				vminor = 10 * (((dword >> 8) & 0xff) - '0') + ((dword & 0xff) - '0') ;
+				psf_log_printf (psf, "    EXIF Version : %u.%02u\n", vmajor, vminor) ;
+				break ;
+
+			case emnt_MARKER : /* design information: null-terminated string */
+			case emdl_MARKER : /* model name ; null-terminated string */
+			case ecor_MARKER : /* manufacturer: null-terminated string */
+			case etim_MARKER : /* creation time: null-terminated string in the format "hour:minute:second.subsecond" */
+			case erel_MARKER : /* relation info: null-terminated string (filename) */
+			case eucm_MARKER : /* user comment: 4-byte size follows, then possibly unicode data */
+				psf_binheader_readf (psf, "4", &dword) ;
+				bytesread += sizeof (dword) ;
+				dword += (dword & 1) ;
+
+				if (dword >= sizeof (buf))
+				{	psf_log_printf (psf, "*** Marker '%M' is too big %u\n\n", marker, dword) ;
+					return bytesread ;
+					} ;
+
+				bytesread += exif_fill_and_sink (psf, buf, sizeof (buf), dword) ;
+
+				/* BAD - don't know what's going on here -- maybe a bug in the camera */
+				/* field should be NULL-terminated but there's no room for it with the reported number */
+				/*  example output:     emdl : 8 (EX-Z1050) */
+				if (marker == emdl_MARKER && dword == strlen (buf) /* should be >= strlen+1*/)
+				{	psf_log_printf (psf, "    *** field size too small for string (sinking 2 bytes)\n") ;
+					bytesread += psf_binheader_readf (psf, "j", 2) ;
+					} ;
+
+				psf_log_printf (psf, "    %M : %d (%s)\n", marker, dword, buf) ;
+				if (dword > length)
+					return bytesread ;
+				break ;
+
+			default :
+				psf_log_printf (psf, "    *** %M (%d): -- ignored --\n", marker, marker) ;
+				break ;
+			} ;
+		} ;
+
+	return bytesread ;
+} /* exif_subchunk_parse */
+
diff --git a/jni/libsndfile-1.0.25/src/wav.lo b/jni/libsndfile-1.0.25/src/wav.lo
new file mode 100644
index 0000000..aafc7e9
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/wav.lo
@@ -0,0 +1,12 @@
+# wav.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/wav.o'
+
+# Name of the non-PIC object
+non_pic_object='wav.o'
+
diff --git a/jni/libsndfile-1.0.25/src/wav.o b/jni/libsndfile-1.0.25/src/wav.o
new file mode 100644
index 0000000..aebc48a
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/wav.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/wav_w64.c b/jni/libsndfile-1.0.25/src/wav_w64.c
new file mode 100644
index 0000000..ba6bd99
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/wav_w64.c
@@ -0,0 +1,677 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2004-2005 David Viens <davidv@plogue.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<string.h>
+#include	<ctype.h>
+#include	<time.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+#include	"wav_w64.h"
+
+/*  Known WAVEFORMATEXTENSIBLE GUIDS.  */
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_PCM =
+{	0x00000001, 0x0000, 0x0010, {	0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+} ;
+
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_MS_ADPCM =
+{	0x00000002, 0x0000, 0x0010, {	0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+} ;
+
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_IEEE_FLOAT =
+{	0x00000003, 0x0000, 0x0010, {	0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+} ;
+
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_ALAW =
+{	0x00000006, 0x0000, 0x0010, {	0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+} ;
+
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_MULAW =
+{	0x00000007, 0x0000, 0x0010, {	0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+} ;
+
+/*
+** the next two are from
+** http://dream.cs.bath.ac.uk/researchdev/wave-ex/bformat.html
+*/
+
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_PCM =
+{	0x00000001, 0x0721, 0x11d3, {	0x86, 0x44, 0xc8, 0xc1, 0xca, 0x00, 0x00, 0x00 }
+} ;
+
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT =
+{	0x00000003, 0x0721, 0x11d3, {	0x86, 0x44, 0xc8, 0xc1, 0xca, 0x00, 0x00, 0x00 }
+} ;
+
+
+#if 0
+/* maybe interesting one day to read the following through sf_read_raw */
+/* http://www.bath.ac.uk/~masrwd/pvocex/pvocex.html */
+static const EXT_SUBFORMAT MSGUID_SUBTYPE_PVOCEX =
+{	0x8312b9c2, 0x2e6e, 0x11d4, {	0xa8, 0x24, 0xde, 0x5b, 0x96, 0xc3, 0xab, 0x21 }
+} ;
+#endif
+
+/* This stores which bit in dwChannelMask maps to which channel */
+static const struct chanmap_s
+{	int id ;
+	const char * name ;
+} channel_mask_bits [] =
+{	/* WAVEFORMATEXTENSIBLE doesn't distuingish FRONT_LEFT from LEFT */
+	{	SF_CHANNEL_MAP_LEFT, "L" },
+	{	SF_CHANNEL_MAP_RIGHT, "R" },
+	{	SF_CHANNEL_MAP_CENTER, "C" },
+	{	SF_CHANNEL_MAP_LFE, "LFE" },
+	{	SF_CHANNEL_MAP_REAR_LEFT, "Ls" },
+	{	SF_CHANNEL_MAP_REAR_RIGHT, "Rs" },
+	{	SF_CHANNEL_MAP_FRONT_LEFT_OF_CENTER, "Lc" },
+	{	SF_CHANNEL_MAP_FRONT_RIGHT_OF_CENTER, "Rc" },
+	{	SF_CHANNEL_MAP_REAR_CENTER, "Cs" },
+	{	SF_CHANNEL_MAP_SIDE_LEFT, "Sl" },
+	{	SF_CHANNEL_MAP_SIDE_RIGHT, "Sr" },
+	{	SF_CHANNEL_MAP_TOP_CENTER, "Tc" },
+	{	SF_CHANNEL_MAP_TOP_FRONT_LEFT, "Tfl" },
+	{	SF_CHANNEL_MAP_TOP_FRONT_CENTER, "Tfc" },
+	{	SF_CHANNEL_MAP_TOP_FRONT_RIGHT, "Tfr" },
+	{	SF_CHANNEL_MAP_TOP_REAR_LEFT, "Trl" },
+	{	SF_CHANNEL_MAP_TOP_REAR_CENTER, "Trc" },
+	{	SF_CHANNEL_MAP_TOP_REAR_RIGHT, "Trr" },
+} ;
+
+/*------------------------------------------------------------------------------
+ * Private static functions.
+ */
+
+static int
+wavex_guid_equal (const EXT_SUBFORMAT * first, const EXT_SUBFORMAT * second)
+{	return !memcmp (first, second, sizeof (EXT_SUBFORMAT)) ;
+} /* wavex_guid_equal */
+
+
+
+int
+wav_w64_read_fmt_chunk (SF_PRIVATE *psf, int fmtsize)
+{	WAV_PRIVATE * wpriv ;
+	WAV_FMT *wav_fmt ;
+	int	bytesread, k, bytespersec = 0 ;
+
+	if ((wpriv = psf->container_data) == NULL)
+		return SFE_INTERNAL ;
+	wav_fmt = &wpriv->wav_fmt ;
+
+	memset (wav_fmt, 0, sizeof (WAV_FMT)) ;
+
+	if (fmtsize < 16)
+		return SFE_WAV_FMT_SHORT ;
+
+	/* assume psf->rwf_endian is already properly set */
+
+	/* Read the minimal WAV file header here. */
+	bytesread = psf_binheader_readf (psf, "224422",
+					&(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_w64_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) ;
+
+	if (wav_fmt->format == WAVE_FORMAT_PCM && wav_fmt->min.blockalign == 0
+		&& wav_fmt->min.bitwidth > 0 && wav_fmt->min.channels > 0)
+	{	wav_fmt->min.blockalign = wav_fmt->min.bitwidth / 8 + (wav_fmt->min.bitwidth % 8 > 0 ? 1 : 0) ;
+		wav_fmt->min.blockalign *= wav_fmt->min.channels ;
+		psf_log_printf (psf, "  Block Align   : 0 (should be %d)\n", wav_fmt->min.blockalign) ;
+		}
+	else
+		psf_log_printf (psf, "  Block Align   : %d\n", wav_fmt->min.blockalign) ;
+
+	if (wav_fmt->format == WAVE_FORMAT_PCM && wav_fmt->min.bitwidth == 24 &&
+			wav_fmt->min.blockalign == 4 * wav_fmt->min.channels)
+	{	psf_log_printf (psf, "  Bit Width     : 24\n") ;
+
+		psf_log_printf (psf, "\n"
+			"  Ambiguous information in 'fmt ' chunk. Possibile file types:\n"
+			"    0) Invalid IEEE float file generated by Syntrillium's Cooledit!\n"
+			"    1) File generated by ALSA's arecord containing 24 bit samples in 32 bit containers.\n"
+			"    2) 24 bit file with incorrect Block Align value.\n"
+			"\n") ;
+
+		wpriv->fmt_is_broken = 1 ;
+		}
+	else if (wav_fmt->min.bitwidth == 0)
+	{	switch (wav_fmt->format)
+		{	case WAVE_FORMAT_GSM610 :
+			case WAVE_FORMAT_IPP_ITU_G_723_1 :
+					psf_log_printf (psf, "  Bit Width     : %d\n", wav_fmt->min.bitwidth) ;
+					break ;
+			default :
+					psf_log_printf (psf, "  Bit Width     : %d (should not be 0)\n", wav_fmt->min.bitwidth) ;
+			}
+		}
+	else
+	{	switch (wav_fmt->format)
+		{	case WAVE_FORMAT_GSM610 :
+			case WAVE_FORMAT_IPP_ITU_G_723_1 :
+		psf_log_printf (psf, "  Bit Width     : %d (should be 0)\n", wav_fmt->min.bitwidth) ;
+					break ;
+			default :
+					psf_log_printf (psf, "  Bit Width     : %d\n", wav_fmt->min.bitwidth) ;
+			}
+		} ;
+
+	psf->sf.samplerate	= wav_fmt->min.samplerate ;
+	psf->sf.frames 		= 0 ;					/* Correct this when reading data chunk. */
+	psf->sf.channels	= wav_fmt->min.channels ;
+
+	switch (wav_fmt->format)
+	{	case WAVE_FORMAT_PCM :
+		case WAVE_FORMAT_IEEE_FLOAT :
+				bytespersec = wav_fmt->min.samplerate * wav_fmt->min.blockalign ;
+				if (wav_fmt->min.bytespersec != (unsigned) bytespersec)
+					psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)\n", wav_fmt->min.bytespersec, bytespersec) ;
+				else
+					psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->min.bytespersec) ;
+
+				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_log_printf (psf, "  Bytes/sec     : %d (should be %d)\n", wav_fmt->min.bytespersec, wav_fmt->min.samplerate * wav_fmt->min.blockalign) ;
+				else
+					psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->min.bytespersec) ;
+
+				psf->bytewidth = 1 ;
+				if (fmtsize >= 18)
+				{	bytesread += psf_binheader_readf (psf, "2", &(wav_fmt->size20.extrabytes)) ;
+					psf_log_printf (psf, "  Extra Bytes   : %d\n", wav_fmt->size20.extrabytes) ;
+					} ;
+				break ;
+
+		case WAVE_FORMAT_IMA_ADPCM :
+				if (wav_fmt->min.bitwidth != 4)
+					return SFE_WAV_ADPCM_NOT4BIT ;
+				if (wav_fmt->min.channels < 1 || wav_fmt->min.channels > 2)
+					return SFE_WAV_ADPCM_CHANNELS ;
+
+				bytesread +=
+				psf_binheader_readf (psf, "22", &(wav_fmt->ima.extrabytes), &(wav_fmt->ima.samplesperblock)) ;
+
+				bytespersec = (wav_fmt->ima.samplerate * wav_fmt->ima.blockalign) / wav_fmt->ima.samplesperblock ;
+				if (wav_fmt->ima.bytespersec != (unsigned) bytespersec)
+					psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)\n", wav_fmt->ima.bytespersec, bytespersec) ;
+				else
+					psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->ima.bytespersec) ;
+
+				psf->bytewidth = 2 ;
+				psf_log_printf (psf, "  Extra Bytes   : %d\n", wav_fmt->ima.extrabytes) ;
+				psf_log_printf (psf, "  Samples/Block : %d\n", wav_fmt->ima.samplesperblock) ;
+				break ;
+
+		case WAVE_FORMAT_MS_ADPCM :
+				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 ;
+
+				bytesread +=
+				psf_binheader_readf (psf, "222", &(wav_fmt->msadpcm.extrabytes),
+						&(wav_fmt->msadpcm.samplesperblock), &(wav_fmt->msadpcm.numcoeffs)) ;
+
+				bytespersec = (wav_fmt->min.samplerate * wav_fmt->min.blockalign) / wav_fmt->msadpcm.samplesperblock ;
+				if (wav_fmt->min.bytespersec == (unsigned) bytespersec)
+					psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->min.bytespersec) ;
+				else if (wav_fmt->min.bytespersec == (wav_fmt->min.samplerate / wav_fmt->msadpcm.samplesperblock) * wav_fmt->min.blockalign)
+					psf_log_printf (psf, "  Bytes/sec     : %d (should be %d (MS BUG!))\n", wav_fmt->min.bytespersec, bytespersec) ;
+				else
+					psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)\n", wav_fmt->min.bytespersec, bytespersec) ;
+
+				psf->bytewidth = 2 ;
+				psf_log_printf (psf, "  Extra Bytes   : %d\n", wav_fmt->msadpcm.extrabytes) ;
+				psf_log_printf (psf, "  Samples/Block : %d\n", wav_fmt->msadpcm.samplesperblock) ;
+				if (wav_fmt->msadpcm.numcoeffs > ARRAY_LEN (wav_fmt->msadpcm.coeffs))
+				{	psf_log_printf (psf, "  No. of Coeffs : %d (should be <= %d)\n", wav_fmt->msadpcm.numcoeffs, ARRAY_LEN (wav_fmt->msadpcm.coeffs)) ;
+					wav_fmt->msadpcm.numcoeffs = ARRAY_LEN (wav_fmt->msadpcm.coeffs) ;
+					}
+				else
+					psf_log_printf (psf, "  No. of Coeffs : %d\n", wav_fmt->msadpcm.numcoeffs) ;
+
+				psf_log_printf (psf, "    Index   Coeffs1   Coeffs2\n") ;
+				for (k = 0 ; k < wav_fmt->msadpcm.numcoeffs ; k++)
+				{	bytesread +=
+					psf_binheader_readf (psf, "22", &(wav_fmt->msadpcm.coeffs [k].coeff1), &(wav_fmt->msadpcm.coeffs [k].coeff2)) ;
+					snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), "     %2d     %7d   %7d\n", k, wav_fmt->msadpcm.coeffs [k].coeff1, wav_fmt->msadpcm.coeffs [k].coeff2) ;
+					psf_log_printf (psf, psf->u.cbuf) ;
+					} ;
+				break ;
+
+		case WAVE_FORMAT_GSM610 :
+				if (wav_fmt->gsm610.channels != 1 || wav_fmt->gsm610.blockalign != 65)
+					return SFE_WAV_GSM610_FORMAT ;
+
+				bytesread +=
+				psf_binheader_readf (psf, "22", &(wav_fmt->gsm610.extrabytes), &(wav_fmt->gsm610.samplesperblock)) ;
+
+				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 != (unsigned) bytespersec)
+					psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)\n", wav_fmt->gsm610.bytespersec, bytespersec) ;
+				else
+					psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->gsm610.bytespersec) ;
+
+				psf->bytewidth = 2 ;
+				psf_log_printf (psf, "  Extra Bytes   : %d\n", wav_fmt->gsm610.extrabytes) ;
+				psf_log_printf (psf, "  Samples/Block : %d\n", wav_fmt->gsm610.samplesperblock) ;
+				break ;
+
+		case WAVE_FORMAT_EXTENSIBLE :
+				if (wav_fmt->ext.bytespersec / wav_fmt->ext.blockalign != wav_fmt->ext.samplerate)
+					psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)\n", wav_fmt->ext.bytespersec, wav_fmt->ext.samplerate * wav_fmt->ext.blockalign) ;
+				else
+					psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->ext.bytespersec) ;
+
+				bytesread +=
+				psf_binheader_readf (psf, "224", &(wav_fmt->ext.extrabytes), &(wav_fmt->ext.validbits),
+						&(wav_fmt->ext.channelmask)) ;
+
+				psf_log_printf (psf, "  Valid Bits    : %d\n", wav_fmt->ext.validbits) ;
+
+				if (wav_fmt->ext.channelmask == 0)
+					psf_log_printf (psf, "  Channel Mask  : 0x0 (should not be zero)\n") ;
+				else
+				{	unsigned bit ;
+
+					wpriv->wavex_channelmask = wav_fmt->ext.channelmask ;
+
+					/* It's probably wise to ignore the channel mask if it is all zero */
+					free (psf->channel_map) ;
+
+					if ((psf->channel_map = calloc (psf->sf.channels, sizeof (psf->channel_map [0]))) == NULL)
+						return SFE_MALLOC_FAILED ;
+
+					/* Terminate the buffer we're going to append_snprintf into. */
+					psf->u.cbuf [0] = 0 ;
+
+					for (bit = k = 0 ; bit < ARRAY_LEN (channel_mask_bits) ; bit++)
+					{
+						if (wav_fmt->ext.channelmask & (1 << bit))
+						{	if (k > psf->sf.channels)
+							{	psf_log_printf (psf, "*** More channel map bits than there are channels.\n") ;
+								break ;
+								} ;
+
+							psf->channel_map [k++] = channel_mask_bits [bit].id ;
+							append_snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), "%s, ", channel_mask_bits [bit].name) ;
+							} ;
+						} ;
+
+					/* Remove trailing ", ". */
+					bit = strlen (psf->u.cbuf) ;
+					psf->u.cbuf [--bit] = 0 ;
+					psf->u.cbuf [--bit] = 0 ;
+
+					if (k != psf->sf.channels)
+					{	psf_log_printf (psf, "  Channel Mask  : 0x%X\n", wav_fmt->ext.channelmask) ;
+						psf_log_printf (psf, "*** Less channel map bits than there are channels.\n") ;
+						}
+					else
+						psf_log_printf (psf, "  Channel Mask  : 0x%X (%s)\n", wav_fmt->ext.channelmask, psf->u.cbuf) ;
+					} ;
+
+				bytesread += psf_binheader_readf (psf, "422", &(wav_fmt->ext.esf.esf_field1), &(wav_fmt->ext.esf.esf_field2), &(wav_fmt->ext.esf.esf_field3)) ;
+
+				/* compare the esf_fields with each known GUID? and print? */
+				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++)
+				{	bytesread += psf_binheader_readf (psf, "1", &(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->bytewidth = BITWIDTH2BYTES (wav_fmt->ext.bitwidth) ;
+
+				/* Compare GUIDs for known ones. */
+				if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_PCM))
+				{	psf->sf.format = SF_FORMAT_WAVEX | u_bitwidth_to_subformat (psf->bytewidth * 8) ;
+					psf_log_printf (psf, "    format : pcm\n") ;
+					}
+				else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_MS_ADPCM))
+				{	psf->sf.format = (SF_FORMAT_WAVEX | SF_FORMAT_MS_ADPCM) ;
+					psf_log_printf (psf, "    format : ms adpcm\n") ;
+					}
+				else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_IEEE_FLOAT))
+				{	psf->sf.format = SF_FORMAT_WAVEX | ((psf->bytewidth == 8) ? SF_FORMAT_DOUBLE : SF_FORMAT_FLOAT) ;
+					psf_log_printf (psf, "    format : IEEE float\n") ;
+					}
+				else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_ALAW))
+				{	psf->sf.format = (SF_FORMAT_WAVEX | SF_FORMAT_ALAW) ;
+					psf_log_printf (psf, "    format : A-law\n") ;
+					}
+				else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_MULAW))
+				{	psf->sf.format = (SF_FORMAT_WAVEX | SF_FORMAT_ULAW) ;
+					psf_log_printf (psf, "    format : u-law\n") ;
+					}
+				else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_PCM))
+				{	psf->sf.format = SF_FORMAT_WAVEX | u_bitwidth_to_subformat (psf->bytewidth * 8) ;
+					psf_log_printf (psf, "    format : pcm (Ambisonic B)\n") ;
+					wpriv->wavex_ambisonic = SF_AMBISONIC_B_FORMAT ;
+					}
+				else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT))
+				{	psf->sf.format = SF_FORMAT_WAVEX | ((psf->bytewidth == 8) ? SF_FORMAT_DOUBLE : SF_FORMAT_FLOAT) ;
+					psf_log_printf (psf, "    format : IEEE float (Ambisonic B)\n") ;
+					wpriv->wavex_ambisonic = SF_AMBISONIC_B_FORMAT ;
+					}
+				else
+					return SFE_UNIMPLEMENTED ;
+
+				break ;
+
+		case WAVE_FORMAT_G721_ADPCM :
+				psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->g72x.bytespersec) ;
+				if (fmtsize >= 20)
+				{	bytesread += psf_binheader_readf (psf, "22", &(wav_fmt->g72x.extrabytes), &(wav_fmt->g72x.auxblocksize)) ;
+					if (wav_fmt->g72x.extrabytes == 0)
+						psf_log_printf (psf, "  Extra Bytes   : %d (should be 2)\n", wav_fmt->g72x.extrabytes) ;
+					else
+						psf_log_printf (psf, "  Extra Bytes   : %d\n", wav_fmt->g72x.extrabytes) ;
+						psf_log_printf (psf, "  Aux Blk Size  : %d\n", wav_fmt->g72x.auxblocksize) ;
+					}
+				else if (fmtsize == 18)
+				{	bytesread += psf_binheader_readf (psf, "2", &(wav_fmt->g72x.extrabytes)) ;
+					psf_log_printf (psf, "  Extra Bytes   : %d%s\n", wav_fmt->g72x.extrabytes, wav_fmt->g72x.extrabytes != 0 ? " (should be 0)" : "") ;
+					}
+				else
+					psf_log_printf (psf, "*** 'fmt ' chunk should be bigger than this!\n") ;
+				break ;
+
+		default :
+				psf_log_printf (psf, "*** No 'fmt ' chunk dumper for this format!\n") ;
+				return SFE_WAV_BAD_FMT ;
+		} ;
+
+	if (bytesread > fmtsize)
+	{	psf_log_printf (psf, "*** wav_w64_read_fmt_chunk (bytesread > fmtsize)\n") ;
+		return SFE_WAV_BAD_FMT ;
+		}
+	else
+		psf_binheader_readf (psf, "j", fmtsize - bytesread) ;
+
+	psf->blockwidth = wav_fmt->min.channels * psf->bytewidth ;
+
+	return 0 ;
+} /* wav_w64_read_fmt_chunk */
+
+void
+wavex_write_guid (SF_PRIVATE *psf, const EXT_SUBFORMAT * subformat)
+{
+	psf_binheader_writef (psf, "422b", subformat->esf_field1,
+					subformat->esf_field2, subformat->esf_field3,
+					subformat->esf_field4, make_size_t (8)) ;
+} /* wavex_write_guid */
+
+
+int
+wavex_gen_channel_mask (const int *chan_map, int channels)
+{	int chan, mask = 0, bit = -1, last_bit = -1 ;
+
+	if (chan_map == NULL)
+		return 0 ;
+
+	for (chan = 0 ; chan < channels ; chan ++)
+	{	int k ;
+
+		for (k = bit + 1 ; k < ARRAY_LEN (channel_mask_bits) ; k++)
+			if (chan_map [chan] == channel_mask_bits [k].id)
+			{	bit = k ;
+				break ;
+				} ;
+
+		/* Check for bad sequence. */
+		if (bit <= last_bit)
+			return 0 ;
+
+		mask += 1 << bit ;
+		last_bit = bit ;
+		} ;
+
+	return mask ;
+} /* wavex_gen_channel_mask */
+
+void
+wav_w64_analyze (SF_PRIVATE *psf)
+{	AUDIO_DETECT ad ;
+	int format = 0 ;
+
+	if (psf->is_pipe)
+	{	psf_log_printf (psf, "*** Error : Reading from a pipe. Can't analyze data section to figure out real data format.\n\n") ;
+		return ;
+		} ;
+
+	psf_log_printf (psf, "---------------------------------------------------\n"
+						"Format is known to be broken. Using detection code.\n") ;
+
+	/* Code goes here. */
+	ad.endianness = SF_ENDIAN_LITTLE ;
+	ad.channels = psf->sf.channels ;
+
+	psf_fseek (psf, 3 * 4 * 50, SEEK_SET) ;
+
+	while (psf_fread (psf->u.ucbuf, 1, 4096, psf) == 4096)
+	{	format = audio_detect (psf, &ad, psf->u.ucbuf, 4096) ;
+		if (format != 0)
+			break ;
+		} ;
+
+	/* Seek to start of DATA section. */
+	psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+
+	if (format == 0)
+	{	psf_log_printf (psf, "wav_w64_analyze : detection failed.\n") ;
+		return ;
+		} ;
+
+	switch (format)
+	{	case SF_FORMAT_PCM_32 :
+		case SF_FORMAT_FLOAT :
+			psf_log_printf (psf, "wav_w64_analyze : found format : 0x%X\n", format) ;
+			psf->sf.format = (psf->sf.format & ~SF_FORMAT_SUBMASK) + format ;
+			psf->bytewidth = 4 ;
+			psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+			break ;
+
+		case SF_FORMAT_PCM_24 :
+			psf_log_printf (psf, "wav_w64_analyze : found format : 0x%X\n", format) ;
+			psf->sf.format = (psf->sf.format & ~SF_FORMAT_SUBMASK) + format ;
+			psf->bytewidth = 3 ;
+			psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+			break ;
+
+		default :
+			psf_log_printf (psf, "wav_w64_analyze : unhandled format : 0x%X\n", format) ;
+			break ;
+		} ;
+
+	return ;
+} /* wav_w64_analyze */
+
+/*==============================================================================
+*/
+
+typedef struct
+{	int			ID ;
+	const char	*name ;
+} WAV_FORMAT_DESC ;
+
+#define STR(x)			#x
+#define FORMAT_TYPE(x)	{ x, STR (x) }
+
+static WAV_FORMAT_DESC wave_descs [] =
+{	FORMAT_TYPE	(WAVE_FORMAT_PCM),
+	FORMAT_TYPE (WAVE_FORMAT_MS_ADPCM),
+	FORMAT_TYPE (WAVE_FORMAT_IEEE_FLOAT),
+	FORMAT_TYPE (WAVE_FORMAT_VSELP),
+	FORMAT_TYPE (WAVE_FORMAT_IBM_CVSD),
+	FORMAT_TYPE (WAVE_FORMAT_ALAW),
+	FORMAT_TYPE (WAVE_FORMAT_MULAW),
+	FORMAT_TYPE (WAVE_FORMAT_OKI_ADPCM),
+	FORMAT_TYPE (WAVE_FORMAT_IMA_ADPCM),
+	FORMAT_TYPE (WAVE_FORMAT_MEDIASPACE_ADPCM),
+	FORMAT_TYPE (WAVE_FORMAT_SIERRA_ADPCM),
+	FORMAT_TYPE (WAVE_FORMAT_G723_ADPCM),
+	FORMAT_TYPE (WAVE_FORMAT_DIGISTD),
+	FORMAT_TYPE (WAVE_FORMAT_DIGIFIX),
+	FORMAT_TYPE (WAVE_FORMAT_DIALOGIC_OKI_ADPCM),
+	FORMAT_TYPE (WAVE_FORMAT_MEDIAVISION_ADPCM),
+	FORMAT_TYPE (WAVE_FORMAT_CU_CODEC),
+	FORMAT_TYPE (WAVE_FORMAT_YAMAHA_ADPCM),
+	FORMAT_TYPE (WAVE_FORMAT_SONARC),
+	FORMAT_TYPE (WAVE_FORMAT_DSPGROUP_TRUESPEECH),
+	FORMAT_TYPE (WAVE_FORMAT_ECHOSC1),
+	FORMAT_TYPE (WAVE_FORMAT_AUDIOFILE_AF36),
+	FORMAT_TYPE (WAVE_FORMAT_APTX),
+	FORMAT_TYPE (WAVE_FORMAT_AUDIOFILE_AF10),
+	FORMAT_TYPE (WAVE_FORMAT_PROSODY_1612),
+	FORMAT_TYPE (WAVE_FORMAT_LRC),
+	FORMAT_TYPE (WAVE_FORMAT_DOLBY_AC2),
+	FORMAT_TYPE (WAVE_FORMAT_GSM610),
+	FORMAT_TYPE (WAVE_FORMAT_MSNAUDIO),
+	FORMAT_TYPE (WAVE_FORMAT_ANTEX_ADPCME),
+	FORMAT_TYPE (WAVE_FORMAT_CONTROL_RES_VQLPC),
+	FORMAT_TYPE (WAVE_FORMAT_DIGIREAL),
+	FORMAT_TYPE (WAVE_FORMAT_DIGIADPCM),
+	FORMAT_TYPE (WAVE_FORMAT_CONTROL_RES_CR10),
+	FORMAT_TYPE (WAVE_FORMAT_NMS_VBXADPCM),
+	FORMAT_TYPE (WAVE_FORMAT_ROLAND_RDAC),
+	FORMAT_TYPE (WAVE_FORMAT_ECHOSC3),
+	FORMAT_TYPE (WAVE_FORMAT_ROCKWELL_ADPCM),
+	FORMAT_TYPE (WAVE_FORMAT_ROCKWELL_DIGITALK),
+	FORMAT_TYPE (WAVE_FORMAT_XEBEC),
+	FORMAT_TYPE (WAVE_FORMAT_G721_ADPCM),
+	FORMAT_TYPE (WAVE_FORMAT_G728_CELP),
+	FORMAT_TYPE (WAVE_FORMAT_MSG723),
+	FORMAT_TYPE (WAVE_FORMAT_MPEG),
+	FORMAT_TYPE (WAVE_FORMAT_RT24),
+	FORMAT_TYPE (WAVE_FORMAT_PAC),
+	FORMAT_TYPE (WAVE_FORMAT_MPEGLAYER3),
+	FORMAT_TYPE (WAVE_FORMAT_LUCENT_G723),
+	FORMAT_TYPE (WAVE_FORMAT_CIRRUS),
+	FORMAT_TYPE (WAVE_FORMAT_ESPCM),
+	FORMAT_TYPE (WAVE_FORMAT_VOXWARE),
+	FORMAT_TYPE (WAVE_FORMAT_CANOPUS_ATRAC),
+	FORMAT_TYPE (WAVE_FORMAT_G726_ADPCM),
+	FORMAT_TYPE (WAVE_FORMAT_G722_ADPCM),
+	FORMAT_TYPE (WAVE_FORMAT_DSAT),
+	FORMAT_TYPE (WAVE_FORMAT_DSAT_DISPLAY),
+	FORMAT_TYPE (WAVE_FORMAT_VOXWARE_BYTE_ALIGNED),
+	FORMAT_TYPE (WAVE_FORMAT_VOXWARE_AC8),
+	FORMAT_TYPE (WAVE_FORMAT_VOXWARE_AC10),
+	FORMAT_TYPE (WAVE_FORMAT_VOXWARE_AC16),
+	FORMAT_TYPE (WAVE_FORMAT_VOXWARE_AC20),
+	FORMAT_TYPE (WAVE_FORMAT_VOXWARE_RT24),
+	FORMAT_TYPE (WAVE_FORMAT_VOXWARE_RT29),
+	FORMAT_TYPE (WAVE_FORMAT_VOXWARE_RT29HW),
+	FORMAT_TYPE (WAVE_FORMAT_VOXWARE_VR12),
+	FORMAT_TYPE (WAVE_FORMAT_VOXWARE_VR18),
+	FORMAT_TYPE (WAVE_FORMAT_VOXWARE_TQ40),
+	FORMAT_TYPE (WAVE_FORMAT_SOFTSOUND),
+	FORMAT_TYPE (WAVE_FORMAT_VOXARE_TQ60),
+	FORMAT_TYPE (WAVE_FORMAT_MSRT24),
+	FORMAT_TYPE (WAVE_FORMAT_G729A),
+	FORMAT_TYPE (WAVE_FORMAT_MVI_MV12),
+	FORMAT_TYPE (WAVE_FORMAT_DF_G726),
+	FORMAT_TYPE (WAVE_FORMAT_DF_GSM610),
+	FORMAT_TYPE (WAVE_FORMAT_ONLIVE),
+	FORMAT_TYPE (WAVE_FORMAT_SBC24),
+	FORMAT_TYPE (WAVE_FORMAT_DOLBY_AC3_SPDIF),
+	FORMAT_TYPE (WAVE_FORMAT_ZYXEL_ADPCM),
+	FORMAT_TYPE (WAVE_FORMAT_PHILIPS_LPCBB),
+	FORMAT_TYPE (WAVE_FORMAT_PACKED),
+	FORMAT_TYPE (WAVE_FORMAT_RHETOREX_ADPCM),
+	FORMAT_TYPE (IBM_FORMAT_MULAW),
+	FORMAT_TYPE (IBM_FORMAT_ALAW),
+	FORMAT_TYPE (IBM_FORMAT_ADPCM),
+	FORMAT_TYPE (WAVE_FORMAT_VIVO_G723),
+	FORMAT_TYPE (WAVE_FORMAT_VIVO_SIREN),
+	FORMAT_TYPE (WAVE_FORMAT_DIGITAL_G723),
+	FORMAT_TYPE (WAVE_FORMAT_CREATIVE_ADPCM),
+	FORMAT_TYPE (WAVE_FORMAT_CREATIVE_FASTSPEECH8),
+	FORMAT_TYPE (WAVE_FORMAT_CREATIVE_FASTSPEECH10),
+	FORMAT_TYPE (WAVE_FORMAT_QUARTERDECK),
+	FORMAT_TYPE (WAVE_FORMAT_FM_TOWNS_SND),
+	FORMAT_TYPE (WAVE_FORMAT_BZV_DIGITAL),
+	FORMAT_TYPE (WAVE_FORMAT_VME_VMPCM),
+	FORMAT_TYPE (WAVE_FORMAT_OLIGSM),
+	FORMAT_TYPE (WAVE_FORMAT_OLIADPCM),
+	FORMAT_TYPE (WAVE_FORMAT_OLICELP),
+	FORMAT_TYPE (WAVE_FORMAT_OLISBC),
+	FORMAT_TYPE (WAVE_FORMAT_OLIOPR),
+	FORMAT_TYPE (WAVE_FORMAT_LH_CODEC),
+	FORMAT_TYPE (WAVE_FORMAT_NORRIS),
+	FORMAT_TYPE (WAVE_FORMAT_SOUNDSPACE_MUSICOMPRESS),
+	FORMAT_TYPE (WAVE_FORMAT_DVM),
+	FORMAT_TYPE (WAVE_FORMAT_INTERWAV_VSC112),
+	FORMAT_TYPE (WAVE_FORMAT_IPP_ITU_G_723_1),
+	FORMAT_TYPE (WAVE_FORMAT_EXTENSIBLE),
+} ;
+
+char const*
+wav_w64_format_str (int k)
+{	int lower, upper, mid ;
+
+	lower = -1 ;
+	upper = sizeof (wave_descs) / sizeof (WAV_FORMAT_DESC) ;
+
+	/* binary search */
+	if ((wave_descs [0].ID <= k) && (k <= wave_descs [upper - 1].ID))
+	{
+		while (lower + 1 < upper)
+		{	mid = (upper + lower) / 2 ;
+
+			if (k == wave_descs [mid].ID)
+				return wave_descs [mid].name ;
+			if (k < wave_descs [mid].ID)
+				upper = mid ;
+			else
+				lower = mid ;
+			} ;
+		} ;
+
+	return "Unknown format" ;
+} /* wav_w64_format_str */
+
+int
+wav_w64_srate2blocksize (int srate_chan_product)
+{	if (srate_chan_product < 12000)
+		return 256 ;
+	if (srate_chan_product < 23000)
+		return 512 ;
+	if (srate_chan_product < 44000)
+		return 1024 ;
+	return 2048 ;
+} /* srate2blocksize */
diff --git a/jni/libsndfile-1.0.25/src/wav_w64.h b/jni/libsndfile-1.0.25/src/wav_w64.h
new file mode 100644
index 0000000..9b2914a
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/wav_w64.h
@@ -0,0 +1,295 @@
+/*
+** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/* This file contains definitions commong to WAV and W64 files. */
+
+
+#ifndef WAV_W64_H_INCLUDED
+#define WAV_W64_H_INCLUDED
+
+/*------------------------------------------------------------------------------
+** List of known WAV format tags
+*/
+
+enum
+{
+  /* keep sorted for wav_w64_format_str() */
+	WAVE_FORMAT_UNKNOWN					= 0x0000,		/* Microsoft Corporation */
+	WAVE_FORMAT_PCM	 					= 0x0001, 		/* Microsoft PCM format */
+	WAVE_FORMAT_MS_ADPCM				= 0x0002,		/* Microsoft ADPCM */
+	WAVE_FORMAT_IEEE_FLOAT				= 0x0003,		/* Micrososft 32 bit float format */
+	WAVE_FORMAT_VSELP					= 0x0004,		/* Compaq Computer Corporation */
+	WAVE_FORMAT_IBM_CVSD				= 0x0005,		/* IBM Corporation */
+	WAVE_FORMAT_ALAW					= 0x0006,		/* Microsoft Corporation */
+	WAVE_FORMAT_MULAW					= 0x0007,		/* Microsoft Corporation */
+	WAVE_FORMAT_OKI_ADPCM				= 0x0010,		/* OKI */
+	WAVE_FORMAT_IMA_ADPCM				= 0x0011,		/* Intel Corporation */
+	WAVE_FORMAT_MEDIASPACE_ADPCM		= 0x0012,		/* Videologic */
+	WAVE_FORMAT_SIERRA_ADPCM			= 0x0013,		/* Sierra Semiconductor Corp */
+	WAVE_FORMAT_G723_ADPCM				= 0x0014,		/* Antex Electronics Corporation */
+	WAVE_FORMAT_DIGISTD					= 0x0015,		/* DSP Solutions, Inc. */
+	WAVE_FORMAT_DIGIFIX					= 0x0016,		/* DSP Solutions, Inc. */
+	WAVE_FORMAT_DIALOGIC_OKI_ADPCM		= 0x0017,		/*  Dialogic Corporation  */
+	WAVE_FORMAT_MEDIAVISION_ADPCM		= 0x0018,		/*  Media Vision, Inc. */
+	WAVE_FORMAT_CU_CODEC				= 0x0019,		/* Hewlett-Packard Company */
+	WAVE_FORMAT_YAMAHA_ADPCM			= 0x0020,		/* Yamaha Corporation of America */
+	WAVE_FORMAT_SONARC					= 0x0021,		/* Speech Compression */
+	WAVE_FORMAT_DSPGROUP_TRUESPEECH 	= 0x0022,		/* DSP Group, Inc */
+	WAVE_FORMAT_ECHOSC1					= 0x0023,		/* Echo Speech Corporation */
+	WAVE_FORMAT_AUDIOFILE_AF36			= 0x0024,		/* Audiofile, Inc. */
+	WAVE_FORMAT_APTX					= 0x0025,		/* Audio Processing Technology */
+	WAVE_FORMAT_AUDIOFILE_AF10			= 0x0026,		/* Audiofile, Inc. */
+	WAVE_FORMAT_PROSODY_1612			= 0x0027,		/* Aculab plc */
+	WAVE_FORMAT_LRC						= 0x0028,		/* Merging Technologies S.A. */
+	WAVE_FORMAT_DOLBY_AC2				= 0x0030,		/* Dolby Laboratories */
+	WAVE_FORMAT_GSM610					= 0x0031,		/* Microsoft Corporation */
+	WAVE_FORMAT_MSNAUDIO				= 0x0032,		/* Microsoft Corporation */
+	WAVE_FORMAT_ANTEX_ADPCME			= 0x0033, 		/* Antex Electronics Corporation */
+	WAVE_FORMAT_CONTROL_RES_VQLPC		= 0x0034,		/* Control Resources Limited */
+	WAVE_FORMAT_DIGIREAL				= 0x0035,		/* DSP Solutions, Inc. */
+	WAVE_FORMAT_DIGIADPCM				= 0x0036,		/* DSP Solutions, Inc. */
+	WAVE_FORMAT_CONTROL_RES_CR10		= 0x0037,		/* Control Resources Limited */
+	WAVE_FORMAT_NMS_VBXADPCM			= 0x0038,		/* Natural MicroSystems */
+	WAVE_FORMAT_ROLAND_RDAC				= 0x0039,		/* Roland */
+	WAVE_FORMAT_ECHOSC3					= 0x003A,		/* Echo Speech Corporation */
+	WAVE_FORMAT_ROCKWELL_ADPCM			= 0x003B,		/* Rockwell International */
+	WAVE_FORMAT_ROCKWELL_DIGITALK		= 0x003C, 		/* Rockwell International */
+	WAVE_FORMAT_XEBEC					= 0x003D,		/* Xebec Multimedia Solutions Limited */
+	WAVE_FORMAT_G721_ADPCM				= 0x0040,		/* Antex Electronics Corporation */
+	WAVE_FORMAT_G728_CELP				= 0x0041,		/* Antex Electronics Corporation */
+	WAVE_FORMAT_MSG723					= 0x0042,		/* Microsoft Corporation */
+	WAVE_FORMAT_MPEG					= 0x0050,		/* Microsoft Corporation */
+	WAVE_FORMAT_RT24					= 0x0052,		/* InSoft Inc. */
+	WAVE_FORMAT_PAC						= 0x0053,		/* InSoft Inc. */
+	WAVE_FORMAT_MPEGLAYER3				= 0x0055,		/* MPEG 3 Layer 1 */
+	WAVE_FORMAT_LUCENT_G723				= 0x0059,		/* Lucent Technologies */
+	WAVE_FORMAT_CIRRUS					= 0x0060,		/* Cirrus Logic */
+	WAVE_FORMAT_ESPCM					= 0x0061,		/* ESS Technology */
+	WAVE_FORMAT_VOXWARE					= 0x0062,		/* Voxware Inc */
+	WAVE_FORMAT_CANOPUS_ATRAC			= 0x0063,		/* Canopus, Co., Ltd. */
+	WAVE_FORMAT_G726_ADPCM				= 0x0064,		/* APICOM */
+	WAVE_FORMAT_G722_ADPCM				= 0x0065,		/* APICOM */
+	WAVE_FORMAT_DSAT					= 0x0066,		/* Microsoft Corporation */
+	WAVE_FORMAT_DSAT_DISPLAY			= 0x0067,		/* Microsoft Corporation */
+	WAVE_FORMAT_VOXWARE_BYTE_ALIGNED	= 0x0069,		/* Voxware Inc. */
+	WAVE_FORMAT_VOXWARE_AC8				= 0x0070,		/* Voxware Inc. */
+	WAVE_FORMAT_VOXWARE_AC10			= 0x0071,		/* Voxware Inc. */
+	WAVE_FORMAT_VOXWARE_AC16			= 0x0072,		/* Voxware Inc. */
+	WAVE_FORMAT_VOXWARE_AC20			= 0x0073,		/* Voxware Inc. */
+	WAVE_FORMAT_VOXWARE_RT24			= 0x0074,		/* Voxware Inc. */
+	WAVE_FORMAT_VOXWARE_RT29			= 0x0075,		/* Voxware Inc. */
+	WAVE_FORMAT_VOXWARE_RT29HW			= 0x0076,		/* Voxware Inc. */
+	WAVE_FORMAT_VOXWARE_VR12			= 0x0077,		/* Voxware Inc. */
+	WAVE_FORMAT_VOXWARE_VR18			= 0x0078,		/* Voxware Inc. */
+	WAVE_FORMAT_VOXWARE_TQ40			= 0x0079,		/* Voxware Inc. */
+	WAVE_FORMAT_SOFTSOUND				= 0x0080,		/* Softsound, Ltd. */
+	WAVE_FORMAT_VOXARE_TQ60				= 0x0081,		/* Voxware Inc. */
+	WAVE_FORMAT_MSRT24					= 0x0082,		/* Microsoft Corporation */
+	WAVE_FORMAT_G729A					= 0x0083,		/* AT&T Laboratories */
+	WAVE_FORMAT_MVI_MV12				= 0x0084,		/* Motion Pixels */
+	WAVE_FORMAT_DF_G726					= 0x0085,		/* DataFusion Systems (Pty) (Ltd) */
+	WAVE_FORMAT_DF_GSM610				= 0x0086,		/* DataFusion Systems (Pty) (Ltd) */
+	/* removed because duplicate */
+	/* WAVE_FORMAT_ISIAUDIO				= 0x0088, */	/* Iterated Systems, Inc. */
+	WAVE_FORMAT_ONLIVE					= 0x0089,		/* OnLive! Technologies, Inc. */
+	WAVE_FORMAT_SBC24					= 0x0091,		/* Siemens Business Communications Systems */
+	WAVE_FORMAT_DOLBY_AC3_SPDIF			= 0x0092,		/* Sonic Foundry */
+	WAVE_FORMAT_ZYXEL_ADPCM				= 0x0097,		/* ZyXEL Communications, Inc. */
+	WAVE_FORMAT_PHILIPS_LPCBB			= 0x0098,		/* Philips Speech Processing */
+	WAVE_FORMAT_PACKED					= 0x0099,		/* Studer Professional Audio AG */
+	WAVE_FORMAT_RHETOREX_ADPCM			= 0x0100,		/* Rhetorex, Inc. */
+
+	/* removed because of the following */
+	/* WAVE_FORMAT_IRAT					= 0x0101,*/		/* BeCubed Software Inc. */
+
+	/* these three are unofficial */
+	IBM_FORMAT_MULAW					= 0x0101,		/* IBM mu-law format */
+	IBM_FORMAT_ALAW						= 0x0102,		/* IBM a-law format */
+	IBM_FORMAT_ADPCM					= 0x0103,		/* IBM AVC Adaptive Differential PCM format */
+
+	WAVE_FORMAT_VIVO_G723				= 0x0111,		/* Vivo Software */
+	WAVE_FORMAT_VIVO_SIREN				= 0x0112,		/* Vivo Software */
+	WAVE_FORMAT_DIGITAL_G723			= 0x0123,		/* Digital Equipment Corporation */
+	WAVE_FORMAT_CREATIVE_ADPCM			= 0x0200,		/* Creative Labs, Inc */
+	WAVE_FORMAT_CREATIVE_FASTSPEECH8 	= 0x0202,		/* Creative Labs, Inc */
+	WAVE_FORMAT_CREATIVE_FASTSPEECH10 	= 0x0203,		/* Creative Labs, Inc */
+	WAVE_FORMAT_QUARTERDECK				= 0x0220,		/* Quarterdeck Corporation */
+	WAVE_FORMAT_FM_TOWNS_SND			= 0x0300,		/* Fujitsu Corporation */
+	WAVE_FORMAT_BZV_DIGITAL				= 0x0400,		/* Brooktree Corporation */
+	WAVE_FORMAT_VME_VMPCM				= 0x0680,		/* AT&T Labs, Inc. */
+	WAVE_FORMAT_OLIGSM					= 0x1000,		/* Ing C. Olivetti & C., S.p.A. */
+	WAVE_FORMAT_OLIADPCM				= 0x1001,		/* Ing C. Olivetti & C., S.p.A. */
+	WAVE_FORMAT_OLICELP					= 0x1002,		/* Ing C. Olivetti & C., S.p.A. */
+	WAVE_FORMAT_OLISBC					= 0x1003,		/* Ing C. Olivetti & C., S.p.A. */
+	WAVE_FORMAT_OLIOPR					= 0x1004,		/* Ing C. Olivetti & C., S.p.A. */
+	WAVE_FORMAT_LH_CODEC				= 0x1100,		/* Lernout & Hauspie */
+	WAVE_FORMAT_NORRIS					= 0x1400,		/* Norris Communications, Inc. */
+	/* removed because duplicate */
+	/* WAVE_FORMAT_ISIAUDIO				= 0x1401, */	/* AT&T Labs, Inc. */
+	WAVE_FORMAT_SOUNDSPACE_MUSICOMPRESS	= 0x1500,		/* AT&T Labs, Inc. */
+	WAVE_FORMAT_DVM						= 0x2000,		/* FAST Multimedia AG */
+	WAVE_FORMAT_INTERWAV_VSC112			= 0x7150,		/* ????? */
+
+	WAVE_FORMAT_IPP_ITU_G_723_1			= 0x7230,		/* Intel Performance Primitives g723 codec. */
+
+	WAVE_FORMAT_EXTENSIBLE				= 0xFFFE
+} ;
+
+typedef	struct
+{	unsigned short	format ;
+	unsigned short	channels ;
+	unsigned int	samplerate ;
+	unsigned int	bytespersec ;
+	unsigned short	blockalign ;
+	unsigned short	bitwidth ;
+} MIN_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	dummy ;
+} WAV_FMT_SIZE20 ;
+
+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 ;
+	unsigned short	numcoeffs ;
+	struct
+	{	short	coeff1 ;
+		short	coeff2 ;
+	}	coeffs [7] ;
+} MS_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 ;
+} 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	auxblocksize ;
+} G72x_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 ;
+	unsigned short	esf_field3 ;
+	char			esf_field4 [8] ;
+} EXT_SUBFORMAT ;
+
+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	validbits ;
+	unsigned int	channelmask ;
+	EXT_SUBFORMAT	esf ;
+} EXTENSIBLE_WAV_FMT ;
+
+typedef union
+{	unsigned short		format ;
+	MIN_WAV_FMT			min ;
+	IMA_ADPCM_WAV_FMT	ima ;
+	MS_ADPCM_WAV_FMT	msadpcm ;
+	G72x_ADPCM_WAV_FMT	g72x ;
+	EXTENSIBLE_WAV_FMT	ext ;
+	GSM610_WAV_FMT		gsm610 ;
+	WAV_FMT_SIZE20		size20 ;
+	char				padding [512] ;
+} WAV_FMT ;
+
+typedef struct
+{	int frames ;
+} FACT_CHUNK ;
+
+typedef struct
+{	/* For ambisonic commands */
+	int	wavex_ambisonic ;
+	unsigned wavex_channelmask ;
+
+	/* Set to true when 'fmt ' chunk is ambiguous.*/
+	int fmt_is_broken ;
+	WAV_FMT wav_fmt ;
+} WAV_PRIVATE ;
+
+#define		WAV_W64_GSM610_BLOCKSIZE	65
+#define		WAV_W64_GSM610_SAMPLES		320
+
+/*------------------------------------------------------------------------------------
+**	Functions defined in wav_ms_adpcm.c
+*/
+
+#define	MSADPCM_ADAPT_COEFF_COUNT	7
+
+void	msadpcm_write_adapt_coeffs (SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------------
+**	Functions defined in wav_w64.c
+*/
+
+int 	wav_w64_srate2blocksize (int srate_chan_product) ;
+char const* wav_w64_format_str (int k) ;
+int		wav_w64_read_fmt_chunk (SF_PRIVATE *psf, int fmtsize) ;
+void	wavex_write_guid (SF_PRIVATE *psf, const EXT_SUBFORMAT * subformat) ;
+void	wav_w64_analyze (SF_PRIVATE *psf) ;
+int		wavex_gen_channel_mask (const int *chan_map, int channels) ;
+
+int		wav_read_bext_chunk (SF_PRIVATE *psf, unsigned int chunksize) ;
+int		wav_write_bext_chunk (SF_PRIVATE *psf) ;
+
+#endif
+
diff --git a/jni/libsndfile-1.0.25/src/wav_w64.lo b/jni/libsndfile-1.0.25/src/wav_w64.lo
new file mode 100644
index 0000000..f36b47d
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/wav_w64.lo
@@ -0,0 +1,12 @@
+# wav_w64.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/wav_w64.o'
+
+# Name of the non-PIC object
+non_pic_object='wav_w64.o'
+
diff --git a/jni/libsndfile-1.0.25/src/wav_w64.o b/jni/libsndfile-1.0.25/src/wav_w64.o
new file mode 100644
index 0000000..9779bcd
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/wav_w64.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/windows.c b/jni/libsndfile-1.0.25/src/windows.c
new file mode 100644
index 0000000..387afdd
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/windows.c
@@ -0,0 +1,93 @@
+/*
+** Copyright (C) 2009-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/*
+**	This needs to be a separate file so that we don't have to include
+**	<windows.h> elsewhere (too many symbol clashes).
+*/
+
+
+#include "sfconfig.h"
+
+#if OS_IS_WIN32
+#include <windows.h>
+
+#define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1
+#include "sndfile.h"
+#include "common.h"
+
+extern int sf_errno ;
+
+static void copy_filename (SF_PRIVATE * psf, LPCWSTR wpath) ;
+
+SNDFILE*
+sf_wchar_open (LPCWSTR wpath, int mode, SF_INFO *sfinfo)
+{	SF_PRIVATE 	*psf ;
+	char utf8name [512] ;
+
+	if ((psf = calloc (1, sizeof (SF_PRIVATE))) == NULL)
+	{	sf_errno = SFE_MALLOC_FAILED ;
+		return	NULL ;
+		} ;
+
+	memset (psf, 0, sizeof (SF_PRIVATE)) ;
+	psf_init_files (psf) ;
+
+	if (WideCharToMultiByte (CP_UTF8, 0, wpath, -1, utf8name, sizeof (utf8name), NULL, NULL) == 0)
+		psf->file.path.wc [0] = 0 ;
+
+	psf_log_printf (psf, "File : '%s' (utf-8 converted from ucs-2)\n", utf8name) ;
+
+	copy_filename (psf, wpath) ;
+	psf->file.use_wchar = SF_TRUE ;
+	psf->file.mode = mode ;
+
+	psf->error = psf_fopen (psf) ;
+
+	return psf_open_file (psf, sfinfo) ;
+} /* sf_wchar_open */
+
+
+static void
+copy_filename (SF_PRIVATE *psf, LPCWSTR wpath)
+{	const wchar_t *cwcptr ;
+	wchar_t *wcptr ;
+
+	wcsncpy (psf->file.path.wc, wpath, ARRAY_LEN (psf->file.path.wc)) ;
+	psf->file.path.wc [ARRAY_LEN (psf->file.path.wc) - 1] = 0 ;
+	if ((cwcptr = wcsrchr (wpath, '/')) || (cwcptr = wcsrchr (wpath, '\\')))
+		cwcptr ++ ;
+	else
+		cwcptr = wpath ;
+
+	wcsncpy (psf->file.name.wc, cwcptr, ARRAY_LEN (psf->file.name.wc)) ;
+	psf->file.name.wc [ARRAY_LEN (psf->file.name.wc) - 1] = 0 ;
+
+	/* Now grab the directory. */
+	wcsncpy (psf->file.dir.wc, wpath, ARRAY_LEN (psf->file.dir.wc)) ;
+	psf->file.dir.wc [ARRAY_LEN (psf->file.dir.wc) - 1] = 0 ;
+
+	if ((wcptr = wcsrchr (psf->file.dir.wc, '/')) || (wcptr = wcsrchr (psf->file.dir.wc, '\\')))
+		wcptr [1] = 0 ;
+	else
+		psf->file.dir.wc [0] = 0 ;
+
+	return ;
+} /* copy_filename */
+
+#endif
diff --git a/jni/libsndfile-1.0.25/src/windows.lo b/jni/libsndfile-1.0.25/src/windows.lo
new file mode 100644
index 0000000..a1c948c
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/windows.lo
@@ -0,0 +1,12 @@
+# windows.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/windows.o'
+
+# Name of the non-PIC object
+non_pic_object='windows.o'
+
diff --git a/jni/libsndfile-1.0.25/src/windows.o b/jni/libsndfile-1.0.25/src/windows.o
new file mode 100644
index 0000000..ccd9b1f
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/windows.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/wve.c b/jni/libsndfile-1.0.25/src/wve.c
new file mode 100644
index 0000000..c13e7ab
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/wve.c
@@ -0,0 +1,209 @@
+/*
+** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+** Copyright (C) 2007 Reuben Thomas
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"sfconfig.h"
+
+#include	<stdio.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+/*------------------------------------------------------------------------------
+** Macros to handle big/little endian issues, and other magic numbers.
+*/
+
+#define ALAW_MARKER			MAKE_MARKER ('A', 'L', 'a', 'w')
+#define SOUN_MARKER			MAKE_MARKER ('S', 'o', 'u', 'n')
+#define DFIL_MARKER			MAKE_MARKER ('d', 'F', 'i', 'l')
+#define ESSN_MARKER			MAKE_MARKER ('e', '*', '*', '\0')
+#define PSION_VERSION		((unsigned short) 3856)
+#define PSION_DATAOFFSET	0x20
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static int	wve_read_header (SF_PRIVATE *psf) ;
+static int	wve_write_header (SF_PRIVATE *psf, int calc_length) ;
+static int	wve_close (SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+wve_open (SF_PRIVATE *psf)
+{	int	error = 0 ;
+
+	if (psf->is_pipe)
+		return SFE_WVE_NO_PIPE ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = wve_read_header (psf)))
+			return error ;
+		} ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_WVE)
+			return	SFE_BAD_OPEN_FORMAT ;
+
+		psf->endian = SF_ENDIAN_BIG ;
+
+		if ((error = wve_write_header (psf, SF_FALSE)))
+			return error ;
+
+		psf->write_header = wve_write_header ;
+		} ;
+
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+	psf->container_close = wve_close ;
+
+	error = alaw_init (psf) ;
+
+	return error ;
+} /* wve_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+wve_read_header (SF_PRIVATE *psf)
+{	int marker ;
+	unsigned short version, padding, repeats, trash ;
+	unsigned datalength ;
+
+	/* Set position to start of file to begin reading header. */
+	psf_binheader_readf (psf, "pm", 0, &marker) ;
+	if (marker != ALAW_MARKER)
+	{	psf_log_printf (psf, "Could not find '%M'\n", ALAW_MARKER) ;
+		return SFE_WVE_NOT_WVE ;
+		} ;
+
+	psf_binheader_readf (psf, "m", &marker) ;
+	if (marker != SOUN_MARKER)
+	{	psf_log_printf (psf, "Could not find '%M'\n", SOUN_MARKER) ;
+		return SFE_WVE_NOT_WVE ;
+		} ;
+
+	psf_binheader_readf (psf, "m", &marker) ;
+	if (marker != DFIL_MARKER)
+	{	psf_log_printf (psf, "Could not find '%M'\n", DFIL_MARKER) ;
+		return SFE_WVE_NOT_WVE ;
+		} ;
+
+	psf_binheader_readf (psf, "m", &marker) ;
+	if (marker != ESSN_MARKER)
+	{	psf_log_printf (psf, "Could not find '%M'\n", ESSN_MARKER) ;
+		return SFE_WVE_NOT_WVE ;
+		} ;
+
+	psf_binheader_readf (psf, "E2", &version) ;
+
+	psf_log_printf (psf, "Psion Palmtop Alaw (.wve)\n"
+			"  Sample Rate : 8000\n"
+			"  Channels    : 1\n"
+			"  Encoding    : A-law\n") ;
+
+	if (version != PSION_VERSION)
+		psf_log_printf (psf, "Psion version %d should be %d\n", version, PSION_VERSION) ;
+
+	psf_binheader_readf (psf, "E4", &datalength) ;
+	psf->dataoffset = PSION_DATAOFFSET ;
+	if (datalength != psf->filelength - psf->dataoffset)
+	{	psf->datalength = psf->filelength - psf->dataoffset ;
+		psf_log_printf (psf, "Data length %d should be %D\n", datalength, psf->datalength) ;
+		}
+	else
+		psf->datalength = datalength ;
+
+	psf_binheader_readf (psf, "E22222", &padding, &repeats, &trash, &trash, &trash) ;
+
+	psf->sf.format		= SF_FORMAT_WVE | SF_FORMAT_ALAW ;
+	psf->sf.samplerate	= 8000 ;
+	psf->sf.frames		= psf->datalength ;
+	psf->sf.channels	= 1 ;
+
+	return SFE_NO_ERROR ;
+} /* wve_read_header */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+wve_write_header (SF_PRIVATE *psf, int calc_length)
+{	sf_count_t	current ;
+	unsigned datalen ;
+
+	current = psf_ftell (psf) ;
+
+	if (calc_length)
+	{	psf->filelength = psf_get_filelen (psf) ;
+
+		psf->datalength = psf->filelength - psf->dataoffset ;
+		if (psf->dataend)
+			psf->datalength -= psf->filelength - psf->dataend ;
+
+		psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+		} ;
+
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	psf_fseek (psf, 0, SEEK_SET) ;
+
+	/* Write header. */
+	datalen = psf->datalength ;
+	psf_binheader_writef (psf, "Emmmm", ALAW_MARKER, SOUN_MARKER, DFIL_MARKER, ESSN_MARKER) ;
+	psf_binheader_writef (psf, "E2422222", PSION_VERSION, datalen, 0, 0, 0, 0, 0) ;
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+
+	if (psf->sf.channels != 1)
+		return SFE_CHANNEL_COUNT ;
+
+	if (psf->error)
+		return psf->error ;
+
+	psf->dataoffset = psf->headindex ;
+
+	if (current > 0)
+		psf_fseek (psf, current, SEEK_SET) ;
+
+	return psf->error ;
+} /* wve_write_header */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+wve_close (SF_PRIVATE *psf)
+{
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	/*  Now we know for certain the length of the file we can re-write
+		**	the header.
+		*/
+		wve_write_header (psf, SF_TRUE) ;
+		} ;
+
+	return 0 ;
+} /* wve_close */
diff --git a/jni/libsndfile-1.0.25/src/wve.lo b/jni/libsndfile-1.0.25/src/wve.lo
new file mode 100644
index 0000000..9e16a0a
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/wve.lo
@@ -0,0 +1,12 @@
+# wve.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/wve.o'
+
+# Name of the non-PIC object
+non_pic_object='wve.o'
+
diff --git a/jni/libsndfile-1.0.25/src/wve.o b/jni/libsndfile-1.0.25/src/wve.o
new file mode 100644
index 0000000..c2d2991
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/wve.o
Binary files differ
diff --git a/jni/libsndfile-1.0.25/src/xi.c b/jni/libsndfile-1.0.25/src/xi.c
new file mode 100644
index 0000000..ee60a4b
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/xi.c
@@ -0,0 +1,1197 @@
+/*
+** Copyright (C) 2003-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "sfconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
+
+#include "sndfile.h"
+#include "sfendian.h"
+#include "common.h"
+
+#define	MAX_XI_SAMPLES	16
+
+/*------------------------------------------------------------------------------
+** Private static functions and tyepdefs.
+*/
+
+typedef struct
+{	/* Warning, this filename is NOT nul terminated. */
+	char	filename [22] ;
+	char	software [20] ;
+	char	sample_name [22] ;
+
+	int		loop_begin, loop_end ;
+	int		sample_flags ;
+
+	/* Data for encoder and decoder. */
+	short	last_16 ;
+} XI_PRIVATE ;
+
+static int	xi_close		(SF_PRIVATE *psf) ;
+static int	xi_write_header (SF_PRIVATE *psf, int calc_length) ;
+static int	xi_read_header	(SF_PRIVATE *psf) ;
+static int	dpcm_init 		(SF_PRIVATE *psf) ;
+
+
+static sf_count_t	dpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+xi_open	(SF_PRIVATE *psf)
+{	XI_PRIVATE *pxi ;
+	int		subformat, error = 0 ;
+
+	if (psf->is_pipe)
+		return SFE_XI_NO_PIPE ;
+
+	if (psf->codec_data)
+		pxi = psf->codec_data ;
+	else if ((pxi = calloc (1, sizeof (XI_PRIVATE))) == NULL)
+		return SFE_MALLOC_FAILED ;
+
+	psf->codec_data = pxi ;
+
+	if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = xi_read_header (psf)))
+			return error ;
+		} ;
+
+	subformat = SF_CODEC (psf->sf.format) ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_XI)
+			return	SFE_BAD_OPEN_FORMAT ;
+
+		psf->endian = SF_ENDIAN_LITTLE ;
+		psf->sf.channels = 1 ; /* Always mono */
+		psf->sf.samplerate = 44100 ; /* Always */
+
+		/* Set up default instrument and software name. */
+		memcpy (pxi->filename, "Default Name            ", sizeof (pxi->filename)) ;
+		memcpy (pxi->software, PACKAGE "-" VERSION "               ", sizeof (pxi->software)) ;
+
+		memset (pxi->sample_name, 0, sizeof (pxi->sample_name)) ;
+		snprintf (pxi->sample_name, sizeof (pxi->sample_name), "%s", "Sample #1") ;
+
+		pxi->sample_flags = (subformat == SF_FORMAT_DPCM_16) ? 16 : 0 ;
+
+		if (xi_write_header (psf, SF_FALSE))
+			return psf->error ;
+
+		psf->write_header = xi_write_header ;
+		} ;
+
+	psf->container_close = xi_close ;
+	psf->seek = dpcm_seek ;
+
+	psf->sf.seekable = SF_FALSE ;
+
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+	switch (subformat)
+	{	case SF_FORMAT_DPCM_8 :		/* 8-bit differential PCM. */
+		case SF_FORMAT_DPCM_16 :	/* 16-bit differential PCM. */
+				error = dpcm_init (psf) ;
+				break ;
+
+		default : break ;
+		} ;
+
+	return error ;
+} /* xi_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+xi_close	(SF_PRIVATE * UNUSED (psf))
+{
+	return 0 ;
+} /* xi_close */
+
+/*==============================================================================
+*/
+
+static sf_count_t dpcm_read_dsc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t dpcm_read_dsc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t dpcm_read_dsc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t dpcm_read_dsc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t dpcm_write_s2dsc (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t dpcm_write_i2dsc (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t dpcm_write_f2dsc (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t dpcm_write_d2dsc (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+static sf_count_t dpcm_read_dles2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t dpcm_read_dles2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t dpcm_read_dles2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t dpcm_read_dles2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t dpcm_write_s2dles (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
+static sf_count_t dpcm_write_i2dles (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
+static sf_count_t dpcm_write_f2dles (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
+static sf_count_t dpcm_write_d2dles (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
+
+static int
+dpcm_init (SF_PRIVATE *psf)
+{	if (psf->bytewidth == 0 || psf->sf.channels == 0)
+		return SFE_INTERNAL ;
+
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+	if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR)
+	{	switch (psf->bytewidth)
+		{	case 1 :
+					psf->read_short		= dpcm_read_dsc2s ;
+					psf->read_int		= dpcm_read_dsc2i ;
+					psf->read_float		= dpcm_read_dsc2f ;
+					psf->read_double	= dpcm_read_dsc2d ;
+					break ;
+			case 2 :
+					psf->read_short		= dpcm_read_dles2s ;
+					psf->read_int		= dpcm_read_dles2i ;
+					psf->read_float		= dpcm_read_dles2f ;
+					psf->read_double	= dpcm_read_dles2d ;
+					break ;
+			default :
+				psf_log_printf (psf, "dpcm_init() returning SFE_UNIMPLEMENTED\n") ;
+				return SFE_UNIMPLEMENTED ;
+			} ;
+		} ;
+
+	if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
+	{	switch (psf->bytewidth)
+		{	case 1 :
+					psf->write_short	= dpcm_write_s2dsc ;
+					psf->write_int		= dpcm_write_i2dsc ;
+					psf->write_float	= dpcm_write_f2dsc ;
+					psf->write_double	= dpcm_write_d2dsc ;
+					break ;
+			case 2 :
+					psf->write_short	= dpcm_write_s2dles ;
+					psf->write_int		= dpcm_write_i2dles ;
+					psf->write_float	= dpcm_write_f2dles ;
+					psf->write_double	= dpcm_write_d2dles ;
+					break ;
+			default :
+				psf_log_printf (psf, "dpcm_init() returning SFE_UNIMPLEMENTED\n") ;
+				return SFE_UNIMPLEMENTED ;
+			} ;
+		} ;
+
+	psf->filelength = psf_get_filelen (psf) ;
+	psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset :
+							psf->filelength - psf->dataoffset ;
+	psf->sf.frames = psf->datalength / psf->blockwidth ;
+
+	return 0 ;
+} /* dpcm_init */
+
+/*==============================================================================
+*/
+
+static sf_count_t
+dpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset)
+{	XI_PRIVATE	*pxi ;
+	int			total, bufferlen, len ;
+
+	if ((pxi = psf->codec_data) == NULL)
+		return SFE_INTERNAL ;
+
+	if (psf->datalength < 0 || psf->dataoffset < 0)
+	{	psf->error = SFE_BAD_SEEK ;
+		return	PSF_SEEK_ERROR ;
+		} ;
+
+	if (offset == 0)
+	{	psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+		pxi->last_16 = 0 ;
+		return 0 ;
+		} ;
+
+	if (offset < 0 || offset > psf->sf.frames)
+	{	psf->error = SFE_BAD_SEEK ;
+		return	PSF_SEEK_ERROR ;
+		} ;
+
+	if (mode != SFM_READ)
+	{	/* What to do about write??? */
+		psf->error = SFE_BAD_SEEK ;
+		return	PSF_SEEK_ERROR ;
+		} ;
+
+	psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
+
+	if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_DPCM_16)
+	{	total = offset ;
+		bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+		while (total > 0)
+		{	len = (total > bufferlen) ? bufferlen : total ;
+			total -= dpcm_read_dles2s (psf, psf->u.sbuf, len) ;
+			} ;
+		}
+	else
+	{	total = offset ;
+		bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+		while (total > 0)
+		{	len = (total > bufferlen) ? bufferlen : total ;
+			total -= dpcm_read_dsc2s (psf, psf->u.sbuf, len) ;
+			} ;
+		} ;
+
+	return offset ;
+} /* dpcm_seek */
+
+
+static int
+xi_write_header (SF_PRIVATE *psf, int UNUSED (calc_length))
+{	XI_PRIVATE	*pxi ;
+	sf_count_t	current ;
+	const char	*string ;
+
+	if ((pxi = psf->codec_data) == NULL)
+		return SFE_INTERNAL ;
+
+	current = psf_ftell (psf) ;
+
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	psf_fseek (psf, 0, SEEK_SET) ;
+
+	string = "Extended Instrument: " ;
+	psf_binheader_writef (psf, "b", string, strlen (string)) ;
+	psf_binheader_writef (psf, "b1", pxi->filename, sizeof (pxi->filename), 0x1A) ;
+
+	/* Write software version and two byte XI version. */
+	psf_binheader_writef (psf, "eb2", pxi->software, sizeof (pxi->software), (1 << 8) + 2) ;
+
+	/*
+	** Jump note numbers (96), volume envelope (48), pan envelope (48),
+	** volume points (1), pan points (1)
+	*/
+	psf_binheader_writef (psf, "z", (size_t) (96 + 48 + 48 + 1 + 1)) ;
+
+	/* Jump volume loop (3 bytes), pan loop (3), envelope flags (3), vibrato (3)
+	** fade out (2), 22 unknown bytes, and then write sample_count (2 bytes).
+	*/
+	psf_binheader_writef (psf, "ez2z2", (size_t) (4 * 3), 0x1234, make_size_t (22), 1) ;
+
+	pxi->loop_begin = 0 ;
+	pxi->loop_end = 0 ;
+
+	psf_binheader_writef (psf, "et844", psf->sf.frames, pxi->loop_begin, pxi->loop_end) ;
+
+	/* volume, fine tune, flags, pan, note, namelen */
+	psf_binheader_writef (psf, "111111", 128, 0, pxi->sample_flags, 128, 0, strlen (pxi->sample_name)) ;
+
+	psf_binheader_writef (psf, "b", pxi->sample_name, sizeof (pxi->sample_name)) ;
+
+
+
+
+
+	/* Header construction complete so write it out. */
+	psf_fwrite (psf->header, psf->headindex, 1, psf) ;
+
+	if (psf->error)
+		return psf->error ;
+
+	psf->dataoffset = psf->headindex ;
+
+	if (current > 0)
+		psf_fseek (psf, current, SEEK_SET) ;
+
+	return psf->error ;
+} /* xi_write_header */
+
+static int
+xi_read_header (SF_PRIVATE *psf)
+{	char	buffer [64], name [32] ;
+	short	version, fade_out, sample_count ;
+	int		k, loop_begin, loop_end ;
+	int 	sample_sizes [MAX_XI_SAMPLES] ;
+
+	psf_binheader_readf (psf, "pb", 0, buffer, 21) ;
+
+	memset (sample_sizes, 0, sizeof (sample_sizes)) ;
+
+	buffer [20] = 0 ;
+	if (strcmp (buffer, "Extended Instrument:") != 0)
+		return SFE_XI_BAD_HEADER ;
+
+	memset (buffer, 0, sizeof (buffer)) ;
+	psf_binheader_readf (psf, "b", buffer, 23) ;
+
+	if (buffer [22] != 0x1A)
+		return SFE_XI_BAD_HEADER ;
+
+	buffer [22] = 0 ;
+	psf_log_printf (psf, "Extended Instrument : %s\n", buffer) ;
+
+	psf_binheader_readf (psf, "be2", buffer, 20, &version) ;
+	buffer [19] = 0 ;
+	psf_log_printf (psf, "Software : %s\nVersion  : %d.%02d\n", buffer, version / 256, version % 256) ;
+
+	/* Jump note numbers (96), volume envelope (48), pan envelope (48),
+	** volume points (1), pan points (1)
+	*/
+	psf_binheader_readf (psf, "j", 96 + 48 + 48 + 1 + 1) ;
+
+	psf_binheader_readf (psf, "b", buffer, 12) ;
+	psf_log_printf (psf, "Volume Loop\n  sustain : %u\n  begin   : %u\n  end     : %u\n",
+						buffer [0], buffer [1], buffer [2]) ;
+	psf_log_printf (psf, "Pan Loop\n  sustain : %u\n  begin   : %u\n  end     : %u\n",
+						buffer [3], buffer [4], buffer [5]) ;
+	psf_log_printf (psf, "Envelope Flags\n  volume  : 0x%X\n  pan     : 0x%X\n",
+				buffer [6] & 0xFF, buffer [7] & 0xFF) ;
+
+	psf_log_printf (psf, "Vibrato\n  type    : %u\n  sweep   : %u\n  depth   : %u\n  rate    : %u\n",
+				buffer [8], buffer [9], buffer [10], buffer [11]) ;
+
+	/*
+	** Read fade_out then jump reserved (2 bytes) and ???? (20 bytes) and
+	** sample_count.
+	*/
+	psf_binheader_readf (psf, "e2j2", &fade_out, 2 + 20, &sample_count) ;
+	psf_log_printf (psf, "Fade out  : %d\n", fade_out) ;
+
+	/* XI file can contain up to 16 samples. */
+	if (sample_count > MAX_XI_SAMPLES)
+		return SFE_XI_EXCESS_SAMPLES ;
+
+	if (psf->instrument == NULL && (psf->instrument = psf_instrument_alloc ()) == NULL)
+		return SFE_MALLOC_FAILED ;
+
+	/* Log all data for each sample. */
+	for (k = 0 ; k < sample_count ; k++)
+	{	psf_binheader_readf (psf, "e444", &(sample_sizes [k]), &loop_begin, &loop_end) ;
+
+		/* Read 5 know bytes, 1 unknown byte and 22 name bytes. */
+		psf_binheader_readf (psf, "bb", buffer, 6, name, 22) ;
+		name [21] = 0 ;
+
+		psf_log_printf (psf, "Sample #%d\n  name    : %s\n", k + 1, name) ;
+
+		psf_log_printf (psf, "  size    : %d\n", sample_sizes [k]) ;
+
+
+
+		psf_log_printf (psf, "  loop\n    begin : %d\n    end   : %d\n", loop_begin, loop_end) ;
+
+		psf_log_printf (psf, "  volume  : %u\n  f. tune : %d\n  flags   : 0x%02X ",
+					buffer [0] & 0xFF, buffer [1] & 0xFF, buffer [2] & 0xFF) ;
+
+		psf_log_printf (psf, " (") ;
+		if (buffer [2] & 1)
+			psf_log_printf (psf, " Loop") ;
+		if (buffer [2] & 2)
+			psf_log_printf (psf, " PingPong") ;
+		psf_log_printf (psf, (buffer [2] & 16) ? " 16bit" : " 8bit") ;
+		psf_log_printf (psf, " )\n") ;
+
+		psf_log_printf (psf, "  pan     : %u\n  note    : %d\n  namelen : %d\n",
+					buffer [3] & 0xFF, buffer [4], buffer [5]) ;
+
+		if (k != 0)
+			continue ;
+
+		if (buffer [2] & 16)
+		{	psf->sf.format = SF_FORMAT_XI | SF_FORMAT_DPCM_16 ;
+			psf->bytewidth = 2 ;
+			}
+		else
+		{	psf->sf.format = SF_FORMAT_XI | SF_FORMAT_DPCM_8 ;
+			psf->bytewidth = 1 ;
+			} ;
+		} ;
+
+	while (sample_count > 1 && sample_sizes [sample_count - 1] == 0)
+		sample_count -- ;
+
+	/* Currently, we can only handle 1 sample per file. */
+
+	if (sample_count > 2)
+	{	psf_log_printf (psf, "*** Sample count is less than 16 but more than 1.\n") ;
+		psf_log_printf (psf, "  sample count : %d    sample_sizes [%d] : %d\n",
+						sample_count, sample_count - 1, sample_sizes [sample_count - 1]) ;
+		return SFE_XI_EXCESS_SAMPLES ;
+		} ;
+
+	psf->datalength = sample_sizes [0] ;
+
+	psf->dataoffset = psf_ftell (psf) ;
+	if (psf->dataoffset < 0)
+	{	psf_log_printf (psf, "*** Bad Data Offset : %D\n", psf->dataoffset) ;
+		return SFE_BAD_OFFSET ;
+		} ;
+	psf_log_printf (psf, "Data Offset : %D\n", psf->dataoffset) ;
+
+	if (psf->dataoffset + psf->datalength > psf->filelength)
+	{	psf_log_printf (psf, "*** File seems to be truncated. Should be at least %D bytes long.\n",
+				psf->dataoffset + sample_sizes [0]) ;
+		psf->datalength = psf->filelength - psf->dataoffset ;
+		} ;
+
+	if (psf_fseek (psf, psf->dataoffset, SEEK_SET) != psf->dataoffset)
+		return SFE_BAD_SEEK ;
+
+	psf->endian = SF_ENDIAN_LITTLE ;
+	psf->sf.channels = 1 ; /* Always mono */
+	psf->sf.samplerate = 44100 ; /* Always */
+
+	psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+
+	if (! psf->sf.frames && psf->blockwidth)
+		psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ;
+
+	psf->instrument->basenote = 0 ;
+	psf->instrument->gain = 1 ;
+	psf->instrument->velocity_lo = psf->instrument->key_lo = 0 ;
+	psf->instrument->velocity_hi = psf->instrument->key_hi = 127 ;
+
+	return 0 ;
+} /* xi_read_header */
+
+/*==============================================================================
+*/
+
+static void dsc2s_array (XI_PRIVATE *pxi, signed char *src, int count, short *dest) ;
+static void dsc2i_array (XI_PRIVATE *pxi, signed char *src, int count, int *dest) ;
+static void dsc2f_array (XI_PRIVATE *pxi, signed char *src, int count, float *dest, float normfact) ;
+static void dsc2d_array (XI_PRIVATE *pxi, signed char *src, int count, double *dest, double normfact) ;
+
+static void dles2s_array (XI_PRIVATE *pxi, short *src, int count, short *dest) ;
+static void dles2i_array (XI_PRIVATE *pxi, short *src, int count, int *dest) ;
+static void dles2f_array (XI_PRIVATE *pxi, short *src, int count, float *dest, float normfact) ;
+static void dles2d_array (XI_PRIVATE *pxi, short *src, int count, double *dest, double normfact) ;
+
+static sf_count_t
+dpcm_read_dsc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	XI_PRIVATE	*pxi ;
+	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	if ((pxi = psf->codec_data) == NULL)
+		return 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+		dsc2s_array (pxi, psf->u.scbuf, readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* dpcm_read_dsc2s */
+
+static sf_count_t
+dpcm_read_dsc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	XI_PRIVATE	*pxi ;
+	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	if ((pxi = psf->codec_data) == NULL)
+		return 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+		dsc2i_array (pxi, psf->u.scbuf, readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* dpcm_read_dsc2i */
+
+static sf_count_t
+dpcm_read_dsc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	XI_PRIVATE	*pxi ;
+	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	float		normfact ;
+
+	if ((pxi = psf->codec_data) == NULL)
+		return 0 ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+		dsc2f_array (pxi, psf->u.scbuf, readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* dpcm_read_dsc2f */
+
+static sf_count_t
+dpcm_read_dsc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	XI_PRIVATE	*pxi ;
+	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	double		normfact ;
+
+	if ((pxi = psf->codec_data) == NULL)
+		return 0 ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+		dsc2d_array (pxi, psf->u.scbuf, readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* dpcm_read_dsc2d */
+
+/*------------------------------------------------------------------------------
+*/
+
+static sf_count_t
+dpcm_read_dles2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	XI_PRIVATE	*pxi ;
+	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	if ((pxi = psf->codec_data) == NULL)
+		return 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		dles2s_array (pxi, psf->u.sbuf, readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* dpcm_read_dles2s */
+
+static sf_count_t
+dpcm_read_dles2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	XI_PRIVATE	*pxi ;
+	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+
+	if ((pxi = psf->codec_data) == NULL)
+		return 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		dles2i_array (pxi, psf->u.sbuf, readcount, ptr + total) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* dpcm_read_dles2i */
+
+static sf_count_t
+dpcm_read_dles2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	XI_PRIVATE	*pxi ;
+	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	float		normfact ;
+
+	if ((pxi = psf->codec_data) == NULL)
+		return 0 ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		dles2f_array (pxi, psf->u.sbuf, readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* dpcm_read_dles2f */
+
+static sf_count_t
+dpcm_read_dles2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	XI_PRIVATE	*pxi ;
+	int			bufferlen, readcount ;
+	sf_count_t	total = 0 ;
+	double		normfact ;
+
+	if ((pxi = psf->codec_data) == NULL)
+		return 0 ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		readcount = psf_fread (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		dles2d_array (pxi, psf->u.sbuf, readcount, ptr + total, normfact) ;
+		total += readcount ;
+		if (readcount < bufferlen)
+			break ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* dpcm_read_dles2d */
+
+/*==============================================================================
+*/
+
+static void s2dsc_array (XI_PRIVATE *pxi, const short *src, signed char *dest, int count) ;
+static void i2dsc_array (XI_PRIVATE *pxi, const int *src, signed char *dest, int count) ;
+static void f2dsc_array (XI_PRIVATE *pxi, const float *src, signed char *dest, int count, float normfact) ;
+static void d2dsc_array (XI_PRIVATE *pxi, const double *src, signed char *dest, int count, double normfact) ;
+
+static void	s2dles_array (XI_PRIVATE *pxi, const short *src, short *dest, int count) ;
+static void i2dles_array (XI_PRIVATE *pxi, const int *src, short *dest, int count) ;
+static void f2dles_array (XI_PRIVATE *pxi, const float *src, short *dest, int count, float normfact) ;
+static void d2dles_array (XI_PRIVATE *pxi, const double *src, short *dest, int count, double normfact) ;
+
+
+static sf_count_t
+dpcm_write_s2dsc (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	XI_PRIVATE	*pxi ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	if ((pxi = psf->codec_data) == NULL)
+		return 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		s2dsc_array (pxi, ptr + total, psf->u.scbuf, bufferlen) ;
+		writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* dpcm_write_s2dsc */
+
+static sf_count_t
+dpcm_write_i2dsc (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	XI_PRIVATE	*pxi ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	if ((pxi = psf->codec_data) == NULL)
+		return 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		i2dsc_array (pxi, ptr + total, psf->u.scbuf, bufferlen) ;
+		writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* dpcm_write_i2dsc */
+
+static sf_count_t
+dpcm_write_f2dsc (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	XI_PRIVATE	*pxi ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+	float		normfact ;
+
+	if ((pxi = psf->codec_data) == NULL)
+		return 0 ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7F) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		f2dsc_array (pxi, ptr + total, psf->u.scbuf, bufferlen, normfact) ;
+		writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* dpcm_write_f2dsc */
+
+static sf_count_t
+dpcm_write_d2dsc (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	XI_PRIVATE	*pxi ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+	double		normfact ;
+
+	if ((pxi = psf->codec_data) == NULL)
+		return 0 ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7F) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.ucbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		d2dsc_array (pxi, ptr + total, psf->u.scbuf, bufferlen, normfact) ;
+		writecount = psf_fwrite (psf->u.scbuf, sizeof (signed char), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* dpcm_write_d2dsc */
+
+
+static sf_count_t
+dpcm_write_s2dles (SF_PRIVATE *psf, const short *ptr, sf_count_t len)
+{	XI_PRIVATE	*pxi ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	if ((pxi = psf->codec_data) == NULL)
+		return 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		s2dles_array (pxi, ptr + total, psf->u.sbuf, bufferlen) ;
+		writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* dpcm_write_s2dles */
+
+static sf_count_t
+dpcm_write_i2dles (SF_PRIVATE *psf, const int *ptr, sf_count_t len)
+{	XI_PRIVATE	*pxi ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+
+	if ((pxi = psf->codec_data) == NULL)
+		return 0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		i2dles_array (pxi, ptr + total, psf->u.sbuf, bufferlen) ;
+		writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* dpcm_write_i2dles */
+
+static sf_count_t
+dpcm_write_f2dles (SF_PRIVATE *psf, const float *ptr, sf_count_t len)
+{	XI_PRIVATE	*pxi ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+	float		normfact ;
+
+	if ((pxi = psf->codec_data) == NULL)
+		return 0 ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		f2dles_array (pxi, ptr + total, psf->u.sbuf, bufferlen, normfact) ;
+		writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* dpcm_write_f2dles */
+
+static sf_count_t
+dpcm_write_d2dles (SF_PRIVATE *psf, const double *ptr, sf_count_t len)
+{	XI_PRIVATE	*pxi ;
+	int			bufferlen, writecount ;
+	sf_count_t	total = 0 ;
+	double		normfact ;
+
+	if ((pxi = psf->codec_data) == NULL)
+		return 0 ;
+
+	normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ;
+
+	bufferlen = ARRAY_LEN (psf->u.sbuf) ;
+
+	while (len > 0)
+	{	if (len < bufferlen)
+			bufferlen = (int) len ;
+		d2dles_array (pxi, ptr + total, psf->u.sbuf, bufferlen, normfact) ;
+		writecount = psf_fwrite (psf->u.sbuf, sizeof (short), bufferlen, psf) ;
+		total += writecount ;
+		if (writecount < bufferlen)
+			break ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* dpcm_write_d2dles */
+
+
+/*==============================================================================
+*/
+
+static void
+dsc2s_array (XI_PRIVATE *pxi, signed char *src, int count, short *dest)
+{	signed char	last_val ;
+	int			k ;
+
+	last_val = pxi->last_16 >> 8 ;
+
+	for (k = 0 ; k < count ; k++)
+	{	last_val += src [k] ;
+		dest [k] = last_val << 8 ;
+		} ;
+
+	pxi->last_16 = last_val << 8 ;
+} /* dsc2s_array */
+
+static void
+dsc2i_array (XI_PRIVATE *pxi, signed char *src, int count, int *dest)
+{	signed char	last_val ;
+	int			k ;
+
+	last_val = pxi->last_16 >> 8 ;
+
+	for (k = 0 ; k < count ; k++)
+	{	last_val += src [k] ;
+		dest [k] = last_val << 24 ;
+		} ;
+
+	pxi->last_16 = last_val << 8 ;
+} /* dsc2i_array */
+
+static void
+dsc2f_array (XI_PRIVATE *pxi, signed char *src, int count, float *dest, float normfact)
+{	signed char	last_val ;
+	int			k ;
+
+	last_val = pxi->last_16 >> 8 ;
+
+	for (k = 0 ; k < count ; k++)
+	{	last_val += src [k] ;
+		dest [k] = last_val * normfact ;
+		} ;
+
+	pxi->last_16 = last_val << 8 ;
+} /* dsc2f_array */
+
+static void
+dsc2d_array (XI_PRIVATE *pxi, signed char *src, int count, double *dest, double normfact)
+{	signed char	last_val ;
+	int			k ;
+
+	last_val = pxi->last_16 >> 8 ;
+
+	for (k = 0 ; k < count ; k++)
+	{	last_val += src [k] ;
+		dest [k] = last_val * normfact ;
+		} ;
+
+	pxi->last_16 = last_val << 8 ;
+} /* dsc2d_array */
+
+/*------------------------------------------------------------------------------
+*/
+
+static void
+s2dsc_array (XI_PRIVATE *pxi, const short *src, signed char *dest, int count)
+{	signed char	last_val, current ;
+	int			k ;
+
+	last_val = pxi->last_16 >> 8 ;
+
+	for (k = 0 ; k < count ; k++)
+	{	current = src [k] >> 8 ;
+		dest [k] = current - last_val ;
+		last_val = current ;
+		} ;
+
+	pxi->last_16 = last_val << 8 ;
+} /* s2dsc_array */
+
+static void
+i2dsc_array (XI_PRIVATE *pxi, const int *src, signed char *dest, int count)
+{	signed char	last_val, current ;
+	int			k ;
+
+	last_val = pxi->last_16 >> 8 ;
+
+	for (k = 0 ; k < count ; k++)
+	{	current = src [k] >> 24 ;
+		dest [k] = current - last_val ;
+		last_val = current ;
+		} ;
+
+	pxi->last_16 = last_val << 8 ;
+} /* i2dsc_array */
+
+static void
+f2dsc_array (XI_PRIVATE *pxi, const float *src, signed char *dest, int count, float normfact)
+{	signed char	last_val, current ;
+	int			k ;
+
+	last_val = pxi->last_16 >> 8 ;
+
+	for (k = 0 ; k < count ; k++)
+	{	current = lrintf (src [k] * normfact) ;
+		dest [k] = current - last_val ;
+		last_val = current ;
+		} ;
+
+	pxi->last_16 = last_val << 8 ;
+} /* f2dsc_array */
+
+static void
+d2dsc_array (XI_PRIVATE *pxi, const double *src, signed char *dest, int count, double normfact)
+{	signed char	last_val, current ;
+	int			k ;
+
+	last_val = pxi->last_16 >> 8 ;
+
+	for (k = 0 ; k < count ; k++)
+	{	current = lrint (src [k] * normfact) ;
+		dest [k] = current - last_val ;
+		last_val = current ;
+		} ;
+
+	pxi->last_16 = last_val << 8 ;
+} /* d2dsc_array */
+
+/*==============================================================================
+*/
+
+static void
+dles2s_array (XI_PRIVATE *pxi, short *src, int count, short *dest)
+{	short	last_val ;
+	int		k ;
+
+	last_val = pxi->last_16 ;
+
+	for (k = 0 ; k < count ; k++)
+	{	last_val += LES2H_SHORT (src [k]) ;
+		dest [k] = last_val ;
+		} ;
+
+	pxi->last_16 = last_val ;
+} /* dles2s_array */
+
+static void
+dles2i_array (XI_PRIVATE *pxi, short *src, int count, int *dest)
+{	short	last_val ;
+	int		k ;
+
+	last_val = pxi->last_16 ;
+
+	for (k = 0 ; k < count ; k++)
+	{	last_val += LES2H_SHORT (src [k]) ;
+		dest [k] = last_val << 16 ;
+		} ;
+
+	pxi->last_16 = last_val ;
+} /* dles2i_array */
+
+static void
+dles2f_array (XI_PRIVATE *pxi, short *src, int count, float *dest, float normfact)
+{	short	last_val ;
+	int		k ;
+
+	last_val = pxi->last_16 ;
+
+	for (k = 0 ; k < count ; k++)
+	{	last_val += LES2H_SHORT (src [k]) ;
+		dest [k] = last_val * normfact ;
+		} ;
+
+	pxi->last_16 = last_val ;
+} /* dles2f_array */
+
+static void
+dles2d_array (XI_PRIVATE *pxi, short *src, int count, double *dest, double normfact)
+{	short	last_val ;
+	int		k ;
+
+	last_val = pxi->last_16 ;
+
+	for (k = 0 ; k < count ; k++)
+	{	last_val += LES2H_SHORT (src [k]) ;
+		dest [k] = last_val * normfact ;
+		} ;
+
+	pxi->last_16 = last_val ;
+} /* dles2d_array */
+
+/*------------------------------------------------------------------------------
+*/
+
+static void
+s2dles_array (XI_PRIVATE *pxi, const short *src, short *dest, int count)
+{	short	diff, last_val ;
+	int		k ;
+
+	last_val = pxi->last_16 ;
+
+	for (k = 0 ; k < count ; k++)
+	{	diff = src [k] - last_val ;
+		dest [k] = LES2H_SHORT (diff) ;
+		last_val = src [k] ;
+		} ;
+
+	pxi->last_16 = last_val ;
+} /* s2dles_array */
+
+static void
+i2dles_array (XI_PRIVATE *pxi, const int *src, short *dest, int count)
+{	short	diff, last_val ;
+	int		k ;
+
+	last_val = pxi->last_16 ;
+
+	for (k = 0 ; k < count ; k++)
+	{	diff = (src [k] >> 16) - last_val ;
+		dest [k] = LES2H_SHORT (diff) ;
+		last_val = src [k] >> 16 ;
+		} ;
+
+	pxi->last_16 = last_val ;
+} /* i2dles_array */
+
+static void
+f2dles_array (XI_PRIVATE *pxi, const float *src, short *dest, int count, float normfact)
+{	short	diff, last_val, current ;
+	int		k ;
+
+	last_val = pxi->last_16 ;
+
+	for (k = 0 ; k < count ; k++)
+	{	current = lrintf (src [k] * normfact) ;
+		diff = current - last_val ;
+		dest [k] = LES2H_SHORT (diff) ;
+		last_val = current ;
+		} ;
+
+	pxi->last_16 = last_val ;
+} /* f2dles_array */
+
+static void
+d2dles_array (XI_PRIVATE *pxi, const double *src, short *dest, int count, double normfact)
+{	short	diff, last_val, current ;
+	int		k ;
+
+	last_val = pxi->last_16 ;
+
+	for (k = 0 ; k < count ; k++)
+	{	current = lrint (src [k] * normfact) ;
+		diff = current - last_val ;
+		dest [k] = LES2H_SHORT (diff) ;
+		last_val = current ;
+		} ;
+
+	pxi->last_16 = last_val ;
+} /* d2dles_array */
+
diff --git a/jni/libsndfile-1.0.25/src/xi.lo b/jni/libsndfile-1.0.25/src/xi.lo
new file mode 100644
index 0000000..9f2a764
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/xi.lo
@@ -0,0 +1,12 @@
+# xi.lo - a libtool object file
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-2
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/xi.o'
+
+# Name of the non-PIC object
+non_pic_object='xi.o'
+
diff --git a/jni/libsndfile-1.0.25/src/xi.o b/jni/libsndfile-1.0.25/src/xi.o
new file mode 100644
index 0000000..19a1337
--- /dev/null
+++ b/jni/libsndfile-1.0.25/src/xi.o
Binary files differ