Small cleanup in python state tracker.

Removes meta binds. They were completely useless. Add checking for
analogs.
This commit is contained in:
Themaister 2013-09-23 20:20:30 +02:00
parent 387701b55e
commit ff793f3fa8
1 changed files with 64 additions and 63 deletions

View File

@ -30,7 +30,6 @@
static PyObject* py_read_wram(PyObject *self, PyObject *args) static PyObject* py_read_wram(PyObject *self, PyObject *args)
{ {
(void)self; (void)self;
const uint8_t *data = (const uint8_t*)pretro_get_memory_data(RETRO_MEMORY_SYSTEM_RAM); const uint8_t *data = (const uint8_t*)pretro_get_memory_data(RETRO_MEMORY_SYSTEM_RAM);
if (!data) if (!data)
{ {
@ -39,8 +38,8 @@ static PyObject* py_read_wram(PyObject *self, PyObject *args)
} }
size_t max = pretro_get_memory_size(RETRO_MEMORY_SYSTEM_RAM); size_t max = pretro_get_memory_size(RETRO_MEMORY_SYSTEM_RAM);
unsigned addr; unsigned addr;
if (!PyArg_ParseTuple(args, "I", &addr)) if (!PyArg_ParseTuple(args, "I", &addr))
return NULL; return NULL;
@ -53,10 +52,45 @@ static PyObject* py_read_wram(PyObject *self, PyObject *args)
return PyLong_FromLong(data[addr]); return PyLong_FromLong(data[addr]);
} }
static PyObject* py_read_vram(PyObject *self, PyObject *args)
{
(void)self;
const uint8_t *data = (const uint8_t*)pretro_get_memory_data(RETRO_MEMORY_VIDEO_RAM);
if (!data)
{
Py_INCREF(Py_None);
return Py_None;
}
size_t max = pretro_get_memory_size(RETRO_MEMORY_VIDEO_RAM);
unsigned addr;
if (!PyArg_ParseTuple(args, "I", &addr))
return NULL;
if (addr >= max)
{
Py_INCREF(Py_None);
return Py_None;
}
return PyLong_FromLong(data[addr]);
}
static const struct retro_keybind *py_binds[MAX_PLAYERS] = {
g_settings.input.binds[0],
g_settings.input.binds[1],
g_settings.input.binds[2],
g_settings.input.binds[3],
g_settings.input.binds[4],
g_settings.input.binds[5],
g_settings.input.binds[6],
g_settings.input.binds[7],
};
static PyObject *py_read_input(PyObject *self, PyObject *args) static PyObject *py_read_input(PyObject *self, PyObject *args)
{ {
(void)self; (void)self;
if (!driver.input_data) if (!driver.input_data)
return PyBool_FromLong(0); return PyBool_FromLong(0);
@ -68,49 +102,38 @@ static PyObject *py_read_input(PyObject *self, PyObject *args)
if (player > MAX_PLAYERS || player < 1 || key >= RARCH_FIRST_META_KEY) if (player > MAX_PLAYERS || player < 1 || key >= RARCH_FIRST_META_KEY)
return NULL; return NULL;
static const struct retro_keybind *binds[MAX_PLAYERS] = { int16_t res = input_input_state_func(py_binds, player - 1, RETRO_DEVICE_JOYPAD, 0, key);
g_settings.input.binds[0],
g_settings.input.binds[1],
g_settings.input.binds[2],
g_settings.input.binds[3],
g_settings.input.binds[4],
g_settings.input.binds[5],
g_settings.input.binds[6],
g_settings.input.binds[7],
};
int16_t res = input_input_state_func(binds, player - 1, RETRO_DEVICE_JOYPAD, 0, key);
return PyBool_FromLong(res); return PyBool_FromLong(res);
} }
static PyObject *py_read_input_meta(PyObject *self, PyObject *args) static PyObject *py_read_analog(PyObject *self, PyObject *args)
{ {
(void)self; (void)self;
if (!driver.input_data) if (!driver.input_data)
return PyBool_FromLong(0); return PyBool_FromLong(0);
unsigned key; unsigned player;
if (!PyArg_ParseTuple(args, "I", &key)) unsigned index;
unsigned id;
if (!PyArg_ParseTuple(args, "III", &player, &index, &id))
return NULL; return NULL;
if (key < RARCH_FIRST_META_KEY) if (player > MAX_PLAYERS || player < 1 || index > 1 || id > 1)
return NULL; return NULL;
bool ret = input_key_pressed_func(key); int16_t res = input_input_state_func(py_binds, player - 1, RETRO_DEVICE_ANALOG, index, id);
return PyBool_FromLong(ret); return PyFloat_FromDouble((double)res / 0x7fff);
} }
static PyMethodDef RarchMethods[] = { static PyMethodDef RarchMethods[] = {
{ "read_wram", py_read_wram, METH_VARARGS, "Read WRAM from system." }, { "read_wram", py_read_wram, METH_VARARGS, "Read WRAM from system." },
{ "input", py_read_input, METH_VARARGS, "Read input state from system." }, { "read_vram", py_read_vram, METH_VARARGS, "Read VRAM from system." },
{ "input_meta", py_read_input_meta, METH_VARARGS, "Read RetroArch specific input." }, { "input", py_read_input, METH_VARARGS, "Read input state from system." },
{ "input_analog", py_read_analog, METH_VARARGS, "Read analog input state from system." },
{ NULL, NULL, 0, NULL } { NULL, NULL, 0, NULL }
}; };
#define DECL_ATTR_RETRO(attr) PyObject_SetAttrString(mod, #attr, PyLong_FromLong(RETRO_DEVICE_ID_JOYPAD_##attr)) #define DECL_ATTR_RETRO(attr) PyObject_SetAttrString(mod, #attr, PyLong_FromLong(RETRO_DEVICE_ID_JOYPAD_##attr))
#define DECL_ATTR_RARCH(attr) PyObject_SetAttrString(mod, #attr, PyLong_FromLong(RARCH_##attr))
static void py_set_attrs(PyObject *mod) static void py_set_attrs(PyObject *mod)
{ {
DECL_ATTR_RETRO(B); DECL_ATTR_RETRO(B);
@ -130,32 +153,10 @@ static void py_set_attrs(PyObject *mod)
DECL_ATTR_RETRO(L3); DECL_ATTR_RETRO(L3);
DECL_ATTR_RETRO(R3); DECL_ATTR_RETRO(R3);
DECL_ATTR_RARCH(FAST_FORWARD_KEY); PyObject_SetAttrString(mod, "ANALOG_LEFT", PyLong_FromLong(RETRO_DEVICE_INDEX_ANALOG_LEFT));
DECL_ATTR_RARCH(FAST_FORWARD_HOLD_KEY); PyObject_SetAttrString(mod, "ANALOG_RIGHT", PyLong_FromLong(RETRO_DEVICE_INDEX_ANALOG_RIGHT));
DECL_ATTR_RARCH(LOAD_STATE_KEY); PyObject_SetAttrString(mod, "ANALOG_X", PyLong_FromLong(RETRO_DEVICE_ID_ANALOG_X));
DECL_ATTR_RARCH(SAVE_STATE_KEY); PyObject_SetAttrString(mod, "ANALOG_Y", PyLong_FromLong(RETRO_DEVICE_ID_ANALOG_Y));
DECL_ATTR_RARCH(FULLSCREEN_TOGGLE_KEY);
DECL_ATTR_RARCH(QUIT_KEY);
DECL_ATTR_RARCH(STATE_SLOT_PLUS);
DECL_ATTR_RARCH(STATE_SLOT_MINUS);
DECL_ATTR_RARCH(REWIND);
DECL_ATTR_RARCH(MOVIE_RECORD_TOGGLE);
DECL_ATTR_RARCH(PAUSE_TOGGLE);
DECL_ATTR_RARCH(FRAMEADVANCE);
DECL_ATTR_RARCH(RESET);
DECL_ATTR_RARCH(SHADER_NEXT);
DECL_ATTR_RARCH(SHADER_PREV);
DECL_ATTR_RARCH(CHEAT_INDEX_PLUS);
DECL_ATTR_RARCH(CHEAT_INDEX_MINUS);
DECL_ATTR_RARCH(CHEAT_TOGGLE);
DECL_ATTR_RARCH(SCREENSHOT);
DECL_ATTR_RARCH(DSP_CONFIG);
DECL_ATTR_RARCH(MUTE);
DECL_ATTR_RARCH(NETPLAY_FLIP);
DECL_ATTR_RARCH(SLOWMOTION);
DECL_ATTR_RARCH(ENABLE_HOTKEY);
DECL_ATTR_RARCH(VOLUME_UP);
DECL_ATTR_RARCH(VOLUME_DOWN);
} }
static PyModuleDef RarchModule = { static PyModuleDef RarchModule = {
@ -314,18 +315,18 @@ error:
void py_state_free(py_state_t *handle) void py_state_free(py_state_t *handle)
{ {
if (handle) if (!handle)
{ return;
PyErr_Print();
PyErr_Clear();
Py_CLEAR(handle->inst); PyErr_Print();
Py_CLEAR(handle->dict); PyErr_Clear();
Py_CLEAR(handle->main);
free(handle); Py_CLEAR(handle->inst);
Py_Finalize(); Py_CLEAR(handle->dict);
} Py_CLEAR(handle->main);
free(handle);
Py_Finalize();
} }
float py_state_get(py_state_t *handle, const char *id, float py_state_get(py_state_t *handle, const char *id,