koda/Smaxx changes to openal for crossplatform building
authornemo
Sun, 28 Jun 2009 14:37:26 +0000
changeset 2200 8192be6e3aef
parent 2199 be265856322f
child 2201 6b14d6da9a49
koda/Smaxx changes to openal for crossplatform building
CMakeLists.txt
QTfrontend/CMakeLists.txt
cmake_modules/FindOggVorbis.cmake
hedgewars/CMakeLists.txt
hedgewars/SDLh.pas
hedgewars/uSound.pas
openalbridge/CMakeLists.txt
openalbridge/endianness.c
openalbridge/endianness.h
openalbridge/loaders.c
openalbridge/loaders.h
openalbridge/openalwrap.c
openalbridge/openalwrap.h
openalbridge/winstdint.h
openalbridge/wrappers.c
--- a/CMakeLists.txt	Sat Jun 27 09:51:15 2009 +0000
+++ b/CMakeLists.txt	Sun Jun 28 14:37:26 2009 +0000
@@ -22,7 +22,6 @@
 	set(universal_build "1")
 	message("-- Building a Universal Application")
 endif(CMAKE_OSX_ARCHITECTURES MATCHES "i386;ppc7400" OR CMAKE_OSX_ARCHITECTURES MATCHES "ppc7400;i386" OR CMAKE_OSX_ARCHITECTURES MATCHES "i386;ppc" OR CMAKE_OSX_ARCHITECTURES MATCHES "ppc;i386")
-
 endif(APPLE)
 
 if(DEFINED DATA_INSTALL_DIR)
@@ -60,7 +59,7 @@
 set(CPACK_PACKAGE_INSTALL_DIRECTORY "Hedgewars ${HEDGEWARS_VERSION}")
 
 if(WIN32 AND NOT UNIX)
-	set(CPACK_NSIS_DISPLAY_NAME "Hedgewars, a turn-based Worms-like strategy") 
+	set(CPACK_NSIS_DISPLAY_NAME "Hedgewars, a free turn-based strategy game") 
 	set(CPACK_NSIS_HELP_LINK "http://www.hedgewars.org/")
 	set(CPACK_NSIS_URL_INFO_ABOUT "http://www.hedgewars.org/")
 	set(CPACK_NSIS_CONTACT "unC0Rr@gmail.com")
--- a/QTfrontend/CMakeLists.txt	Sat Jun 27 09:51:15 2009 +0000
+++ b/QTfrontend/CMakeLists.txt	Sun Jun 28 14:37:26 2009 +0000
@@ -17,8 +17,6 @@
 
 # Configure for SDL
 find_package(SDL REQUIRED)
-find_package(OpenAL REQUIRED)
-find_package(OggVorbis REQUIRED)
 
 include_directories(${SDL_INCLUDE_DIR})
 
@@ -166,18 +164,29 @@
 	${hwfr_hdrs}
 	${hwfr_rez_src})
 
-find_library(OPENALBRIDGE_LIBRARY libopenalbridge.a PATH ${EXECUTABLE_OUTPUT_PATH} )
-
 set(HW_LINK_LIBS 
 	${QT_LIBRARIES}
 	${SDL_LIBRARY}
-	${OPENAL_LIBRARY}
-	${OGG_LIBRARY}
-	${VORBIS_LIBRARY}
-	${VORBISFILE_LIBRARY}
-	${OPENALBRIDGE_LIBRARY}
+	openalbridge
 )
 
