prev_frame = Pico.m.frame_count;\r
}\r
\r
- if (need_low_volume)\r
+ if (!need_low_volume)\r
return;\r
\r
/* set the right mixer func */\r
\r
static void updateSound(int len)\r
{\r
+ len <<= 1;\r
if (PicoOpt & POPT_EN_STEREO)\r
len <<= 1;\r
\r
+ if ((currentConfig.EmuOpt & EOPT_NO_FRMLIMIT) && !sndout_oss_can_write(len))\r
+ return;\r
+\r
/* avoid writing audio when lagging behind to prevent audio lag */\r
if (PicoSkipFrame != 2)\r
- sndout_oss_write(PsndOut, len<<1);\r
+ sndout_oss_write(PsndOut, len);\r
}\r
\r
void pemu_sound_start(void)\r
{\r
int is_stereo = (PicoOpt & POPT_EN_STEREO) ? 1 : 0;\r
int target_fps = Pico.m.pal ? 50 : 60;\r
- int snd_excess_add;\r
+ int frame_samples, snd_excess_add;\r
gp2x_soc_t soc;\r
\r
+ soc = soc_detect();\r
+\r
#define SOUND_RERATE_FLAGS (POPT_EN_FM|POPT_EN_PSG|POPT_EN_STEREO|POPT_EXT_FM|POPT_EN_MCD_CDDA)\r
if (PsndRate != PsndRate_old || Pico.m.pal != pal_old || ((PicoOpt & POPT_EXT_FM) && crashed_940) ||\r
((PicoOpt ^ PicoOpt_old) & SOUND_RERATE_FLAGS)) {\r
PsndRerate(Pico.m.frame_count ? 1 : 0);\r
}\r
- snd_excess_add = ((PsndRate - PsndLen * target_fps)<<16) / target_fps;\r
- printf("starting audio: %i len: %i (ex: %04x) stereo: %i, pal: %i\n",\r
- PsndRate, PsndLen, snd_excess_add, is_stereo, Pico.m.pal);\r
- sndout_oss_start(PsndRate, 16, is_stereo);\r
- sndout_oss_setvol(currentConfig.volume, currentConfig.volume);\r
- PicoWriteSound = updateSound;\r
- plat_update_volume(0, 0);\r
+\r
memset(sndBuffer, 0, sizeof(sndBuffer));\r
PsndOut = sndBuffer;\r
+ PicoWriteSound = updateSound;\r
PsndRate_old = PsndRate;\r
PicoOpt_old = PicoOpt;\r
pal_old = Pico.m.pal;\r
+ plat_update_volume(0, 0);\r
+\r
+ frame_samples = PsndLen;\r
+ snd_excess_add = ((PsndRate - PsndLen * target_fps)<<16) / target_fps;\r
+ if (snd_excess_add != 0)\r
+ frame_samples++;\r
+ if (soc == SOCID_POLLUX)\r
+ frame_samples *= 2; /* force larger buffer */\r
+\r
+ printf("starting audio: %i len: %i (ex: %04x) stereo: %i, pal: %i\n",\r
+ PsndRate, PsndLen, snd_excess_add, is_stereo, Pico.m.pal);\r
+ sndout_oss_setvol(currentConfig.volume, currentConfig.volume);\r
+ sndout_oss_start(PsndRate, frame_samples, is_stereo);\r
\r
/* Wiz's sound hardware needs more prebuffer */\r
- soc = soc_detect();\r
if (soc == SOCID_POLLUX)\r
- updateSound(PsndLen);\r
+ updateSound(frame_samples);\r
}\r
}\r
\r
\r
void pemu_loop_end(void)\r
{\r
+ int po_old = PicoOpt;\r
+ int eo_old = currentConfig.EmuOpt;\r
+\r
+ /* do one more frame for menu bg */\r
+ PicoOpt &= ~POPT_ALT_RENDERER;\r
+ PicoOpt |= POPT_EN_SOFTSCALE|POPT_ACC_SPRITES;\r
+ currentConfig.EmuOpt |= EOPT_16BPP;\r
+\r
+ PicoScanBegin = EmuScanBegin16;\r
+ PicoScanEnd = NULL;\r
+ PicoDrawSetColorFormat(1);\r
+ Pico.m.dirtyPal = 1;\r
+ PicoFrame();\r
+\r
+ PicoOpt = po_old;\r
+ currentConfig.EmuOpt = eo_old;\r
}\r
\r
const char *plat_get_credits(void)\r