123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- /*
- Copyright (C) 2009 Id Software, Inc.
- Copyright (C) 2004 Michael Liebscher
- Copyright (C) 1997-2001 Id Software, Inc.
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
- #include "../wolfiphone.h"
- filehandle_t *fh;
- PRIVATE size_t ovc_read( void *ptr, size_t size, size_t nmemb, void *dataSource )
- {
- if( ! size || ! nmemb )
- {
- return 0;
- }
-
- return FS_ReadFile( ptr, size, nmemb, fh );
- }
- PRIVATE int ovc_seek( void *dataSource, ogg_int64_t offset, int whence )
- {
- return FS_FileSeek( fh, offset, whence );
- }
- PRIVATE int ovc_close( void *dataSource )
- {
- return 0;
- }
- PRIVATE long ovc_tell( void *dataSource )
- {
- return FS_FileTell( fh );
- }
- /*
- -----------------------------------------------------------------------------
- Function: LoadOggInfo -Load ogg file.
-
- Parameters: filename -[in] Name of wav file to load.
- wav -[out] wav data.
- info -[out] wav sound info.
-
- Returns: True if file loaded, otherwise false.
-
- Notes: Caller is responsible for freeing wav data by calling Z_Free.
- -----------------------------------------------------------------------------
- */
- PUBLIC _boolean LoadOggInfo( const char *filename, W8 **wav, soundInfo_t *info )
- {
- W8 *data;
- int size;
- int dummy;
- char *newFilename;
- int len;
- OggVorbis_File vorbisFile;
- vorbis_info vorbisInfo;
- ov_callbacks vorbisCallbacks = {ovc_read, ovc_seek, ovc_close, ovc_tell};
- int ret;
-
- newFilename = strdup( filename );
-
- len = strlen( newFilename );
- if ( len < 5 || strcmp( newFilename + len - 4, ".wav" ) ) {
- free( newFilename );
- return false;
- }
-
- newFilename[ len - 3 ] = 'o';
- newFilename[ len - 2 ] = 'g';
- newFilename[ len - 1 ] = 'g';
-
- fh = FS_OpenFile( newFilename, 0 );
- if( ! fh )
- {
- free( newFilename );
- return false;
- }
- if( (ret = ov_open_callbacks( fh, &vorbisFile, NULL, 0, vorbisCallbacks )) < 0 ) {
- free( newFilename );
- return false;
- }
- vorbisInfo = *ov_info( &vorbisFile, -1 );
- if( vorbisInfo.channels != 1 && vorbisInfo.channels != 2 )
- {
- Com_Printf( "Only mono and stereo OGG files supported (%s)\n", newFilename );
- free( newFilename );
- return false;
- }
-
- info->channels = vorbisInfo.channels;
- info->sample_rate = vorbisInfo.rate;
- info->sample_size = 2;
- #define BUFFER_SIZE ( 128 * 1024 )
-
- data = (W8 *)malloc( BUFFER_SIZE );
- size = 0;
-
- while( size < BUFFER_SIZE )
- {
- int read = 0;
- read = ov_read( &vorbisFile, (char *)data + size, BUFFER_SIZE - size, &dummy );
- if( read == 0 )
- {
- break;
- }
-
- if( read <= 0 )
- {
- Com_Printf( "Only mono and stereo OGG files supported (%s)\n", newFilename );
- free( newFilename );
- return false;
- }
-
- size += read;
- }
- info->samples = size / ( info->channels * info->sample_size );
- Com_Printf("Loaded %s: channels=%d, sample_rate=%d, sample_size=%d, samples=%d. \n", newFilename, info->channels, info->sample_rate, info->sample_size, info->samples );
- free( newFilename );
- *wav = (W8 *)Z_Malloc( size );
- memcpy(*wav, data, size );
- free( data );
-
- FS_CloseFile( fh );
- return true;
- }
|