[Pkg-sdl-commits] [libsdl2-mixer] 02/11: Imported Upstream version 2.0.1+dfsg1

Manuel A. Fernandez Montecelo mafm at moszumanska.debian.org
Tue Jan 26 18:05:10 UTC 2016


This is an automated email from the git hooks/post-receive script.

mafm pushed a commit to branch master
in repository libsdl2-mixer.

commit b1f964791e95de94d49194ec0da88446be8d7017
Author: Manuel A. Fernandez Montecelo <mafm at debian.org>
Date:   Tue Jan 26 16:07:22 2016 +0000

    Imported Upstream version 2.0.1+dfsg1
---
 Android.mk                       |  36 ++-
 CHANGES.txt                      |  10 +
 COPYING.txt                      |   2 +-
 Makefile.in                      |   2 +-
 SDL2_mixer.spec                  |   4 +-
 SDL_mixer.h                      |   8 +-
 build-scripts/config.guess       | 301 +++++++++++++----------
 build-scripts/config.sub         | 251 +++++++++++++------
 configure                        |  39 +--
 configure.in                     |  27 +-
 dynamic_flac.c                   |   2 +-
 dynamic_flac.h                   |   2 +-
 dynamic_fluidsynth.c             |   2 +-
 dynamic_fluidsynth.h             |   2 +-
 dynamic_mod.c                    |   2 +-
 dynamic_mod.h                    |   2 +-
 dynamic_modplug.c                |   2 +-
 dynamic_modplug.h                |   8 +-
 dynamic_mp3.c                    |   2 +-
 dynamic_mp3.h                    |   2 +-
 dynamic_ogg.c                    |   2 +-
 dynamic_ogg.h                    |   8 +-
 effect_position.c                |   2 +-
 effect_stereoreverse.c           |   2 +-
 effects_internal.c               |   2 +-
 effects_internal.h               |   2 +-
 fluidsynth.c                     |   3 +-
 fluidsynth.h                     |   2 +-
 load_aiff.c                      |   2 +-
 load_aiff.h                      |   2 +-
 load_flac.c                      |   2 +-
 load_flac.h                      |   2 +-
 load_mp3.c                       | 195 +++++++++++++++
 load_flac.h => load_mp3.h        |  11 +-
 load_ogg.c                       |  17 +-
 load_ogg.h                       |   2 +-
 load_voc.c                       |   2 +-
 load_voc.h                       |   2 +-
 mixer.c                          |  49 +++-
 music.c                          |   4 +-
 music_cmd.c                      |   2 +-
 music_cmd.h                      |   2 +-
 music_flac.c                     |   2 +-
 music_flac.h                     |   2 +-
 music_mad.c                      |   2 +-
 music_mad.h                      |   2 +-
 music_mod.c                      |   2 +-
 music_mod.h                      |   2 +-
 music_modplug.c                  |   2 +-
 music_modplug.h                  |   8 +-
 music_ogg.c                      |  10 +-
 music_ogg.h                      |   8 +-
 native_midi/native_midi_common.c |   3 +-
 playmus.c                        |   2 +-
 playwave.c                       |   2 +-
 timidity/playmidi.c              |   2 +-
 timidity/readmidi.c              |   6 +-
 timidity/timidity.c              |  18 +-
 version.rc                       |  10 +-
 wavestream.c                     | 515 ++++++++++++++++++++++++---------------
 wavestream.h                     |  19 +-
 61 files changed, 1111 insertions(+), 529 deletions(-)

diff --git a/Android.mk b/Android.mk
index 81c94b5..a5b7100 100644
--- a/Android.mk
+++ b/Android.mk
@@ -6,38 +6,48 @@ LOCAL_MODULE := SDL2_mixer
 
 # Enable this if you want to support loading MOD music via modplug
 # The library path should be a relative path to this directory.
-SUPPORT_MOD_MODPLUG := true
+SUPPORT_MOD_MODPLUG ?= true
 MODPLUG_LIBRARY_PATH := external/libmodplug-0.8.8.4
 
 # Enable this if you want to support loading MOD music via mikmod
 # The library path should be a relative path to this directory.
-SUPPORT_MOD_MIKMOD := true
+SUPPORT_MOD_MIKMOD ?= true
 MIKMOD_LIBRARY_PATH := external/libmikmod-3.1.12
 
 # Enable this if you want to support loading MP3 music via SMPEG
 # The library path should be a relative path to this directory.
-SUPPORT_MP3_SMPEG := true
+SUPPORT_MP3_SMPEG ?= true
 SMPEG_LIBRARY_PATH := external/smpeg2-2.0.0
 
 # Enable this if you want to support loading OGG Vorbis music via Tremor
 # The library path should be a relative path to this directory.
-SUPPORT_OGG := true
+SUPPORT_OGG ?= true
 OGG_LIBRARY_PATH := external/libogg-1.3.1
 VORBIS_LIBRARY_PATH := external/libvorbisidec-1.2.1
 
 
-LOCAL_C_INCLUDES := $(LOCAL_PATH)
-LOCAL_CFLAGS := -DWAV_MUSIC
+# Enable this if you want to support TiMidity
+SUPPORT_TIMIDITY ?= true
+
+LOCAL_C_INCLUDES := $(LOCAL_PATH) 
+LOCAL_CFLAGS := -DWAV_MUSIC 
+
+LOCAL_SRC_FILES := $(notdir $(filter-out %/playmus.c %/playwave.c, $(wildcard $(LOCAL_PATH)/*.c))) \
 
-LOCAL_SRC_FILES := $(notdir $(filter-out %/playmus.c %/playwave.c, $(wildcard $(LOCAL_PATH)/*.c)))
 
 LOCAL_LDLIBS :=
 LOCAL_STATIC_LIBRARIES :=
 LOCAL_SHARED_LIBRARIES := SDL2
 
+ifeq ($(SUPPORT_TIMIDITY),true)
+	LOCAL_C_INCLUDES += $(LOCAL_PATH)/timidity
+	LOCAL_CFLAGS += -DMID_MUSIC -DUSE_TIMIDITY_MIDI
+	LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/timidity/*.c))
+endif
+
 ifeq ($(SUPPORT_MOD_MODPLUG),true)
     LOCAL_C_INCLUDES += $(LOCAL_PATH)/$(MODPLUG_LIBRARY_PATH)/src $(LOCAL_PATH)/$(MODPLUG_LIBRARY_PATH)/src/libmodplug
-    LOCAL_CFLAGS += -DMODPLUG_MUSIC -DHAVE_SETENV -DHAVE_SINF
+    LOCAL_CFLAGS += -DMODPLUG_MUSIC -DMODPLUG_HEADER="<modplug.h>" -DHAVE_SETENV -DHAVE_SINF
     LOCAL_SRC_FILES += \
         $(MODPLUG_LIBRARY_PATH)/src/fastmix.cpp \
         $(MODPLUG_LIBRARY_PATH)/src/load_669.cpp \
@@ -89,7 +99,13 @@ endif
 
 ifeq ($(SUPPORT_OGG),true)
     LOCAL_C_INCLUDES += $(LOCAL_PATH)/$(OGG_LIBRARY_PATH)/include $(LOCAL_PATH)/$(VORBIS_LIBRARY_PATH)
-    LOCAL_CFLAGS += -DOGG_MUSIC -DOGG_USE_TREMOR
+    LOCAL_CFLAGS += -DOGG_MUSIC -DOGG_USE_TREMOR -DOGG_HEADER="<ivorbisfile.h>"
+    ifeq ($(TARGET_ARCH_ABI),armeabi)
+	LOCAL_CFLAGS += -D_ARM_ASSEM_
+    endif
+    ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
+	LOCAL_CFLAGS += -D_ARM_ASSEM_
+    endif
     LOCAL_SRC_FILES += \
         $(VORBIS_LIBRARY_PATH)/mdct.c \
         $(VORBIS_LIBRARY_PATH)/block.c \
@@ -110,4 +126,6 @@ endif
 
 LOCAL_EXPORT_C_INCLUDES += $(LOCAL_C_INCLUDES)
 
+LOCAL_ARM_MODE := arm
+
 include $(BUILD_SHARED_LIBRARY)
diff --git a/CHANGES.txt b/CHANGES.txt
index 29398cf..1eb0834 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,3 +1,13 @@
+2.0.1:
+Sam Lantinga - Tue Jul  7 11:40:33 PDT 2015
+ * Added support for 'smpl' format loop points in music WAV files
+Sam Lantinga - Sat Aug 23 10:57:26 2014
+ * Fixed floating point exception in Mix_Volume()
+David Ludwig - Mon Apr 14 22:15:36 2014
+ * Added support for building for Windows RT and Windows Phone
+Isaac Burns - Sun Sep 15 21:50:27 PDT 2013
+ * Added support for loading MP3 files as sound chunks
+
 2.0.0:
 Sam Lantinga - Sun Jun  9 14:45:30 PDT 2013
  * Made libmodplug the default MOD player as it is now in the public domain
diff --git a/COPYING.txt b/COPYING.txt
index b92b0da..b7bd3d9 100644
--- a/COPYING.txt
+++ b/COPYING.txt
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/Makefile.in b/Makefile.in
index 1df22e5..d5e76a2 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -39,7 +39,7 @@ VERSION_OBJECTS = @VERSION_OBJECTS@
 PLAYWAVE_OBJECTS = @PLAYWAVE_OBJECTS@
 PLAYMUS_OBJECTS = @PLAYMUS_OBJECTS@
 
-DIST = *.txt Android.mk Makefile.in SDL2_mixer.pc.in SDL_mixer.h SDL2_mixer.spec SDL2_mixer.spec.in debian VisualC Xcode Xcode-iOS acinclude autogen.sh build-scripts configure configure.in dynamic_flac.c dynamic_flac.h dynamic_fluidsynth.c dynamic_fluidsynth.h dynamic_modplug.c dynamic_modplug.h dynamic_mod.c dynamic_mod.h dynamic_mp3.c dynamic_mp3.h dynamic_ogg.c dynamic_ogg.h effect_position.c effect_stereoreverse.c effects_internal.c effects_internal.h fluidsynth.c fluidsynth.h extern [...]
+DIST = *.txt Android.mk Makefile.in SDL2_mixer.pc.in SDL_mixer.h SDL2_mixer.spec SDL2_mixer.spec.in debian VisualC Xcode Xcode-iOS acinclude autogen.sh build-scripts configure configure.in dynamic_flac.c dynamic_flac.h dynamic_fluidsynth.c dynamic_fluidsynth.h dynamic_modplug.c dynamic_modplug.h dynamic_mod.c dynamic_mod.h dynamic_mp3.c dynamic_mp3.h dynamic_ogg.c dynamic_ogg.h effect_position.c effect_stereoreverse.c effects_internal.c effects_internal.h fluidsynth.c fluidsynth.h extern [...]
 
 LT_AGE      = @LT_AGE@
 LT_CURRENT  = @LT_CURRENT@
diff --git a/SDL2_mixer.spec b/SDL2_mixer.spec
index 297fbdd..dfa45e7 100644
--- a/SDL2_mixer.spec
+++ b/SDL2_mixer.spec
@@ -1,5 +1,5 @@
 %define name SDL2_mixer
-%define version 2.0.0
+%define version 2.0.1
 %define release 1
 
 Summary: Simple DirectMedia Layer - Sample Mixer Library
@@ -45,7 +45,7 @@ rm -rf $RPM_BUILD_ROOT
 
 %files
 %defattr(-,root,root)
-%doc README CHANGES COPYING
+%doc README.txt CHANGES.txt COPYING.txt
 %{prefix}/lib/lib*.so.*
 
 %files devel
diff --git a/SDL_mixer.h b/SDL_mixer.h
index 53fac6d..71c1f5c 100644
--- a/SDL_mixer.h
+++ b/SDL_mixer.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -40,7 +40,7 @@ extern "C" {
 */
 #define SDL_MIXER_MAJOR_VERSION 2
 #define SDL_MIXER_MINOR_VERSION 0
-#define SDL_MIXER_PATCHLEVEL    0
+#define SDL_MIXER_PATCHLEVEL    1
 
 /* This macro can be used to fill a version structure with the compile-time
  * version of the SDL_mixer library.
@@ -207,8 +207,8 @@ extern DECLSPEC void SDLCALL Mix_SetPostMix(void (*mix_func)(void *udata, Uint8
  */
 extern DECLSPEC void SDLCALL Mix_HookMusic(void (*mix_func)(void *udata, Uint8 *stream, int len), void *arg);
 
-/* Add your own callback when the music has finished playing.
-   This callback is only called if the music finishes naturally.
+/* Add your own callback for when the music has finished playing or when it is
+ * stopped from a call to Mix_HaltMusic.
  */
 extern DECLSPEC void SDLCALL Mix_HookMusicFinished(void (*music_finished)(void));
 
diff --git a/build-scripts/config.guess b/build-scripts/config.guess
index e792aac..ddb3622 100755
--- a/build-scripts/config.guess
+++ b/build-scripts/config.guess
@@ -1,10 +1,10 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
 #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-#   Free Software Foundation, Inc.
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+#   2011, 2012 Free Software Foundation, Inc.
 
-timestamp='2009-09-18'
+timestamp='2012-08-14'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -17,9 +17,7 @@ timestamp='2009-09-18'
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
@@ -56,8 +54,9 @@ version="\
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -144,7 +143,7 @@ UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
 case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     *:NetBSD:*:*)
 	# NetBSD (nbsd) targets should (where applicable) match one or
-	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
 	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
 	# switched to ELF, *-*-netbsd* would select the old
 	# object file format.  This provides both forward
@@ -180,7 +179,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 		fi
 		;;
 	    *)
-	        os=netbsd
+		os=netbsd
 		;;
 	esac
 	# The OS release
@@ -201,6 +200,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
 	echo "${machine}-${os}${release}"
 	exit ;;
+    *:Bitrig:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
+	exit ;;
     *:OpenBSD:*:*)
 	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
 	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
@@ -223,7 +226,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
 		;;
 	*5.*)
-	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
 		;;
 	esac
 	# According to Compaq, /usr/sbin/psrinfo has been available on
@@ -269,7 +272,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	# A Xn.n version is an unreleased experimental baselevel.
 	# 1.2 uses "1.2" for uname -r.
 	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	exit ;;