+#since openalbridge is linked statically in human systems we need to explicitly link dependencies 
+if(UNIX)
+	set(HW_LINK_LIBS
+		${OPENAL_LIBRARY}
+		${OGG_LIBRARY}
+		${VORBIS_LIBRARY}
+		${HW_LINK_LIBS}
+		)
+if(NOT APPLE)
+	set(HW_LINK_LIBS
+		${VORBISFILE_LIBRARY}
+		${HW_LINK_LIBS}
+		)
+endif(NOT APPLE)
+endif(UNIX)
+
+
 if(WIN32 AND NOT UNIX)
 	if(NOT SDL_LIBRARY)
 		set(HW_LINK_LIBS 
--- a/cmake_modules/FindOggVorbis.cmake	Sat Jun 27 09:51:15 2009 +0000
+++ b/cmake_modules/FindOggVorbis.cmake	Sun Jun 28 14:37:26 2009 +0000
@@ -1,90 +1,23 @@
-# - Try to find the OggVorbis libraries
-# Once done this will define
-#
-#  OGGVORBIS_FOUND - system has OggVorbis
-#  OGGVORBIS_VERSION - set either to 1 or 2
-#  OGGVORBIS_INCLUDE_DIR - the OggVorbis include directory
-#  OGGVORBIS_LIBRARIES - The libraries needed to use OggVorbis
-#  OGG_LIBRARY         - The Ogg library
-#  VORBIS_LIBRARY      - The Vorbis library
-#  VORBISFILE_LIBRARY  - The VorbisFile library
-#  VORBISENC_LIBRARY   - The VorbisEnc library
+FIND_PATH(VORBIS_INCLUDE_DIR vorbis/vorbisfile.h)
+FIND_PATH(OGG_INCLUDE_DIR ogg/ogg.h)
+
+FIND_LIBRARY(OGG_LIBRARY NAMES ogg)
+
+FIND_LIBRARY(VORBIS_LIBRARY NAMES vorbis)
+FIND_LIBRARY(VORBISFILE_LIBRARY NAMES vorbisfile)
 
-# Copyright (c) 2006, Richard Laerkaeng, <richard@goteborg.utfors.se>
-#
-# Redistribution and use is allowed according to the terms of the BSD license.
-# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
-
-
-include (CheckLibraryExists)
+IF(VORBIS_INCLUDE_DIR AND OGG_LIBRARY AND VORBIS_LIBRARY AND VORBISFILE_LIBRARY)
+    SET(OGGVORBIS_FOUND TRUE)
+    SET(OGGVORBIS_LIBRARIES ${OGG_LIBRARY} ${VORBIS_LIBRARY} ${VORBISFILE_LIBRARY})
+    SET(OGGVORBIS_INCLUDE_DIRS ${VORBIS_INCLUDE_DIR} ${OGG_INCLUDE_DIR})
+ELSE(VORBIS_INCLUDE_DIR AND OGG_LIBRARY AND VORBIS_LIBRARY AND VORBISFILE_LIBRARY)
+    SET(OGGVORBIS_FOUND FALSE)
+ENDIF(VORBIS_INCLUDE_DIR AND OGG_LIBRARY AND VORBIS_LIBRARY AND VORBISFILE_LIBRARY)
 
-find_path(VORBIS_INCLUDE_DIR vorbis/vorbisfile.h)
-find_path(OGG_INCLUDE_DIR ogg/ogg.h)
-
-find_library(OGG_LIBRARY NAMES ogg)
-find_library(VORBIS_LIBRARY NAMES vorbis)
-find_library(VORBISFILE_LIBRARY NAMES vorbisfile)
-find_library(VORBISENC_LIBRARY NAMES vorbisenc)
-
-mark_as_advanced(VORBIS_INCLUDE_DIR OGG_INCLUDE_DIR
-                 OGG_LIBRARY VORBIS_LIBRARY VORBISFILE_LIBRARY VORBISENC_LIBRARY)
+IF(OGGVORBIS_FOUND)
+    MESSAGE(STATUS "Found OggVorbis: ${OGGVORBIS_LIBRARIES}")
+ELSE(OGGVORBIS_FOUND)
+    MESSAGE(FATAL_ERROR "Could NOT find Ogg and/or Vorbis - Visit xiph.org for them")
+ENDIF(OGGVORBIS_FOUND)
 
 
-if (VORBIS_INCLUDE_DIR AND VORBIS_LIBRARY AND VORBISFILE_LIBRARY AND VORBISENC_LIBRARY)
-   set(OGGVORBIS_FOUND TRUE)
-
-   set(OGGVORBIS_LIBRARIES ${OGG_LIBRARY} ${VORBIS_LIBRARY} ${VORBISFILE_LIBRARY} ${VORBISENC_LIBRARY})
-
-   set(_CMAKE_REQUIRED_LIBRARIES_TMP ${CMAKE_REQUIRED_LIBRARIES})
-   set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${OGGVORBIS_LIBRARIES})
-   check_library_exists(vorbis vorbis_bitrate_addblock "" HAVE_LIBVORBISENC2)
-   set(CMAKE_REQUIRED_LIBRARIES ${_CMAKE_REQUIRED_LIBRARIES_TMP})
-
-   if (HAVE_LIBVORBISENC2)
-      set (OGGVORBIS_VERSION 2)
-   else (HAVE_LIBVORBISENC2)
-      set (OGGVORBIS_VERSION 1)
-   endif (HAVE_LIBVORBISENC2)
-
-else (VORBIS_INCLUDE_DIR AND VORBIS_LIBRARY AND VORBISFILE_LIBRARY AND VORBISENC_LIBRARY)
-   set (OGGVORBIS_VERSION)
-   set(OGGVORBIS_FOUND FALSE)
-endif (VORBIS_INCLUDE_DIR AND VORBIS_LIBRARY AND VORBISFILE_LIBRARY AND VORBISENC_LIBRARY)
-
-
-if (OGGVORBIS_FOUND)
-   if (NOT OggVorbis_FIND_QUIETLY)
-      message(STATUS "Found OggVorbis: ${OGGVORBIS_LIBRARIES}")
-   endif (NOT OggVorbis_FIND_QUIETLY)
-else (OGGVORBIS_FOUND)
-   if (OggVorbis_FIND_REQUIRED)
-      message(FATAL_ERROR "Could NOT find OggVorbis libraries")
-   endif (OggVorbis_FIND_REQUIRED)
-   if (NOT OggVorbis_FIND_QUITELY)
-      message(STATUS "Could NOT find OggVorbis libraries")
-   endif (NOT OggVorbis_FIND_QUITELY)
-endif (OGGVORBIS_FOUND)
-
-#check_include_files(vorbis/vorbisfile.h HAVE_VORBISFILE_H)
-#check_library_exists(ogg ogg_page_version "" HAVE_LIBOGG)
-#check_library_exists(vorbis vorbis_info_init "" HAVE_LIBVORBIS)
-#check_library_exists(vorbisfile ov_open "" HAVE_LIBVORBISFILE)
-#check_library_exists(vorbisenc vorbis_info_clear "" HAVE_LIBVORBISENC)
-#check_library_exists(vorbis vorbis_bitrate_addblock "" HAVE_LIBVORBISENC2)
-
-#if (HAVE_LIBOGG AND HAVE_VORBISFILE_H AND HAVE_LIBVORBIS AND HAVE_LIBVORBISFILE AND HAVE_LIBVORBISENC)
-#    message(STATUS "Ogg/Vorbis found")
-#    set (VORBIS_LIBS "-lvorbis -logg")
-#    set (VORBISFILE_LIBS "-lvorbisfile")
-#    set (VORBISENC_LIBS "-lvorbisenc")
-#    set (OGGVORBIS_FOUND TRUE)
-#    if (HAVE_LIBVORBISENC2)
-#        set (HAVE_VORBIS 2)
-#    else (HAVE_LIBVORBISENC2)
-#        set (HAVE_VORBIS 1)
-#    endif (HAVE_LIBVORBISENC2)
-#else (HAVE_LIBOGG AND HAVE_VORBISFILE_H AND HAVE_LIBVORBIS AND HAVE_LIBVORBISFILE AND HAVE_LIBVORBISENC)
-#    message(STATUS "Ogg/Vorbis not found")
-#endif (HAVE_LIBOGG AND HAVE_VORBISFILE_H AND HAVE_LIBVORBIS AND HAVE_LIBVORBISFILE AND HAVE_LIBVORBISENC)
-
-
--- a/hedgewars/CMakeLists.txt	Sat Jun 27 09:51:15 2009 +0000
+++ b/hedgewars/CMakeLists.txt	Sun Jun 28 14:37:26 2009 +0000
@@ -69,33 +69,14 @@
 	FIND_PACKAGE(SDL)
 
 	if (SDL_FOUND)
