#endif\r
\r
#include "../PicoInt.h"\r
+#include "../cd/pcm.h"\r
+#include "mix.h"\r
\r
+// master int buffer to mix to\r
+static int PsndBuffer[2*44100/50];\r
\r
//int z80CycleAim = 0;\r
\r
dac_cnt -= lines;\r
len++;\r
}\r
- if (i == mid) // midpoint\r
+ if (i == mid) // midpoint\r
while(pos+len < PsndLen/2) {\r
dac_cnt -= lines;\r
len++;\r
{\r
unsigned int state[28];\r
\r
+ // not all rates are supported in MCD mode due to mp3 decoder\r
+ if (PicoMCD & 1) {\r
+ if (PsndRate != 11025 && PsndRate != 22050 && PsndRate != 44100) PsndRate = 22050;\r
+ if (!(PicoOpt & 8)) PicoOpt |= 8;\r
+ }\r
+\r
+ if ((PicoMCD & 1) && Pico_mcd->m.audio_track) Pico_mcd->m.audio_offset = mp3_get_offset();\r
YM2612Init(Pico.m.pal ? OSC_PAL/7 : OSC_NTSC/7, PsndRate);\r
// feed it back it's own registers, just like after loading state\r
YM2612PicoStateLoad();\r
+ if ((PicoMCD & 1) && Pico_mcd->m.audio_track)\r
+ mp3_start_play(Pico_mcd->TOC.Tracks[Pico_mcd->m.audio_track].F, Pico_mcd->m.audio_offset);\r
\r
memcpy(state, sn76496_regs, 28*4); // remember old state\r
SN76496_init(Pico.m.pal ? OSC_PAL/15 : OSC_NTSC/15, PsndRate);\r
\r
// recalculate dac info\r
dac_recalculate();\r
+\r
+ if (PicoMCD & 1)\r
+ pcm_set_rate(PsndRate);\r
}\r
\r
\r
// This is called once per raster (aka line), but not necessarily for every line\r
-int sound_timers_and_dac(int raster)\r
+void sound_timers_and_dac(int raster)\r
{\r
- if(raster >= 0 && PsndOut && (PicoOpt&1) && *ym2612_dacen) {\r
- short dout = (short) *ym2612_dacout;\r
- int pos=dac_info[raster], len=pos&0xf;\r
- short *d;\r
- pos>>=4;\r
-\r
- if(PicoOpt&8) { // only left channel for stereo (will be copied to right by ym2612 mixing code)\r
- d=PsndOut+pos*2;\r
- while(len--) { *d = dout; d += 2; }\r
+ int pos, len;\r
+ int do_dac = PsndOut && (PicoOpt&1) && *ym2612_dacen;\r
+// int do_pcm = PsndOut && (PicoMCD&1) && (PicoOpt&0x400);\r
+\r
+ // Our raster lasts 63.61323/64.102564 microseconds (NTSC/PAL)\r
+ YM2612PicoTick(1);\r
+\r
+ if (!do_dac /*&& !do_pcm*/) return;\r
+\r
+ pos=dac_info[raster], len=pos&0xf;\r
+ if (!len) return;\r
+\r
+ pos>>=4;\r
+\r
+ if (do_dac) {\r
+ short *d = PsndOut + pos*2;\r
+ int dout = *ym2612_dacout;\r
+ if(PicoOpt&8) {\r
+ // some manual loop unrolling here :)\r
+ d[0] = dout;\r
+ if (len > 1) {\r
+ d[2] = dout;\r
+ if (len > 2) {\r
+ d[4] = dout;\r
+ if (len > 3)\r
+ d[6] = dout;\r
+ }\r
+ }\r
} else {\r
- d=PsndOut+pos;\r
- while(len--) *d++ = dout;\r
+ short *d = PsndOut + pos;\r
+ d[0] = dout;\r
+ if (len > 1) {\r
+ d[1] = dout;\r
+ if (len > 2) {\r
+ d[2] = dout;\r
+ if (len > 3)\r
+ d[3] = dout;\r
+ }\r
+ }\r
}\r
}\r
\r
- //dprintf("s: %03i", raster);\r
+#if 0\r
+ if (do_pcm) {\r
+ int *d = PsndBuffer;\r
+ d += (PicoOpt&8) ? pos*2 : pos;\r
+ pcm_update(d, len, 1);\r
+ }\r
+#endif\r
+}\r
\r
- // Our raster lasts 63.61323/64.102564 microseconds (NTSC/PAL)\r
- YM2612PicoTick(1);\r
\r
- return 0;\r
+void sound_clear(void)\r
+{\r
+ if (PicoOpt & 8) memset32((int *) PsndOut, 0, PsndLen);\r
+ else memset(PsndOut, 0, PsndLen<<1);\r
+// memset(PsndBuffer, 0, (PicoOpt & 8) ? (PsndLen<<3) : (PsndLen<<2));\r
}\r
\r
\r
int sound_render(int offset, int length)\r
{\r
+ int *buf32 = PsndBuffer+offset;\r
int stereo = (PicoOpt & 8) >> 3;\r
+ // emulating CD && PCM option enabled && PCM chip on && have enabled channels\r
+ int do_pcm = (PicoMCD&1) && (PicoOpt&0x400) && (Pico_mcd->pcm.control & 0x80) && Pico_mcd->pcm.enabled;\r
offset <<= stereo;\r
\r
// PSG\r
- if(PicoOpt & 2)\r
+ if (PicoOpt & 2)\r
SN76496Update(PsndOut+offset, length, stereo);\r
\r
// Add in the stereo FM buffer\r
- if(PicoOpt & 1) {\r
- YM2612UpdateOne(PsndOut+offset, length, stereo);\r
- } else {\r
- // YM2612 upmixes to stereo, so we have to do this manually here\r
- int i;\r
- short *s = PsndOut+offset;\r
- for (i = 0; i < length; i++) {\r
- *(s+1) = *s; s+=2;\r
- }\r
- }\r
+ if (PicoOpt & 1)\r
+ YM2612UpdateOne(buf32, length, stereo, 1);\r
+\r
+ if (do_pcm)\r
+ pcm_update(buf32, length, stereo);\r
+\r
+ // CDDA audio\r
+// if ((PicoMCD & 1) && (PicoOpt & 0x800))\r
+// mp3_update(PsndBuffer+offset, length, stereo);\r
+\r
+ // convert + limit to normal 16bit output\r
+ if (stereo)\r
+ mix_32_to_16l_stereo(PsndOut+offset, buf32, length);\r
+ else mix_32_to_16_mono (PsndOut+offset, buf32, length);\r
\r
return 0;\r
}\r
mz80init();\r
// Modify the default context\r
mz80GetContext(&z80);\r
- \r
+\r
// point mz80 stuff\r
z80.z80Base=Pico.zram;\r
z80.z80MemRead=mz80_mem_read;\r
z80.z80MemWrite=mz80_mem_write;\r
z80.z80IoRead=mz80_io_read;\r
z80.z80IoWrite=mz80_io_write;\r
- \r
+\r
mz80SetContext(&z80);\r
\r
#elif defined(_USE_DRZ80)\r