X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=platform%2Fgp2x%2Fcode940%2F940.c;fp=platform%2Fgp2x%2F940.c;h=e0c40020b1f0673000b83f21c0ee4542d96ddae7;hb=42c7b14797fad5ad8adc822e8d0cebf326eb620b;hp=e94bf21a4a1207a37666b3d83a0492fd8ab353e7;hpb=b837b69b3fcff1737431c8be1c78d1cfd64003a6;p=picodrive.git diff --git a/platform/gp2x/940.c b/platform/gp2x/code940/940.c similarity index 52% rename from platform/gp2x/940.c rename to platform/gp2x/code940/940.c index e94bf21..e0c4002 100644 --- a/platform/gp2x/940.c +++ b/platform/gp2x/code940/940.c @@ -1,7 +1,8 @@ #include "940shared.h" -static _940_data_t *shared_data = (_940_data_t *) 0x100000; -static _940_ctl_t *shared_ctl = (_940_ctl_t *) 0x200000; +static _940_data_t *shared_data = (_940_data_t *) 0x00100000; +static _940_ctl_t *shared_ctl = (_940_ctl_t *) 0x00200000; +static unsigned char *mp3_data = (unsigned char *) 0x01000000; YM2612 *ym2612_940; int *mix_buffer; @@ -22,17 +23,17 @@ void Main940(int startvector) // debug shared_ctl->vstarts[startvector]++; - asm volatile ("mcr p15, 0, r0, c7, c10, 4" ::: "r0"); + // asm volatile ("mcr p15, 0, r0, c7, c10, 4" ::: "r0"); - for (;; shared_ctl->loopc++) + for (;;) { - int job_num; + int job_num = 0; /* while (!shared_ctl->busy) { //shared_ctl->waitc++; - spend_cycles(256); + spend_cycles(8*1024); } */ if (!shared_ctl->busy) @@ -44,9 +45,12 @@ void Main940(int startvector) { switch (shared_ctl->jobs[job_num]) { - case JOB940_YM2612INIT: + case JOB940_INITALL: + /* ym2612 */ shared_ctl->writebuff0[0] = shared_ctl->writebuff1[0] = 0xffff; YM2612Init_(shared_ctl->baseclock, shared_ctl->rate); + /* Helix mp3 decoder */ + shared_data->mp3dec = MP3InitDecoder(); break; case JOB940_YM2612RESETCHIP: @@ -80,14 +84,51 @@ void Main940(int startvector) YM2612UpdateOne_(0, shared_ctl->length, shared_ctl->stereo); break; } + + case JOB940_MP3DECODE: { + int mp3_offs = shared_ctl->mp3_offs; + unsigned char *readPtr = mp3_data + mp3_offs; + int bytesLeft = shared_ctl->mp3_len - mp3_offs; + int offset; // frame offset from readPtr + int err; + + if (bytesLeft <= 0) break; // EOF, nothing to do + + offset = MP3FindSyncWord(readPtr, bytesLeft); + if (offset < 0) { + shared_ctl->mp3_offs = shared_ctl->mp3_len; + break; // EOF + } + readPtr += offset; + bytesLeft -= offset; + + err = MP3Decode(shared_data->mp3dec, &readPtr, &bytesLeft, + shared_data->mp3_buffer[shared_ctl->mp3_buffsel], 0); + if (err) { + if (err == ERR_MP3_INDATA_UNDERFLOW) { + shared_ctl->mp3_offs = shared_ctl->mp3_len; // EOF + break; + } else if (err <= -6 && err >= -12) { + // ERR_MP3_INVALID_FRAMEHEADER, ERR_MP3_INVALID_* + // just try to skip the offending frame.. + readPtr++; + } + shared_ctl->mp3_errors++; + shared_ctl->mp3_lasterr = err; + } + shared_ctl->mp3_offs = readPtr - mp3_data; + break; + } } } - shared_ctl->busy = 0; -// cache_clean_flush(); cache_clean(); // asm volatile ("mov r0, #0" ::: "r0"); // asm volatile ("mcr p15, 0, r0, c7, c10, 4" ::: "r0"); /* drain write buffer, should be done on nonbuffered write */ +// cache_clean_flush(); + + shared_ctl->loopc++; + shared_ctl->busy = 0; } }