-		#removing previous version of library
-		exec_program(rm
-			ARGS -f ${EXECUTABLE_OUTPUT_PATH}/libSDLmain.a ${EXECUTABLE_OUTPUT_PATH}/SDLMain.o
-			OUTPUT_VARIABLE noout
-			RETURN_VALUE testnoexecstack
-			)
-
-		#get what architectures to build
-		if(universal_build MATCHES "1")
-			set (arch_to_build "-arch i386 -arch ppc7400")
-		else(universal_build MATCHES "1")
-			set (arch_to_build "")
-		endif(universal_build MATCHES "1")
 
-		#build, archive and make lib
-		exec_program(${CMAKE_C_COMPILER}
-			ARGS ${arch_to_build} -o ${EXECUTABLE_OUTPUT_PATH}/SDLMain.o -c ${hedgewars_SOURCE_DIR}/hedgewars/SDLMain.m -I ${SDL_INCLUDE_DIR} -O2
-			OUTPUT_VARIABLE noout
-			)
-		exec_program(${CMAKE_AR}
-			ARGS -rvu ${EXECUTABLE_OUTPUT_PATH}/libSDLmain.a ${EXECUTABLE_OUTPUT_PATH}/SDLMain.o
-			OUTPUT_VARIABLE noout
-			)
-		exec_program(${CMAKE_RANLIB}
-			ARGS ${EXECUTABLE_OUTPUT_PATH}/libSDLmain.a
-			OUTPUT_VARIABLE noout
-			)
+		set(LIBRARY_OUTPUT_PATH ${EXECUTABLE_OUTPUT_PATH})
+		include_directories(${SDL_INCLUDE_DIR})
+		link_libraries(${SDL_LIBRARY})
+
+		add_library (SDLmain STATIC SDLMain.m)
+		set(engine_sources SDLmain ${engine_sources})
+
 	else (SDL_FOUND)
 		message(FATAL_ERROR "No SDL framework found!")
 	endif (SDL_FOUND)
@@ -128,7 +109,7 @@
 		COMMAND "${pascal_compiler}"
 		ARGS ${pascal_compiler_flags}
 		MAIN_DEPENDENCY ${hwengine_project}
-		DEPENDS ${engine_sources}
+		DEPENDS openalbridge ${engine_sources}
 		)
 
 ELSE(NOT APPLE OR NOT universal_build MATCHES "1")
@@ -138,7 +119,7 @@
 		COMMAND "ppc386" 
 		ARGS ${pascal_compiler_flags} -ohwengine.386
 		MAIN_DEPENDENCY ${hwengine_project}
-		DEPENDS ${engine_sources}
+		DEPENDS openalbridge ${engine_sources}
 		)
 add_custom_target(hwengine.386 ALL DEPENDS "${EXECUTABLE_OUTPUT_PATH}/hwengine${CMAKE_EXECUTABLE_SUFFIX}.386")
 
@@ -146,7 +127,7 @@
 		COMMAND "ppcppc"
 		ARGS ${pascal_compiler_flags} -ohwengine.ppc
 		MAIN_DEPENDENCY ${hwengine_project}
-		DEPENDS ${engine_sources}
+		DEPENDS openalbridge ${engine_sources}
 		)
 add_custom_target(hwengine.ppc ALL DEPENDS "${EXECUTABLE_OUTPUT_PATH}/hwengine${CMAKE_EXECUTABLE_SUFFIX}.ppc")
 
--- a/hedgewars/SDLh.pas	Sat Jun 27 09:51:15 2009 +0000
+++ b/hedgewars/SDLh.pas	Sun Jun 28 14:37:26 2009 +0000
@@ -36,15 +36,16 @@
 {$PACKRECORDS C}
 
 {$IFDEF DARWIN}
-	  {$PASCALMAINNAME SDL_main}
+	{$PASCALMAINNAME SDL_main}
 {$IFNDEF IPHONEOS}
-	  {$linkframework Cocoa}
-	  {$linkframework SDL}
-	  {$linkframework SDL_net}
-	  {$linkframework SDL_image}
-	  {$linkframework SDL_ttf}
-	  {$linklib SDLmain}
-	  {$linklib gcc}
+	{$linkframework Cocoa}
+	{$linkframework SDL}
+	{$linkframework SDL_net}
+	{$linkframework SDL_image}
+	{$linkframework SDL_ttf}
+	{$linklib openalbridge}
+	{$linklib SDLmain}
+	{$linklib gcc}
 {$ENDIF}
 {$ENDIF}
 
--- a/hedgewars/uSound.pas	Sat Jun 27 09:51:15 2009 +0000
+++ b/hedgewars/uSound.pas	Sun Jun 28 14:37:26 2009 +0000
@@ -19,17 +19,20 @@
 unit uSound;
 interface
 
+
 {$IFDEF DARWIN}
+	{$linklib openalbridge}
 	{$linkframework OpenAL}
 	{$linkframework Ogg}
 	{$linkframework Vorbis}
-	{$linklib openalbridge}
 {$ELSE}
+{$IFDEF UNIX}
 	{$linklib openal}
 	{$linklib ogg}
 	{$linklib vorbis}
 	{$linklib vorbisfile}
 {$ENDIF}
+{$ENDIF}
 
 uses uConsts;
 {$INCLUDE options.inc}
@@ -40,7 +43,7 @@
 		chunks: array [TSound] of LongInt;
 		end;
 
-const OpenALBridge = 'libopenalbridge';
+const OpenALBridge = 'openalbridge';
 
 procedure InitSound;
 procedure ReleaseSound;
