15 #ifndef WAVE_FORMAT_ADPCM
16 #define WAVE_FORMAT_ADPCM 2
62 #define IF_ERR(a, b) if (a) { mprintf(("ACM ERROR, line %d...\n", __LINE__)); return b; }
63 #define IF_ERR2(a, b) if (a) { mprintf(("ACM ERROR, line %d...\n", __LINE__)); b; }
74 #define FIXED_POINT_COEF_BASE 256
75 #define FIXED_POINT_ADAPTION_BASE 256
76 #define SMALLEST_ADPCM_DELTA 16
104 static int read_short(
HMMIO rw,
short *i)
106 int rc =
mmioRead( rw, (
char *)i,
sizeof(
short) );
107 IF_ERR(rc !=
sizeof(
short), 0);
139 for (i = 0; i < max; i++) {
143 for (i = 0; i < max; i++) {
147 for (i = 0; i < max; i++) {
151 for (i = 0; i < max; i++) {
163 static const short max_audioval = ((1<<(16-1))-1);
164 static const short min_audioval = -(1<<(16-1));
165 static const ushort AdaptionTable[] = {
166 230, 230, 230, 230, 307, 409, 512, 614,
167 768, 614, 512, 409, 307, 230, 230, 230
174 lNewSamp = lPredSamp + (header->
iDelta * (nib - 0x10));
176 lNewSamp = lPredSamp + (header->
iDelta * nib);
180 if (lNewSamp < min_audioval) {
181 lNewSamp = min_audioval;
182 }
else if (lNewSamp > max_audioval) {
183 lNewSamp = max_audioval;
194 header->
iSamp1 = (short)lNewSamp;
202 short iCoef1, iCoef2;
205 for (i = 0; i < max; i++) {
211 IF_ERR(!read_ubyte(rw, &nib), 0);
213 do_adpcm_nibble(nib >> 4, &fmt->
header[i], lPredSamp);
216 do_adpcm_nibble(nib & 0x0F, &fmt->
header[i], lPredSamp);
230 short *
buf = (
short *)_buf;
240 CLAMP(i_val, 0, 255);
242 *_buf++ = (
ubyte)i_val;
252 short *buf = (
short *)_buf;
262 CLAMP(i_val, 0, 255);
264 *_buf++ = (
ubyte)i_val;
273 while (bw < fmt->buffer_size) {
278 if (!read_adpcm_block_headers(rw, fmt)) {
283 put_adpcm_sample_frame2(data + bw, fmt);
289 put_adpcm_sample_frame1(data + bw, fmt);
295 put_adpcm_sample_frame1(data + bw, fmt);
299 if (!decode_adpcm_sample_frame(rw, fmt)) {
318 if (fmt->
header != NULL) {
355 Assert( dest_len != NULL );
357 if (pwfxSrc == NULL) {
366 memset( &IOhdr, 0,
sizeof(
MMIOINFO) );
367 memset( &IOrw, 0,
sizeof(
MMIOINFO) );
419 if ( *dest == NULL ) {
428 memset(*dest, 0x80, new_size);
430 memset(*dest, 0x00, new_size);
452 if ( !max_dest_bytes ) {
453 max_dest_bytes = new_size;
457 rc = read_sample_fmt_adpcm(*dest, rw, fmt);
465 mprintf((
"ACM ERROR: Have leftover data after decode!!\n"));
474 if (src_bytes_used) {
479 adpcm_memory_free(fmt);
490 adpcm_memory_free(fmt);
503 if (pwfxSrc == NULL) {
514 memset( &IOhdr, 0,
sizeof(
MMIOINFO) );
553 adpcm_memory_free(fmt);
563 IF_ERR2(str == NULL,
goto Error);
579 adpcm_memory_free(fmt);
593 if (stream == NULL) {
599 adpcm_memory_free(str->
fmt);
607 if (stream == NULL) {
622 if (stream == NULL) {
639 Assert( dest_len != NULL );
641 if (stream == NULL) {
650 memset( &IOrw, 0,
sizeof(
MMIOINFO) );
664 rc = read_sample_fmt_adpcm(dest, rw, str->
fmt);
671 if (src_bytes_used) {
ADPCMBLOCKHEADER * header
uint samples_left_in_block
int ACM_query_source_size(void *stream, int dest_len)
MMRESULT mmioClose(HMMIO hmmio, uint wFlags)
GLenum GLuint GLenum GLsizei const GLchar * buf
#define CLAMP(x, min, max)
struct acm_stream_t acm_stream_t
typedef int(SCP_EXT_CALLCONV *SCPDLL_PFVERSION)(SCPDLL_Version *)
#define WAVE_FORMAT_ADPCM
struct adpcmcoef_tag ADPCMCOEFSET
int ACM_query_dest_size(void *stream, int src_len)
int ACM_convert_ADPCM_to_PCM(WAVEFORMATEX *pwfxSrc, ubyte *src, int src_len, ubyte **dest, int max_dest_bytes, int *dest_len, unsigned int *src_bytes_used, int dest_bps)
struct ADPCM_FMT_T adpcm_fmt_t
#define SMALLEST_ADPCM_DELTA
int ACM_stream_close(void *stream)
struct tWAVEFORMATEX WAVEFORMATEX
void _cdecl void void _cdecl Error(const char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
int ACM_stream_open(WAVEFORMATEX *pwfxSrc, WAVEFORMATEX *pwfxDest, void **stream, int dest_bps)
#define FIXED_POINT_ADAPTION_BASE
struct adpcmblockheader_tag ADPCMBLOCKHEADER
struct adpcmwaveformat_tag ADPCMWAVEFORMAT
#define FIXED_POINT_COEF_BASE
GLenum GLsizei GLenum GLenum const GLvoid * data
long mmioRead(HMMIO hmmio, HPSTR pch, long cch)
int ACM_convert(void *stream, ubyte *src, int src_len, ubyte *dest, int max_dest_bytes, unsigned int *dest_len, unsigned int *src_bytes_used)
HMMIO mmioOpen(LPSTR szFilename, LPMMIOINFO lpmmioinfo, DWORD dwOpenFlags)