#include "940shared.h"\r
\r
-static _940_data_t *shared_data = (_940_data_t *) 0x100000;\r
-static _940_ctl_t *shared_ctl = (_940_ctl_t *) 0x200000;\r
+static _940_data_t *shared_data = (_940_data_t *) 0x00100000;\r
+static _940_ctl_t *shared_ctl = (_940_ctl_t *) 0x00200000;\r
+static unsigned char *mp3_data = (unsigned char *) 0x01000000;\r
YM2612 *ym2612_940;\r
int *mix_buffer;\r
\r
\r
// debug\r
shared_ctl->vstarts[startvector]++;\r
- asm volatile ("mcr p15, 0, r0, c7, c10, 4" ::: "r0");\r
+ // asm volatile ("mcr p15, 0, r0, c7, c10, 4" ::: "r0");\r
\r
\r
- for (;; shared_ctl->loopc++)\r
+ for (;;)\r
{\r
- int job_num;\r
+ int job_num = 0;\r
/*\r
while (!shared_ctl->busy)\r
{\r
//shared_ctl->waitc++;\r
- spend_cycles(256);\r
+ spend_cycles(8*1024);\r
}\r
*/\r
if (!shared_ctl->busy)\r
{\r
switch (shared_ctl->jobs[job_num])\r
{\r
- case JOB940_YM2612INIT:\r
+ case JOB940_INITALL:\r
+ /* ym2612 */\r
shared_ctl->writebuff0[0] = shared_ctl->writebuff1[0] = 0xffff;\r
YM2612Init_(shared_ctl->baseclock, shared_ctl->rate);\r
+ /* Helix mp3 decoder */\r
+ shared_data->mp3dec = MP3InitDecoder();\r
break;\r
\r
case JOB940_YM2612RESETCHIP:\r
YM2612UpdateOne_(0, shared_ctl->length, shared_ctl->stereo);\r
break;\r
}\r
+\r
+ case JOB940_MP3DECODE: {\r
+ int mp3_offs = shared_ctl->mp3_offs;\r
+ unsigned char *readPtr = mp3_data + mp3_offs;\r
+ int bytesLeft = shared_ctl->mp3_len - mp3_offs;\r
+ int offset; // frame offset from readPtr\r
+ int err;\r
+\r
+ if (bytesLeft <= 0) break; // EOF, nothing to do\r
+\r
+ offset = MP3FindSyncWord(readPtr, bytesLeft);\r
+ if (offset < 0) {\r
+ shared_ctl->mp3_offs = shared_ctl->mp3_len;\r
+ break; // EOF\r
+ }\r
+ readPtr += offset;\r
+ bytesLeft -= offset;\r
+\r
+ err = MP3Decode(shared_data->mp3dec, &readPtr, &bytesLeft,\r
+ shared_data->mp3_buffer[shared_ctl->mp3_buffsel], 0);\r
+ if (err) {\r
+ if (err == ERR_MP3_INDATA_UNDERFLOW) {\r
+ shared_ctl->mp3_offs = shared_ctl->mp3_len; // EOF\r
+ break;\r
+ } else if (err <= -6 && err >= -12) {\r
+ // ERR_MP3_INVALID_FRAMEHEADER, ERR_MP3_INVALID_*\r
+ // just try to skip the offending frame..\r
+ readPtr++;\r
+ }\r
+ shared_ctl->mp3_errors++;\r
+ shared_ctl->mp3_lasterr = err;\r
+ }\r
+ shared_ctl->mp3_offs = readPtr - mp3_data;\r
+ break;\r
+ }\r
}\r
}\r
\r
- shared_ctl->busy = 0;\r
-// cache_clean_flush();\r
cache_clean();\r
// asm volatile ("mov r0, #0" ::: "r0");\r
// asm volatile ("mcr p15, 0, r0, c7, c10, 4" ::: "r0"); /* drain write buffer, should be done on nonbuffered write */\r
+// cache_clean_flush();\r
+\r
+ shared_ctl->loopc++;\r
+ shared_ctl->busy = 0;\r
}\r
}\r
\r