--- a/openalbridge/CMakeLists.txt	Sat Jun 27 09:51:15 2009 +0000
+++ b/openalbridge/CMakeLists.txt	Sun Jun 28 14:37:26 2009 +0000
@@ -1,31 +1,36 @@
 find_package(OpenAL REQUIRED)
+find_package(OggVorbis REQUIRED)
 include_directories(${OPENAL_INCLUDE_DIR})
+include_directories(${OGGVORBIS_INCLUDE_DIRS})
 
-#add_library (openalbridge openalwrap.c loaders.c endianness.c wrappers.c)
-exec_program(${CMAKE_C_COMPILER}
-			ARGS ${arch_to_build} -o ${EXECUTABLE_OUTPUT_PATH}/loaders.o -c ${hedgewars_SOURCE_DIR}/openalbridge/loaders.c -I ${OPENAL_INCLUDE_DIR} -O2 -w
-			OUTPUT_VARIABLE noout
-)
-exec_program(${CMAKE_C_COMPILER}
-			ARGS ${arch_to_build} -o ${EXECUTABLE_OUTPUT_PATH}/endianness.o -c ${hedgewars_SOURCE_DIR}/openalbridge/endianness.c -I ${OPENAL_INCLUDE_DIR} -O2 -w
-	OUTPUT_VARIABLE noout
+
+set(LIBRARY_OUTPUT_PATH ${EXECUTABLE_OUTPUT_PATH})
+set(openal_src
+	openalwrap.c loaders.c endianness.c wrappers.c
 )
 
-exec_program(${CMAKE_C_COMPILER}
-			ARGS ${arch_to_build} -o ${EXECUTABLE_OUTPUT_PATH}/openalwrap.o -c ${hedgewars_SOURCE_DIR}/openalbridge/openalwrap.c -I ${OPENAL_INCLUDE_DIR} -O2 -w
-			OUTPUT_VARIABLE noout
-)
+#build a static library for human systems
+set (build_type STATIC)
+
 
-exec_program(${CMAKE_C_COMPILER}
-			ARGS ${arch_to_build} -o ${EXECUTABLE_OUTPUT_PATH}/wrappers.o -c ${hedgewars_SOURCE_DIR}/openalbridge/wrappers.c -I ${OPENAL_INCLUDE_DIR} -O2 -w
-			OUTPUT_VARIABLE noout
-			)
-		exec_program(${CMAKE_AR}
-			ARGS -rvu ${EXECUTABLE_OUTPUT_PATH}/libopenalbridge.a ${EXECUTABLE_OUTPUT_PATH}/loaders.o ${EXECUTABLE_OUTPUT_PATH}/endianness.o ${EXECUTABLE_OUTPUT_PATH}/openalwrap.o ${EXECUTABLE_OUTPUT_PATH}/wrappers.o 
-			OUTPUT_VARIABLE noout
-			)
-		exec_program(${CMAKE_RANLIB}
-			ARGS ${EXECUTABLE_OUTPUT_PATH}/libopenalbridge.a
-			OUTPUT_VARIABLE noout
-			)
+if(WIN32)
+#workaround for visualstudio
+	set(openal_src
+		openalwrap.h loaders.h endianness.h wrappers.h winstdint.h ${openal_src}
+	)
+#deps for the shared library
+	link_libraries(${OPENAL_LIBRARY})
+	link_libraries(${OGG_LIBRARY})
+	link_libraries(${VORBIS_LIBRARY})
+	link_libraries(${VORBISFILE_LIBRARY})
+#build a shared library
+	set (build_type SHARED)
+endif(WIN32)
 
+add_library (openalbridge ${build_type} ${openal_src})
+
+if(WIN32)
+	SET_TARGET_PROPERTIES(openalbridge PROPERTIES LINK_FLAGS /DEF:openalbridge.def)
+#install it in the executable directory
+	install(TARGETS openalbridge DESTINATION bin)
+endif(WIN32)
--- a/openalbridge/endianness.c	Sat Jun 27 09:51:15 2009 +0000
+++ b/openalbridge/endianness.c	Sun Jun 28 14:37:26 2009 +0000
@@ -16,9 +16,6 @@
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
  */
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
 #include "endianness.h"
 
 #ifdef __CPLUSPLUS
--- a/openalbridge/endianness.h	Sat Jun 27 09:51:15 2009 +0000
+++ b/openalbridge/endianness.h	Sun Jun 28 14:37:26 2009 +0000
@@ -16,6 +16,15 @@
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
  */
 
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifndef _WIN32
+#include <stdint.h>
+#else
+#include "winstdint.h"
+#endif
+
 #ifdef __CPLUSPLUS
 extern "C" {
 #endif 
--- a/openalbridge/loaders.c	Sat Jun 27 09:51:15 2009 +0000
+++ b/openalbridge/loaders.c	Sun Jun 28 14:37:26 2009 +0000
@@ -16,14 +16,7 @@
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
  */
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include "al.h"
-#include "alc.h"
 #include "loaders.h"
-#include "endianness.h"
-#include "wrappers.h"
 
 #ifdef __CPLUSPLUS
 extern "C" {
--- a/openalbridge/loaders.h	Sat Jun 27 09:51:15 2009 +0000
+++ b/openalbridge/loaders.h	Sun Jun 28 14:37:26 2009 +0000
@@ -15,6 +15,18 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
  */
+#include <stdio.h>
+#include <stdlib.h>
+#include "al.h"
+#include "alc.h"
+#include "endianness.h"
+#include "wrappers.h"
+
+#ifndef _WIN32
+#include <stdint.h>
+#else
+#include "winstdint.h"
+#endif
 
 #ifdef __CPLUSPLUS
 extern "C" {
--- a/openalbridge/openalwrap.c	Sat Jun 27 09:51:15 2009 +0000
+++ b/openalbridge/openalwrap.c	Sun Jun 28 14:37:26 2009 +0000
@@ -72,7 +72,6 @@
 		/* This function initializes an OpenAL contex, allocates memory space for data and prepares OpenAL buffers*/
 		ALCcontext *context;
 		ALCdevice *device;
-		ALenum error;
 
 		const ALCchar *default_device;
 		// Position of the listener.
@@ -87,7 +86,7 @@
 		fprintf(stderr, "Using default device: %s\n", default_device);
 		
 		if ((device = alcOpenDevice(default_device)) == NULL) {
-			fprintf(stderr, "ERROR %d: Failed to open sound device\n", error);
+			fprintf(stderr, "ERROR: Failed to open sound device\n");
 			return AL_FALSE;
 		}
 		context = alcCreateContext(device, NULL);
@@ -273,9 +272,9 @@
 	}
 	
 #ifndef _WIN32
-	void *helper_fadeout(void* tmp) {
+	void *helper_fadeout(void *tmp) {
 #else
-	VOID WINAPI helper_fadeout(LPVOID tmp) {	
+	void WINAPI helper_fadeout(void *tmp) {	
 #endif
 		ALfloat gain;
 		fade_t *fade;
@@ -305,33 +304,36 @@
 #ifndef _WIN32
 		pthread_exit(NULL);
 #else
-		ThreadExit();
+		free(fade);
+		_endthread();
 #endif
 	}
 	
 	ALint openal_fadeout(int index, unsigned int quantity) {
 #ifndef _WIN32
 		pthread_t thread;
+		fade_t fade;
+		fade.index = index;
+		fade.quantity = quantity;
 #else
 		HANDLE Thread;
 		DWORD threadID;
+		fade_t *fade = malloc(sizeof(fade_t));
+		fade->index = index;
+		fade->quantity = quantity;
 #endif
-		fade_t fade;
-		
+
 		if (index >= globalindex) {
 			fprintf(stderr, "ERROR: index out of bounds (got %d, max %d)", index, globalindex);
 			return AL_FALSE;
 		}
 		
-		fade.index = index;
-		fade.quantity = quantity;
 		
 #ifndef _WIN32
 		pthread_create(&thread, NULL, helper_fadeout, (void*) &fade);
 		pthread_detach(thread);
 #else
-		Thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) helper_fadeout, (void*) &fade, 0, threadID);
-		CloseHandle(Thread);
+		Thread = _beginthread(&helper_fadeout, 0, (void*) fade);
 #endif
 		
 		alGetError();  /* clear any AL errors beforehand */
@@ -340,9 +342,9 @@
 	}
 		
 #ifndef _WIN32
-		void *helper_fadein(void* tmp) 
+		void *helper_fadein(void *tmp) 
 #else
-		VOID WINAPI helper_fadein(LPVOID tmp) 
+		void WINAPI helper_fadein(void *tmp) 
 #endif
 		{
 			ALfloat gain;
@@ -372,7 +374,8 @@
 #ifndef _WIN32
 			pthread_exit(NULL);
 #else
-			ThreadExit();
+			free(fade);
+			_endthread();
 #endif
 		}
 			
@@ -380,26 +383,27 @@
 	ALint openal_fadein(int index, unsigned int quantity) {
 #ifndef _WIN32
 		pthread_t thread;
+		fade_t fade;
+		fade.index = index;
+		fade.quantity = quantity;
 #else
 		HANDLE Thread;
 		DWORD threadID;
+		fade_t *fade = malloc(sizeof(fade_t));
+		fade->index = index;
+		fade->quantity = quantity;
 #endif
-		fade_t fade;
 		
 		if (index >= globalindex) {
 			fprintf(stderr, "ERROR: index out of bounds (got %d, max %d)", index, globalindex);
 			return AL_FALSE;
 		}
-		
-		fade.index = index;
-		fade.quantity = quantity;
-		
+				
 #ifndef _WIN32
 		pthread_create(&thread, NULL, helper_fadein, (void*) &fade);
 		pthread_detach(thread);
 #else
-		Thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) helper_fadein, (void*) &fade, 0, threadID);
-		CloseHandle(Thread);
+		Thread = _beginthread(&helper_fadein, 0, (void*) fade);
 #endif
 		
 		alGetError();  /* clear any AL errors beforehand */
--- a/openalbridge/openalwrap.h	Sat Jun 27 09:51:15 2009 +0000
+++ b/openalbridge/openalwrap.h	Sun Jun 28 14:37:26 2009 +0000
@@ -18,7 +18,6 @@
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <stdint.h>
 #include "al.h"
 #include "alc.h"
 #include "loaders.h"
@@ -27,8 +26,11 @@
 
 #ifndef _WIN32
 #include <pthread.h>
+#include <stdint.h>
 #else
+#define WIN32_LEAN_AND_MEAN
 #include <windows.h>
+#include "winstdint.h"
 #endif
 
 #ifndef _SLEEP_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/openalbridge/winstdint.h	Sun Jun 28 14:37:26 2009 +0000
@@ -0,0 +1,494 @@
+// ISO C9x  compliant stdint.h for Microsoft Visual Studio
+// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 
+// 
+//  Copyright (c) 2006-2008 Alexander Chemeris
+// 
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+// 
+//   1. Redistributions of source code must retain the above copyright notice,
+//      this list of conditions and the following disclaimer.
+// 
+//   2. Redistributions in binary form must reproduce the above copyright
+//      notice, this list of conditions and the following disclaimer in the
+//      documentation and/or other materials provided with the distribution.
+// 
+//   3. The name of the author may be used to endorse or promote products
+//      derived from this software without specific prior written permission.
+// 
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// 
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef _MSC_VER // [
+#error "Use this header only with Microsoft Visual C++ compilers!"
+#endif // _MSC_VER ]
+
+#ifndef _MSC_STDINT_H_ // [
+#define _MSC_STDINT_H_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif
+
+#include <limits.h>
+
+// For Visual Studio 6 in C++ mode and for many Visual Studio versions when
+// compiling for ARM we should wrap <wchar.h> include with 'extern "C++" {}'
+// or compiler give many errors like this:
+//   error C2733: second C linkage of overloaded function 'wmemchr' not allowed
+#ifdef __cplusplus
+extern "C" {
+#endif
+#  include <wchar.h>
+#ifdef __cplusplus
+}
+#endif
+
+// Define _W64 macros to mark types changing their size, like intptr_t.
+#ifndef _W64
+#  if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
+#     define _W64 __w64
+#  else
+#     define _W64
+#  endif
+#endif
+
+
+// 7.18.1 Integer types
+
+// 7.18.1.1 Exact-width integer types
+
+// Visual Studio 6 and Embedded Visual C++ 4 doesn't
+// realize that, e.g. char has the same size as __int8
+// so we give up on __intX for them.
+#if (_MSC_VER < 1300)
+   typedef char              int8_t;
+   typedef short             int16_t;
+   typedef int               int32_t;
+   typedef unsigned char     uint8_t;
+   typedef unsigned short    uint16_t;
+   typedef unsigned int      uint32_t;
+#else
+   typedef __int8            int8_t;
+   typedef __int16           int16_t;
+   typedef __int32           int32_t;
+   typedef unsigned __int8   uint8_t;
+   typedef unsigned __int16  uint16_t;
+   typedef unsigned __int32  uint32_t;
+#endif
+typedef __int64              int64_t;
+typedef unsigned __int64     uint64_t;
+
+
+// 7.18.1.2 Minimum-width integer types
+typedef int8_t    int_least8_t;
+typedef int16_t   int_least16_t;
+typedef int32_t   int_least32_t;
+typedef int64_t   int_least64_t;
+typedef uint8_t   uint_least8_t;
+typedef uint16_t  uint_least16_t;
+typedef uint32_t  uint_least32_t;
+typedef uint64_t  uint_least64_t;
+
+// 7.18.1.3 Fastest minimum-width integer types
+typedef int8_t    int_fast8_t;
+typedef int16_t   int_fast16_t;
+typedef int32_t   int_fast32_t;
+typedef int64_t   int_fast64_t;
+typedef uint8_t   uint_fast8_t;
+typedef uint16_t  uint_fast16_t;
+typedef uint32_t  uint_fast32_t;
+typedef uint64_t  uint_fast64_t;
+
+// 7.18.1.4 Integer types capable of holding object pointers
+#ifdef _WIN64 // [
+   typedef __int64           intptr_t;
+   typedef unsigned __int64  uintptr_t;
+#else // _WIN64 ][
+   typedef _W64 int               intptr_t;
+   typedef _W64 unsigned int      uintptr_t;
+#endif // _WIN64 ]
+
+// 7.18.1.5 Greatest-width integer types
+typedef int64_t   intmax_t;
+typedef uint64_t  uintmax_t;
+
+
+// 7.18.2 Limits of specified-width integer types
+
+#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [   See footnote 220 at page 257 and footnote 221 at page 259
+
+// 7.18.2.1 Limits of exact-width integer types
+#define INT8_MIN     ((int8_t)_I8_MIN)
+#define INT8_MAX     _I8_MAX
+#define INT16_MIN    ((int16_t)_I16_MIN)
+#define INT16_MAX    _I16_MAX
+#define INT32_MIN    ((int32_t)_I32_MIN)
+#define INT32_MAX    _I32_MAX
+#define INT64_MIN    ((int64_t)_I64_MIN)
+#define INT64_MAX    _I64_MAX
+#define UINT8_MAX    _UI8_MAX
+#define UINT16_MAX   _UI16_MAX
+#define UINT32_MAX   _UI32_MAX
+#define UINT64_MAX   _UI64_MAX
+
+// 7.18.2.2 Limits of minimum-width integer types
+#define INT_LEAST8_MIN    INT8_MIN
+#define INT_LEAST8_MAX    INT8_MAX
+#define INT_LEAST16_MIN   INT16_MIN
+#define INT_LEAST16_MAX   INT16_MAX
+#define INT_LEAST32_MIN   INT32_MIN
+#define INT_LEAST32_MAX   INT32_MAX
+#define INT_LEAST64_MIN   INT64_MIN
+#define INT_LEAST64_MAX   INT64_MAX
+#define UINT_LEAST8_MAX   UINT8_MAX
+#define UINT_LEAST16_MAX  UINT16_MAX
+#define UINT_LEAST32_MAX  UINT32_MAX
+#define UINT_LEAST64_MAX  UINT64_MAX
+
+// 7.18.2.3 Limits of fastest minimum-width integer types
+#define INT_FAST8_MIN    INT8_MIN
+#define INT_FAST8_MAX    INT8_MAX
+#define INT_FAST16_MIN   INT16_MIN
+#define INT_FAST16_MAX   INT16_MAX
+#define INT_FAST32_MIN   INT32_MIN
+#define INT_FAST32_MAX   INT32_MAX
+#define INT_FAST64_MIN   INT64_MIN
+#define INT_FAST64_MAX   INT64_MAX
+#define UINT_FAST8_MAX   UINT8_MAX
+#define UINT_FAST16_MAX  UINT16_MAX
+#define UINT_FAST32_MAX  UINT32_MAX
+#define UINT_FAST64_MAX  UINT64_MAX
+
+// 7.18.2.4 Limits of integer types capable of holding object pointers
+#ifdef _WIN64 // [
+#  define INTPTR_MIN   INT64_MIN
+#  define INTPTR_MAX   INT64_MAX
+#  define UINTPTR_MAX  UINT64_MAX
+#else // _WIN64 ][
+#  define INTPTR_MIN   INT32_MIN
+#  define INTPTR_MAX   INT32_MAX
+#  define UINTPTR_MAX  UINT32_MAX
+#endif // _WIN64 ]
+
+// 7.18.2.5 Limits of greatest-width integer types
+#define INTMAX_MIN   INT64_MIN
+#define INTMAX_MAX   INT64_MAX
+#define UINTMAX_MAX  UINT64_MAX
+
+// 7.18.3 Limits of other integer types
+
+#ifdef _WIN64 // [
+#  define PTRDIFF_MIN  _I64_MIN
+#  define PTRDIFF_MAX  _I64_MAX
+#else  // _WIN64 ][
+#  define PTRDIFF_MIN  _I32_MIN
+#  define PTRDIFF_MAX  _I32_MAX
+#endif  // _WIN64 ]
+
+#define SIG_ATOMIC_MIN  INT_MIN
+#define SIG_ATOMIC_MAX  INT_MAX
+
+#ifndef SIZE_MAX // [
+#  ifdef _WIN64 // [
+#     define SIZE_MAX  _UI64_MAX
+#  else // _WIN64 ][
+#     define SIZE_MAX  _UI32_MAX
+#  endif // _WIN64 ]
+#endif // SIZE_MAX ]
+
+// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>
+#ifndef WCHAR_MIN // [
+#  define WCHAR_MIN  0
+#endif  // WCHAR_MIN ]
+#ifndef WCHAR_MAX // [
+#  define WCHAR_MAX  _UI16_MAX
+#endif  // WCHAR_MAX ]
+
+#define WINT_MIN  0
+#define WINT_MAX  _UI16_MAX
+
+#endif // __STDC_LIMIT_MACROS ]
+
+
+// 7.18.4 Limits of other integer types
+
+#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [   See footnote 224 at page 260
+
+// 7.18.4.1 Macros for minimum-width integer constants
+
+#define INT8_C(val)  val##i8
+#define INT16_C(val) val##i16
+#define INT32_C(val) val##i32
+#define INT64_C(val) val##i64
+
+#define UINT8_C(val)  val##ui8
+#define UINT16_C(val) val##ui16
+#define UINT32_C(val) val##ui32
+#define UINT64_C(val) val##ui64
+
+// 7.18.4.2 Macros for greatest-width integer constants
+#define INTMAX_C   INT64_C
+#define UINTMAX_C  UINT64_C
+
+#endif // __STDC_CONSTANT_MACROS ]
+
+
+#endif // _MSC_STDINT_H_ ]
+// ISO C9x  compliant stdint.h for Microsoft Visual Studio
+// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 
+// 
+//  Copyright (c) 2006-2008 Alexander Chemeris
+// 
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+// 
+//   1. Redistributions of source code must retain the above copyright notice,
+//      this list of conditions and the following disclaimer.
+// 
+//   2. Redistributions in binary form must reproduce the above copyright
+//      notice, this list of conditions and the following disclaimer in the
+//      documentation and/or other materials provided with the distribution.
+// 
+//   3. The name of the author may be used to endorse or promote products
+//      derived from this software without specific prior written permission.
+// 
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// 
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef _MSC_VER // [
+#error "Use this header only with Microsoft Visual C++ compilers!"
+#endif // _MSC_VER ]
+
+#ifndef _MSC_STDINT_H_ // [
+#define _MSC_STDINT_H_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif
+
+#include <limits.h>
+
+// For Visual Studio 6 in C++ mode and for many Visual Studio versions when
+// compiling for ARM we should wrap <wchar.h> include with 'extern "C++" {}'
+// or compiler give many errors like this:
+//   error C2733: second C linkage of overloaded function 'wmemchr' not allowed
+#ifdef __cplusplus
+extern "C" {
+#endif
+#  include <wchar.h>
+#ifdef __cplusplus
+}
+#endif
+
+// Define _W64 macros to mark types changing their size, like intptr_t.
+#ifndef _W64
+#  if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
+#     define _W64 __w64
+#  else
+#     define _W64
+#  endif
+#endif
+
+
+// 7.18.1 Integer types
+
+// 7.18.1.1 Exact-width integer types
+
+// Visual Studio 6 and Embedded Visual C++ 4 doesn't
+// realize that, e.g. char has the same size as __int8
+// so we give up on __intX for them.
+#if (_MSC_VER < 1300)
+   typedef char              int8_t;
+   typedef short             int16_t;
+   typedef int               int32_t;
+   typedef unsigned char     uint8_t;
+   typedef unsigned short    uint16_t;
+   typedef unsigned int      uint32_t;
+#else
+   typedef __int8            int8_t;
+   typedef __int16           int16_t;
+   typedef __int32           int32_t;
+   typedef unsigned __int8   uint8_t;
+   typedef unsigned __int16  uint16_t;
+   typedef unsigned __int32  uint32_t;
+#endif
+typedef __int64              int64_t;
+typedef unsigned __int64     uint64_t;
+
+
+// 7.18.1.2 Minimum-width integer types
+typedef int8_t    int_least8_t;
+typedef int16_t   int_least16_t;
+typedef int32_t   int_least32_t;
+typedef int64_t   int_least64_t;
+typedef uint8_t   uint_least8_t;
+typedef uint16_t  uint_least16_t;
+typedef uint32_t  uint_least32_t;
+typedef uint64_t  uint_least64_t;
+
+// 7.18.1.3 Fastest minimum-width integer types
+typedef int8_t    int_fast8_t;
+typedef int16_t   int_fast16_t;
+typedef int32_t   int_fast32_t;
+typedef int64_t   int_fast64_t;
+typedef uint8_t   uint_fast8_t;
+typedef uint16_t  uint_fast16_t;
+typedef uint32_t  uint_fast32_t;
+typedef uint64_t  uint_fast64_t;
+
+// 7.18.1.4 Integer types capable of holding object pointers
+#ifdef _WIN64 // [
+   typedef __int64           intptr_t;
+   typedef unsigned __int64  uintptr_t;
+#else // _WIN64 ][
+   typedef _W64 int               intptr_t;
+   typedef _W64 unsigned int      uintptr_t;
+#endif // _WIN64 ]
+
+// 7.18.1.5 Greatest-width integer types
+typedef int64_t   intmax_t;
+typedef uint64_t  uintmax_t;
+
+
+// 7.18.2 Limits of specified-width integer types
+
+#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [   See footnote 220 at page 257 and footnote 221 at page 259
+
+// 7.18.2.1 Limits of exact-width integer types
+#define INT8_MIN     ((int8_t)_I8_MIN)
+#define INT8_MAX     _I8_MAX
+#define INT16_MIN    ((int16_t)_I16_MIN)
+#define INT16_MAX    _I16_MAX
+#define INT32_MIN    ((int32_t)_I32_MIN)
+#define INT32_MAX    _I32_MAX
+#define INT64_MIN    ((int64_t)_I64_MIN)
+#define INT64_MAX    _I64_MAX
+#define UINT8_MAX    _UI8_MAX
+#define UINT16_MAX   _UI16_MAX
+#define UINT32_MAX   _UI32_MAX
+#define UINT64_MAX   _UI64_MAX
+
+// 7.18.2.2 Limits of minimum-width integer types
+#define INT_LEAST8_MIN    INT8_MIN
+#define INT_LEAST8_MAX    INT8_MAX
+#define INT_LEAST16_MIN   INT16_MIN
+#define INT_LEAST16_MAX   INT16_MAX
+#define INT_LEAST32_MIN   INT32_MIN
+#define INT_LEAST32_MAX   INT32_MAX
+#define INT_LEAST64_MIN   INT64_MIN
+#define INT_LEAST64_MAX   INT64_MAX
+#define UINT_LEAST8_MAX   UINT8_MAX
+#define UINT_LEAST16_MAX  UINT16_MAX
+#define UINT_LEAST32_MAX  UINT32_MAX
+#define UINT_LEAST64_MAX  UINT64_MAX
+
+// 7.18.2.3 Limits of fastest minimum-width integer types
+#define INT_FAST8_MIN    INT8_MIN
+#define INT_FAST8_MAX    INT8_MAX
+#define INT_FAST16_MIN   INT16_MIN
+#define INT_FAST16_MAX   INT16_MAX
+#define INT_FAST32_MIN   INT32_MIN
+#define INT_FAST32_MAX   INT32_MAX
+#define INT_FAST64_MIN   INT64_MIN
+#define INT_FAST64_MAX   INT64_MAX
+#define UINT_FAST8_MAX   UINT8_MAX
+#define UINT_FAST16_MAX  UINT16_MAX
+#define UINT_FAST32_MAX  UINT32_MAX
+#define UINT_FAST64_MAX  UINT64_MAX
+
+// 7.18.2.4 Limits of integer types capable of holding object pointers
+#ifdef _WIN64 // [
+#  define INTPTR_MIN   INT64_MIN
+#  define INTPTR_MAX   INT64_MAX
+#  define UINTPTR_MAX  UINT64_MAX
+#else // _WIN64 ][
+#  define INTPTR_MIN   INT32_MIN
+#  define INTPTR_MAX   INT32_MAX
+#  define UINTPTR_MAX  UINT32_MAX
+#endif // _WIN64 ]
+
+// 7.18.2.5 Limits of greatest-width integer types
+#define INTMAX_MIN   INT64_MIN
+#define INTMAX_MAX   INT64_MAX
+#define UINTMAX_MAX  UINT64_MAX
+
+// 7.18.3 Limits of other integer types
+
+#ifdef _WIN64 // [
+#  define PTRDIFF_MIN  _I64_MIN
+#  define PTRDIFF_MAX  _I64_MAX
+#else  // _WIN64 ][
+#  define PTRDIFF_MIN  _I32_MIN
+#  define PTRDIFF_MAX  _I32_MAX
+#endif  // _WIN64 ]
+
+#define SIG_ATOMIC_MIN  INT_MIN
+#define SIG_ATOMIC_MAX  INT_MAX
+
+#ifndef SIZE_MAX // [
+#  ifdef _WIN64 // [
+#     define SIZE_MAX  _UI64_MAX
+#  else // _WIN64 ][
+#     define SIZE_MAX  _UI32_MAX
+#  endif // _WIN64 ]
+#endif // SIZE_MAX ]
+
+// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>
+#ifndef WCHAR_MIN // [
+#  define WCHAR_MIN  0
+#endif  // WCHAR_MIN ]
+#ifndef WCHAR_MAX // [
+#  define WCHAR_MAX  _UI16_MAX
+#endif  // WCHAR_MAX ]
+
+#define WINT_MIN  0
+#define WINT_MAX  _UI16_MAX
+
+#endif // __STDC_LIMIT_MACROS ]
+
+
+// 7.18.4 Limits of other integer types
+
+#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [   See footnote 224 at page 260
+
+// 7.18.4.1 Macros for minimum-width integer constants
+
+#define INT8_C(val)  val##i8
+#define INT16_C(val) val##i16
+#define INT32_C(val) val##i32
+#define INT64_C(val) val##i64
+
+#define UINT8_C(val)  val##ui8
+#define UINT16_C(val) val##ui16
+#define UINT32_C(val) val##ui32
+#define UINT64_C(val) val##ui64
+
+// 7.18.4.2 Macros for greatest-width integer constants
+#define INTMAX_C   INT64_C
+#define UINTMAX_C  UINT64_C
+
+#endif // __STDC_CONSTANT_MACROS ]
+
+
+#endif // _MSC_STDINT_H_ ]
--- a/openalbridge/wrappers.c	Sat Jun 27 09:51:15 2009 +0000
+++ b/openalbridge/wrappers.c	Sun Jun 28 14:37:26 2009 +0000
@@ -25,8 +25,10 @@
 	void *Malloc (size_t nbytes)
 	{
 		void *aptr;
-		if ( (aptr = malloc(nbytes)) == NULL)
+		if ( (aptr = malloc(nbytes)) == NULL) {
 			fprintf(stderr, "ERROR: not enough memory! malloc() failed");
+			exit(-1);
+		}
 		return aptr;
 	}