/*
- * (C) notaz, 2012
+ * (C) notaz, 2012,2014,2015
*
* This work is licensed under the terms of the GNU GPLv2 or later.
* See the COPYING file in the top-level directory.
#include "../libpcsxcore/cdriso.h"
#include "../libpcsxcore/cheat.h"
#include "../plugins/dfsound/out.h"
+#include "../plugins/dfsound/spu_config.h"
#include "../plugins/dfinput/externals.h"
#include "cspace.h"
#include "main.h"
static retro_input_state_t input_state_cb;
static retro_environment_t environ_cb;
static retro_audio_sample_batch_t audio_batch_cb;
+static struct retro_rumble_interface rumble;
static void *vout_buf;
static int vout_width, vout_height;
static bool vout_can_dupe;
static bool duping_enable;
-static int samples_sent, samples_to_send;
static int plugins_opened;
static int is_pal_mode;
int in_type1, in_type2;
int in_a1[2] = { 127, 127 }, in_a2[2] = { 127, 127 };
int in_keystate;
-int in_enable_vibration;
+int in_enable_vibration = 1;
/* PSX max resolution is 640x512, but with enhancement it's 1024x512 */
#define VOUT_MAX_WIDTH 1024
is_pal_mode = is_pal;
}
-void plat_trigger_vibrate(int is_strong)
+void plat_trigger_vibrate(int pad, int low, int high)
{
+ rumble.set_rumble_state(pad, RETRO_RUMBLE_STRONG, high << 8);
+ rumble.set_rumble_state(pad, RETRO_RUMBLE_WEAK, low ? 0xffff : 0x0);
}
void pl_update_gun(int *xn, int *yn, int *xres, int *yres, int *in)
static int snd_busy(void)
{
- if (samples_to_send > samples_sent)
- return 0; /* give more samples */
- else
- return 1;
+ return 0;
}
static void snd_feed(void *buf, int bytes)
{
- audio_batch_cb(buf, bytes / 4);
- samples_sent += bytes / 4;
+ if (audio_batch_cb != NULL)
+ audio_batch_cb(buf, bytes / 4);
}
void out_register_libretro(struct out_driver *drv)
void retro_set_environment(retro_environment_t cb)
{
static const struct retro_variable vars[] = {
- { "frameskip", "Frameskip; 0|1|2|3" },
- { "region", "Region; Auto|NTSC|PAL" },
- { "pad1type", "Pad 1 Type; standard|analog" },
+ { "pcsx_rearmed_frameskip", "Frameskip; 0|1|2|3" },
+ { "pcsx_rearmed_region", "Region; Auto|NTSC|PAL" },
+ { "pcsx_rearmed_pad1type", "Pad 1 Type; standard|analog" },
+ { "pcsx_rearmed_pad2type", "Pad 2 Type; standard|analog" },
#ifndef DRC_DISABLE
- { "rearmed_drc", "Dynamic recompiler; enabled|disabled" },
+ { "pcsx_rearmed_drc", "Dynamic recompiler; enabled|disabled" },
#endif
#ifdef __ARM_NEON__
{ "pcsx_rearmed_neon_interlace_enable", "Enable interlacing mode(s); disabled|enabled" },
{ "pcsx_rearmed_neon_enhancement_no_main", "Enhanced resolution speed hack; disabled|enabled" },
#endif
{ "pcsx_rearmed_duping_enable", "Frame duping; on|off" },
+ { "pcsx_rearmed_spu_reverb", "Sound: Reverb; on|off" },
+ { "pcsx_rearmed_spu_interpolation", "Sound: Interpolation; simple|gaussian|cubic|off" },
{ NULL, NULL },
};
{
memset(info, 0, sizeof(*info));
info->library_name = "PCSX-ReARMed";
- info->library_version = "r19";
+ info->library_version = "r20";
info->valid_extensions = "bin|cue|img|mdf|pbp|toc|cbn|m3u";
info->need_fullpath = true;
}
/* savestates */
size_t retro_serialize_size(void)
{
- // it's currently 4380651 bytes, but have some reserved for future
- return 0x430000;
+ // it's currently 4380651-4397047 bytes,
+ // but have some reserved for future
+ return 0x440000;
}
struct save_fp {
}
}
-#ifdef __QNX__
+#if defined(__QNX__) || defined(_WIN32)
/* Blackberry QNX doesn't have strcasestr */
/*
struct retro_variable var;
var.value = NULL;
- var.key = "frameskip";
+ var.key = "pcsx_rearmed_frameskip";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
pl_rearmed_cbs.frameskip = atoi(var.value);
var.value = NULL;
- var.key = "region";
+ var.key = "pcsx_rearmed_region";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
{
}
var.value = NULL;
- var.key = "pad1type";
+ var.key = "pcsx_rearmed_pad1type";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
{
in_type1 = PSE_PAD_TYPE_ANALOGPAD;
}
+ var.value = NULL;
+ var.key = "pcsx_rearmed_pad2type";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+ {
+ in_type2 = PSE_PAD_TYPE_STANDARD;
+ if (strcmp(var.value, "analog") == 0)
+ in_type2 = PSE_PAD_TYPE_ANALOGPAD;
+ }
+
#ifdef __ARM_NEON__
var.value = "NULL";
var.key = "pcsx_rearmed_neon_interlace_enable";
#ifndef DRC_DISABLE
var.value = NULL;
- var.key = "rearmed_drc";
+ var.key = "pcsx_rearmed_drc";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
{
}
#endif
+ var.value = "NULL";
+ var.key = "pcsx_rearmed_spu_reverb";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+ {
+ if (strcmp(var.value, "off") == 0)
+ spu_config.iUseReverb = false;
+ else if (strcmp(var.value, "on") == 0)
+ spu_config.iUseReverb = true;
+ }
+
+ var.value = "NULL";
+ var.key = "pcsx_rearmed_spu_interpolation";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+ {
+ if (strcmp(var.value, "simple") == 0)
+ spu_config.iUseInterpolation = 1;
+ else if (strcmp(var.value, "gaussian") == 0)
+ spu_config.iUseInterpolation = 2;
+ else if (strcmp(var.value, "cubic") == 0)
+ spu_config.iUseInterpolation = 3;
+ else if (strcmp(var.value, "off") == 0)
+ spu_config.iUseInterpolation = 0;
+ }
+
if (in_flight) {
// inform core things about possible config changes
plugin_call_rearmed_cbs();
stop = 0;
psxCpu->Execute();
- samples_to_send += is_pal_mode ? 44100 / 50 : 44100 / 60;
-
video_cb((vout_fb_dirty || !vout_can_dupe || !duping_enable) ? vout_buf : NULL,
vout_width, vout_height, vout_width * 2);
vout_fb_dirty = 0;
const char *bios[] = { "scph1001", "scph5501", "scph7001" };
const char *dir;
char path[256];
- int i, ret, level;
+ int i, ret;
bool found_bios = false;
ret = emu_core_preinit();
environ_cb(RETRO_ENVIRONMENT_SET_MESSAGE, (void*)&msg);
}
- level = 1;
- environ_cb(RETRO_ENVIRONMENT_SET_PERFORMANCE_LEVEL, &level);
-
environ_cb(RETRO_ENVIRONMENT_GET_CAN_DUPE, &vout_can_dupe);
environ_cb(RETRO_ENVIRONMENT_SET_DISK_CONTROL_INTERFACE, &disk_control);
+ environ_cb(RETRO_ENVIRONMENT_GET_RUMBLE_INTERFACE, &rumble);
/* Set how much slower PSX CPU runs * 100 (so that 200 is 2 times)
* we have to do this because cache misses and some IO penalties
* are not emulated. Warning: changing this may break compatibility. */
-#ifdef __ARM_ARCH_7A__
+#if !defined(__arm__) || defined(__ARM_ARCH_7A__)
cycle_multiplier = 175;
#else
cycle_multiplier = 200;
#endif
+ pl_rearmed_cbs.gpu_peops.iUseDither = 1;
McdDisable[0] = 0;
McdDisable[1] = 1;