2
0
mirror of https://github.com/FWGS/xash3d-fwgs synced 2024-12-04 16:11:31 +01:00
xash3d-fwgs/engine/common/soundlib/soundlib.h

138 lines
4.0 KiB
C

/*
soundlib.h - engine sound lib
Copyright (C) 2010 Uncle Mike
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 3 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.
*/
#ifndef SOUNDLIB_H
#define SOUNDLIB_H
#include "common.h"
#define FRAME_SIZE 32768 // must match with mp3 frame size
#define OUTBUF_SIZE 8192 // don't change!
typedef struct loadwavfmt_s
{
const char *formatstring;
const char *ext;
qboolean (*loadfunc)( const char *name, const byte *buffer, fs_offset_t filesize );
} loadwavfmt_t;
typedef struct streamfmt_s
{
const char *formatstring;
const char *ext;
stream_t *(*openfunc)( const char *filename );
int (*readfunc)( stream_t *stream, int bytes, void *buffer );
int (*setposfunc)( stream_t *stream, int newpos );
int (*getposfunc)( stream_t *stream );
void (*freefunc)( stream_t *stream );
} streamfmt_t;
typedef struct sndlib_s
{
const loadwavfmt_t *loadformats;
const streamfmt_t *streamformat; // music stream
// current sound state
int type; // sound type
int rate; // num samples per second (e.g. 11025 - 11 khz)
int width; // resolution - bum bits divided by 8 (8 bit is 1, 16 bit is 2)
int channels; // num channels (1 - mono, 2 - stereo)
int loopstart; // start looping from
uint samples; // total samplecount in sound
uint flags; // additional sound flags
size_t size; // sound unpacked size (for bounds checking)
byte *wav; // sound pointer (see sound_type for details)
byte *tempbuffer; // for convert operations
int cmd_flags;
} sndlib_t;
struct stream_s
{
const streamfmt_t *format; // streamformat to operate
// stream info
file_t *file; // stream file
int width; // resolution - num bits divided by 8 (8 bit is 1, 16 bit is 2)
int rate; // stream rate
int channels; // stream channels
int type; // wavtype
size_t size; // total stream size
// current stream state
void *ptr; // internal decoder state
char temp[OUTBUF_SIZE]; // mpeg decoder stuff
size_t pos; // actual track position (or actual buffer remains)
int buffsize; // cached buffer size
};
/*
========================================================================
.WAV sound format
========================================================================
*/
#define RIFFHEADER (('F'<<24)+('F'<<16)+('I'<<8)+'R') // little-endian "RIFF"
#define WAVEHEADER (('E'<<24)+('V'<<16)+('A'<<8)+'W') // little-endian "WAVE"
#define FORMHEADER ((' '<<24)+('t'<<16)+('m'<<8)+'f') // little-endian "fmt "
#define DATAHEADER (('a'<<24)+('t'<<16)+('a'<<8)+'d') // little-endian "data"
typedef struct
{
int32_t riff_id; // 'RIFF'
int32_t rLen;
int32_t wave_id; // 'WAVE'
int32_t fmt_id; // 'fmt '
int32_t pcm_header_len; // varies...
int16_t wFormatTag;
int16_t nChannels; // 1,2 for stereo data is (l,r) pairs
int32_t nSamplesPerSec;
int32_t nAvgBytesPerSec;
int16_t nBlockAlign;
int16_t nBitsPerSample;
} wavehdr_t;
typedef struct
{
int32_t data_id; // 'data' or 'fact'
int32_t dLen;
} chunkhdr_t;
extern sndlib_t sound;
//
// formats load
//
qboolean Sound_LoadWAV( const char *name, const byte *buffer, fs_offset_t filesize );
qboolean Sound_LoadMPG( const char *name, const byte *buffer, fs_offset_t filesize );
//
// stream operate
//
stream_t *Stream_OpenWAV( const char *filename );
int Stream_ReadWAV( stream_t *stream, int bytes, void *buffer );
int Stream_SetPosWAV( stream_t *stream, int newpos );
int Stream_GetPosWAV( stream_t *stream );
void Stream_FreeWAV( stream_t *stream );
stream_t *Stream_OpenMPG( const char *filename );
int Stream_ReadMPG( stream_t *stream, int bytes, void *buffer );
int Stream_SetPosMPG( stream_t *stream, int newpos );
int Stream_GetPosMPG( stream_t *stream );
void Stream_FreeMPG( stream_t *stream );
#endif//SOUNDLIB_H