+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+	exitcode=$?
+	trap '' 0
+	exit $exitcode ;;
     Alpha\ *:Windows_NT*:*)
 	# How do we know it's Interix rather than the generic POSIX subsystem?
 	# Should we change UNAME_MACHINE based on the output of uname instead
@@ -295,7 +301,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	echo s390-ibm-zvmoe
 	exit ;;
     *:OS400:*:*)
-        echo powerpc-ibm-os400
+	echo powerpc-ibm-os400
 	exit ;;
     arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
 	echo arm-acorn-riscix${UNAME_RELEASE}
@@ -333,6 +339,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
 	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
 	exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+	echo i386-pc-auroraux${UNAME_RELEASE}
+	exit ;;
     i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
 	eval $set_cc_for_build
 	SUN_ARCH="i386"
@@ -391,23 +400,23 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     # MiNT.  But MiNT is downward compatible to TOS, so this should
     # be no problem.
     atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
+	echo m68k-atari-mint${UNAME_RELEASE}
 	exit ;;
     atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
 	echo m68k-atari-mint${UNAME_RELEASE}
-        exit ;;
+	exit ;;
     *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
+	echo m68k-atari-mint${UNAME_RELEASE}
 	exit ;;
     milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-        echo m68k-milan-mint${UNAME_RELEASE}
-        exit ;;
+	echo m68k-milan-mint${UNAME_RELEASE}
+	exit ;;
     hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-        echo m68k-hades-mint${UNAME_RELEASE}
-        exit ;;
+	echo m68k-hades-mint${UNAME_RELEASE}
+	exit ;;
     *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-        echo m68k-unknown-mint${UNAME_RELEASE}
-        exit ;;
+	echo m68k-unknown-mint${UNAME_RELEASE}
+	exit ;;
     m68k:machten:*:*)
 	echo m68k-apple-machten${UNAME_RELEASE}
 	exit ;;
@@ -477,8 +486,8 @@ EOF
 	echo m88k-motorola-sysv3
 	exit ;;
     AViiON:dgux:*:*)
-        # DG/UX returns AViiON for all architectures
-        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	# DG/UX returns AViiON for all architectures
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
 	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
 	then
 	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
@@ -491,7 +500,7 @@ EOF
 	else
 	    echo i586-dg-dgux${UNAME_RELEASE}
 	fi
- 	exit ;;
+	exit ;;
     M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
 	echo m88k-dolphin-sysv3
 	exit ;;
@@ -548,7 +557,7 @@ EOF
 		echo rs6000-ibm-aix3.2
 	fi
 	exit ;;
-    *:AIX:*:[456])
+    *:AIX:*:[4567])
 	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
 	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
 		IBM_ARCH=rs6000
@@ -591,52 +600,52 @@ EOF
 	    9000/[678][0-9][0-9])
 		if [ -x /usr/bin/getconf ]; then
 		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
-                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
-                    case "${sc_cpu_version}" in
-                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
-                      532)                      # CPU_PA_RISC2_0
-                        case "${sc_kernel_bits}" in
-                          32) HP_ARCH="hppa2.0n" ;;
-                          64) HP_ARCH="hppa2.0w" ;;
+		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+		    case "${sc_cpu_version}" in
+		      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+		      532)                      # CPU_PA_RISC2_0
+			case "${sc_kernel_bits}" in
+			  32) HP_ARCH="hppa2.0n" ;;
+			  64) HP_ARCH="hppa2.0w" ;;
 			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
-                        esac ;;
-                    esac
+			esac ;;
+		    esac
 		fi
 		if [ "${HP_ARCH}" = "" ]; then
 		    eval $set_cc_for_build
-		    sed 's/^              //' << EOF >$dummy.c
+		    sed 's/^		//' << EOF >$dummy.c
 
-              #define _HPUX_SOURCE
-              #include <stdlib.h>
-              #include <unistd.h>
+		#define _HPUX_SOURCE
+		#include <stdlib.h>
+		#include <unistd.h>
 
-              int main ()
-              {
-              #if defined(_SC_KERNEL_BITS)
-                  long bits = sysconf(_SC_KERNEL_BITS);
-              #endif
-                  long cpu  = sysconf (_SC_CPU_VERSION);
+		int main ()
+		{
+		#if defined(_SC_KERNEL_BITS)
+		    long bits = sysconf(_SC_KERNEL_BITS);
+		#endif
+		    long cpu  = sysconf (_SC_CPU_VERSION);
 
-                  switch (cpu)
-              	{
-              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-              	case CPU_PA_RISC2_0:
-              #if defined(_SC_KERNEL_BITS)
-              	    switch (bits)
-              		{
-              		case 64: puts ("hppa2.0w"); break;
-              		case 32: puts ("hppa2.0n"); break;
-              		default: puts ("hppa2.0"); break;
-              		} break;
-              #else  /* !defined(_SC_KERNEL_BITS) */
-              	    puts ("hppa2.0"); break;
-              #endif
-              	default: puts ("hppa1.0"); break;
-              	}
-                  exit (0);
-              }
+		    switch (cpu)
+			{
+			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+			case CPU_PA_RISC2_0:
+		#if defined(_SC_KERNEL_BITS)
+			    switch (bits)
+				{
+				case 64: puts ("hppa2.0w"); break;
+				case 32: puts ("hppa2.0n"); break;
+				default: puts ("hppa2.0"); break;
+				} break;
+		#else  /* !defined(_SC_KERNEL_BITS) */
+			    puts ("hppa2.0"); break;
+		#endif
+			default: puts ("hppa1.0"); break;
+			}
+		    exit (0);
+		}
 EOF
 		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
 		    test -z "$HP_ARCH" && HP_ARCH=hppa
@@ -727,22 +736,22 @@ EOF
 	exit ;;
     C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
 	echo c1-convex-bsd
-        exit ;;
+	exit ;;
     C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
 	if getsysinfo -f scalar_acc
 	then echo c32-convex-bsd
 	else echo c2-convex-bsd
 	fi
-        exit ;;
+	exit ;;
     C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
 	echo c34-convex-bsd
-        exit ;;
+	exit ;;
     C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
 	echo c38-convex-bsd
-        exit ;;
+	exit ;;
     C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
 	echo c4-convex-bsd
-        exit ;;
+	exit ;;
     CRAY*Y-MP:*:*:*)
 	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 	exit ;;
@@ -766,14 +775,14 @@ EOF
 	exit ;;
     F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
 	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-        exit ;;
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
     5000:UNIX_System_V:4.*:*)
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
-        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
 	exit ;;
     i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
 	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
@@ -785,34 +794,39 @@ EOF
 	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
 	exit ;;
     *:FreeBSD:*:*)
-	case ${UNAME_MACHINE} in
-	    pc98)
-		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	case ${UNAME_PROCESSOR} in
 	    amd64)
 		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
 	    *)
-		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
 	esac
 	exit ;;
     i*:CYGWIN*:*)
 	echo ${UNAME_MACHINE}-pc-cygwin
 	exit ;;
+    *:MINGW64*:*)
+	echo ${UNAME_MACHINE}-pc-mingw64
+	exit ;;
     *:MINGW*:*)
 	echo ${UNAME_MACHINE}-pc-mingw32
 	exit ;;
+    i*:MSYS*:*)
+	echo ${UNAME_MACHINE}-pc-msys
+	exit ;;
     i*:windows32*:*)
-    	# uname -m includes "-pc" on this system.
-    	echo ${UNAME_MACHINE}-mingw32
+	# uname -m includes "-pc" on this system.
+	echo ${UNAME_MACHINE}-mingw32
 	exit ;;
     i*:PW*:*)
 	echo ${UNAME_MACHINE}-pc-pw32
 	exit ;;
-    *:Interix*:[3456]*)
-    	case ${UNAME_MACHINE} in
+    *:Interix*:*)
+	case ${UNAME_MACHINE} in
 	    x86)
 		echo i586-pc-interix${UNAME_RELEASE}
 		exit ;;
-	    EM64T | authenticamd | genuineintel)
+	    authenticamd | genuineintel | EM64T)
 		echo x86_64-unknown-interix${UNAME_RELEASE}
 		exit ;;
 	    IA64)
@@ -854,6 +868,13 @@ EOF
     i*86:Minix:*:*)
 	echo ${UNAME_MACHINE}-pc-minix
 	exit ;;
+    aarch64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    aarch64_be:Linux:*:*)
+	UNAME_MACHINE=aarch64_be
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
     alpha:Linux:*:*)
 	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
 	  EV5)   UNAME_MACHINE=alphaev5 ;;
@@ -863,7 +884,7 @@ EOF
 	  EV6)   UNAME_MACHINE=alphaev6 ;;
 	  EV67)  UNAME_MACHINE=alphaev67 ;;
 	  EV68*) UNAME_MACHINE=alphaev68 ;;
-        esac
+	esac
 	objdump --private-headers /bin/sh | grep -q ld.so.1
 	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
 	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
@@ -875,23 +896,44 @@ EOF
 	then
 	    echo ${UNAME_MACHINE}-unknown-linux-gnu
 	else
-	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+        case `sed -n '/^Hardware/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+        BCM2708) MANUFACTURER=raspberry;;
+        *) MANUFACTURER=unknown;;
+        esac
+	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+		| grep -q __ARM_PCS_VFP
+	    then
+		echo ${UNAME_MACHINE}-${MANUFACTURER}-linux-gnueabi
+	    else
+		echo ${UNAME_MACHINE}-${MANUFACTURER}-linux-gnueabihf
+	    fi
 	fi
 	exit ;;
     avr32*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     cris:Linux:*:*)
-	echo cris-axis-linux-gnu
+	echo ${UNAME_MACHINE}-axis-linux-gnu
 	exit ;;
     crisv32:Linux:*:*)
-	echo crisv32-axis-linux-gnu
+	echo ${UNAME_MACHINE}-axis-linux-gnu
 	exit ;;
     frv:Linux:*:*)
-    	echo frv-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    hexagon:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     i*86:Linux:*:*)
-	echo ${UNAME_MACHINE}-pc-linux-gnu
+	LIBC=gnu
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
 	exit ;;
     ia64:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-gnu
@@ -918,15 +960,11 @@ EOF
 	#endif
 	#endif
 EOF
-	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
-	    /^CPU/{
-		s: ::g
-		p
-	    }'`"
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
 	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
 	;;
     or32:Linux:*:*)
-	echo or32-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     padre:Linux:*:*)
 	echo sparc-unknown-linux-gnu
@@ -952,7 +990,7 @@ EOF
 	echo ${UNAME_MACHINE}-ibm-linux
 	exit ;;
     sh64*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     sh*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-gnu
@@ -960,14 +998,17 @@ EOF
     sparc:Linux:*:* | sparc64:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
+    tile*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
     vax:Linux:*:*)
 	echo ${UNAME_MACHINE}-dec-linux-gnu
 	exit ;;
     x86_64:Linux:*:*)
-	echo x86_64-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     xtensa*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     i*86:DYNIX/ptx:4*:*)
 	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
@@ -976,11 +1017,11 @@ EOF
 	echo i386-sequent-sysv4
 	exit ;;
     i*86:UNIX_SV:4.2MP:2.*)
-        # Unixware is an offshoot of SVR4, but it has its own version
-        # number series starting with 2...
-        # I am not positive that other SVR4 systems won't match this,
+	# Unixware is an offshoot of SVR4, but it has its own version
+	# number series starting with 2...
+	# I am not positive that other SVR4 systems won't match this,
 	# I just have to hope.  -- rms.
-        # Use sysv4.2uw... so that sysv4* matches it.
+	# Use sysv4.2uw... so that sysv4* matches it.
 	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
 	exit ;;
     i*86:OS/2:*:*)
@@ -1012,7 +1053,7 @@ EOF
 	fi
 	exit ;;
     i*86:*:5:[678]*)
-    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	# UnixWare 7.x, OpenUNIX and OpenServer 6.
 	case `/bin/uname -X | grep "^Machine"` in
 	    *486*)	     UNAME_MACHINE=i486 ;;
 	    *Pentium)	     UNAME_MACHINE=i586 ;;
@@ -1040,13 +1081,13 @@ EOF
 	exit ;;
     pc:*:*:*)
 	# Left here for compatibility:
-        # uname -m prints for DJGPP always 'pc', but it prints nothing about
-        # the processor, so we play safe by assuming i586.
+	# uname -m prints for DJGPP always 'pc', but it prints nothing about
+	# the processor, so we play safe by assuming i586.
 	# Note: whatever this is, it MUST be the same as what config.sub
 	# prints for the "djgpp" host, or else GDB configury will decide that
 	# this is a cross-build.
 	echo i586-pc-msdosdjgpp
-        exit ;;
+	exit ;;
     Intel:Mach:3*:*)
 	echo i386-pc-mach3
 	exit ;;
@@ -1081,8 +1122,8 @@ EOF
 	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
 	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
     3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && { echo i486-ncr-sysv4; exit; } ;;
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4; exit; } ;;
     NCR*:*:4.2:* | MPRAS*:*:4.2:*)
 	OS_REL='.3'
 	test -r /etc/.relid \
@@ -1125,10 +1166,10 @@ EOF
 		echo ns32k-sni-sysv
 	fi
 	exit ;;
-    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                      # says <Richard.M.Bartel at ccMail.Census.GOV>
-        echo i586-unisys-sysv4
-        exit ;;
+    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+			# says <Richard.M.Bartel at ccMail.Census.GOV>
+	echo i586-unisys-sysv4
+	exit ;;
     *:UNIX_System_V:4*:FTX*)
 	# From Gerald Hewes <hewes at openmarket.com>.
 	# How about differentiating between stratus architectures? -djm
@@ -1154,11 +1195,11 @@ EOF
 	exit ;;
     R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
 	if [ -d /usr/nec ]; then
-	        echo mips-nec-sysv${UNAME_RELEASE}
+		echo mips-nec-sysv${UNAME_RELEASE}
 	else
-	        echo mips-unknown-sysv${UNAME_RELEASE}
+		echo mips-unknown-sysv${UNAME_RELEASE}
 	fi
-        exit ;;
+	exit ;;
     BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
 	echo powerpc-be-beos
 	exit ;;
@@ -1171,6 +1212,9 @@ EOF
     BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
 	echo i586-pc-haiku
 	exit ;;
+    x86_64:Haiku:*:*)
+	echo x86_64-unknown-haiku
+	exit ;;
     SX-4:SUPER-UX:*:*)
 	echo sx4-nec-superux${UNAME_RELEASE}
 	exit ;;
