+}\r
+*/\r
+\r
+// here we assume that length is different between games, but constant in one game\r
+\r
+static int mp3_samples_ready = 0, mp3_buffer_offs = 0;\r
+static int mp3_play_bufsel = 0;\r
+\r
+int YM2612UpdateOne_940(int *buffer, int length, int stereo, int is_buf_empty)\r
+{\r
+ int length_mp3 = Pico.m.pal ? 44100/50 : 44100/60; // mp3s are locked to 44100Hz stereo\r
+ int *ym_buf = shared_data->mix_buffer;\r
+// int *dest_buf = buffer;\r
+ int cdda_on, mp3_job = 0;\r
+// int len;\r
+\r
+ // emulating CD, enabled in opts, not data track, CDC is reading, playback was started, track not ended\r
+ cdda_on = (PicoMCD & 1) && (PicoOpt & 0x800) && !(Pico_mcd->s68k_regs[0x36] & 1) &&\r
+ (Pico_mcd->scd.Status_CDC & 1) && loaded_mp3;\r
+\r
+ //printf("YM2612UpdateOne_940()\n");\r
+ if (/*shared_ctl->busy*/gp2x_memregs[0x3B3E>>1]) wait_busy_940();\r
+\r
+ // track ended?\r
+ cdda_on = cdda_on && shared_ctl->mp3_offs < shared_ctl->mp3_len;\r
+\r
+ // mix in ym buffer\r
+ if (is_buf_empty) memcpy32(buffer, ym_buf, length<<stereo);\r
+ // else TODO\r
+\r
+// for (len = length << stereo; len > 0; len--)\r
+// {\r
+// *dest_buf++ += *ym_buf++;\r
+// }\r
+\r
+ /* mix mp3 data, only stereo */\r
+ if (cdda_on && mp3_samples_ready >= length_mp3)\r
+ {\r
+ int shr = 0;\r
+ void (*mix_samples)(int *dest_buf, short *mp3_buf, int count) = mix_16h_to_32;\r
+ if (PsndRate == 22050) { mix_samples = mix_16h_to_32_s1; shr = 1; }\r
+ else if (PsndRate == 11025) { mix_samples = mix_16h_to_32_s2; shr = 2; }\r
+\r
+ if (1152 - mp3_buffer_offs >= length_mp3) {\r
+ mix_samples(buffer, shared_data->mp3_buffer[mp3_play_bufsel] + mp3_buffer_offs*2, (length_mp3>>shr)<<1);\r
+\r
+ mp3_buffer_offs += length_mp3;\r
+ } else {\r
+ // collect from both buffers..\r
+ int left = 1152 - mp3_buffer_offs;\r
+ if (mp3_play_bufsel == 0)\r
+ {\r
+ mix_samples(buffer, shared_data->mp3_buffer[0] + mp3_buffer_offs*2, (length_mp3>>shr)<<1);\r
+ mp3_buffer_offs = length_mp3 - left;\r
+ mp3_play_bufsel = 1;\r
+ } else {\r
+ mix_samples(buffer, shared_data->mp3_buffer[1] + mp3_buffer_offs*2, (left>>shr)<<1);\r
+ mp3_buffer_offs = length_mp3 - left;\r
+ mix_samples(buffer + ((left>>shr)<<1),\r
+ shared_data->mp3_buffer[0], (mp3_buffer_offs>>shr)<<1);\r
+ mp3_play_bufsel = 0;\r
+ }\r
+ }\r
+ mp3_samples_ready -= length_mp3;\r
+ }\r