--- np2/sound/getsnd/getwave.c 2004/01/08 16:29:56 1.1 +++ np2/sound/getsnd/getwave.c 2005/02/07 14:46:13 1.5 @@ -5,28 +5,28 @@ #if defined(__GNUC__) typedef struct { char head[4]; - BYTE size[4]; + UINT8 size[4]; char fmt[4]; } __attribute__ ((packed)) RIFF_HEADER; typedef struct { char head[4]; - BYTE size[4]; + UINT8 size[4]; } __attribute__ ((packed)) WAVE_HEADER; typedef struct { - BYTE format[2]; - BYTE channel[2]; - BYTE rate[4]; - BYTE rps[4]; - BYTE block[2]; - BYTE bit[2]; + UINT8 format[2]; + UINT8 channel[2]; + UINT8 rate[4]; + UINT8 rps[4]; + UINT8 block[2]; + UINT8 bit[2]; } __attribute__ ((packed)) WAVE_INFOS; typedef struct { - BYTE exsize[2]; - BYTE spb[2]; - BYTE numcoef[2]; + UINT8 exsize[2]; + UINT8 spb[2]; + UINT8 numcoef[2]; } __attribute__ ((packed)) WAVE_MSA_INFO; #else /* __GNUC__ */ @@ -34,28 +34,28 @@ typedef struct { #pragma pack(push, 1) typedef struct { char head[4]; - BYTE size[4]; + UINT8 size[4]; char fmt[4]; } RIFF_HEADER; typedef struct { char head[4]; - BYTE size[4]; + UINT8 size[4]; } WAVE_HEADER; typedef struct { - BYTE format[2]; - BYTE channel[2]; - BYTE rate[4]; - BYTE rps[4]; - BYTE block[2]; - BYTE bit[2]; + UINT8 format[2]; + UINT8 channel[2]; + UINT8 rate[4]; + UINT8 rps[4]; + UINT8 block[2]; + UINT8 bit[2]; } WAVE_INFOS; typedef struct { - BYTE exsize[2]; - BYTE spb[2]; - BYTE numcoef[2]; + UINT8 exsize[2]; + UINT8 spb[2]; + UINT8 numcoef[2]; } WAVE_MSA_INFO; #pragma pack(pop) @@ -85,14 +85,37 @@ static UINT pcm_dec(GETSND snd, void *ds return(size); } #elif defined(BYTESEX_BIG) -static UINT pcm_dec(SMIXTRACK *trk, short *dst) { +static UINT pcm_dec(GETSND snd, UINT8 *dst) { -#error pcm_dec: unsupported - return(0); + UINT size; + UINT cnt; + UINT8 *src; + + size = min(snd->blocksize, snd->datsize); + if (size) { + if (snd->bit == 16) { + cnt = size >> 1; + src = snd->datptr; + while(cnt) { + cnt--; + dst[0] = src[1]; + dst[1] = src[0]; + src += 2; + dst += 2; + } + } + else { + CopyMemory(dst, snd->datptr, size); + } + snd->datptr += size; + snd->datsize -= size; + size >>= (int)(long)snd->snd; + } + return(size); } #endif -static const BYTE abits[4] = {0, 1, 0, 2}; +static const UINT8 abits[4] = {0, 1, 0, 2}; static BOOL pcm_open(GETSND snd) { @@ -108,7 +131,7 @@ static BOOL pcm_open(GETSND snd) { snd->blocksamples = 0x800; // 適当に。 snd->blocksize *= snd->blocksamples; snd->snd = (void *)(long)abits[align - 1]; - snd->dec = pcm_dec; + snd->dec = (GSDEC)pcm_dec; return(SUCCESS); pcmopn_err: @@ -119,8 +142,8 @@ pcmopn_err: // ---- MS-ADPCM typedef struct { - short Coef1; - short Coef2; + SINT16 Coef1; + SINT16 Coef2; } __COEFPAIR; static const int MSADPCMTable[16] = { @@ -128,17 +151,17 @@ static const int MSADPCMTable[16] = { 768, 614, 512, 409, 307, 230, 230, 230 }; -static UINT msa_dec(GETSND snd, short *dst) { +static UINT msa_dec(GETSND snd, SINT16 *dst) { - BYTE *buf; + UINT8 *buf; UINT size; UINT outsamples; int pred[2], delta[2], nibble; UINT i; - BYTE indata; + UINT8 indata; __COEFPAIR *coef; UINT ch; - long outdata; + SINT32 outdata; buf = snd->datptr; // ワーク使ってません。 size = min(snd->datsize, snd->blocksize); @@ -152,8 +175,8 @@ static UINT msa_dec(GETSND snd, short *d pred[1] = 0; delta[0] = LOADINTELWORD(buf+1); delta[1] = 0; - *dst++ = (short)LOADINTELWORD(buf+5); - *dst++ = (short)LOADINTELWORD(buf+3); + *dst++ = (SINT16)LOADINTELWORD(buf+5); + *dst++ = (SINT16)LOADINTELWORD(buf+3); buf += 7; outsamples = 2 + ((size - 7) * 2); } @@ -164,10 +187,10 @@ static UINT msa_dec(GETSND snd, short *d pred[1] = buf[1]; delta[0] = LOADINTELWORD(buf+2); delta[1] = LOADINTELWORD(buf+4); - *dst++ = (short)LOADINTELWORD(buf+10); - *dst++ = (short)LOADINTELWORD(buf+12); - *dst++ = (short)LOADINTELWORD(buf+6); - *dst++ = (short)LOADINTELWORD(buf+8); + *dst++ = (SINT16)LOADINTELWORD(buf+10); + *dst++ = (SINT16)LOADINTELWORD(buf+12); + *dst++ = (SINT16)LOADINTELWORD(buf+6); + *dst++ = (SINT16)LOADINTELWORD(buf+8); buf += 14; outsamples = 2 + (size - 14); } @@ -200,7 +223,7 @@ static UINT msa_dec(GETSND snd, short *d else if (outdata < -32768) { outdata = -32768; } - *dst++ = (short)outdata; + *dst++ = (SINT16)outdata; } } return(outsamples); @@ -219,17 +242,15 @@ static BOOL msa_open(GETSND snd, WAVE_IN UINT spb; UINT blk; __COEFPAIR *coef; - BYTE *p; + UINT8 *p; - if (snd->bit != 4) { + if ((snd->bit != 4) || + (headsize < (sizeof(WAVE_INFOS) + sizeof(WAVE_MSA_INFO)))) { goto msaopn_err; } info = (WAVE_MSA_INFO *)(wavehead + 1); headsize -= sizeof(WAVE_INFOS); headsize -= sizeof(WAVE_MSA_INFO); - if ((signed long)headsize < 0) { - goto msaopn_err; - } exsize = LOADINTELWORD(info->exsize); spb = LOADINTELWORD(info->spb); numcoef = LOADINTELWORD(info->numcoef); @@ -264,7 +285,7 @@ static BOOL msa_open(GETSND snd, WAVE_IN snd->decend = msa_decend; snd->snd = (void *)coef; - p = (BYTE *)(info + 1); + p = (UINT8 *)(info + 1); do { coef->Coef1 = LOADINTELWORD(p + 0); coef->Coef2 = LOADINTELWORD(p + 2); @@ -283,7 +304,7 @@ msaopn_err: #define IMA_MAXSTEP 89 static BOOL ima_init = FALSE; -static BYTE ima_statetbl[IMA_MAXSTEP][8]; +static UINT8 ima_statetbl[IMA_MAXSTEP][8]; static const int ima_stateadj[8] = {-1, -1, -1, -1, 2, 4, 6, 8}; @@ -310,16 +331,17 @@ static void ima_inittable(void) { else if (k >= IMA_MAXSTEP) { k = IMA_MAXSTEP - 1; } - ima_statetbl[i][j] = (BYTE)k; + ima_statetbl[i][j] = (UINT8)k; } } } -static UINT ima_dec(GETSND snd, short *dst) { +static UINT ima_dec(GETSND snd, SINT16 *dst) { UINT c; - int val[2], state[2]; - BYTE *src; + SINT32 val[2]; + int state[2]; + UINT8 *src; UINT blk; if (snd->blocksize > snd->datsize) { @@ -331,10 +353,10 @@ static UINT ima_dec(GETSND snd, short *d blk = snd->blocksamples; for (c=0; cchannels; c++) { - short tmp; + SINT16 tmp; tmp = LOADINTELWORD(src); val[c] = tmp; - *dst++ = (short)val[c]; + *dst++ = (SINT16)val[c]; state[c] = src[2]; if (state[c] >= IMA_MAXSTEP) { state[c] = 0; @@ -372,7 +394,7 @@ static UINT ima_dec(GETSND snd, short *d val[c] = -32768; } } - *dst = (short)val[c]; + *dst = (SINT16)val[c]; dst += snd->channels; } while(--r); dst -= (8 * snd->channels); @@ -418,13 +440,13 @@ imaopn_err: // ---- MP3 #if defined(SUPPORT_MP3) -extern BOOL __mp3_open(GETSND snd, BYTE *ptr, UINT size); +extern BOOL __mp3_open(GETSND snd, UINT8 *ptr, UINT size); #endif // ---- -BOOL getwave_open(GETSND snd, BYTE *ptr, UINT size) { +BOOL getwave_open(GETSND snd, UINT8 *ptr, UINT size) { RIFF_HEADER *riff; WAVE_HEADER *head; @@ -441,6 +463,7 @@ BOOL getwave_open(GETSND snd, BYTE *ptr, riff = (RIFF_HEADER *)ptr; pos = sizeof(RIFF_HEADER); if (size < pos) { + TRACEOUT(("wav: error RIFF header")); goto gwopn_err; } if (memcmp(riff->head, fmt_riff, 4)) { @@ -452,6 +475,7 @@ BOOL getwave_open(GETSND snd, BYTE *ptr, head = (WAVE_HEADER *)(ptr + pos); pos += sizeof(WAVE_HEADER); if (size < pos) { + TRACEOUT(("wav: error fmt header")); goto gwopn_err; } if (memcmp(head->head, chunk_fmt, 4)) { @@ -544,11 +568,9 @@ BOOL getwave_open(GETSND snd, BYTE *ptr, // 登録〜 snd->datptr = ptr; snd->datsize = size; - TRACEOUT(("ok")); return(SUCCESS); gwopn_err: - TRACEOUT(("err")); return(FAILURE); }