@@ -1223,7 +1267,10 @@ EOF
     *:QNX:*:4*)
 	echo i386-pc-qnx
 	exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
+    NEO-?:NONSTOP_KERNEL:*:*)
+	echo neo-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSE-*:NONSTOP_KERNEL:*:*)
 	echo nse-tandem-nsk${UNAME_RELEASE}
 	exit ;;
     NSR-?:NONSTOP_KERNEL:*:*)
@@ -1268,13 +1315,13 @@ EOF
 	echo pdp10-unknown-its
 	exit ;;
     SEI:*:*:SEIUX)
-        echo mips-sei-seiux${UNAME_RELEASE}
+	echo mips-sei-seiux${UNAME_RELEASE}
 	exit ;;
     *:DragonFly:*:*)
 	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
 	exit ;;
     *:*VMS:*:*)
-    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	UNAME_MACHINE=`(uname -p) 2>/dev/null`
 	case "${UNAME_MACHINE}" in
 	    A*) echo alpha-dec-vms ; exit ;;
 	    I*) echo ia64-dec-vms ; exit ;;
@@ -1292,11 +1339,11 @@ EOF
     i*86:AROS:*:*)
 	echo ${UNAME_MACHINE}-pc-aros
 	exit ;;
+    x86_64:VMkernel:*:*)
+	echo ${UNAME_MACHINE}-unknown-esx
+	exit ;;
 esac
 
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
 eval $set_cc_for_build
 cat >$dummy.c <<EOF
 #ifdef _SEQUENT_
@@ -1314,11 +1361,11 @@ main ()
 #include <sys/param.h>
   printf ("m68k-sony-newsos%s\n",
 #ifdef NEWSOS4
-          "4"
+	"4"
 #else
-	  ""
+	""
 #endif
-         ); exit (0);
+	); exit (0);
 #endif
 #endif
 
diff --git a/build-scripts/config.sub b/build-scripts/config.sub
index 5ecc18b..ce5e0e6 100755
--- a/build-scripts/config.sub
+++ b/build-scripts/config.sub
@@ -1,10 +1,10 @@
 #! /bin/sh
 # Configuration validation subroutine script.
 #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-#   Free Software Foundation, Inc.
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+#   2011, 2012 Free Software Foundation, Inc.
 
-timestamp='2009-10-07'
+timestamp='2012-08-18'
 
 # This file is (in principle) common to ALL GNU software.
 # The presence of a machine in this file suggests that SOME GNU software
@@ -21,9 +21,7 @@ timestamp='2009-10-07'
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
@@ -75,8 +73,9 @@ Report bugs and patches to <config-patches at gnu.org>."
 version="\
 GNU config.sub ($timestamp)
 
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -123,13 +122,18 @@ esac
 # Here we must recognize all the valid KERNEL-OS combinations.
 maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
-  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | \
   kopensolaris*-gnu* | \
   storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
     ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
   *)
     basic_machine=`echo $1 | sed 's/-[^-]*$//'`
     if [ $basic_machine != $1 ]
@@ -156,8 +160,8 @@ case $os in
 		os=
 		basic_machine=$1
 		;;
-        -bluegene*)
-	        os=-cnk
+	-bluegene*)
+		os=-cnk
 		;;
 	-sim | -cisco | -oki | -wec | -winbond)
 		os=
@@ -173,10 +177,10 @@ case $os in
 		os=-chorusos
 		basic_machine=$1
 		;;
- 	-chorusrdb)
- 		os=-chorusrdb
+	-chorusrdb)
+		os=-chorusrdb
 		basic_machine=$1
- 		;;
+		;;
 	-hiux*)
 		os=-hiuxwe2
 		;;
@@ -221,6 +225,12 @@ case $os in
 	-isc*)
 		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
 		;;
+	-lynx*178)
+		os=-lynxos178
+		;;
+	-lynx*5)
+		os=-lynxos5
+		;;
 	-lynx*)
 		os=-lynxos
 		;;
@@ -245,17 +255,22 @@ case $basic_machine in
 	# Some are omitted here because they have special meanings below.
 	1750a | 580 \
 	| a29k \
+	| aarch64 | aarch64_be \
 	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
 	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
 	| am33_2.0 \
 	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+        | be32 | be64 \
 	| bfin \
 	| c4x | clipper \
 	| d10v | d30v | dlx | dsp16xx \
+	| epiphany \
 	| fido | fr30 | frv \
 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| hexagon \
 	| i370 | i860 | i960 | ia64 \
 	| ip2k | iq2000 \
+	| le32 | le64 \
 	| lm32 \
 	| m32c | m32r | m32rle | m68000 | m68k | m88k \
 	| maxq | mb | microblaze | mcore | mep | metag \
@@ -281,28 +296,39 @@ case $basic_machine in
 	| moxie \
 	| mt \
 	| msp430 \
+	| nds32 | nds32le | nds32be \
 	| nios | nios2 \
 	| ns16k | ns32k \
+	| open8 \
 	| or32 \
 	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| powerpc | powerpc64 | powerpc64le | powerpcle \
 	| pyramid \
-	| rx \
+	| rl78 | rx \
 	| score \
 	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 	| sh64 | sh64le \
 	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
 	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-	| spu | strongarm \
-	| tahoe | thumb | tic4x | tic80 | tron \
-	| v850 | v850e \
+	| spu \
+	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+	| ubicom32 \
+	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
 	| we32k \
-	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| x86 | xc16x | xstormy16 | xtensa \
 	| z8k | z80)
 		basic_machine=$basic_machine-unknown
 		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | picochip)
-		# Motorola 68HC11/12.
+	c54x)
+		basic_machine=tic54x-unknown
+		;;
+	c55x)
+		basic_machine=tic55x-unknown
+		;;
+	c6x)
+		basic_machine=tic6x-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
 		basic_machine=$basic_machine-unknown
 		os=-none
 		;;
@@ -312,12 +338,40 @@ case $basic_machine in
 		basic_machine=mt-unknown
 		;;
 
+	strongarm | thumb | xscale)
+		basic_machine=arm-unknown
+		;;
+	xgate)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	xscaleeb)
+		basic_machine=armeb-unknown
+		;;
+
+	xscaleel)
+		basic_machine=armel-unknown
+		;;
+
 	# We use `pc' rather than `unknown'
 	# because (1) that's what they normally are, and
 	# (2) the word "unknown" tends to confuse beginning users.
 	i*86 | x86_64)
 	  basic_machine=$basic_machine-pc
 	  ;;
+	nacl64*)
+		basic_machine=x86_64-pc
+		os=-nacl
+		;;
+	nacl*)
+		basic_machine=i686-pc
+		os=-nacl
+		;;
+	pnacl*)
+		# le32-unknown-pnacl comes from http://www.chromium.org/nativeclient/pnacl/stability-of-the-pnacl-bitcode-abi
+		basic_machine=le32-unknown
+		os=-pnacl
+		;;
 	# Object if more than one company name word.
 	*-*-*)
 		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
@@ -326,21 +380,25 @@ case $basic_machine in
 	# Recognize the basic CPU types with company name.
 	580-* \
 	| a29k-* \
+	| aarch64-* | aarch64_be-* \
 	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
 	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
 	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 	| avr-* | avr32-* \
+	| be32-* | be64-* \
 	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* \
 	| clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
 	| elxsi-* \
 	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
 	| h8300-* | h8500-* \
 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| hexagon-* \
 	| i*86-* | i860-* | i960-* | ia64-* \
 	| ip2k-* | iq2000-* \
+	| le32-* | le64-* \
 	| lm32-* \
 	| m32c-* | m32r-* | m32rle-* \
 	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
@@ -366,24 +424,29 @@ case $basic_machine in
 	| mmix-* \
 	| mt-* \
 	| msp430-* \
+	| nds32-* | nds32le-* | nds32be-* \
 	| nios-* | nios2-* \
 	| none-* | np1-* | ns16k-* | ns32k-* \
+	| open8-* \
 	| orion-* \
 	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
 	| pyramid-* \
-	| romp-* | rs6000-* | rx-* \
+	| rl78-* | romp-* | rs6000-* | rx-* \
 	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
 	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
-	| tahoe-* | thumb-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+	| tahoe-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tile*-* \
 	| tron-* \
-	| v850-* | v850e-* | vax-* \
+	| ubicom32-* \
+	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+	| vax-* \
 	| we32k-* \
-	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* \
 	| xstormy16-* | xtensa*-* \
 	| ymp-* \
 	| z8k-* | z80-*)
@@ -408,7 +471,7 @@ case $basic_machine in
 		basic_machine=a29k-amd
 		os=-udi
 		;;
-    	abacus)
+	abacus)
 		basic_machine=abacus-unknown
 		;;
 	adobe68k)
@@ -478,11 +541,20 @@ case $basic_machine in
 		basic_machine=powerpc-ibm
 		os=-cnk
 		;;
+	c54x-*)
+		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c55x-*)
+		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c6x-*)
+		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
 	c90)
 		basic_machine=c90-cray
 		os=-unicos
 		;;
-        cegcc)
+	cegcc)
 		basic_machine=arm-unknown
 		os=-cegcc
 		;;
@@ -514,7 +586,7 @@ case $basic_machine in
 		basic_machine=craynv-cray
 		os=-unicosmp
 		;;
-	cr16)
+	cr16 | cr16-*)
 		basic_machine=cr16-unknown
 		os=-elf
 		;;
@@ -672,7 +744,6 @@ case $basic_machine in
 	i370-ibm* | ibm*)
 		basic_machine=i370-ibm
 		;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
 	i*86v32)
 		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
 		os=-sysv32
@@ -730,9 +801,13 @@ case $basic_machine in
 		basic_machine=ns32k-utek
 		os=-sysv
 		;;
-        microblaze)
+	microblaze)
 		basic_machine=microblaze-xilinx
 		;;
+	mingw64)
+		basic_machine=x86_64-pc
+		os=-mingw64
+		;;
 	mingw32)
 		basic_machine=i386-pc
 		os=-mingw32
@@ -769,10 +844,22 @@ case $basic_machine in
 	ms1-*)
 		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
 		;;
+	msys)
+		basic_machine=i386-pc
+		os=-msys
+		;;
 	mvs)
 		basic_machine=i370-ibm
 		os=-mvs
 		;;
+	nacl)
+		basic_machine=le32-unknown
+		os=-nacl
+		;;
+	pnacl)
+		basic_machine=le32-unknown
+		os=-pnacl
+		;;
 	ncr3000)
 		basic_machine=i486-ncr
 		os=-sysv4
@@ -837,6 +924,12 @@ case $basic_machine in
 	np1)
 		basic_machine=np1-gould
 		;;
+	neo-tandem)
+		basic_machine=neo-tandem
+		;;
+	nse-tandem)
+		basic_machine=nse-tandem
+		;;
 	nsr-tandem)
 		basic_machine=nsr-tandem
 		;;
@@ -919,9 +1012,10 @@ case $basic_machine in
 		;;
 	power)	basic_machine=power-ibm
 		;;
-	ppc)	basic_machine=powerpc-unknown
+	ppc | ppcbe)	basic_machine=powerpc-unknown
 		;;
-	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+	ppc-* | ppcbe-*)
+		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
 		;;
 	ppcle | powerpclittle | ppc-le | powerpc-little)
 		basic_machine=powerpcle-unknown
@@ -1015,6 +1109,9 @@ case $basic_machine in
 		basic_machine=i860-stratus
 		os=-sysv4
 		;;
+	strongarm-* | thumb-*)
+		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
 	sun2)
 		basic_machine=m68000-sun
 		;;
@@ -1071,20 +1168,8 @@ case $basic_machine in
 		basic_machine=t90-cray
 		os=-unicos
 		;;
-	tic54x | c54x*)
-		basic_machine=tic54x-unknown
-		os=-coff
-		;;
-	tic55x | c55x*)
-		basic_machine=tic55x-unknown
-		os=-coff
-		;;
-	tic6x | c6x*)
-		basic_machine=tic6x-unknown
-		os=-coff
-		;;
 	tile*)
-		basic_machine=tile-unknown
+		basic_machine=$basic_machine-unknown
 		os=-linux-gnu
 		;;
 	tx39)
@@ -1154,6 +1239,9 @@ case $basic_machine in
 	xps | xps100)
 		basic_machine=xps100-honeywell
 		;;
+	xscale-* | xscalee[bl]-*)
+		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+		;;
 	ymp)
 		basic_machine=ymp-cray
 		os=-unicos
@@ -1251,9 +1339,12 @@ esac
 if [ x"$os" != x"" ]
 then
 case $os in
-        # First match some system type aliases
-        # that might get confused with valid system types.
+	# First match some system type aliases
+	# that might get confused with valid system types.
 	# -solaris* is a basic system type, with this one exception.
+	-auroraux)
+		os=-auroraux
+		;;
 	-solaris1 | -solaris1.*)
 		os=`echo $os | sed -e 's|solaris1|sunos4|'`
 		;;
@@ -1275,21 +1366,22 @@ case $os in
 	# -sysv* is not here because it comes later, after sysvr4.
 	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
 	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
-	      | -kopensolaris* \
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+	      | -sym* | -kopensolaris* \
 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
 	      | -aos* | -aros* \
 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -openbsd* | -solidbsd* \
+	      | -bitrig* | -openbsd* | -solidbsd* \
 	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
 	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
 	      | -chorusos* | -chorusrdb* | -cegcc* \
-	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
 	      | -uxpv* | -beos* | -mpeix* | -udk* \
 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
@@ -1309,6 +1401,12 @@ case $os in
 			;;
 		esac
 		;;
+	-nacl*)
+		os=-nacl
+		;;
+	-pnacl*)
+		os=-pnacl
+		;;
 	-nto-qnx*)
 		;;
 	-nto*)
@@ -1336,7 +1434,7 @@ case $os in
 	-opened*)
 		os=-openedition
 		;;
-        -os400*)
+	-os400*)
 		os=-os400
 		;;
 	-wince*)
@@ -1385,7 +1483,7 @@ case $os in
 	-sinix*)
 		os=-sysv4
 		;;
-        -tpf*)
+	-tpf*)
 		os=-tpf
 		;;
 	-triton*)
@@ -1430,6 +1528,12 @@ case $os in
 	-dicos*)
 		os=-dicos
 		;;
