void plat_update_volume(int has_changed, int is_up) { static int prev_frame = 0, wait_frames = 0; int need_low_volume = 0; int vol = currentConfig.volume; gp2x_soc_t soc; soc = soc_detect(); if ((PicoOpt & POPT_EN_STEREO) && soc == SOCID_MMSP2) need_low_volume = 1; if (has_changed) { if (need_low_volume && vol < 5 && prev_frame == Pico.m.frame_count - 1 && wait_frames < 12) wait_frames++; else { wait_frames = 0; plat_target_step_volume(¤tConfig.volume, is_up ? 1 : -1); vol = currentConfig.volume; } emu_status_msg("VOL: %02i", vol); prev_frame = Pico.m.frame_count; } if (!need_low_volume) return; /* set the right mixer func */ if (vol >= 5) PsndMix_32_to_16l = mix_32_to_16l_stereo; else { mix_32_to_16l_level = 5 - vol; PsndMix_32_to_16l = mix_32_to_16l_stereo_lvl; } }
void pemu_sound_start(void) { gp2x_soc_t soc; emu_sound_start(); if (currentConfig.EmuOpt & EOPT_EN_SOUND) { soc = soc_detect(); if (soc == SOCID_POLLUX) { PsndRate = pollux_get_real_snd_rate(PsndRate); PsndRerate(Pico.m.frame_count ? 1 : 0); } plat_target_step_volume(¤tConfig.volume, 0); } }
void do_emu_action(void) { int ret; emu_action_old = emu_action; switch (emu_action) { case SACTION_LOAD_STATE: ret = emu_load_state(state_slot); snprintf(hud_msg, sizeof(hud_msg), ret == 0 ? "LOADED" : "FAIL!"); break; case SACTION_SAVE_STATE: ret = emu_save_state(state_slot); snprintf(hud_msg, sizeof(hud_msg), ret == 0 ? "SAVED" : "FAIL!"); break; #ifndef NO_FRONTEND case SACTION_ENTER_MENU: toggle_fast_forward(1); menu_loop(); return; case SACTION_NEXT_SSLOT: state_slot++; if (state_slot > 9) state_slot = 0; goto do_state_slot; case SACTION_PREV_SSLOT: state_slot--; if (state_slot < 0) state_slot = 9; do_state_slot: snprintf(hud_msg, sizeof(hud_msg), "STATE SLOT %d [%s]", state_slot, emu_check_state(state_slot) == 0 ? "USED" : "FREE"); hud_new_msg = 3; SysPrintf("* %s\n", hud_msg); break; case SACTION_TOGGLE_FSKIP: pl_rearmed_cbs.fskip_advice = 0; pl_rearmed_cbs.frameskip++; if (pl_rearmed_cbs.frameskip > 1) pl_rearmed_cbs.frameskip = -1; snprintf(hud_msg, sizeof(hud_msg), "FRAMESKIP: %s", pl_rearmed_cbs.frameskip == -1 ? "AUTO" : pl_rearmed_cbs.frameskip == 0 ? "OFF" : "1" ); plugin_call_rearmed_cbs(); break; case SACTION_SWITCH_DISPMODE: pl_switch_dispmode(); plugin_call_rearmed_cbs(); if (GPU_open != NULL && GPU_close != NULL) { GPU_close(); GPU_open(&gpuDisp, "PCSX", NULL); } break; case SACTION_FAST_FORWARD: toggle_fast_forward(0); plugin_call_rearmed_cbs(); break; case SACTION_TOGGLE_FPS: if ((g_opts & (OPT_SHOWFPS|OPT_SHOWCPU)) == (OPT_SHOWFPS|OPT_SHOWCPU)) g_opts &= ~(OPT_SHOWFPS|OPT_SHOWCPU); else if (g_opts & OPT_SHOWFPS) g_opts |= OPT_SHOWCPU; else g_opts |= OPT_SHOWFPS; break; case SACTION_TOGGLE_FULLSCREEN: plat_target.vout_fullscreen = !plat_target.vout_fullscreen; if (GPU_open != NULL && GPU_close != NULL) { GPU_close(); GPU_open(&gpuDisp, "PCSX", NULL); } break; case SACTION_SCREENSHOT: { char buf[MAXPATHLEN]; void *scrbuf; int w, h, bpp; time_t t = time(NULL); struct tm *tb = localtime(&t); int ti = tb->tm_yday * 1000000 + tb->tm_hour * 10000 + tb->tm_min * 100 + tb->tm_sec; scrbuf = pl_prepare_screenshot(&w, &h, &bpp); get_gameid_filename(buf, sizeof(buf), "screenshots/%.32s-%.9s.%d.png", ti); ret = -1; if (scrbuf != 0 && bpp == 16) ret = writepng(buf, scrbuf, w, h); if (ret == 0) snprintf(hud_msg, sizeof(hud_msg), "SCREENSHOT TAKEN"); break; } case SACTION_VOLUME_UP: case SACTION_VOLUME_DOWN: { static int volume; plat_target_step_volume(&volume, emu_action == SACTION_VOLUME_UP ? 1 : -1); } return; case SACTION_MINIMIZE: if (GPU_close != NULL) GPU_close(); plat_minimize(); if (GPU_open != NULL) { ret = GPU_open(&gpuDisp, "PCSX", NULL); if (ret) SysMessage("GPU_open returned %d", ret); } return; #endif default: return; } hud_new_msg = 3; }