From c16517fbcbe60e17f51a1057d49e359c9230f2ae Mon Sep 17 00:00:00 2001 From: Lance Date: Wed, 24 Oct 2012 02:59:31 +0000 Subject: [PATCH] OggVorbis support now turned on (AVAIL_OGGVORBIS) Ogg/Vorbis: Will now look for 'libvorbisfile-3.dll' as well as 'vorbisfile.dll' in Windows. MinGW builds now have OggVorbis statically linked. (LIBVORBISFILE_STATIC) git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4138 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/Makefile | 38 ++++++------ engine/client/snd_ov.c | 28 +++++---- engine/common/bothdefs.h | 3 +- engine/libs/mingw-libs/libogg.a | Bin 44726 -> 50702 bytes engine/libs/ogg/ogg.h | 58 ++++++++++-------- engine/libs/ogg/os_types.h | 85 +++++++++++++++++++------- engine/libs/vorbis/codec.h | 49 ++++++++------- engine/libs/vorbis/vorbisfile.h | 103 +++++++++++++++++++++++++------- 8 files changed, 245 insertions(+), 119 deletions(-) diff --git a/engine/Makefile b/engine/Makefile index 2f9ca78c..60f3fa11 100644 --- a/engine/Makefile +++ b/engine/Makefile @@ -312,6 +312,7 @@ ifeq ($(shell echo $(FTE_TARGET)|grep -v win),) endif IMAGELDFLAGS=$(MINGW_LIBS_DIR)/libpng.a $(MINGW_LIBS_DIR)/libz.a $(MINGW_LIBS_DIR)/libjpeg.a + SOUNDLDFLAGS=$(MINGW_LIBS_DIR)/libvorbisfile.a $(MINGW_LIBS_DIR)/libvorbis.a $(MINGW_LIBS_DIR)/libogg.a ifeq ($(shell echo $(FTE_TARGET)|grep -v -i _SDL),) RELEASE_CFLAGS+= -D_SDL @@ -320,6 +321,7 @@ ifeq ($(shell echo $(FTE_TARGET)|grep -v win),) endif IMAGELDFLAGS ?= -lpng -ljpeg +SOUNDLDFLAGS ?= -lvorbisfile -lvorbis -logg #BASELDFLAGS=-lm -lz GLXLDFLAGS=-L/usr/X11R6/lib -lX11 -lXext $(IMAGELDFLAGS) @@ -630,7 +632,7 @@ GLCL_EXE_NAME=../fteqwcl_sdl.gl$(BITS) ifdef windir GL_LDFLAGS=$(GLLDFLAGS) -lmingw32 -lws2_32 `sdl-config --libs` else - GL_LDFLAGS=$(GLLDFLAGS) $(IMAGELDFLAGS) `sdl-config --libs` + GL_LDFLAGS=$(GLLDFLAGS) $(IMAGELDFLAGS) $(SOUNDLDFLAGS) `sdl-config --libs` endif GL_CFLAGS=$(GLCFLAGS) `sdl-config --cflags` GLB_DIR=gl_sdl$(FTE_TARGET)$(BITS) @@ -648,13 +650,13 @@ MB_DIR=m_sdl$(FTE_TARGET)$(BITS) M_EXE_NAME=../fteqw_sdl$(BITS) MCL_OBJS=$(D3DGL_OBJS) $(GLQUAKE_OBJS) $(SOFTWARE_OBJS) gl_vidsdl.o snd_sdl.o cd_sdl.o sys_sdl.o in_sdl.o M_CFLAGS=$(GLCFLAGS) `sdl-config --cflags` -D_MERGED_SDL -M_LDFLAGS=$(GLLDFLAGS) $(IMAGELDFLAGS) +M_LDFLAGS=$(GLLDFLAGS) $(IMAGELDFLAGS) $(SOUNDLDFLAGS) ifdef windir M_LDFLAGS=$(MLDFLAGS) -lmingw32 -lws2_32 -lSDLmain -lSDL else #pthread is needed because of SDL. - M_LDFLAGS=$(MLDFLAGS) `sdl-config --libs` $(IMAGELDFLAGS) + M_LDFLAGS=$(MLDFLAGS) `sdl-config --libs` $(IMAGELDFLAGS) $(SOUNDLDFLAGS) endif @@ -696,10 +698,10 @@ ifeq ($(shell echo $(FTE_TARGET)|grep -E -i -v "win(32|64)_sdl$$"),) ifdef windir GL_LDFLAGS=$(GLLDFLAGS) -lmingw32 -lws2_32 `sdl-config --libs` else - GL_LDFLAGS=$(IMAGELDFLAGS) -lws2_32 -lmingw32 $(SDL_LDFLAGS) -mwindows -ldxguid -lwinmm -lole32 $(GLLDFLAGS) `sdl-config --libs` + GL_LDFLAGS=$(IMAGELDFLAGS) $(SOUNDLDFLAGS) -lws2_32 -lmingw32 $(SDL_LDFLAGS) -mwindows -ldxguid -lwinmm -lole32 $(GLLDFLAGS) `sdl-config --libs` endif - GL_CFLAGS=-D_SDL -I$(LIBS_DIR) -I$(MINGW_LIBS_DIR)/ -I$(MINGW_LIBS_DIR) $(GLCFLAGS) `sdl-config --cflags` $(DX7SDK) + GL_CFLAGS=-D_SDL -I$(MINGW_LIBS_DIR)/ -I$(MINGW_LIBS_DIR) -I$(LIBS_DIR) $(GLCFLAGS) -DLIBVORBISFILE_STATIC `sdl-config --cflags` $(DX7SDK) ifeq ($(shell echo $(FTE_TARGET)|grep -E -i -v "win32.*sdl"),) GL_CFLAGS+= -D_MINGW_VFPRINTF endif @@ -718,26 +720,26 @@ ifeq ($(shell echo $(FTE_TARGET)|grep -E -i -v "win(32|64)_sdl$$"),) MB_DIR=m_mgw_sdl$(BITS) M_EXE_NAME=../fteqw_sdl$(BITS).exe MCL_OBJS=$(D3DGL_OBJS) $(GLQUAKE_OBJS) $(SOFTWARE_OBJS) $(D3DQUAKE_OBJS) $(BOTLIB_OBJS) gl_vidsdl.o snd_sdl.o cd_sdl.o sys_sdl.o in_sdl.o snd_directx.o $(LTO_END) resources.o $(LTO_START) - M_CFLAGS=$(D3DCFLAGS) -D_SDL -I$(LIBS_DIR) -I$(MINGW_LIBS_DIR)/ -I$(MINGW_LIBS_DIR) $(GLCFLAGS) `sdl-config --cflags` -D_MERGED_SDL $(DX7SDK) + M_CFLAGS=$(D3DCFLAGS) -D_SDL -I$(LIBS_DIR) -I$(MINGW_LIBS_DIR)/ -I$(MINGW_LIBS_DIR) $(GLCFLAGS) -DLIBVORBISFILE_STATIC `sdl-config --cflags` -D_MERGED_SDL $(DX7SDK) ifeq ($(shell echo $(FTE_TARGET)|grep -E -i -v "win32.*sdl"),) M_CFLAGS+= -D_MINGW_VFPRINTF endif - M_LDFLAGS=$(GLLDFLAGS) $(IMAGELDFLAGS) + M_LDFLAGS=$(GLLDFLAGS) $(IMAGELDFLAGS) $(SOUNDLDFLAGS) ifdef windir M_LDFLAGS=$(MLDFLAGS) -lmingw32 -lws2_32 -lSDLmain -lSDL else #pthread is needed because of SDL. - M_LDFLAGS=$(IMAGELDFLAGS) -lws2_32 -lmingw32 $(MINGW_LIBS_DIR)/libSDL.a $(MINGW_LIBS_DIR)/libSDLmain.a -mwindows -ldxguid -lwinmm -lole32 $(MLDFLAGS) `sdl-config --libs` $(IMAGELDFLAGS) + M_LDFLAGS=$(IMAGELDFLAGS) $(SOUNDLDFLAGS) -lws2_32 -lmingw32 $(MINGW_LIBS_DIR)/libSDL.a $(MINGW_LIBS_DIR)/libSDLmain.a -mwindows -ldxguid -lwinmm -lole32 $(MLDFLAGS) `sdl-config --libs` $(IMAGELDFLAGS) endif D3DCL_OBJS=$(D3DQUAKE_OBJS) snd_sdl.o cd_sdl.o sys_sdl.o in_sdl.o snd_directx.o $(D3DGL_OBJS) $(LTO_END) resources.o $(LTO_START) D3D_EXE_NAME=../fted3d_sdl_qw$(BITS).exe D3DCL_EXE_NAME=../fted3d_sdl_clqw$(BITS).exe - D3D_LDFLAGS=$(IMAGELDFLAGS) -lws2_32 -lmingw32 $(SDL_LDFLAGS) -mwindows -ldxguid -lwinmm -lole32 - D3D_CFLAGS=$(D3DCFLAGS) -D_SDL -DNO_XFLIP -I$(LIBS_DIR) -I$(MINGW_LIBS_DIR)/ -I$(MINGW_LIBS_DIR) `sdl-config --cflags` $(DX7SDK) + D3D_LDFLAGS=$(IMAGELDFLAGS) $(SOUNDLDFLAGS) -lws2_32 -lmingw32 $(SDL_LDFLAGS) -mwindows -ldxguid -lwinmm -lole32 + D3D_CFLAGS=$(D3DCFLAGS) -D_SDL -DNO_XFLIP -I$(LIBS_DIR) -I$(MINGW_LIBS_DIR)/ -I$(MINGW_LIBS_DIR) -DLIBVORBISFILE_STATIC `sdl-config --cflags` $(DX7SDK) ifeq ($(shell echo $(FTE_TARGET)|grep -E -i -v "win32.*sdl"),) D3D_CFLAGS+= -D_MINGW_VFPRINTF endif @@ -808,32 +810,32 @@ ifeq ($(shell echo $(FTE_TARGET)|grep -E -v "win(32|64)$$"),) GLCL_OBJS=$(GL_OBJS) $(D3DGL_OBJS) $(GLQUAKE_OBJS) $(BOTLIB_OBJS) fs_win32.o gl_vidnt.o snd_win.o snd_directx.o cd_win.o in_win.o sys_win.o $(LTO_END) resources.o $(LTO_START) GL_EXE_NAME=../fteglqw$(BITS).exe GLCL_EXE_NAME=../fteglqwcl$(BITS).exe - GL_LDFLAGS=$(GLLDFLAGS) $(IMAGELDFLAGS) -ldxguid -lws2_32 -lwinmm -lgdi32 -lole32 - GL_CFLAGS=$(GLCFLAGS) $(W32_CFLAGS) $(DX7SDK) -DMULTITHREAD + GL_LDFLAGS=$(GLLDFLAGS) $(IMAGELDFLAGS) $(SOUNDLDFLAGS) -ldxguid -lws2_32 -lwinmm -lgdi32 -lole32 + GL_CFLAGS=$(GLCFLAGS) $(W32_CFLAGS) $(DX7SDK) -DMULTITHREAD -DLIBVORBISFILE_STATIC GLB_DIR=gl_mgw$(BITS) GLCL_DIR=glcl_mgw$(BITS) NPFTECL_OBJS=$(GL_OBJS) $(D3DGL_OBJS) $(GLQUAKE_OBJS) fs_win32.o gl_vidnt.o snd_win.o snd_directx.o cd_win.o in_win.o sys_win.o sys_npfte.o sys_axfte.o sys_plugfte.o $(LTO_END) npplug.o ../../ftequake/npapi.def $(LTO_START) NPFTE_DLL_NAME=../npfte$(BITS).dll NPFTECL_DLL_NAME=../npftecl$(BITS).dll - NPFTE_LDFLAGS=-Wl,--enable-stdcall-fixup $(GLLDFLAGS) $(IMAGELDFLAGS) -ldxguid -lws2_32 -lwinmm -lgdi32 -lole32 -loleaut32 -luuid -lstdc++ -shared - NPFTE_CFLAGS=$(NPFTECFLAGS) $(GLCFLAGS) $(W32_CFLAGS) $(DX7SDK) -DMULTITHREAD + NPFTE_LDFLAGS=-Wl,--enable-stdcall-fixup $(GLLDFLAGS) $(IMAGELDFLAGS) $(SOUNDLDFLAGS) -ldxguid -lws2_32 -lwinmm -lgdi32 -lole32 -loleaut32 -luuid -lstdc++ -shared + NPFTE_CFLAGS=$(NPFTECFLAGS) $(GLCFLAGS) $(W32_CFLAGS) $(DX7SDK) -DMULTITHREAD -DLIBVORBISFILE_STATIC NPFTEB_DIR=npfte_mgw$(BITS) NPFTECL_DIR=npqtvcl_mgw$(BITS) MCL_OBJS=$(D3DGL_OBJS) $(GLQUAKE_OBJS) $(SOFTWARE_OBJS) $(D3DQUAKE_OBJS) $(BOTLIB_OBJS) fs_win32.o gl_vidnt.o snd_win.o snd_directx.o cd_win.o in_win.o sys_win.o $(LTO_END) resources.o $(LTO_START) M_EXE_NAME=../fteqw$(BITS).exe MCL_EXE_NAME=../fteqwcl$(BITS).exe - M_LDFLAGS=$(GLLDFLAGS) $(IMAGELDFLAGS) -ldxguid -lws2_32 -lwinmm -lgdi32 -lole32 - M_CFLAGS=$(GLCFLAGS) $(W32_CFLAGS) $(D3DCFLAGS) $(DX7SDK) -DMULTITHREAD + M_LDFLAGS=$(GLLDFLAGS) $(IMAGELDFLAGS) $(SOUNDLDFLAGS) -ldxguid -lws2_32 -lwinmm -lgdi32 -lole32 + M_CFLAGS=$(GLCFLAGS) $(W32_CFLAGS) $(D3DCFLAGS) $(DX7SDK) -DMULTITHREAD -DLIBVORBISFILE_STATIC MB_DIR=m_mgw$(BITS) MCL_DIR=mcl_mgw$(BITS) D3DCL_OBJS=$(D3DQUAKE_OBJS) snd_win.o snd_directx.o cd_win.o in_win.o sys_win.o $(D3DGL_OBJS) fs_win32.o $(LTO_END) resources.o $(LTO_START) D3D_EXE_NAME=../fted3dqw$(BITS).exe D3DCL_EXE_NAME=../fted3dclqw$(BITS).exe - D3D_LDFLAGS=$(IMAGELDFLAGS) -ldxguid -lws2_32 -lwinmm -lgdi32 -lole32 - D3D_CFLAGS=$(D3DCFLAGS) $(W32_CFLAGS) $(DX7SDK) -DMULTITHREAD + D3D_LDFLAGS=$(IMAGELDFLAGS) $(SOUNDLDFLAGS) -ldxguid -lws2_32 -lwinmm -lgdi32 -lole32 + D3D_CFLAGS=$(D3DCFLAGS) $(W32_CFLAGS) $(DX7SDK) -DMULTITHREAD -DLIBVORBISFILE_STATIC D3DB_DIR=d3d_mgw$(BITS) D3DCL_DIR=d3dcl_mgw$(BITS) diff --git a/engine/client/snd_ov.c b/engine/client/snd_ov.c index 963ba0ad..56d4914d 100644 --- a/engine/client/snd_ov.c +++ b/engine/client/snd_ov.c @@ -61,7 +61,7 @@ typedef struct { qboolean failed; - char *tempbuffer; + char *tempbuffer; int tempbufferbytes; char *decodedbuffer; @@ -119,7 +119,7 @@ qboolean S_LoadOVSound (sfx_t *s, qbyte *data, int datalen, int sndspeed) } sfxcache_t *OV_DecodeSome(struct sfx_s *sfx, struct sfxcache_s *buf, int start, int length) -{ +{ extern int snd_speed; extern cvar_t snd_linearresample_stream; int bigendianp = bigendian; @@ -215,10 +215,10 @@ sfxcache_t *OV_DecodeSome(struct sfx_s *sfx, struct sfxcache_s *buf, int start, return NULL; } - SND_ResampleStream(dec->tempbuffer, - dec->srcspeed, - 2, - dec->srcchannels, + SND_ResampleStream(dec->tempbuffer, + dec->srcspeed, + 2, + dec->srcchannels, bytesread / (2 * dec->srcchannels), dec->decodedbuffer+dec->decodedbytecount, outspeed, @@ -267,7 +267,7 @@ void OV_CancelDecoder(sfx_t *s) } static size_t VARGS read_func (void *ptr, size_t size, size_t nmemb, void *datasource) -{ +{ ovdecoderbuffer_t *buffer = datasource; int spare = buffer->length - buffer->pos; @@ -279,7 +279,7 @@ static size_t VARGS read_func (void *ptr, size_t size, size_t nmemb, void *datas } static int VARGS seek_func (void *datasource, ogg_int64_t offset, int whence) -{ +{ ovdecoderbuffer_t *buffer = datasource; switch(whence) { @@ -292,7 +292,7 @@ static int VARGS seek_func (void *datasource, ogg_int64_t offset, int whence) case SEEK_CUR: buffer->pos+=offset; break; - } + } return 0; } @@ -347,8 +347,16 @@ qboolean OV_StartDecode(unsigned char *start, unsigned long length, ovdecoderbuf oggvorbislibrary = Sys_LoadLibrary("vorbisfile", funcs); if (!oggvorbislibrary) oggvorbislibrary = Sys_LoadLibrary("libvorbisfile", funcs); + if (!oggvorbislibrary) - Con_Printf("Couldn't load DLL: \"vorbisfile.dll\".\n"); + { + oggvorbislibrary = Sys_LoadLibrary("libvorbisfile-3", funcs); + if (!oggvorbislibrary) + oggvorbislibrary = Sys_LoadLibrary("libvorbisfile", funcs); + } + + if (!oggvorbislibrary) + Con_Printf("Couldn't load DLL: \"vorbisfile.dll\" or \"libvorbisfile-3\".\n"); } #else { diff --git a/engine/common/bothdefs.h b/engine/common/bothdefs.h index cf87ea07..76db8cbe 100644 --- a/engine/common/bothdefs.h +++ b/engine/common/bothdefs.h @@ -77,7 +77,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define NO_OGG #endif - //#define AVAIL_OGGVORBIS + #define AVAIL_OGGVORBIS #if !defined(__CYGWIN__) && !defined(MINGW) && !defined(MACOSX) #define AVAIL_PNGLIB #define AVAIL_JPEGLIB @@ -93,6 +93,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define AVAIL_PNGLIB #define AVAIL_ZLIB #define AVAIL_JPEGLIB + #define AVAIL_OGGVORBIS #endif #if !defined(NO_DIRECTX) && !defined(NODIRECTX) diff --git a/engine/libs/mingw-libs/libogg.a b/engine/libs/mingw-libs/libogg.a index 72a929899e6866a478faf4a81bb24d1b87e68197..da9ed3c203ee6bf14e753c24a0a0a0616a44fb91 100755 GIT binary patch literal 50702 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 literal 44726 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 #include +typedef struct { + void *iov_base; + size_t iov_len; +} ogg_iovec_t; + typedef struct { long endbyte; int endbit; @@ -53,8 +59,8 @@ typedef struct { int *lacing_vals; /* The values that will go to the segment table */ ogg_int64_t *granule_vals; /* granulepos values for headers. Not compact - this way, but it is simple coupled to the - lacing fifo */ + this way, but it is simple coupled to the + lacing fifo */ long lacing_storage; long lacing_fill; long lacing_packet; @@ -69,10 +75,10 @@ typedef struct { of a logical bitstream */ long serialno; long pageno; - ogg_int64_t packetno; /* sequence number for decode; the framing + ogg_int64_t packetno; /* sequence number for decode; the framing knows where there's a hole in the data, but we need coupling so that the codec - (which is in a seperate abstraction + (which is in a separate abstraction layer) also knows about the gap */ ogg_int64_t granulepos; @@ -88,12 +94,12 @@ typedef struct { long e_o_s; ogg_int64_t granulepos; - + ogg_int64_t packetno; /* sequence number for decode; the framing - knows where there's a hole in the data, - but we need coupling so that the codec - (which is in a seperate abstraction - layer) also knows about the gap */ + knows where there's a hole in the data, + but we need coupling so that the codec + (which is in a separate abstraction + layer) also knows about the gap */ } ogg_packet; typedef struct { @@ -110,6 +116,7 @@ typedef struct { /* Ogg BITSTREAM PRIMITIVES: bitstream ************************/ extern void oggpack_writeinit(oggpack_buffer *b); +extern int oggpack_writecheck(oggpack_buffer *b); extern void oggpack_writetrunc(oggpack_buffer *b,long bits); extern void oggpack_writealign(oggpack_buffer *b); extern void oggpack_writecopy(oggpack_buffer *b,void *source,long bits); @@ -128,6 +135,7 @@ extern long oggpack_bits(oggpack_buffer *b); extern unsigned char *oggpack_get_buffer(oggpack_buffer *b); extern void oggpackB_writeinit(oggpack_buffer *b); +extern int oggpackB_writecheck(oggpack_buffer *b); extern void oggpackB_writetrunc(oggpack_buffer *b,long bits); extern void oggpackB_writealign(oggpack_buffer *b); extern void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits); @@ -148,15 +156,20 @@ extern unsigned char *oggpackB_get_buffer(oggpack_buffer *b); /* Ogg BITSTREAM PRIMITIVES: encoding **************************/ extern int ogg_stream_packetin(ogg_stream_state *os, ogg_packet *op); +extern int ogg_stream_iovecin(ogg_stream_state *os, ogg_iovec_t *iov, + int count, long e_o_s, ogg_int64_t granulepos); extern int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og); +extern int ogg_stream_pageout_fill(ogg_stream_state *os, ogg_page *og, int nfill); extern int ogg_stream_flush(ogg_stream_state *os, ogg_page *og); +extern int ogg_stream_flush_fill(ogg_stream_state *os, ogg_page *og, int nfill); /* Ogg BITSTREAM PRIMITIVES: decoding **************************/ extern int ogg_sync_init(ogg_sync_state *oy); extern int ogg_sync_clear(ogg_sync_state *oy); extern int ogg_sync_reset(ogg_sync_state *oy); -extern int ogg_sync_destroy(ogg_sync_state *oy); +extern int ogg_sync_destroy(ogg_sync_state *oy); +extern int ogg_sync_check(ogg_sync_state *oy); extern char *ogg_sync_buffer(ogg_sync_state *oy, long size); extern int ogg_sync_wrote(ogg_sync_state *oy, long bytes); @@ -173,18 +186,19 @@ extern int ogg_stream_clear(ogg_stream_state *os); extern int ogg_stream_reset(ogg_stream_state *os); extern int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno); extern int ogg_stream_destroy(ogg_stream_state *os); +extern int ogg_stream_check(ogg_stream_state *os); extern int ogg_stream_eos(ogg_stream_state *os); extern void ogg_page_checksum_set(ogg_page *og); -extern int ogg_page_version(ogg_page *og); -extern int ogg_page_continued(ogg_page *og); -extern int ogg_page_bos(ogg_page *og); -extern int ogg_page_eos(ogg_page *og); -extern ogg_int64_t ogg_page_granulepos(ogg_page *og); -extern int ogg_page_serialno(ogg_page *og); -extern long ogg_page_pageno(ogg_page *og); -extern int ogg_page_packets(ogg_page *og); +extern int ogg_page_version(const ogg_page *og); +extern int ogg_page_continued(const ogg_page *og); +extern int ogg_page_bos(const ogg_page *og); +extern int ogg_page_eos(const ogg_page *og); +extern ogg_int64_t ogg_page_granulepos(const ogg_page *og); +extern int ogg_page_serialno(const ogg_page *og); +extern long ogg_page_pageno(const ogg_page *og); +extern int ogg_page_packets(const ogg_page *og); extern void ogg_packet_clear(ogg_packet *op); @@ -194,9 +208,3 @@ extern void ogg_packet_clear(ogg_packet *op); #endif #endif /* _OGG_H */ - - - - - - diff --git a/engine/libs/ogg/os_types.h b/engine/libs/ogg/os_types.h index 1042c2d0..ec49b6aa 100644 --- a/engine/libs/ogg/os_types.h +++ b/engine/libs/ogg/os_types.h @@ -24,23 +24,37 @@ #define _ogg_realloc realloc #define _ogg_free free -#ifdef _WIN32 +#if defined(_WIN32) -# ifndef __GNUC__ - /* MSVC/Borland */ - typedef __int64 ogg_int64_t; - typedef __int32 ogg_int32_t; - typedef unsigned __int32 ogg_uint32_t; - typedef __int16 ogg_int16_t; - typedef unsigned __int16 ogg_uint16_t; +# if defined(__CYGWIN__) +# include + typedef int16_t ogg_int16_t; + typedef uint16_t ogg_uint16_t; + typedef int32_t ogg_int32_t; + typedef uint32_t ogg_uint32_t; + typedef int64_t ogg_int64_t; + typedef uint64_t ogg_uint64_t; +# elif defined(__MINGW32__) +# include + typedef short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long ogg_int64_t; + typedef unsigned long long ogg_uint64_t; +# elif defined(__MWERKS__) + typedef long long ogg_int64_t; + typedef int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef short ogg_int16_t; + typedef unsigned short ogg_uint16_t; # else - /* Cygwin */ - #include <_G_config.h> - typedef _G_int64_t ogg_int64_t; - typedef _G_int32_t ogg_int32_t; - typedef _G_uint32_t ogg_uint32_t; - typedef _G_int16_t ogg_int16_t; - typedef _G_uint16_t ogg_uint16_t; + /* MSVC/Borland */ + typedef __int64 ogg_int64_t; + typedef __int32 ogg_int32_t; + typedef unsigned __int32 ogg_uint32_t; + typedef __int16 ogg_int16_t; + typedef unsigned __int16 ogg_uint16_t; # endif #elif defined(__MACOS__) @@ -52,23 +66,33 @@ typedef UInt32 ogg_uint32_t; typedef SInt64 ogg_int64_t; -#elif defined(__MACOSX__) /* MacOS X Framework build */ +#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */ -# include +# include typedef int16_t ogg_int16_t; - typedef u_int16_t ogg_uint16_t; + typedef uint16_t ogg_uint16_t; typedef int32_t ogg_int32_t; - typedef u_int32_t ogg_uint32_t; + typedef uint32_t ogg_uint32_t; typedef int64_t ogg_int64_t; +#elif defined(__HAIKU__) + + /* Haiku */ +# include + typedef short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long ogg_int64_t; + #elif defined(__BEOS__) /* Be */ # include typedef int16_t ogg_int16_t; - typedef u_int16_t ogg_uint16_t; + typedef uint16_t ogg_uint16_t; typedef int32_t ogg_int32_t; - typedef u_int32_t ogg_uint32_t; + typedef uint32_t ogg_uint32_t; typedef int64_t ogg_int64_t; #elif defined (__EMX__) @@ -96,9 +120,26 @@ typedef unsigned ogg_uint32_t; typedef short ogg_int16_t; +#elif defined(__SYMBIAN32__) + + /* Symbian GCC */ + typedef signed short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef signed int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long int ogg_int64_t; + +#elif defined(__TMS320C6X__) + + /* TI C64x compiler */ + typedef signed short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef signed int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long int ogg_int64_t; + #else -# include # include #endif diff --git a/engine/libs/vorbis/codec.h b/engine/libs/vorbis/codec.h index 2a681890..f082241d 100644 --- a/engine/libs/vorbis/codec.h +++ b/engine/libs/vorbis/codec.h @@ -6,7 +6,7 @@ * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * - * by the XIPHOPHORUS Company http://www.xiph.org/ * + * by the Xiph.Org Foundation http://www.xiph.org/ * ******************************************************************** @@ -32,14 +32,14 @@ typedef struct vorbis_info{ /* The below bitrate declarations are *hints*. Combinations of the three values carry the following implications: - - all three set to the same value: + + all three set to the same value: implies a fixed rate bitstream - only nominal set: - implies a VBR stream that averages the nominal bitrate. No hard + only nominal set: + implies a VBR stream that averages the nominal bitrate. No hard upper/lower limit - upper and or lower set: - implies a VBR bitstream that obeys the bitrate limits. nominal + upper and or lower set: + implies a VBR bitstream that obeys the bitrate limits. nominal may also be set to give a nominal rate. none set: the coder does not care to speculate. @@ -87,9 +87,9 @@ typedef struct vorbis_dsp_state{ typedef struct vorbis_block{ /* necessary stream state for linking to the framing abstraction */ - float **pcm; /* this is a pointer into local storage */ + float **pcm; /* this is a pointer into local storage */ oggpack_buffer opb; - + long lW; long W; long nW; @@ -121,7 +121,7 @@ typedef struct vorbis_block{ /* vorbis_block is a single block of data to be processed as part of the analysis/synthesis stream; it belongs to a specific logical -bitstream, but is independant from other vorbis_blocks belonging to +bitstream, but is independent from other vorbis_blocks belonging to that logical bitstream. *************************************************/ struct alloc_chain{ @@ -166,28 +166,30 @@ extern void vorbis_info_init(vorbis_info *vi); extern void vorbis_info_clear(vorbis_info *vi); extern int vorbis_info_blocksize(vorbis_info *vi,int zo); extern void vorbis_comment_init(vorbis_comment *vc); -extern void vorbis_comment_add(vorbis_comment *vc, char *comment); -extern void vorbis_comment_add_tag(vorbis_comment *vc, - char *tag, char *contents); -extern char *vorbis_comment_query(vorbis_comment *vc, char *tag, int count); -extern int vorbis_comment_query_count(vorbis_comment *vc, char *tag); +extern void vorbis_comment_add(vorbis_comment *vc, const char *comment); +extern void vorbis_comment_add_tag(vorbis_comment *vc, + const char *tag, const char *contents); +extern char *vorbis_comment_query(vorbis_comment *vc, const char *tag, int count); +extern int vorbis_comment_query_count(vorbis_comment *vc, const char *tag); extern void vorbis_comment_clear(vorbis_comment *vc); extern int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb); extern int vorbis_block_clear(vorbis_block *vb); extern void vorbis_dsp_clear(vorbis_dsp_state *v); extern double vorbis_granule_time(vorbis_dsp_state *v, - ogg_int64_t granulepos); + ogg_int64_t granulepos); + +extern const char *vorbis_version_string(void); /* Vorbis PRIMITIVES: analysis/DSP layer ****************************/ extern int vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi); extern int vorbis_commentheader_out(vorbis_comment *vc, ogg_packet *op); extern int vorbis_analysis_headerout(vorbis_dsp_state *v, - vorbis_comment *vc, - ogg_packet *op, - ogg_packet *op_comm, - ogg_packet *op_code); + vorbis_comment *vc, + ogg_packet *op, + ogg_packet *op_comm, + ogg_packet *op_code); extern float **vorbis_analysis_buffer(vorbis_dsp_state *v,int vals); extern int vorbis_analysis_wrote(vorbis_dsp_state *v,int vals); extern int vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb); @@ -195,11 +197,12 @@ extern int vorbis_analysis(vorbis_block *vb,ogg_packet *op); extern int vorbis_bitrate_addblock(vorbis_block *vb); extern int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd, - ogg_packet *op); + ogg_packet *op); /* Vorbis PRIMITIVES: synthesis layer *******************************/ +extern int vorbis_synthesis_idheader(ogg_packet *op); extern int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc, - ogg_packet *op); + ogg_packet *op); extern int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi); extern int vorbis_synthesis_restart(vorbis_dsp_state *v); @@ -216,7 +219,7 @@ extern int vorbis_synthesis_halfrate_p(vorbis_info *v); /* Vorbis ERRORS and return codes ***********************************/ -#define OV_FALSE -1 +#define OV_FALSE -1 #define OV_EOF -2 #define OV_HOLE -3 diff --git a/engine/libs/vorbis/vorbisfile.h b/engine/libs/vorbis/vorbisfile.h index d291b15e..de540cf7 100644 --- a/engine/libs/vorbis/vorbisfile.h +++ b/engine/libs/vorbis/vorbisfile.h @@ -5,8 +5,8 @@ * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * - * by the XIPHOPHORUS Company http://www.xiph.org/ * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * * * ******************************************************************** @@ -27,22 +27,81 @@ extern "C" #include "codec.h" /* The function prototypes for the callbacks are basically the same as for - * the stdio functions fread, fseek, fclose, ftell. + * the stdio functions fread, fseek, fclose, ftell. * The one difference is that the FILE * arguments have been replaced with * a void * - this is to be used as a pointer to whatever internal data these * functions might need. In the stdio case, it's just a FILE * cast to a void * - * + * * If you use other functions, check the docs for these functions and return * the right values. For seek_func(), you *MUST* return -1 if the stream is * unseekable */ typedef struct { - size_t (VARGS *read_func) (void *ptr, size_t size, size_t nmemb, void *datasource); - int (VARGS *seek_func) (void *datasource, ogg_int64_t offset, int whence); - int (VARGS *close_func) (void *datasource); - long (VARGS *tell_func) (void *datasource); + size_t (*read_func) (void *ptr, size_t size, size_t nmemb, void *datasource); + int (*seek_func) (void *datasource, ogg_int64_t offset, int whence); + int (*close_func) (void *datasource); + long (*tell_func) (void *datasource); } ov_callbacks; +#ifndef OV_EXCLUDE_STATIC_CALLBACKS + +/* a few sets of convenient callbacks, especially for use under + * Windows where ov_open_callbacks() should always be used instead of + * ov_open() to avoid problems with incompatible crt.o version linking + * issues. */ + +static int _ov_header_fseek_wrap(FILE *f,ogg_int64_t off,int whence){ + if(f==NULL)return(-1); + +#ifdef __MINGW32__ + return fseeko64(f,off,whence); +#elif defined (_WIN32) + return _fseeki64(f,off,whence); +#else + return fseek(f,off,whence); +#endif +} + +/* These structs below (OV_CALLBACKS_DEFAULT etc) are defined here as + * static data. That means that every file which includes this header + * will get its own copy of these structs whether it uses them or + * not unless it #defines OV_EXCLUDE_STATIC_CALLBACKS. + * These static symbols are essential on platforms such as Windows on + * which several different versions of stdio support may be linked to + * by different DLLs, and we need to be certain we know which one + * we're using (the same one as the main application). + */ + +static ov_callbacks OV_CALLBACKS_DEFAULT = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) _ov_header_fseek_wrap, + (int (*)(void *)) fclose, + (long (*)(void *)) ftell +}; + +static ov_callbacks OV_CALLBACKS_NOCLOSE = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) _ov_header_fseek_wrap, + (int (*)(void *)) NULL, + (long (*)(void *)) ftell +}; + +static ov_callbacks OV_CALLBACKS_STREAMONLY = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) NULL, + (int (*)(void *)) fclose, + (long (*)(void *)) NULL +}; + +static ov_callbacks OV_CALLBACKS_STREAMONLY_NOCLOSE = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) NULL, + (int (*)(void *)) NULL, + (long (*)(void *)) NULL +}; + +#endif + #define NOTOPEN 0 #define PARTOPEN 1 #define OPENED 2 @@ -54,7 +113,7 @@ typedef struct OggVorbis_File { int seekable; ogg_int64_t offset; ogg_int64_t end; - ogg_sync_state oy; + ogg_sync_state oy; /* If the FILE handle isn't seekable (eg, a pipe), only the current stream appears */ @@ -63,8 +122,8 @@ typedef struct OggVorbis_File { ogg_int64_t *dataoffsets; long *serialnos; ogg_int64_t *pcmlengths; /* overloaded to maintain binary - compatability; x2 size, stores both - beginning and end values */ + compatibility; x2 size, stores both + beginning and end values */ vorbis_info *vi; vorbis_comment *vc; @@ -86,14 +145,16 @@ typedef struct OggVorbis_File { } OggVorbis_File; -extern int ov_clear(OggVorbis_File *vf); -extern int ov_open(FILE *f,OggVorbis_File *vf,char *initial,long ibytes); -extern int ov_open_callbacks(void *datasource, OggVorbis_File *vf, - char *initial, long ibytes, ov_callbacks callbacks); -extern int ov_test(FILE *f,OggVorbis_File *vf,char *initial,long ibytes); +extern int ov_clear(OggVorbis_File *vf); +extern int ov_fopen(const char *path,OggVorbis_File *vf); +extern int ov_open(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes); +extern int ov_open_callbacks(void *datasource, OggVorbis_File *vf, + const char *initial, long ibytes, ov_callbacks callbacks); + +extern int ov_test(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes); extern int ov_test_callbacks(void *datasource, OggVorbis_File *vf, - char *initial, long ibytes, ov_callbacks callbacks); + const char *initial, long ibytes, ov_callbacks callbacks); extern int ov_test_open(OggVorbis_File *vf); extern long ov_bitrate(OggVorbis_File *vf,int i); @@ -126,9 +187,12 @@ extern vorbis_info *ov_info(OggVorbis_File *vf,int link); extern vorbis_comment *ov_comment(OggVorbis_File *vf,int link); extern long ov_read_float(OggVorbis_File *vf,float ***pcm_channels,int samples, - int *bitstream); + int *bitstream); +extern long ov_read_filter(OggVorbis_File *vf,char *buffer,int length, + int bigendianp,int word,int sgned,int *bitstream, + void (*filter)(float **pcm,long channels,long samples,void *filter_param),void *filter_param); extern long ov_read(OggVorbis_File *vf,char *buffer,int length, - int bigendianp,int word,int sgned,int *bitstream); + int bigendianp,int word,int sgned,int *bitstream); extern int ov_crosslap(OggVorbis_File *vf1,OggVorbis_File *vf2); extern int ov_halfrate(OggVorbis_File *vf,int flag); @@ -140,4 +204,3 @@ extern int ov_halfrate_p(OggVorbis_File *vf); #endif -