+	-nacl*)
+        os=-nacl
+        ;;
+	-pnacl*)
+		os=-pnacl
+		;;
 	-none)
 		;;
 	*)
@@ -1452,10 +1556,10 @@ else
 # system, and we'll never get to this point.
 
 case $basic_machine in
-        score-*)
+	score-*)
 		os=-elf
 		;;
-        spu-*)
+	spu-*)
 		os=-elf
 		;;
 	*-acorn)
@@ -1467,8 +1571,20 @@ case $basic_machine in
 	arm*-semi)
 		os=-aout
 		;;
-        c4x-* | tic4x-*)
-        	os=-coff
+	c4x-* | tic4x-*)
+		os=-coff
+		;;
+	hexagon-*)
+		os=-elf
+		;;
+	tic54x-*)
+		os=-coff
+		;;
+	tic55x-*)
+		os=-coff
+		;;
+	tic6x-*)
+		os=-coff
 		;;
 	# This must come before the *-dec entry.
 	pdp10-*)
@@ -1488,14 +1604,11 @@ case $basic_machine in
 		;;
 	m68000-sun)
 		os=-sunos3
-		# This also exists in the configure program, but was not the
-		# default.
-		# os=-sunos4
 		;;
 	m68*-cisco)
 		os=-aout
 		;;
-        mep-*)
+	mep-*)
 		os=-elf
 		;;
 	mips*-cisco)
@@ -1522,7 +1635,7 @@ case $basic_machine in
 	*-ibm)
 		os=-aix
 		;;
-    	*-knuth)
+	*-knuth)
 		os=-mmixware
 		;;
 	*-wec)
diff --git a/configure b/configure
index 878381b..7c45b7f 100755
--- a/configure
+++ b/configure
@@ -906,7 +906,7 @@ enable_music_midi
 enable_music_midi_timidity
 enable_music_midi_native
 enable_music_midi_fluidsynth
-enable_music_fluidsynth_shared
+enable_music_midi_fluidsynth_shared
 enable_music_ogg
 enable_music_ogg_tremor
 enable_music_ogg_shared
@@ -2439,9 +2439,9 @@ ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
 #
 MAJOR_VERSION=2
 MINOR_VERSION=0
-MICRO_VERSION=0
-INTERFACE_AGE=0
-BINARY_AGE=0
+MICRO_VERSION=1
+INTERFACE_AGE=1
+BINARY_AGE=1
 VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION
 
 
@@ -11065,13 +11065,13 @@ case "$host" in
     *mingw32ce*)
         #VERSION_SOURCES="$srcdir/version.rc"
         EXE=".exe"
-	;;
+    ;;
     *-*-cygwin* | *-*-mingw32*)
         VERSION_SOURCES="$srcdir/version.rc"
         EXE=".exe"
         if test "$build" != "$host"; then # cross-compiling
             # Default cross-compile location
-            ac_default_prefix=/usr/local/cross-tools/i386-mingw32
+            ac_default_prefix=/usr/local/cross-tools/$host
         else
             # Look for the location of the tools and install there
             if test "$BUILD_PREFIX" != ""; then
@@ -11148,7 +11148,7 @@ find_lib()
     else
         host_lib_path="/usr/$base_libdir /usr/local/$base_libdir"
     fi
-    for path in $gcc_bin_path $gcc_lib_path $env_lib_path $host_lib_path; do
+    for path in $env_lib_path $gcc_bin_path $gcc_lib_path $host_lib_path; do
         lib=`ls -- $path/$1 2>/dev/null | sed -e '/\.so\..*\./d' -e 's,.*/,,' | sort | tail -1`
         if test x$lib != x; then
             echo $lib
@@ -11817,8 +11817,8 @@ fi
 
 	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-                            ac_fn_c_check_header_mongrel "$LINENO" "modplug.h" "ac_cv_header_modplug_h" "$ac_includes_default"
-if test "x$ac_cv_header_modplug_h" = xyes; then :
+                            ac_fn_c_check_header_mongrel "$LINENO" "libmodplug/modplug.h" "ac_cv_header_libmodplug_modplug_h" "$ac_includes_default"
+if test "x$ac_cv_header_libmodplug_modplug_h" = xyes; then :
   have_libmodplug_hdr=yes
 fi
 
@@ -11870,8 +11870,8 @@ fi
 
 
 elif test $pkg_failed = untried; then
-	            ac_fn_c_check_header_mongrel "$LINENO" "modplug.h" "ac_cv_header_modplug_h" "$ac_includes_default"
-if test "x$ac_cv_header_modplug_h" = xyes; then :
+	            ac_fn_c_check_header_mongrel "$LINENO" "libmodplug/modplug.h" "ac_cv_header_libmodplug_modplug_h" "$ac_includes_default"
+if test "x$ac_cv_header_libmodplug_modplug_h" = xyes; then :
   have_libmodplug_hdr=yes
 fi
 
@@ -11954,7 +11954,7 @@ fi
             echo "-- dynamic libmodplug -> $modplug_lib"
             EXTRA_CFLAGS="$EXTRA_CFLAGS -DMODPLUG_DYNAMIC=\\\"$modplug_lib\\\""
         else
-	        EXTRA_LDFLAGS="$EXTRA_LDFLAGS $MODPLUG_LIBS"
+            EXTRA_LDFLAGS="$EXTRA_LDFLAGS $MODPLUG_LIBS"
         fi
     else
         { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** Unable to find ModPlug library (http://modplug-xmms.sourceforge.net/)" >&5
@@ -12095,7 +12095,7 @@ $as_echo "$as_me: WARNING: *** Unable to find MikMod library (http://mikmod.raph
 fi
 
 if test x$have_libmodplug != xyes -a x$have_libmikmod != xyes ; then
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: MOD support disabled" >&5
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: MOD support disabled" >&5
 $as_echo "$as_me: WARNING: MOD support disabled" >&2;}
 fi
 
@@ -12161,9 +12161,9 @@ else
   enable_music_midi_fluidsynth=yes
 fi
 
-    # Check whether --enable-music-fluidsynth-shared was given.
-if test "${enable_music_fluidsynth_shared+set}" = set; then :
-  enableval=$enable_music_fluidsynth_shared;
+    # Check whether --enable-music-midi-fluidsynth-shared was given.
+if test "${enable_music_midi_fluidsynth_shared+set}" = set; then :
+  enableval=$enable_music_midi_fluidsynth_shared;
 else
   enable_music_midi_fluidsynth_shared=yes
 fi
@@ -12251,7 +12251,7 @@ fi
 if test x$enable_music_midi_timidity != xyes -a \
         x$use_music_midi_native != xyes -a x$use_music_midi_native != xyes_cpp -a \
         x$have_fluidsynth != xyes; then
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: MIDI support disabled" >&5
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: MIDI support disabled" >&5
 $as_echo "$as_me: WARNING: MIDI support disabled" >&2;}
 fi
 
@@ -12897,6 +12897,11 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 $as_echo "$have_libmad" >&6; }
     if test x$have_libmad = xyes; then
         SOURCES="$SOURCES $srcdir/music_mad.c"
+        if echo "$SOURCES" | grep "load_mp3.c" >/dev/null; then
+            :
+        else
+            SOURCES="$SOURCES $srcdir/load_mp3.c"
+        fi
         EXTRA_CFLAGS="$EXTRA_CFLAGS -DMP3_MAD_MUSIC"
         EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lmad"
     else
diff --git a/configure.in b/configure.in
index f71c002..77dc3fe 100644
--- a/configure.in
+++ b/configure.in
@@ -14,9 +14,9 @@ dnl Set various version strings - taken gratefully from the GTk sources
 #
 MAJOR_VERSION=2
 MINOR_VERSION=0
-MICRO_VERSION=0
-INTERFACE_AGE=0
-BINARY_AGE=0
+MICRO_VERSION=1
+INTERFACE_AGE=1
+BINARY_AGE=1
 VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION
 
 AC_SUBST(MAJOR_VERSION)
@@ -115,13 +115,13 @@ case "$host" in
     *mingw32ce*)
         #VERSION_SOURCES="$srcdir/version.rc"
         EXE=".exe"
-	;;
+    ;;
     *-*-cygwin* | *-*-mingw32*)
         VERSION_SOURCES="$srcdir/version.rc"
         EXE=".exe"
         if test "$build" != "$host"; then # cross-compiling
             # Default cross-compile location
-            ac_default_prefix=/usr/local/cross-tools/i386-mingw32
+            ac_default_prefix=/usr/local/cross-tools/$host
         else
             # Look for the location of the tools and install there
             if test "$BUILD_PREFIX" != ""; then
@@ -186,7 +186,7 @@ find_lib()
     else
         host_lib_path="/usr/$base_libdir /usr/local/$base_libdir"
     fi
-    for path in $gcc_bin_path $gcc_lib_path $env_lib_path $host_lib_path; do
+    for path in $env_lib_path $gcc_bin_path $gcc_lib_path $host_lib_path; do
         lib=[`ls -- $path/$1 2>/dev/null | sed -e '/\.so\..*\./d' -e 's,.*/,,' | sort | tail -1`]
         if test x$lib != x; then
             echo $lib
@@ -257,7 +257,7 @@ if test x$enable_music_mod = xyes -a x$enable_music_mod_modplug = xyes; then
             have_libmodplug_hdr=yes
             have_libmodplug_lib=yes
         ], [dnl
-            AC_CHECK_HEADER([modplug.h], [have_libmodplug_hdr=yes])
+            AC_CHECK_HEADER([libmodplug/modplug.h], [have_libmodplug_hdr=yes])
             AC_CHECK_LIB([modplug], [have_libmodplug_lib=yes])
         ])
 
@@ -283,7 +283,7 @@ if test x$enable_music_mod = xyes -a x$enable_music_mod_modplug = xyes; then
             echo "-- dynamic libmodplug -> $modplug_lib"
             EXTRA_CFLAGS="$EXTRA_CFLAGS -DMODPLUG_DYNAMIC=\\\"$modplug_lib\\\""
         else
-	        EXTRA_LDFLAGS="$EXTRA_LDFLAGS $MODPLUG_LIBS"
+            EXTRA_LDFLAGS="$EXTRA_LDFLAGS $MODPLUG_LIBS"
         fi
     else
         AC_MSG_WARN([*** Unable to find ModPlug library (http://modplug-xmms.sourceforge.net/)])
@@ -359,7 +359,7 @@ return 1;
 fi
 
 if test x$have_libmodplug != xyes -a x$have_libmikmod != xyes ; then
-	AC_MSG_WARN([MOD support disabled])
+    AC_MSG_WARN([MOD support disabled])
 fi
 
 AC_ARG_ENABLE([music-midi],
@@ -408,7 +408,7 @@ AC_HELP_STRING([--enable-music-midi-native], [enable native MIDI music output [[
     AC_ARG_ENABLE([music-midi-fluidsynth],
 AC_HELP_STRING([--enable-music-midi-fluidsynth], [enable FluidSynth MIDI output [[default=yes]]]),
                   [], [enable_music_midi_fluidsynth=yes])
-    AC_ARG_ENABLE([music-fluidsynth-shared],
+    AC_ARG_ENABLE([music-midi-fluidsynth-shared],
 AC_HELP_STRING([--enable-music-midi-fluidsynth-shared], [dynamically load FluidSynth library [[default=yes]]]),
                   [], [enable_music_midi_fluidsynth_shared=yes])
     if test x$enable_music_midi_fluidsynth = xyes; then
@@ -448,7 +448,7 @@ fi
 if test x$enable_music_midi_timidity != xyes -a \
         x$use_music_midi_native != xyes -a x$use_music_midi_native != xyes_cpp -a \
         x$have_fluidsynth != xyes; then
-	AC_MSG_WARN([MIDI support disabled])
+    AC_MSG_WARN([MIDI support disabled])
 fi
 
 AC_ARG_ENABLE([music-ogg],
@@ -637,6 +637,11 @@ if test x$enable_music_mp3 = xyes -a x$enable_music_mp3_mad_gpl = xyes; then
     AC_MSG_RESULT($have_libmad)
     if test x$have_libmad = xyes; then
         SOURCES="$SOURCES $srcdir/music_mad.c"
+        if echo "$SOURCES" | grep "load_mp3.c" >/dev/null; then
+            :
+        else
+            SOURCES="$SOURCES $srcdir/load_mp3.c"
+        fi
         EXTRA_CFLAGS="$EXTRA_CFLAGS -DMP3_MAD_MUSIC"
         EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lmad"
     else
diff --git a/dynamic_flac.c b/dynamic_flac.c
index 9a57b5c..cc728f2 100644
--- a/dynamic_flac.c
+++ b/dynamic_flac.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/dynamic_flac.h b/dynamic_flac.h
index 10a4046..75d7144 100644
--- a/dynamic_flac.h
+++ b/dynamic_flac.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/dynamic_fluidsynth.c b/dynamic_fluidsynth.c
index fe0f841..edc7660 100644
--- a/dynamic_fluidsynth.c
+++ b/dynamic_fluidsynth.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/dynamic_fluidsynth.h b/dynamic_fluidsynth.h
index 455b419..e3e3b67 100644
--- a/dynamic_fluidsynth.h
+++ b/dynamic_fluidsynth.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/dynamic_mod.c b/dynamic_mod.c
index a1e42a2..788ccb9 100644
--- a/dynamic_mod.c
+++ b/dynamic_mod.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/dynamic_mod.h b/dynamic_mod.h
index 945d3cf..5cb3df9 100644
--- a/dynamic_mod.h
+++ b/dynamic_mod.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/dynamic_modplug.c b/dynamic_modplug.c
index 2f5c694..20a8dc9 100644
--- a/dynamic_modplug.c
+++ b/dynamic_modplug.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/dynamic_modplug.h b/dynamic_modplug.h
index 21eeb33..ac4e076 100644
--- a/dynamic_modplug.h
+++ b/dynamic_modplug.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -21,7 +21,11 @@
 
 #ifdef MODPLUG_MUSIC
 
-#include "modplug.h"
+#ifdef MODPLUG_HEADER
+#include MODPLUG_HEADER
+#else
+#include <libmodplug/modplug.h>
+#endif
 
 typedef struct {
     int loaded;
diff --git a/dynamic_mp3.c b/dynamic_mp3.c
index 0ed38c5..1f00920 100644
--- a/dynamic_mp3.c
+++ b/dynamic_mp3.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/dynamic_mp3.h b/dynamic_mp3.h
index 5017e0e..3586b70 100644
--- a/dynamic_mp3.h
+++ b/dynamic_mp3.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/dynamic_ogg.c b/dynamic_ogg.c
index a4b089a..26bd011 100644
--- a/dynamic_ogg.c
+++ b/dynamic_ogg.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/dynamic_ogg.h b/dynamic_ogg.h
index d54705a..1f0bda4 100644
--- a/dynamic_ogg.h
+++ b/dynamic_ogg.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -20,8 +20,10 @@
 */
 
 #ifdef OGG_MUSIC
-#ifdef OGG_USE_TREMOR
-#include <ivorbisfile.h>
+#if defined(OGG_HEADER)
+#include OGG_HEADER
+#elif defined(OGG_USE_TREMOR)
+#include <tremor/ivorbisfile.h>
 #else
 #include <vorbis/vorbisfile.h>
 #endif
diff --git a/effect_position.c b/effect_position.c
index e9559c5..2ec1c42 100644
--- a/effect_position.c
+++ b/effect_position.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/effect_stereoreverse.c b/effect_stereoreverse.c
index 5763aea..860035f 100644
--- a/effect_stereoreverse.c
+++ b/effect_stereoreverse.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/effects_internal.c b/effects_internal.c
index 62d59b2..edee647 100644
--- a/effects_internal.c
+++ b/effects_internal.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/effects_internal.h b/effects_internal.h
index c6e92ee..7a2522b 100644
--- a/effects_internal.h
+++ b/effects_internal.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/fluidsynth.c b/fluidsynth.c
index 213944a..0a5d2dc 100644
--- a/fluidsynth.c
+++ b/fluidsynth.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -124,6 +124,7 @@ static int fluidsynth_loadsong_RW_internal(FluidSynthMidiSong *song, void *data)
     if ((buffer = (char*) SDL_malloc(size))) {
         if(SDL_RWread(src, buffer, size, 1) == 1) {
             if (fluidsynth.fluid_player_add_mem(song->player, buffer, size) == FLUID_OK) {
+                SDL_free(buffer);
                 return 1;
             } else {
                 Mix_SetError("FluidSynth failed to load in-memory song");
diff --git a/fluidsynth.h b/fluidsynth.h
index dfccd1c..ae3f2cb 100644
--- a/fluidsynth.h
+++ b/fluidsynth.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/load_aiff.c b/load_aiff.c
index 5bc4367..a112882 100644
--- a/load_aiff.c
+++ b/load_aiff.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/load_aiff.h b/load_aiff.h
index 02e3cb8..490ad2b 100644
--- a/load_aiff.h
+++ b/load_aiff.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/load_flac.c b/load_flac.c
index 20b8f00..bf9fc51 100644
--- a/load_flac.c
+++ b/load_flac.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/load_flac.h b/load_flac.h
index f71f31e..6cd0442 100644
--- a/load_flac.h
+++ b/load_flac.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/load_mp3.c b/load_mp3.c
new file mode 100644
index 0000000..40e031c
--- /dev/null
+++ b/load_mp3.c
@@ -0,0 +1,195 @@
+/*
+  SDL_mixer:  An audio mixer library based on the SDL library
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+	 claim that you wrote the original software. If you use this software
+	 in a product, an acknowledgment in the product documentation would be
+	 appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+	 misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  This is the source needed to decode an MP3 into a waveform.
+*/
+
+/* $Id$ */
+
+#if defined(MP3_MUSIC) || defined(MP3_MAD_MUSIC)
+
+#include "SDL_mixer.h"
+
+#include "load_mp3.h"
+
+#if defined(MP3_MUSIC)
+#include "dynamic_mp3.h"
+#elif defined(MP3_MAD_MUSIC)
+#include "music_mad.h"
+#endif
+
+SDL_AudioSpec *Mix_LoadMP3_RW(SDL_RWops *src, int freesrc, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len)
+{
+	/* note: spec is initialized to mixer spec */
+
+#if defined(MP3_MUSIC)
+	SMPEG* mp3;
+	SMPEG_Info info;
+#elif defined(MP3_MAD_MUSIC)
+	mad_data *mp3_mad;
+#endif
+	long samplesize;
+	int read_len;
+	const Uint32 chunk_len = 4096;
+	int err = 0;
+
+	if ((!src) || (!spec) || (!audio_buf) || (!audio_len))
+	{
+		return NULL;
+	}
+
+	if (!err)
+	{
+		*audio_len = 0;
+		*audio_buf = (Uint8*) SDL_malloc(chunk_len);
+		err = (*audio_buf == NULL);
+	}
+
+	if (!err)
+	{
+		err = ((Mix_Init(MIX_INIT_MP3) & MIX_INIT_MP3) == 0);
+	}
+
+	if (!err)
+	{
+#if defined(MP3_MUSIC)
+		mp3 = smpeg.SMPEG_new_rwops(src, &info, freesrc, 0);
+		err = (mp3 == NULL);
+#elif defined(MP3_MAD_MUSIC)
+        mp3_mad = mad_openFileRW(src, spec, freesrc);
+		err = (mp3_mad == NULL);
+#endif
+	}
+
+#if defined(MP3_MUSIC)
+	if (!err)
+	{
+		err = !info.has_audio;
+	}
+#endif
+
+	if (!err)
+	{
+#if defined(MP3_MUSIC)
+
+		smpeg.SMPEG_actualSpec(mp3, spec);
+
+		smpeg.SMPEG_enableaudio(mp3, 1);
+		smpeg.SMPEG_enablevideo(mp3, 0);
+
+		smpeg.SMPEG_play(mp3);
+
+		/* read once for audio length */
+		while ((read_len = smpeg.SMPEG_playAudio(mp3, *audio_buf, chunk_len)) > 0)
+		{
+			*audio_len += read_len;
+		}
+
+		smpeg.SMPEG_stop(mp3);
+
+#elif defined(MP3_MAD_MUSIC)
+
+        mad_start(mp3_mad);
+
+		/* read once for audio length */
+		while ((read_len = mad_getSamples(mp3_mad, *audio_buf, chunk_len)) > 0)
+		{
+			*audio_len += read_len;
+		}
+
+		mad_stop(mp3_mad);
+
+#endif
+
+		err = (read_len < 0);
+	}
+
+	if (!err)
+	{
+		/* reallocate, if needed */
+		if ((*audio_len > 0) && (*audio_len != chunk_len))
+		{
+			*audio_buf = (Uint8*) SDL_realloc(*audio_buf, *audio_len);
+			err = (*audio_buf == NULL);
+		}
+	}
+
+	if (!err)
+	{
+		/* read again for audio buffer, if needed */
+		if (*audio_len > chunk_len)
+		{
+#if defined(MP3_MUSIC)
+			smpeg.SMPEG_rewind(mp3);
+			smpeg.SMPEG_play(mp3);
+			err = (*audio_len != smpeg.SMPEG_playAudio(mp3, *audio_buf, *audio_len));
+			smpeg.SMPEG_stop(mp3);
+#elif defined(MP3_MAD_MUSIC)
+			mad_seek(mp3_mad, 0);
+			mad_start(mp3_mad);
+			err = (*audio_len != mad_getSamples(mp3_mad, *audio_buf, *audio_len));
+			mad_stop(mp3_mad);
+#endif
+		}
+	}
+
+	if (!err)
+	{
+		/* Don't return a buffer that isn't a multiple of samplesize */
+		samplesize = ((spec->format & 0xFF)/8)*spec->channels;
+		*audio_len &= ~(samplesize-1);
+	}
+
+#if defined(MP3_MUSIC)
+	if (mp3)
+	{
+		smpeg.SMPEG_delete(mp3); mp3 = NULL;
+		/* Deleting the MP3 closed the source if desired */
+		freesrc = SDL_FALSE;
+	}
+#elif defined(MP3_MAD_MUSIC)
+	if (mp3_mad)
+	{
+		mad_closeFile(mp3_mad); mp3_mad = NULL;
+		/* Deleting the MP3 closed the source if desired */
+		freesrc = SDL_FALSE;
+	}
+#endif
+
+	if (freesrc)
+	{
+		SDL_RWclose(src); src = NULL;
+	}
+
+	/* handle error */
+	if (err)
+	{
+		if (*audio_buf != NULL)
+		{
+			SDL_free(*audio_buf); *audio_buf = NULL;
+		}
+		*audio_len = 0;
+		spec = NULL;
+	}
+
+	return spec;
+}
+
+#endif
diff --git a/load_flac.h b/load_mp3.h
similarity index 80%
copy from load_flac.h
copy to load_mp3.h
index f71f31e..8a8ea56 100644
--- a/load_flac.h
+++ b/load_mp3.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -18,14 +18,13 @@
      misrepresented as being the original software.
   3. This notice may not be removed or altered from any source distribution.
 
-  This is the source needed to decode a FLAC into a waveform.
-    ~ Austen Dicken (admin at cvpcs.org).
+  This is the source needed to decode an MP3 into a waveform.
 */
 
-/* $Id: $ */
+/* $Id$ */
 
-#ifdef FLAC_MUSIC
+#if defined(MP3_MUSIC) || defined(MP3_MAD_MUSIC)
 /* Don't call this directly; use Mix_LoadWAV_RW() for now. */
-SDL_AudioSpec *Mix_LoadFLAC_RW (SDL_RWops *src, int freesrc,
+SDL_AudioSpec *Mix_LoadMP3_RW (SDL_RWops *src, int freesrc,
         SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len);
 #endif
diff --git a/load_ogg.c b/load_ogg.c
index 4b92f44..3a0e293 100644
--- a/load_ogg.c
+++ b/load_ogg.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -43,24 +43,25 @@ static size_t sdl_read_func(void *ptr, size_t size, size_t nmemb, void *datasour
     return SDL_RWread((SDL_RWops*)datasource, ptr, size, nmemb);
 }
 
-static Sint64 sdl_seek_func(void *datasource, ogg_int64_t offset, int whence)
+static int sdl_seek_func(void *datasource, ogg_int64_t offset, int whence)
 {
-    return SDL_RWseek((SDL_RWops*)datasource, offset, whence);
+    return (int)SDL_RWseek((SDL_RWops*)datasource, offset, whence);
 }
 
-static Sint64 sdl_close_func_freesrc(void *datasource)
+static int sdl_close_func_freesrc(void *datasource)
 {
     return SDL_RWclose((SDL_RWops*)datasource);
 }
 
-static Sint64 sdl_close_func_nofreesrc(void *datasource)
+static int sdl_close_func_nofreesrc(void *datasource)
 {
-    return SDL_RWseek((SDL_RWops*)datasource, 0, RW_SEEK_SET);
+    SDL_RWseek((SDL_RWops*)datasource, 0, RW_SEEK_SET);
+    return 0;
 }
 
-static Sint64 sdl_tell_func(void *datasource)
+static long sdl_tell_func(void *datasource)
 {
-    return SDL_RWtell((SDL_RWops*)datasource);
+    return (long)SDL_RWtell((SDL_RWops*)datasource);
 }
 
 
diff --git a/load_ogg.h b/load_ogg.h
index 1f05909..a13ef6c 100644
--- a/load_ogg.h
+++ b/load_ogg.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/load_voc.c b/load_voc.c
index 03b3417..cc495f7 100644
--- a/load_voc.c
+++ b/load_voc.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/load_voc.h b/load_voc.h
index d82d76e..6afd2f6 100644
--- a/load_voc.h
+++ b/load_voc.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/mixer.c b/mixer.c
index 94b1bec..bebb6c0 100644
--- a/mixer.c
+++ b/mixer.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -32,9 +32,11 @@
 #include "SDL_mixer.h"
 #include "load_aiff.h"
 #include "load_voc.h"
+#include "load_mp3.h"
 #include "load_ogg.h"
 #include "load_flac.h"
 #include "dynamic_flac.h"
+#include "dynamic_fluidsynth.h"
 #include "dynamic_modplug.h"
 #include "dynamic_mod.h"
 #include "dynamic_mp3.h"
@@ -182,7 +184,7 @@ int Mix_Init(int flags)
             result |= MIX_INIT_MOD;
         }
 #else
-        Mix_SetError("Mixer not built with MOD timidity support");
+        Mix_SetError("Mixer not built with MOD mikmod support");
 #endif
     }
     if (flags & MIX_INIT_MP3) {
@@ -190,6 +192,8 @@ int Mix_Init(int flags)
         if ((initialized & MIX_INIT_MP3) || Mix_InitMP3() == 0) {
             result |= MIX_INIT_MP3;
         }
+#elif defined(MP3_MAD_MUSIC)
+        result |= MIX_INIT_MP3;
 #else
         Mix_SetError("Mixer not built with MP3 support");
 #endif
@@ -318,7 +322,7 @@ static void mix_channels(void *udata, Uint8 *stream, int len)
     /* Mix any playing channels... */
     sdl_ticks = SDL_GetTicks();
     for ( i=0; i<num_channels; ++i ) {
-        if( ! mix_channel[i].paused ) {
+        if ( !mix_channel[i].paused ) {
             if ( mix_channel[i].expire > 0 && mix_channel[i].expire < sdl_ticks ) {
                 /* Expiration delay for that channel is reached */
                 mix_channel[i].playing = 0;
@@ -328,7 +332,7 @@ static void mix_channels(void *udata, Uint8 *stream, int len)
                 _Mix_channel_done_playing(i);
             } else if ( mix_channel[i].fading != MIX_NO_FADING ) {
                 Uint32 ticks = sdl_ticks - mix_channel[i].ticks_fade;
-                if( ticks > mix_channel[i].fade_length ) {
+                if ( ticks >= mix_channel[i].fade_length ) {
                     Mix_Volume(i, mix_channel[i].fade_volume_reset); /* Restore the volume */
                     if( mix_channel[i].fading == MIX_FADING_OUT ) {
                         mix_channel[i].playing = 0;
@@ -338,7 +342,7 @@ static void mix_channels(void *udata, Uint8 *stream, int len)
                     }
                     mix_channel[i].fading = MIX_NO_FADING;
                 } else {
-                    if( mix_channel[i].fading == MIX_FADING_OUT ) {
+                    if ( mix_channel[i].fading == MIX_FADING_OUT ) {
                         Mix_Volume(i, (mix_channel[i].fade_volume * (mix_channel[i].fade_length-ticks))
                                    / mix_channel[i].fade_length );
                     } else {
@@ -493,6 +497,9 @@ int Mix_OpenAudio(int frequency, Uint16 format, int nchannels, int chunksize)
 #ifdef FLAC_MUSIC
     add_chunk_decoder("FLAC");
 #endif
+#if defined(MP3_MUSIC) || defined(MP3_MAD_MUSIC)
+    add_chunk_decoder("MP3");
+#endif
 
     audio_opened = 1;
     SDL_PauseAudio(0);
@@ -557,11 +564,23 @@ int Mix_QuerySpec(int *frequency, Uint16 *format, int *channels)
     return(audio_opened);
 }
 
+static int detect_mp3(Uint8 *magic)
+{
+    if ( strncmp((char *)magic, "ID3", 3) == 0 ) {
+        return 1;
+    }
 
-/*
- * !!! FIXME: Ideally, we want a Mix_LoadSample_RW(), which will handle the
- *             generic setup, then call the correct file format loader.
- */
+    /* Detection code lifted from SMPEG */
+    if(((magic[0] & 0xff) != 0xff) || // No sync bits
+       ((magic[1] & 0xf0) != 0xf0) || //
+       ((magic[2] & 0xf0) == 0x00) || // Bitrate is 0
+       ((magic[2] & 0xf0) == 0xf0) || // Bitrate is 15
+       ((magic[2] & 0x0c) == 0x0c) || // Frequency is 3
+       ((magic[1] & 0x06) == 0x00)) { // Layer is 4
+        return(0);
+    }
+    return 1;
+}
 
 /* Load a wave file */
 Mix_Chunk *Mix_LoadWAV_RW(SDL_RWops *src, int freesrc)
@@ -629,6 +648,16 @@ Mix_Chunk *Mix_LoadWAV_RW(SDL_RWops *src, int freesrc)
                     (Uint8 **)&chunk->abuf, &chunk->alen);
             break;
         default:
+#if defined(MP3_MUSIC) || defined(MP3_MAD_MUSIC)
+			if (detect_mp3((Uint8*)&magic))
+			{
+				/* note: send a copy of the mixer spec */
+				wavespec = mixer;
+				loaded = Mix_LoadMP3_RW(src, freesrc, &wavespec,
+						(Uint8 **)&chunk->abuf, &chunk->alen);
+				break;
+			}
+#endif
             SDL_SetError("Unrecognized sound file type");
             if ( freesrc ) {
                 SDL_RWclose(src);
@@ -1067,7 +1096,7 @@ int Mix_FadeOutChannel(int which, int ms)
                 (mix_channel[which].fading != MIX_FADING_OUT) ) {
                 mix_channel[which].fade_volume = mix_channel[which].volume;
                 mix_channel[which].fading = MIX_FADING_OUT;
-                mix_channel[which].fade_length = ms;
+                mix_channel[which].fade_length = (Uint32)ms;
                 mix_channel[which].ticks_fade = SDL_GetTicks();
 
                 /* only change fade_volume_reset if we're not fading. */
diff --git a/music.c b/music.c
index 76d967d..bbaf4a3 100644
--- a/music.c
+++ b/music.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -574,7 +574,7 @@ Mix_Music *Mix_LoadMUS(const char *file)
 
     /* We need to know if a specific error occurs; if not, we'll set a
      * generic one, so we clear the current one. */
-    Mix_SetError("");
+    SDL_ClearError();
     music = Mix_LoadMUSType_RW(src, type, SDL_TRUE);
     if ( music == NULL && Mix_GetError()[0] == '\0' ) {
         Mix_SetError("Unrecognized music format");
diff --git a/music_cmd.c b/music_cmd.c
index e58b3e1..0989ac0 100644
--- a/music_cmd.c
+++ b/music_cmd.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/music_cmd.h b/music_cmd.h
index 5b5b077..976fd72 100644
--- a/music_cmd.h
+++ b/music_cmd.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/music_flac.c b/music_flac.c
index ea81ceb..4d56283 100644
--- a/music_flac.c
+++ b/music_flac.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/music_flac.h b/music_flac.h
index a514923..5c877ec 100644
--- a/music_flac.h
+++ b/music_flac.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/music_mad.c b/music_mad.c
index 054a2d9..e66dfc2 100644
--- a/music_mad.c
+++ b/music_mad.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/music_mad.h b/music_mad.h
index 297826b..16a0875 100644
--- a/music_mad.h
+++ b/music_mad.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/music_mod.c b/music_mod.c
index 87b9ac8..4b04d25 100644
--- a/music_mod.c
+++ b/music_mod.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/music_mod.h b/music_mod.h
index f142268..a4055ae 100644
--- a/music_mod.h
+++ b/music_mod.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/music_modplug.c b/music_modplug.c
index a51bc91..04c42a3 100644
--- a/music_modplug.c
+++ b/music_modplug.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/music_modplug.h b/music_modplug.h
index d9cfb04..952dc86 100644
--- a/music_modplug.h
+++ b/music_modplug.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -21,7 +21,11 @@
 
 #ifdef MODPLUG_MUSIC
 
-#include "modplug.h"
+#ifdef MODPLUG_HEADER
+#include MODPLUG_HEADER
+#else
+#include <libmodplug/modplug.h>
+#endif
 #include "SDL_rwops.h"
 #include "SDL_audio.h"
 #include "SDL_mixer.h"
diff --git a/music_ogg.c b/music_ogg.c
index 5997cc7..788f891 100644
--- a/music_ogg.c
+++ b/music_ogg.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -56,14 +56,14 @@ static size_t sdl_read_func(void *ptr, size_t size, size_t nmemb, void *datasour
     return SDL_RWread((SDL_RWops*)datasource, ptr, size, nmemb);
 }
 
-static Sint64 sdl_seek_func(void *datasource, ogg_int64_t offset, int whence)
+static int sdl_seek_func(void *datasource, ogg_int64_t offset, int whence)
 {
-    return SDL_RWseek((SDL_RWops*)datasource, offset, whence);
+    return (int)SDL_RWseek((SDL_RWops*)datasource, offset, whence);
 }
 
-static Sint64 sdl_tell_func(void *datasource)
+static long sdl_tell_func(void *datasource)
 {
-    return SDL_RWtell((SDL_RWops*)datasource);
+    return (long)SDL_RWtell((SDL_RWops*)datasource);
 }
 
 /* Load an OGG stream from an SDL_RWops object */
diff --git a/music_ogg.h b/music_ogg.h
index 5510064..c04798d 100644
--- a/music_ogg.h
+++ b/music_ogg.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -25,8 +25,10 @@
 
 /* This file supports Ogg Vorbis music streams */
 
-#ifdef OGG_USE_TREMOR
-#include <ivorbisfile.h>
+#if defined(OGG_HEADER)
+#include OGG_HEADER
+#elif defined(OGG_USE_TREMOR)
+#include <tremor/ivorbisfile.h>
 #else
 #include <vorbis/vorbisfile.h>
 #endif
diff --git a/native_midi/native_midi_common.c b/native_midi/native_midi_common.c
index a81c014..7726349 100644
--- a/native_midi/native_midi_common.c
+++ b/native_midi/native_midi_common.c
@@ -230,7 +230,8 @@ static MIDIEvent *MIDItoStream(MIDIFile *mididata)
         return NULL;
 
     track = (MIDIEvent**) calloc(1, sizeof(MIDIEvent*) * mididata->nTracks);
-    if (NULL == head)
+
+    if (NULL == track)
         return NULL;
 
     /* First, convert all tracks to MIDIEvent lists */
diff --git a/playmus.c b/playmus.c
index 9562786..ccf1fb0 100644
--- a/playmus.c
+++ b/playmus.c
@@ -1,6 +1,6 @@
 /*
   PLAYMUS:  A test application for the SDL mixer library.
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/playwave.c b/playwave.c
index 9b652d4..a35c63e 100644
--- a/playwave.c
+++ b/playwave.c
@@ -1,6 +1,6 @@
 /*
   PLAYWAVE:  A test application for the SDL mixer library.
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
diff --git a/timidity/playmidi.c b/timidity/playmidi.c
index 2463341..dd12804 100644
--- a/timidity/playmidi.c
+++ b/timidity/playmidi.c
@@ -326,7 +326,7 @@ static void recompute_amp(int v)
    {
     int note = voice[v].sample->note_to_use;
     if (note>0 && drumvolume[chan][note]>=0) vol = drumvolume[chan][note];
-    if (note>0 && drumpanpot[chan][note]>=0) panning = drumvolume[chan][note];
+    if (note>0 && drumpanpot[chan][note]>=0) panning = drumpanpot[chan][note];
    }
 
   if (opt_expression_curve == 2) curved_expression = 127.0 * vol_table[expr];
diff --git a/timidity/readmidi.c b/timidity/readmidi.c
index e3d162f..afa79b9 100644
--- a/timidity/readmidi.c
+++ b/timidity/readmidi.c
@@ -673,15 +673,15 @@ static MidiEvent *groom_list(int32 divisions,int32 *eventsp,int32 *samplesp)
 		meep->event.time, meep->event.channel + 1,
 		meep->event.type, meep->event.a, meep->event.b);
 
-      if (meep->event.channel >= MAXCHAN)
-	skip_this_event=1;
-      else if (meep->event.type==ME_TEMPO)
+      if (meep->event.type==ME_TEMPO)
 	{
 	  tempo=
 	    meep->event.channel + meep->event.b * 256 + meep->event.a * 65536;
 	  compute_sample_increment(tempo, divisions);
 	  skip_this_event=1;
 	}
+      else if (meep->event.channel >= MAXCHAN)
+	skip_this_event=1;
       else if ((quietchannels & (1<<meep->event.channel)))
 	skip_this_event=1;
       else switch (meep->event.type)
diff --git a/timidity/timidity.c b/timidity/timidity.c
index 2004cc0..5b96800 100644
--- a/timidity/timidity.c
+++ b/timidity/timidity.c
@@ -56,7 +56,7 @@ static int read_config_file(const char *name)
     line++;
     w[words=0]=strtok(tmp, " \t\r\n\240");
     if (!w[0] || (*w[0]=='#')) continue;
-    while (w[words] && (words < MAXWORDS))
+    while (w[words] && (words < (MAXWORDS-1)))
       {
         w[++words]=strtok(0," \t\r\n\240");
         if (w[words] && w[words][0]=='#') break;
@@ -68,6 +68,7 @@ static int read_config_file(const char *name)
        {
         ctl->cmsg(CMSG_ERROR, VERB_NORMAL,
           "%s: line %d: No directory given\n", name, line);
+        close_file(fp);
         return -2;
        }
       for (i=1; i<words; i++)
@@ -79,6 +80,7 @@ static int read_config_file(const char *name)
       {
         ctl->cmsg(CMSG_ERROR, VERB_NORMAL,
           "%s: line %d: No file name given\n", name, line);
+        close_file(fp);
         return -2;
      }
     for (i=1; i<words; i++)
@@ -95,6 +97,7 @@ static int read_config_file(const char *name)
         ctl->cmsg(CMSG_ERROR, VERB_NORMAL, 
         "%s: line %d: Must specify exactly one patch name\n",
           name, line);
+        close_file(fp);
         return -2;
       }
     strncpy(def_instr_name, w[1], 255);
@@ -107,6 +110,7 @@ static int read_config_file(const char *name)
         ctl->cmsg(CMSG_ERROR, VERB_NORMAL,
           "%s: line %d: No drum set number given\n", 
           name, line);
+      close_file(fp);
       return -2;
       }
     i=atoi(w[1]);
@@ -115,6 +119,7 @@ static int read_config_file(const char *name)
         ctl->cmsg(CMSG_ERROR, VERB_NORMAL, 
           "%s: line %d: Drum set must be between 0 and 127\n",
         name, line);
+        close_file(fp);
         return -2;
      }
     if (!drumset[i])
@@ -131,6 +136,7 @@ static int read_config_file(const char *name)
         ctl->cmsg(CMSG_ERROR, VERB_NORMAL,
           "%s: line %d: No bank number given\n", 
         name, line);
+        close_file(fp);
         return -2;
      }
     i=atoi(w[1]);
@@ -139,6 +145,7 @@ static int read_config_file(const char *name)
         ctl->cmsg(CMSG_ERROR, VERB_NORMAL, 
           "%s: line %d: Tone bank must be between 0 and 127\n",
         name, line);
+        close_file(fp);
         return -2;
       }
     if (!tonebank[i])
@@ -161,6 +168,7 @@ static int read_config_file(const char *name)
       ctl->cmsg(CMSG_ERROR, VERB_NORMAL,
         "%s: line %d: Program must be between 0 and 127\n",
         name, line);
+      close_file(fp);
       return -2;
     }
   if (!bank)
@@ -169,6 +177,7 @@ static int read_config_file(const char *name)
        "%s: line %d: Must specify tone bank or drum set "
         "before assignment\n",
         name, line);
+     close_file(fp);
      return -2;
     }
   if (bank->tone[i].name)
@@ -184,6 +193,7 @@ static int read_config_file(const char *name)
         {
     ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "%s: line %d: bad patch option %s\n",
       name, line, w[j]);
+    close_file(fp);
     return -2;
         }
       *cp++=0;
@@ -195,6 +205,7 @@ static int read_config_file(const char *name)
        ctl->cmsg(CMSG_ERROR, VERB_NORMAL, 
           "%s: line %d: amplification must be between "
          "0 and %d\n", name, line, MAX_AMPLIFICATION);
+       close_file(fp);
        return -2;
       }
     bank->tone[i].amp=k;
@@ -207,6 +218,7 @@ static int read_config_file(const char *name)
        ctl->cmsg(CMSG_ERROR, VERB_NORMAL, 
          "%s: line %d: note must be between 0 and 127\n",
           name, line);
+        close_file(fp);
         return -2;
       }
     bank->tone[i].note=k;
@@ -228,6 +240,7 @@ static int read_config_file(const char *name)
          "%s: line %d: panning must be left, right, "
          "center, or between -100 and 100\n",
          name, line);
+       close_file(fp);
        return -2;
       }
     bank->tone[i].pan=k;
@@ -242,6 +255,7 @@ static int read_config_file(const char *name)
       {
         ctl->cmsg(CMSG_ERROR, VERB_NORMAL,
           "%s: line %d: keep must be env or loop\n", name, line);
+       close_file(fp);
        return -2;
       }
       }
@@ -258,6 +272,7 @@ static int read_config_file(const char *name)
        ctl->cmsg(CMSG_ERROR, VERB_NORMAL,
          "%s: line %d: strip must be env, loop, or tail\n",
          name, line);
+       close_file(fp);
        return -2;
       }
       }
@@ -265,6 +280,7 @@ static int read_config_file(const char *name)
       {
     ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "%s: line %d: bad patch option %s\n",
       name, line, w[j]);
+    close_file(fp);
     return -2;
       }
     }
diff --git a/version.rc b/version.rc
index a876096..d624e96 100644
--- a/version.rc
+++ b/version.rc
@@ -9,8 +9,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
 //
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,0,0,0
- PRODUCTVERSION 2,0,0,0
+ FILEVERSION 2,0,1,0
+ PRODUCTVERSION 2,0,1,0
  FILEFLAGSMASK 0x3fL
  FILEFLAGS 0x0L
  FILEOS 0x40004L
@@ -23,12 +23,12 @@ BEGIN
         BEGIN
             VALUE "CompanyName", "\0"
             VALUE "FileDescription", "SDL_mixer\0"
-            VALUE "FileVersion", "2, 0, 0, 0\0"
+            VALUE "FileVersion", "2, 0, 1, 0\0"
             VALUE "InternalName", "SDL_mixer\0"
-            VALUE "LegalCopyright", "Copyright � 2013 Sam Lantinga\0"
+            VALUE "LegalCopyright", "Copyright � 2016 Sam Lantinga\0"
             VALUE "OriginalFilename", "SDL_mixer.dll\0"
             VALUE "ProductName", "Simple DirectMedia Layer\0"
-            VALUE "ProductVersion", "2, 0, 0, 0\0"
+            VALUE "ProductVersion", "2, 0, 1, 0\0"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/wavestream.c b/wavestream.c
index 0934be2..8dc1683 100644
--- a/wavestream.c
+++ b/wavestream.c
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -47,20 +47,18 @@
 /*******************************************/
 #define RIFF        0x46464952      /* "RIFF" */
 #define WAVE        0x45564157      /* "WAVE" */
-#define FACT        0x74636166      /* "fact" */
-#define LIST        0x5453494c      /* "LIST" */
-#define FMT     0x20746D66      /* "fmt " */
+#define FMT         0x20746D66      /* "fmt " */
 #define DATA        0x61746164      /* "data" */
+#define SMPL        0x6c706d73      /* "smpl" */
 #define PCM_CODE    1
 #define ADPCM_CODE  2
 #define WAVE_MONO   1
 #define WAVE_STEREO 2
 
-/* Normally, these three chunks come consecutively in a WAVE file */
-typedef struct WaveFMT {
+typedef struct {
 /* Not saved in the chunk we read:
-    Uint32  FMTchunk;
-    Uint32  fmtlen;
+    Uint32  chunkID;
+    Uint32  chunkLen;
 */
     Uint16  encoding;
     Uint16  channels;       /* 1 = mono, 2 = stereo */
@@ -70,12 +68,31 @@ typedef struct WaveFMT {
     Uint16  bitspersample;      /* One of 8, 12, 16, or 4 for ADPCM */
 } WaveFMT;
 
-/* The general chunk found in the WAVE file */
-typedef struct Chunk {
-    Uint32 magic;
-    Uint32 length;
-    Uint8 *data;            /* Data includes magic and length */
-} Chunk;
+typedef struct {
+    Uint32 identifier;
+    Uint32 type;
+    Uint32 start;
+    Uint32 end;
+    Uint32 fraction;
+    Uint32 play_count;
+} SampleLoop;
+
+typedef struct {
+/* Not saved in the chunk we read:
+    Uint32  chunkID;
+    Uint32  chunkLen;
+*/
+    Uint32  manufacturer;
+    Uint32  product;
+    Uint32  sample_period;
+    Uint32  MIDI_unity_note;
+    Uint32  MIDI_pitch_fraction;
+    Uint32  SMTPE_format;
+    Uint32  SMTPE_offset;
+    Uint32  sample_loops;
+    Uint32  sampler_data;
+    SampleLoop loops[];
+} SamplerChunk;
 
 /*********************************************/
 /* Define values for AIFF (IFF audio) format */
@@ -94,10 +111,8 @@ static SDL_AudioSpec mixer;
 static int wavestream_volume = MIX_MAX_VOLUME;
 
 /* Function to load the WAV/AIFF stream */
-static SDL_RWops *LoadWAVStream (SDL_RWops *rw, SDL_AudioSpec *spec,
-                    long *start, long *stop);
-static SDL_RWops *LoadAIFFStream (SDL_RWops *rw, SDL_AudioSpec *spec,
-                    long *start, long *stop);
+static SDL_bool LoadWAVStream(WAVStream *wave);
+static SDL_bool LoadAIFFStream(WAVStream *wave);
 
 /* Initialize the WAVStream player, with the given mixer settings
    This function returns 0, or -1 if there was an error.
@@ -117,33 +132,35 @@ void WAVStream_SetVolume(int volume)
 WAVStream *WAVStream_LoadSong_RW(SDL_RWops *src, int freesrc)
 {
     WAVStream *wave;
-    SDL_AudioSpec wavespec;
+    SDL_bool loaded = SDL_FALSE;
 
-    if ( ! mixer.format ) {
+    if (!mixer.format) {
         Mix_SetError("WAV music output not started");
         return(NULL);
     }
+
     wave = (WAVStream *)SDL_malloc(sizeof *wave);
-    if ( wave ) {
+    if (wave) {
         Uint32 magic;
 
         SDL_zerop(wave);
+        wave->src = src;
         wave->freesrc = freesrc;
 
         magic = SDL_ReadLE32(src);
-        if ( magic == RIFF || magic == WAVE ) {
-            wave->src = LoadWAVStream(src, &wavespec, &wave->start, &wave->stop);
-        } else if ( magic == FORM ) {
-            wave->src = LoadAIFFStream(src, &wavespec, &wave->start, &wave->stop);
+        if (magic == RIFF || magic == WAVE) {
+            loaded = LoadWAVStream(wave);
+        } else if (magic == FORM) {
+            loaded = LoadAIFFStream(wave);
         } else {
             Mix_SetError("Unknown WAVE format");
         }
-        if ( wave->src == NULL ) {
-            SDL_free(wave);
+        if (!loaded) {
+            WAVStream_FreeSong(wave);
             return(NULL);
         }
         SDL_BuildAudioCVT(&wave->cvt,
-            wavespec.format, wavespec.channels, wavespec.freq,
+            wave->spec.format, wave->spec.channels, wave->spec.freq,
             mixer.format, mixer.channels, mixer.freq);
     } else {
         SDL_OutOfMemory();
@@ -155,67 +172,118 @@ WAVStream *WAVStream_LoadSong_RW(SDL_RWops *src, int freesrc)
 /* Start playback of a given WAV stream */
 void WAVStream_Start(WAVStream *wave)
 {
-    SDL_RWseek (wave->src, wave->start, RW_SEEK_SET);
+    int i;
+    for (i = 0; i < wave->numloops; ++i) {
+        WAVLoopPoint *loop = &wave->loops[i];
+        loop->active = SDL_TRUE;
+        loop->current_play_count = loop->initial_play_count;
+    }
+    SDL_RWseek(wave->src, wave->start, RW_SEEK_SET);
     music = wave;
 }
 
 /* Play some of a stream previously started with WAVStream_Start() */
-int WAVStream_PlaySome(Uint8 *stream, int len)
+static int PlaySome(Uint8 *stream, int len)
 {
-    Sint64 pos;
-    Sint64 left = 0;
-
-    if ( music && ((pos=SDL_RWtell(music->src)) < music->stop) ) {
-        if ( music->cvt.needed ) {
-            int original_len;
-
-            original_len=(int)((double)len/music->cvt.len_ratio);
-            if ( music->cvt.len != original_len ) {
-                int worksize;
-                if ( music->cvt.buf != NULL ) {
-                    SDL_free(music->cvt.buf);
-                }
-                worksize = original_len*music->cvt.len_mult;
-                music->cvt.buf=(Uint8 *)SDL_malloc(worksize);
-                if ( music->cvt.buf == NULL ) {
-                    return 0;
-                }
-                music->cvt.len = original_len;
+    Sint64 pos, stop;
+    WAVLoopPoint *loop;
+    Sint64 loop_start;
+    Sint64 loop_stop;
+    int i;
+    int consumed;
+
+    pos = SDL_RWtell(music->src);
+    stop = music->stop;
+    loop = NULL;
+    for (i = 0; i < music->numloops; ++i) {
+        loop = &music->loops[i];
+        if (loop->active) {
+            const int bytes_per_sample = (SDL_AUDIO_BITSIZE(music->spec.format) / 8) * music->spec.channels;
+            loop_start = music->start + loop->start * bytes_per_sample;
+            loop_stop = music->start + (loop->stop + 1) * bytes_per_sample;
+            if (pos >= loop_start && pos < loop_stop)
+            {
+                stop = loop_stop;
+                break;
             }
-            if ( (music->stop - pos) < original_len ) {
-                left = (original_len - (music->stop - pos));
-                original_len -= (int)left;
-                left = (int)((double)left*music->cvt.len_ratio);
+        }
+        loop = NULL;
+    }
+
+    if (music->cvt.needed) {
+        int original_len;
+
+        original_len = (int)((double)len/music->cvt.len_ratio);
+        if (music->cvt.len != original_len) {
+            int worksize;
+            if (music->cvt.buf != NULL) {
+                SDL_free(music->cvt.buf);
             }
-            original_len = SDL_RWread(music->src, music->cvt.buf,1,original_len);
-            /* At least at the time of writing, SDL_ConvertAudio()
-               does byte-order swapping starting at the end of the
-               buffer. Thus, if we are reading 16-bit samples, we
-               had better make damn sure that we get an even
-               number of bytes, or we'll get garbage.
-             */
-            if ( (music->cvt.src_format & 0x0010) && (original_len & 1) ) {
-                original_len--;
+            worksize = original_len*music->cvt.len_mult;
+            music->cvt.buf=(Uint8 *)SDL_malloc(worksize);
+            if (music->cvt.buf == NULL) {
+                return 0;
             }
             music->cvt.len = original_len;
-            SDL_ConvertAudio(&music->cvt);
-            SDL_MixAudio(stream, music->cvt.buf, music->cvt.len_cvt, wavestream_volume);
+        }
+        if ((stop - pos) < original_len) {
+            original_len = (int)(stop - pos);
+        }
+        original_len = SDL_RWread(music->src, music->cvt.buf, 1, original_len);
+        /* At least at the time of writing, SDL_ConvertAudio()
+           does byte-order swapping starting at the end of the
+           buffer. Thus, if we are reading 16-bit samples, we
+           had better make damn sure that we get an even
+           number of bytes, or we'll get garbage.
+         */
+        if ((music->cvt.src_format & 0x0010) && (original_len & 1)) {
+            original_len--;
+        }
+        music->cvt.len = original_len;
+        SDL_ConvertAudio(&music->cvt);
+        SDL_MixAudio(stream, music->cvt.buf, music->cvt.len_cvt, wavestream_volume);
+        consumed = music->cvt.len_cvt;
+    } else {
+        Uint8 *data;
+        if ((stop - pos) < len) {
+            len = (int)(stop - pos);
+        }
+        data = SDL_stack_alloc(Uint8, len);
+        if (data) {
+            len = SDL_RWread(music->src, data, 1, len);
+            SDL_MixAudio(stream, data, len, wavestream_volume);
+            SDL_stack_free(data);
+        }
+        consumed = len;
+    }
+
+    if (loop && SDL_RWtell(music->src) >= stop) {
+        if (loop->current_play_count == 1) {
+            loop->active = SDL_FALSE;
         } else {
-            Uint8 *data;
-            if ( (music->stop - pos) < len ) {
-                left = (len - (music->stop - pos));
-                len -= (int)left;
-            }
-            data = SDL_stack_alloc(Uint8, len);
-            if (data)
-            {
-                SDL_RWread(music->src, data, len, 1);
-                SDL_MixAudio(stream, data, len, wavestream_volume);
-                SDL_stack_free(data);
+            if (loop->current_play_count > 0) {
+                --loop->current_play_count;
             }
+            SDL_RWseek(music->src, loop_start, RW_SEEK_SET);
         }
     }
-    return (int)left;
+    return consumed;
+}
+
+int WAVStream_PlaySome(Uint8 *stream, int len)
+{
+    if (!music)
+        return 0;
+
+    while ((SDL_RWtell(music->src) < music->stop) && (len > 0)) {
+        int consumed = PlaySome(stream, len);
+        if (!consumed)
+            break;
+
+        stream += consumed;
+        len -= consumed;
+    }
+    return len;
 }
 
 /* Stop playback of a stream previously started with WAVStream_Start() */
@@ -227,12 +295,15 @@ void WAVStream_Stop(void)
 /* Close the given WAV stream */
 void WAVStream_FreeSong(WAVStream *wave)
 {
-    if ( wave ) {
+    if (wave) {
         /* Clean up associated data */
-        if ( wave->cvt.buf ) {
+        if (wave->loops) {
+            SDL_free(wave->loops);
+        }
+        if (wave->cvt.buf) {
             SDL_free(wave->cvt.buf);
         }
-        if ( wave->freesrc ) {
+        if (wave->freesrc) {
             SDL_RWclose(wave->src);
         }
         SDL_free(wave);
@@ -245,85 +316,45 @@ int WAVStream_Active(void)
     int active;
 
     active = 0;
-    if ( music && (SDL_RWtell(music->src) < music->stop) ) {
+    if (music && (SDL_RWtell(music->src) < music->stop)) {
         active = 1;
     }
     return(active);
 }
 
-static int ReadChunk(SDL_RWops *src, Chunk *chunk, int read_data)
+static SDL_bool ParseFMT(WAVStream *wave, Uint32 chunk_length)
 {
-    chunk->magic    = SDL_ReadLE32(src);
-    chunk->length   = SDL_ReadLE32(src);
-    if ( read_data ) {
-        chunk->data = (Uint8 *)SDL_malloc(chunk->length);
-        if ( chunk->data == NULL ) {
-            Mix_SetError("Out of memory");
-            return(-1);
-        }
-        if ( SDL_RWread(src, chunk->data, chunk->length, 1) != 1 ) {
-            Mix_SetError("Couldn't read chunk");
-            SDL_free(chunk->data);
-            return(-1);
-        }
-    } else {
-        SDL_RWseek(src, chunk->length, RW_SEEK_CUR);
+    SDL_RWops *src = wave->src;
+    SDL_AudioSpec *spec = &wave->spec;
+    WaveFMT *format;
+    Uint8 *data;
+    SDL_bool loaded = SDL_FALSE;
+
+    if (chunk_length < sizeof(*format)) {
+        Mix_SetError("Wave format chunk too small");
+        return SDL_FALSE;
     }
-    return(chunk->length);
-}
-
-static SDL_RWops *LoadWAVStream (SDL_RWops *src, SDL_AudioSpec *spec,
-                    long *start, long *stop)
-{
-    int was_error;
-    Chunk chunk;
-    int lenread;
-
-    /* WAV magic header */
-    Uint32 wavelen;
-    Uint32 WAVEmagic;
 
-    /* FMT chunk */
-    WaveFMT *format = NULL;
-
-    was_error = 0;
-
-    /* Check the magic header */
-    wavelen     = SDL_ReadLE32(src);
-    WAVEmagic   = SDL_ReadLE32(src);
-
-    /* Read the audio data format chunk */
-    chunk.data = NULL;
-    do {
-        /* FIXME! Add this logic to SDL_LoadWAV_RW() */
-        if ( chunk.data ) {
-            SDL_free(chunk.data);
-        }
-        lenread = ReadChunk(src, &chunk, 1);
-        if ( lenread < 0 ) {
-            was_error = 1;
-            goto done;
-        }
-    } while ( (chunk.magic == FACT) || (chunk.magic == LIST) );
+    data = (Uint8 *)SDL_malloc(chunk_length);
+    if (!data) {
+        Mix_SetError("Out of memory");
+        return SDL_FALSE;
+    }
+    if (!SDL_RWread(wave->src, data, chunk_length, 1)) {
+        Mix_SetError("Couldn't read %d bytes from WAV file", chunk_length);
+        return SDL_FALSE;
+    }
+    format = (WaveFMT *)data;
 
     /* Decode the audio data format */
-    format = (WaveFMT *)chunk.data;
-    if ( chunk.magic != FMT ) {
-        SDL_free(chunk.data);
-        Mix_SetError("Complex WAVE files not supported");
-        was_error = 1;
-        goto done;
-    }
     switch (SDL_SwapLE16(format->encoding)) {
         case PCM_CODE:
             /* We can understand this */
             break;
         default:
             Mix_SetError("Unknown WAVE data format");
-            was_error = 1;
             goto done;
     }
-    SDL_memset(spec, 0, (sizeof *spec));
     spec->freq = SDL_SwapLE32(format->frequency);
     switch (SDL_SwapLE16(format->bitspersample)) {
         case 8:
@@ -334,32 +365,136 @@ static SDL_RWops *LoadWAVStream (SDL_RWops *src, SDL_AudioSpec *spec,
             break;
         default:
             Mix_SetError("Unknown PCM data format");
-            was_error = 1;
             goto done;
     }
     spec->channels = (Uint8) SDL_SwapLE16(format->channels);
     spec->samples = 4096;       /* Good default buffer size */
 
-    /* Set the file offset to the DATA chunk data */
-    chunk.data = NULL;
-    do {
-        *start = (long)SDL_RWtell(src) + 2*sizeof(Uint32);
-        lenread = ReadChunk(src, &chunk, 0);
-        if ( lenread < 0 ) {
-            was_error = 1;
-            goto done;
+    loaded = SDL_TRUE;
+
+done:
+    SDL_free(data);
+    return loaded;
+}
+
+static SDL_bool ParseDATA(WAVStream *wave, Uint32 chunk_length)
+{
+    wave->start = SDL_RWtell(wave->src);
+    wave->stop = wave->start + chunk_length;
+    SDL_RWseek(wave->src, chunk_length, RW_SEEK_CUR);
+    return SDL_TRUE;
+}
+
+static SDL_bool AddLoopPoint(WAVStream *wave, Uint32 play_count, Uint32 start, Uint32 stop)
+{
+    WAVLoopPoint *loop;
+    WAVLoopPoint *loops = SDL_realloc(wave->loops, (wave->numloops + 1)*sizeof(*wave->loops));
+    if (!loops) {
+        Mix_SetError("Out of memory");
+        return SDL_FALSE;
+    }
+
+    loop = &loops[ wave->numloops ];
+    loop->start = start;
+    loop->stop = stop;
+    loop->initial_play_count = play_count;
+    loop->current_play_count = play_count;
+
+    wave->loops = loops;
+    ++wave->numloops;
+    return SDL_TRUE;
+}
+
+static SDL_bool ParseSMPL(WAVStream *wave, Uint32 chunk_length)
+{
+    SamplerChunk *chunk;
+    Uint8 *data;
+    int i;
+    SDL_bool loaded = SDL_FALSE;
+
+    data = (Uint8 *)SDL_malloc(chunk_length);
+    if (!data) {
+        Mix_SetError("Out of memory");
+        return SDL_FALSE;
+    }
+    if (!SDL_RWread(wave->src, data, chunk_length, 1)) {
+        Mix_SetError("Couldn't read %d bytes from WAV file", chunk_length);
+        return SDL_FALSE;
+    }
+    chunk = (SamplerChunk *)data;
+
+    for (i = 0; i < SDL_SwapLE32(chunk->sample_loops); ++i) {
+        const Uint32 LOOP_TYPE_FORWARD = 0;
+        Uint32 loop_type = SDL_SwapLE32(chunk->loops[i].type);
+        if (loop_type == LOOP_TYPE_FORWARD) {
+            AddLoopPoint(wave, SDL_SwapLE32(chunk->loops[i].play_count), SDL_SwapLE32(chunk->loops[i].start), SDL_SwapLE32(chunk->loops[i].end));
         }
-    } while ( chunk.magic != DATA );
-    *stop = (long)SDL_RWtell(src);
+    }
+
+    loaded = SDL_TRUE;
 
 done:
-    if ( format != NULL ) {
-        SDL_free(format);
+    SDL_free(data);
+    return loaded;
+}
+
+static SDL_bool LoadWAVStream(WAVStream *wave)
+{
+    SDL_RWops *src = wave->src;
+    Uint32 chunk_type;
+    Uint32 chunk_length;
+    SDL_bool found_FMT = SDL_FALSE;
+    SDL_bool found_DATA = SDL_FALSE;
+
+    /* WAV magic header */
+    Uint32 wavelen;
+    Uint32 WAVEmagic;
+
+    /* Check the magic header */
+    wavelen = SDL_ReadLE32(src);
+    WAVEmagic = SDL_ReadLE32(src);
+
+    /* Read the chunks */
+    for (; ;) {
+        chunk_type = SDL_ReadLE32(src);
+        chunk_length = SDL_ReadLE32(src);
+
+        if (chunk_length == 0)
+            break;
+
+        switch (chunk_type)
+        {
+        case FMT:
+            found_FMT = SDL_TRUE;
+            if (!ParseFMT(wave, chunk_length))
+                return SDL_FALSE;
+            break;
+        case DATA:
+            found_DATA = SDL_TRUE;
+            if (!ParseDATA(wave, chunk_length))
+                return SDL_FALSE;
+            break;
+        case SMPL:
+            if (!ParseSMPL(wave, chunk_length))
+                return SDL_FALSE;
+            break;
+        default:
+            SDL_RWseek(src, chunk_length, RW_SEEK_CUR);
+            break;
+        }
     }
-    if ( was_error ) {
-        return NULL;
+
+    if (!found_FMT) {
+        Mix_SetError("Bad WAV file (no FMT chunk)");
+        return SDL_FALSE;
     }
-    return(src);
+
+    if (!found_DATA) {
+        Mix_SetError("Bad WAV file (no DATA chunk)");
+        return SDL_FALSE;
+    }
+
+    return SDL_TRUE;
 }
 
 /* I couldn't get SANE_to_double() to work, so I stole this from libsndfile.
@@ -384,16 +519,16 @@ static Uint32 SANE_to_Uint32 (Uint8 *sanebuf)
     if (sanebuf[0] == 0x40 && sanebuf[1] > 0x1C)
         return 800000000;
 
-    return ((sanebuf[2] << 23) | (sanebuf[3] << 15) | (sanebuf[4] << 7)
-        | (sanebuf[5] >> 1)) >> (29 - sanebuf[1]);
+    return ((sanebuf[2] << 23) | (sanebuf[3] << 15) | (sanebuf[4] << 7) |
+            (sanebuf[5] >> 1)) >> (29 - sanebuf[1]);
 }
 
-static SDL_RWops *LoadAIFFStream (SDL_RWops *src, SDL_AudioSpec *spec,
-                    long *start, long *stop)
+static SDL_bool LoadAIFFStream(WAVStream *wave)
 {
-    int was_error;
-    int found_SSND;
-    int found_COMM;
+    SDL_RWops *src = wave->src;
+    SDL_AudioSpec *spec = &wave->spec;
+    SDL_bool found_SSND = SDL_FALSE;
+    SDL_bool found_COMM = SDL_FALSE;
 
     Uint32 chunk_type;
     Uint32 chunk_length;
@@ -411,27 +546,20 @@ static SDL_RWops *LoadAIFFStream (SDL_RWops *src, SDL_AudioSpec *spec,
     Uint8 sane_freq[10];
     Uint32 frequency = 0;
 
-    was_error = 0;
-
     /* Check the magic header */
-    chunk_length    = SDL_ReadBE32(src);
-    AIFFmagic   = SDL_ReadLE32(src);
-    if ( AIFFmagic != AIFF ) {
+    chunk_length = SDL_ReadBE32(src);
+    AIFFmagic = SDL_ReadLE32(src);
+    if (AIFFmagic != AIFF) {
         Mix_SetError("Unrecognized file type (not AIFF)");
-        was_error = 1;
-        goto done;
+        return SDL_FALSE;
     }
 
     /* From what I understand of the specification, chunks may appear in
-         * any order, and we should just ignore unknown ones.
+     * any order, and we should just ignore unknown ones.
      *
      * TODO: Better sanity-checking. E.g. what happens if the AIFF file
      *       contains compressed sound data?
      */
-
-    found_SSND = 0;
-    found_COMM = 0;
-
     do {
         chunk_type      = SDL_ReadLE32(src);
         chunk_length    = SDL_ReadBE32(src);
@@ -439,25 +567,25 @@ static SDL_RWops *LoadAIFFStream (SDL_RWops *src, SDL_AudioSpec *spec,
 
         /* Paranoia to avoid infinite loops */
         if (chunk_length == 0)
-        break;
+            break;
 
         switch (chunk_type) {
         case SSND:
-            found_SSND      = 1;
-            offset      = SDL_ReadBE32(src);
-            blocksize       = SDL_ReadBE32(src);
-            *start      = (long)SDL_RWtell(src) + offset;
+            found_SSND = SDL_TRUE;
+            offset = SDL_ReadBE32(src);
+            blocksize = SDL_ReadBE32(src);
+            wave->start = SDL_RWtell(src) + offset;
             break;
 
         case COMM:
-            found_COMM      = 1;
+            found_COMM = SDL_TRUE;
 
             /* Read the audio data format chunk */
-            channels        = SDL_ReadBE16(src);
-            numsamples      = SDL_ReadBE32(src);
-            samplesize      = SDL_ReadBE16(src);
+            channels = SDL_ReadBE16(src);
+            numsamples = SDL_ReadBE32(src);
+            samplesize = SDL_ReadBE16(src);
             SDL_RWread(src, sane_freq, sizeof(sane_freq), 1);
-            frequency       = SANE_to_Uint32(sane_freq);
+            frequency = SANE_to_Uint32(sane_freq);
             break;
 
         default:
@@ -468,17 +596,15 @@ static SDL_RWops *LoadAIFFStream (SDL_RWops *src, SDL_AudioSpec *spec,
 
     if (!found_SSND) {
         Mix_SetError("Bad AIFF file (no SSND chunk)");
-        was_error = 1;
-        goto done;
+        return SDL_FALSE;
     }
 
     if (!found_COMM) {
         Mix_SetError("Bad AIFF file (no COMM chunk)");
-        was_error = 1;
-        goto done;
+        return SDL_FALSE;
     }
 
-    *stop = *start + channels * numsamples * (samplesize / 8);
+    wave->stop = wave->start + channels * numsamples * (samplesize / 8);
 
     /* Decode the audio data format */
     SDL_memset(spec, 0, (sizeof *spec));
@@ -492,16 +618,11 @@ static SDL_RWops *LoadAIFFStream (SDL_RWops *src, SDL_AudioSpec *spec,
             break;
         default:
             Mix_SetError("Unknown samplesize in data format");
-            was_error = 1;
-            goto done;
+            return SDL_FALSE;
     }
     spec->channels = (Uint8) channels;
     spec->samples = 4096;       /* Good default buffer size */
 
-done:
-    if ( was_error ) {
-        return NULL;
-    }
-    return(src);
+    return SDL_TRUE;
 }
 
diff --git a/wavestream.h b/wavestream.h
index fb0c702..adb4dbb 100644
--- a/wavestream.h
+++ b/wavestream.h
@@ -1,6 +1,6 @@
 /*
   SDL_mixer:  An audio mixer library based on the SDL library
-  Copyright (C) 1997-2013 Sam Lantinga <slouken at libsdl.org>
+  Copyright (C) 1997-2016 Sam Lantinga <slouken at libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -21,16 +21,25 @@
 
 /* $Id$ */
 
-/* This file supports streaming WAV files, without volume adjustment */
+/* This file supports streaming WAV files */
 
-#include <stdio.h>
+typedef struct {
+    SDL_bool active;
+    Uint32 start;
+    Uint32 stop;
+    Uint32 initial_play_count;
+    Uint32 current_play_count;
+} WAVLoopPoint;
 
 typedef struct {
     SDL_RWops *src;
     SDL_bool freesrc;
-    long  start;
-    long  stop;
+    SDL_AudioSpec spec;
+    Sint64 start;
+    Sint64 stop;
     SDL_AudioCVT cvt;
+    int numloops;
+    WAVLoopPoint *loops;
 } WAVStream;
 
 /* Initialize the WAVStream player, with the given mixer settings

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-sdl/packages/libsdl2-mixer.git



More information about the pkg-sdl-commits mailing list