mirror of
https://github.com/libretro/beetle-wswan-libretro.git
synced 2025-03-01 12:38:05 +00:00
Remove more non-wswan code
This commit is contained in:
parent
5bc3830a90
commit
c912cbdffe
31
Makefile
31
Makefile
@ -217,11 +217,6 @@ else
|
||||
FLAGS += -DHAVE__MKDIR
|
||||
endif
|
||||
|
||||
ifeq ($(NEED_THREADING), 1)
|
||||
FLAGS += -DWANT_THREADING
|
||||
THREAD_SOURCES += threads.c
|
||||
endif
|
||||
|
||||
ifeq ($(NEED_CRC32), 1)
|
||||
FLAGS += -DWANT_CRC32
|
||||
LIBRETRO_SOURCES += scrc32.cpp
|
||||
@ -231,32 +226,6 @@ ifeq ($(NEED_DEINTERLACER), 1)
|
||||
FLAGS += -DNEED_DEINTERLACER
|
||||
endif
|
||||
|
||||
ifeq ($(NEED_SCSI_CD), 1)
|
||||
CDROM_SOURCES += $(MEDNAFEN_DIR)/cdrom/scsicd.cpp
|
||||
endif
|
||||
|
||||
ifeq ($(NEED_CD), 1)
|
||||
CDROM_SOURCES += $(MEDNAFEN_DIR)/cdrom/CDAccess.cpp \
|
||||
$(MEDNAFEN_DIR)/cdrom/CDAccess_Image.cpp \
|
||||
$(MEDNAFEN_DIR)/cdrom/CDAccess_CCD.cpp \
|
||||
$(MEDNAFEN_DIR)/cdrom/CDUtility.cpp \
|
||||
$(MEDNAFEN_DIR)/cdrom/lec.cpp \
|
||||
$(MEDNAFEN_DIR)/cdrom/SimpleFIFO.cpp \
|
||||
$(MEDNAFEN_DIR)/cdrom/audioreader.cpp \
|
||||
$(MEDNAFEN_DIR)/cdrom/galois.cpp \
|
||||
$(MEDNAFEN_DIR)/cdrom/recover-raw.cpp \
|
||||
$(MEDNAFEN_DIR)/cdrom/l-ec.cpp \
|
||||
$(MEDNAFEN_DIR)/cdrom/crc32.cpp \
|
||||
$(MEDNAFEN_DIR)/cdrom/cdromif.cpp
|
||||
FLAGS += -DNEED_CD
|
||||
endif
|
||||
|
||||
ifeq ($(NEED_TREMOR), 1)
|
||||
TREMOR_SRC := $(wildcard $(MEDNAFEN_DIR)/tremor/*.c)
|
||||
FLAGS += -DNEED_TREMOR
|
||||
endif
|
||||
|
||||
|
||||
MEDNAFEN_SOURCES := $(MEDNAFEN_DIR)/mednafen.cpp \
|
||||
$(MEDNAFEN_DIR)/error.cpp \
|
||||
$(MEDNAFEN_DIR)/math_ops.cpp \
|
||||
|
@ -56,35 +56,11 @@ endif
|
||||
|
||||
CORE_INCDIR := $(CORE_DIR)
|
||||
|
||||
ifeq ($(NEED_THREADING), 1)
|
||||
FLAGS += -DWANT_THREADING
|
||||
THREAD_SOURCES += $(MEDNAFEN_LIBRETRO_DIR)/threads.c
|
||||
endif
|
||||
|
||||
ifeq ($(NEED_CRC32), 1)
|
||||
FLAGS += -DWANT_CRC32
|
||||
CORE_SOURCES += $(MEDNAFEN_LIBRETRO_DIR)/scrc32.cpp
|
||||
endif
|
||||
|
||||
ifeq ($(NEED_DEINTERLACER), 1)
|
||||
FLAGS += -DNEED_DEINTERLACER
|
||||
endif
|
||||
|
||||
ifeq ($(NEED_SCSI_CD), 1)
|
||||
SCSI_CD_SOURCES := $(MEDNAFEN_DIR)/cdrom/scsicd.cpp
|
||||
endif
|
||||
|
||||
ifeq ($(NEED_CD), 1)
|
||||
CDROM_SOURCES := $(MEDNAFEN_DIR)/cdrom/CDAccess.cpp $(MEDNAFEN_DIR)/cdrom/CDAccess_Image.cpp $(MEDNAFEN_DIR)/cdrom/CDAccess_CCD.cpp $(MEDNAFEN_DIR)/cdrom/CDUtility.cpp $(MEDNAFEN_DIR)/cdrom/lec.cpp $(MEDNAFEN_DIR)/cdrom/SimpleFIFO.cpp $(MEDNAFEN_DIR)/cdrom/audioreader.cpp $(MEDNAFEN_DIR)/cdrom/galois.cpp $(MEDNAFEN_DIR)/cdrom/recover-raw.cpp $(MEDNAFEN_DIR)/cdrom/l-ec.cpp $(MEDNAFEN_DIR)/cdrom/cdromif.cpp $(MEDNAFEN_DIR)/cdrom/crc32.cpp
|
||||
FLAGS += -DNEED_CD
|
||||
endif
|
||||
|
||||
ifeq ($(NEED_TREMOR), 1)
|
||||
TREMOR_SRC := $(wildcard $(MEDNAFEN_DIR)/tremor/*.c)
|
||||
FLAGS += -DNEED_TREMOR
|
||||
endif
|
||||
|
||||
|
||||
MEDNAFEN_SOURCES := $(MEDNAFEN_DIR)/mednafen.cpp \
|
||||
$(MEDNAFEN_DIR)/error.cpp \
|
||||
$(MEDNAFEN_DIR)/math_ops.cpp \
|
||||
@ -106,11 +82,11 @@ MEDNAFEN_SOURCES := $(MEDNAFEN_DIR)/mednafen.cpp \
|
||||
$(MEDNAFEN_DIR)/md5.cpp
|
||||
|
||||
|
||||
LIBRETRO_SOURCES := $(MEDNAFEN_LIBRETRO_DIR)/libretro.cpp $(THREAD_STUBS)
|
||||
LIBRETRO_SOURCES := $(MEDNAFEN_LIBRETRO_DIR)/libretro.cpp
|
||||
|
||||
SOURCES_C := $(TREMOR_SRC) $(LIBRETRO_SOURCES_C) $(MEDNAFEN_DIR)/trio/trio.c $(MEDNAFEN_DIR)/trio/triostr.c $(THREAD_SOURCES)
|
||||
SOURCES_C := $(TREMOR_SRC) $(LIBRETRO_SOURCES_C) $(MEDNAFEN_DIR)/trio/trio.c $(MEDNAFEN_DIR)/trio/triostr.c
|
||||
|
||||
LOCAL_SRC_FILES += $(LIBRETRO_SOURCES) $(CORE_SOURCES) $(MEDNAFEN_SOURCES) $(CDROM_SOURCES) $(SCSI_CD_SOURCES) $(HW_CPU_SOURCES) $(HW_MISC_SOURCES) $(HW_SOUND_SOURCES) $(HW_VIDEO_SOURCES) $(SOURCES_C) $(CORE_CD_SOURCES)
|
||||
LOCAL_SRC_FILES += $(LIBRETRO_SOURCES) $(CORE_SOURCES) $(MEDNAFEN_SOURCES) $(HW_CPU_SOURCES) $(HW_MISC_SOURCES) $(HW_SOUND_SOURCES) $(HW_VIDEO_SOURCES) $(SOURCES_C) $(CORE_CD_SOURCES)
|
||||
|
||||
WARNINGS := -Wall \
|
||||
-Wno-sign-compare \
|
||||
|
341
libretro.cpp
341
libretro.cpp
@ -50,22 +50,6 @@ static void set_basename(const char *path)
|
||||
retro_base_name = retro_base_name.substr(0, retro_base_name.find_last_of('.'));
|
||||
}
|
||||
|
||||
#if defined(WANT_LYNX_EMU)
|
||||
#define MEDNAFEN_CORE_NAME_MODULE "lynx"
|
||||
#define MEDNAFEN_CORE_NAME "Mednafen Lynx"
|
||||
#define MEDNAFEN_CORE_VERSION "v0.9.32"
|
||||
#define MEDNAFEN_CORE_EXTENSIONS "lnx"
|
||||
#define MEDNAFEN_CORE_TIMING_FPS 75
|
||||
#define MEDNAFEN_CORE_GEOMETRY_BASE_W 160
|
||||
#define MEDNAFEN_CORE_GEOMETRY_BASE_H 102
|
||||
#define MEDNAFEN_CORE_GEOMETRY_MAX_W 160
|
||||
#define MEDNAFEN_CORE_GEOMETRY_MAX_H 102
|
||||
#define MEDNAFEN_CORE_GEOMETRY_ASPECT_RATIO (4.0 / 3.0)
|
||||
#define FB_WIDTH 160
|
||||
#define FB_HEIGHT 102
|
||||
static bool is_pal = false;
|
||||
|
||||
#elif defined(WANT_WSWAN_EMU)
|
||||
#define MEDNAFEN_CORE_NAME_MODULE "wswan"
|
||||
#define MEDNAFEN_CORE_NAME "Mednafen WonderSwan"
|
||||
#define MEDNAFEN_CORE_VERSION "v0.9.35.1"
|
||||
@ -79,48 +63,6 @@ static bool is_pal = false;
|
||||
#define FB_WIDTH 224
|
||||
#define FB_HEIGHT 144
|
||||
|
||||
#elif defined(WANT_GBA_EMU)
|
||||
#define MEDNAFEN_CORE_NAME_MODULE "gba"
|
||||
#define MEDNAFEN_CORE_NAME "Mednafen VBA-M"
|
||||
#define MEDNAFEN_CORE_VERSION "v0.9.33.3"
|
||||
#define MEDNAFEN_CORE_EXTENSIONS "gba|agb|bin"
|
||||
#define MEDNAFEN_CORE_TIMING_FPS 59.73
|
||||
#define MEDNAFEN_CORE_GEOMETRY_BASE_W (game->nominal_width)
|
||||
#define MEDNAFEN_CORE_GEOMETRY_BASE_H (game->nominal_height)
|
||||
#define MEDNAFEN_CORE_GEOMETRY_MAX_W 240
|
||||
#define MEDNAFEN_CORE_GEOMETRY_MAX_H 160
|
||||
#define MEDNAFEN_CORE_GEOMETRY_ASPECT_RATIO (4.0 / 3.0)
|
||||
#define FB_WIDTH 240
|
||||
#define FB_HEIGHT 160
|
||||
|
||||
#elif defined(WANT_SNES_EMU)
|
||||
#define MEDNAFEN_CORE_NAME_MODULE "snes"
|
||||
#define MEDNAFEN_CORE_NAME "Mednafen bSNES"
|
||||
#define MEDNAFEN_CORE_VERSION "v0.9.26"
|
||||
#define MEDNAFEN_CORE_EXTENSIONS "smc|fig|bs|st|sfc"
|
||||
#define MEDNAFEN_CORE_TIMING_FPS 60.10
|
||||
#define MEDNAFEN_CORE_GEOMETRY_BASE_W (game->nominal_width)
|
||||
#define MEDNAFEN_CORE_GEOMETRY_BASE_H (game->nominal_height)
|
||||
#define MEDNAFEN_CORE_GEOMETRY_MAX_W 512
|
||||
#define MEDNAFEN_CORE_GEOMETRY_MAX_H 512
|
||||
#define MEDNAFEN_CORE_GEOMETRY_ASPECT_RATIO (4.0 / 3.0)
|
||||
#define FB_WIDTH 512
|
||||
#define FB_HEIGHT 512
|
||||
|
||||
#elif defined(WANT_PCFX_EMU)
|
||||
#define MEDNAFEN_CORE_NAME_MODULE "pcfx"
|
||||
#define MEDNAFEN_CORE_NAME "Mednafen PC-FX"
|
||||
#define MEDNAFEN_CORE_VERSION "v0.9.33.3"
|
||||
#define MEDNAFEN_CORE_EXTENSIONS "cue|ccd"
|
||||
#define MEDNAFEN_CORE_TIMING_FPS 59.94
|
||||
#define MEDNAFEN_CORE_GEOMETRY_BASE_W (game->nominal_width)
|
||||
#define MEDNAFEN_CORE_GEOMETRY_BASE_H (game->nominal_height)
|
||||
#define MEDNAFEN_CORE_GEOMETRY_MAX_W 341
|
||||
#define MEDNAFEN_CORE_GEOMETRY_MAX_H 480
|
||||
#define MEDNAFEN_CORE_GEOMETRY_ASPECT_RATIO (4.0 / 3.0)
|
||||
#define FB_WIDTH 344
|
||||
#define FB_HEIGHT 480
|
||||
#endif
|
||||
|
||||
|
||||
#define FB_MAX_HEIGHT FB_HEIGHT
|
||||
@ -228,56 +170,12 @@ static void check_variables(void)
|
||||
{
|
||||
struct retro_variable var = {0};
|
||||
|
||||
#if defined (WANT_GBA_EMU)
|
||||
var.key = "gba_hle";
|
||||
|
||||
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
|
||||
{
|
||||
if (strcmp(var.value, "enabled") == 0)
|
||||
setting_gba_hle = 1;
|
||||
else if (strcmp(var.value, "disabled") == 0)
|
||||
setting_gba_hle = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(WANT_LYNX_EMU)
|
||||
|
||||
#define MAX_PLAYERS 1
|
||||
#define MAX_BUTTONS 9
|
||||
static uint8_t input_buf[MAX_PLAYERS][2] = {0};
|
||||
|
||||
#elif defined(WANT_WSWAN_EMU)
|
||||
|
||||
#define MAX_PLAYERS 1
|
||||
#define MAX_BUTTONS 11
|
||||
static uint16_t input_buf;
|
||||
|
||||
#elif defined(WANT_GBA_EMU)
|
||||
|
||||
#define MAX_PLAYERS 1
|
||||
#define MAX_BUTTONS 11
|
||||
static uint16_t input_buf;
|
||||
|
||||
#elif defined(WANT_SNES_EMU)
|
||||
|
||||
#define MAX_PLAYERS 5
|
||||
#define MAX_BUTTONS 14
|
||||
static uint8_t input_buf[MAX_PLAYERS][2];
|
||||
|
||||
#elif defined(WANT_PCFX_EMU)
|
||||
|
||||
#define MAX_PLAYERS 2
|
||||
#define MAX_BUTTONS 12
|
||||
static uint16_t input_buf[MAX_PLAYERS];
|
||||
|
||||
#else
|
||||
|
||||
#define MAX_PLAYERS 1
|
||||
#define MAX_BUTTONS 7
|
||||
|
||||
static uint16_t input_buf[1];
|
||||
#endif
|
||||
|
||||
static void hookup_ports(bool force)
|
||||
{
|
||||
@ -286,21 +184,7 @@ static void hookup_ports(bool force)
|
||||
if (initial_ports_hookup && !force)
|
||||
return;
|
||||
|
||||
#if defined(WANT_LYNX_EMU)
|
||||
currgame->SetInput(0, "gamepad", &input_buf);
|
||||
#elif defined(WANT_WSWAN_EMU)
|
||||
currgame->SetInput(0, "gamepad", &input_buf);
|
||||
#elif defined(WANT_GBA_EMU)
|
||||
// Possible endian bug ...
|
||||
currgame->SetInput(0, "gamepad", &input_buf);
|
||||
#elif defined(WANT_SNES_EMU)
|
||||
// Possible endian bug ...
|
||||
for (unsigned i = 0; i < MAX_PLAYERS; i++)
|
||||
currgame->SetInput(i, "gamepad", &input_buf[i][0]);
|
||||
#else
|
||||
// Possible endian bug ...
|
||||
currgame->SetInput(0, "gamepad", &input_buf[0]);
|
||||
#endif
|
||||
|
||||
initial_ports_hookup = true;
|
||||
}
|
||||
@ -354,30 +238,6 @@ void retro_unload_game()
|
||||
static void update_input(void)
|
||||
{
|
||||
MDFNGI *currgame = (MDFNGI*)game;
|
||||
#if defined(WANT_LYNX_EMU)
|
||||
static unsigned map[] = {
|
||||
RETRO_DEVICE_ID_JOYPAD_A,
|
||||
RETRO_DEVICE_ID_JOYPAD_B,
|
||||
RETRO_DEVICE_ID_JOYPAD_L,
|
||||
RETRO_DEVICE_ID_JOYPAD_R,
|
||||
RETRO_DEVICE_ID_JOYPAD_LEFT,
|
||||
RETRO_DEVICE_ID_JOYPAD_RIGHT,
|
||||
RETRO_DEVICE_ID_JOYPAD_UP,
|
||||
RETRO_DEVICE_ID_JOYPAD_DOWN,
|
||||
RETRO_DEVICE_ID_JOYPAD_START,
|
||||
};
|
||||
|
||||
for (unsigned j = 0; j < MAX_PLAYERS; j++)
|
||||
{
|
||||
uint16_t input_state = 0;
|
||||
for (unsigned i = 0; i < MAX_BUTTONS; i++)
|
||||
input_state |= input_state_cb(j, RETRO_DEVICE_JOYPAD, 0, map[i]) ? (1 << i) : 0;
|
||||
|
||||
// Input data must be little endian.
|
||||
input_buf[j][0] = (input_state >> 0) & 0xff;
|
||||
input_buf[j][1] = (input_state >> 8) & 0xff;
|
||||
}
|
||||
#elif defined(WANT_WSWAN_EMU)
|
||||
input_buf = 0;
|
||||
|
||||
static unsigned map[] = {
|
||||
@ -407,123 +267,6 @@ static void update_input(void)
|
||||
input_buf = u.b[0] | u.b[1] << 8;
|
||||
#endif
|
||||
|
||||
#elif defined(WANT_GBA_EMU)
|
||||
input_buf = 0;
|
||||
static unsigned map[] = {
|
||||
RETRO_DEVICE_ID_JOYPAD_A, //A button
|
||||
RETRO_DEVICE_ID_JOYPAD_B, //B button
|
||||
RETRO_DEVICE_ID_JOYPAD_SELECT,
|
||||
RETRO_DEVICE_ID_JOYPAD_START,
|
||||
RETRO_DEVICE_ID_JOYPAD_RIGHT,
|
||||
RETRO_DEVICE_ID_JOYPAD_LEFT,
|
||||
RETRO_DEVICE_ID_JOYPAD_UP,
|
||||
RETRO_DEVICE_ID_JOYPAD_DOWN,
|
||||
RETRO_DEVICE_ID_JOYPAD_R,
|
||||
RETRO_DEVICE_ID_JOYPAD_L,
|
||||
};
|
||||
|
||||
for (unsigned i = 0; i < MAX_BUTTONS; i++)
|
||||
input_buf |= map[i] != -1u &&
|
||||
input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, map[i]) ? (1 << i) : 0;
|
||||
|
||||
#ifdef MSB_FIRST
|
||||
union {
|
||||
uint8_t b[2];
|
||||
uint16_t s;
|
||||
} u;
|
||||
u.s = input_buf;
|
||||
input_buf = u.b[0] | u.b[1] << 8;
|
||||
#endif
|
||||
|
||||
#elif defined(WANT_SNES_EMU)
|
||||
|
||||
static unsigned map[] = {
|
||||
RETRO_DEVICE_ID_JOYPAD_B,
|
||||
RETRO_DEVICE_ID_JOYPAD_Y,
|
||||
RETRO_DEVICE_ID_JOYPAD_SELECT,
|
||||
RETRO_DEVICE_ID_JOYPAD_START,
|
||||
RETRO_DEVICE_ID_JOYPAD_UP,
|
||||
RETRO_DEVICE_ID_JOYPAD_DOWN,
|
||||
RETRO_DEVICE_ID_JOYPAD_LEFT,
|
||||
RETRO_DEVICE_ID_JOYPAD_RIGHT,
|
||||
RETRO_DEVICE_ID_JOYPAD_A,
|
||||
RETRO_DEVICE_ID_JOYPAD_X,
|
||||
RETRO_DEVICE_ID_JOYPAD_L,
|
||||
RETRO_DEVICE_ID_JOYPAD_R,
|
||||
};
|
||||
|
||||
for (unsigned j = 0; j < MAX_PLAYERS; j++)
|
||||
{
|
||||
uint16_t input_state = 0;
|
||||
for (unsigned i = 0; i < MAX_BUTTONS; i++)
|
||||
input_state |= input_state_cb(j, RETRO_DEVICE_JOYPAD, 0, map[i]) ? (1 << i) : 0;
|
||||
|
||||
#ifdef MSB_FIRST
|
||||
union {
|
||||
uint8_t b[2];
|
||||
uint16_t s;
|
||||
} u;
|
||||
u.s = input_buf[j];
|
||||
input_buf[j] = u.b[0] | u.b[1] << 8;
|
||||
#else
|
||||
input_buf[j][0] = (input_state >> 0) & 0xff;
|
||||
input_buf[j][1] = (input_state >> 8) & 0xff;
|
||||
#endif
|
||||
}
|
||||
|
||||
#elif defined(WANT_PCFX_EMU)
|
||||
input_buf[0] = input_buf[1] = 0;
|
||||
static unsigned map[] = {
|
||||
RETRO_DEVICE_ID_JOYPAD_A,
|
||||
RETRO_DEVICE_ID_JOYPAD_B,
|
||||
RETRO_DEVICE_ID_JOYPAD_X,
|
||||
RETRO_DEVICE_ID_JOYPAD_Y,
|
||||
RETRO_DEVICE_ID_JOYPAD_L,
|
||||
RETRO_DEVICE_ID_JOYPAD_R,
|
||||
RETRO_DEVICE_ID_JOYPAD_SELECT,
|
||||
RETRO_DEVICE_ID_JOYPAD_START,
|
||||
RETRO_DEVICE_ID_JOYPAD_UP,
|
||||
RETRO_DEVICE_ID_JOYPAD_RIGHT,
|
||||
RETRO_DEVICE_ID_JOYPAD_DOWN,
|
||||
RETRO_DEVICE_ID_JOYPAD_LEFT,
|
||||
};
|
||||
|
||||
for (unsigned j = 0; j < MAX_PLAYERS; j++)
|
||||
{
|
||||
for (unsigned i = 0; i < MAX_BUTTONS; i++)
|
||||
input_buf[j] |= map[i] != -1u &&
|
||||
input_state_cb(j, RETRO_DEVICE_JOYPAD, 0, map[i]) ? (1 << i) : 0;
|
||||
|
||||
#ifdef MSB_FIRST
|
||||
union {
|
||||
uint8_t b[2];
|
||||
uint16_t s;
|
||||
} u;
|
||||
u.s = input_buf[j];
|
||||
input_buf[j] = u.b[0] | u.b[1] << 8;
|
||||
#endif
|
||||
|
||||
}
|
||||
#else
|
||||
input_buf[0] = 0;
|
||||
static unsigned map[] = {
|
||||
RETRO_DEVICE_ID_JOYPAD_UP,
|
||||
RETRO_DEVICE_ID_JOYPAD_DOWN,
|
||||
RETRO_DEVICE_ID_JOYPAD_LEFT,
|
||||
RETRO_DEVICE_ID_JOYPAD_RIGHT,
|
||||
RETRO_DEVICE_ID_JOYPAD_A, //A button
|
||||
RETRO_DEVICE_ID_JOYPAD_B, //B button
|
||||
RETRO_DEVICE_ID_JOYPAD_START, //Option button
|
||||
};
|
||||
|
||||
for (unsigned j = 0; j < MAX_PLAYERS; j++)
|
||||
{
|
||||
for (unsigned i = 0; i < MAX_BUTTONS; i++)
|
||||
input_buf[j] |= map[i] != -1u &&
|
||||
input_state_cb(j, RETRO_DEVICE_JOYPAD, 0, map[i]) ? (1 << i) : 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
static uint64_t video_frames, audio_frames;
|
||||
@ -643,50 +386,11 @@ unsigned retro_api_version(void)
|
||||
|
||||
void retro_set_controller_port_device(unsigned in_port, unsigned device)
|
||||
{
|
||||
MDFNGI *currgame = (MDFNGI*)game;
|
||||
|
||||
if (!currgame)
|
||||
return;
|
||||
|
||||
#if defined(WANT_PCFX_EMU)
|
||||
switch(device)
|
||||
{
|
||||
case RETRO_DEVICE_JOYPAD:
|
||||
if (currgame->SetInput)
|
||||
currgame->SetInput(in_port, "gamepad", &input_buf[in_port]);
|
||||
break;
|
||||
case RETRO_DEVICE_MOUSE:
|
||||
if (currgame->SetInput)
|
||||
currgame->SetInput(in_port, "mouse", &input_buf[in_port]);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void retro_set_environment(retro_environment_t cb)
|
||||
{
|
||||
environ_cb = cb;
|
||||
|
||||
#if defined(WANT_PCFX_EMU)
|
||||
static const struct retro_controller_description pads[] = {
|
||||
{ "PCFX Joypad", RETRO_DEVICE_JOYPAD },
|
||||
{ "Mouse", RETRO_DEVICE_MOUSE },
|
||||
};
|
||||
|
||||
static const struct retro_controller_info ports[] = {
|
||||
{ pads, 2 },
|
||||
{ pads, 2 },
|
||||
{ 0 },
|
||||
};
|
||||
|
||||
environ_cb(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports);
|
||||
#elif defined(WANT_GBA_EMU)
|
||||
static const struct retro_variable vars[] = {
|
||||
{ "gba_hle", "HLE bios emulation; enabled|disabled" },
|
||||
{ NULL, NULL },
|
||||
};
|
||||
cb(RETRO_ENVIRONMENT_SET_VARIABLES, (void*)vars);
|
||||
#endif
|
||||
}
|
||||
|
||||
void retro_set_audio_sample(retro_audio_sample_t cb)
|
||||
@ -854,48 +558,3 @@ void MDFND_Sleep(unsigned int time)
|
||||
{
|
||||
retro_sleep(time);
|
||||
}
|
||||
|
||||
#ifdef WANT_THREADING
|
||||
MDFN_Thread *MDFND_CreateThread(int (*fn)(void *), void *data)
|
||||
{
|
||||
return (MDFN_Thread*)sthread_create((void (*)(void*))fn, data);
|
||||
}
|
||||
|
||||
void MDFND_WaitThread(MDFN_Thread *thr, int *val)
|
||||
{
|
||||
sthread_join((sthread_t*)thr);
|
||||
|
||||
if (val)
|
||||
{
|
||||
*val = 0;
|
||||
fprintf(stderr, "WaitThread relies on return value.\n");
|
||||
}
|
||||
}
|
||||
|
||||
void MDFND_KillThread(MDFN_Thread *)
|
||||
{
|
||||
fprintf(stderr, "Killing a thread is a BAD IDEA!\n");
|
||||
}
|
||||
|
||||
MDFN_Mutex *MDFND_CreateMutex()
|
||||
{
|
||||
return (MDFN_Mutex*)slock_new();
|
||||
}
|
||||
|
||||
void MDFND_DestroyMutex(MDFN_Mutex *lock)
|
||||
{
|
||||
slock_free((slock_t*)lock);
|
||||
}
|
||||
|
||||
int MDFND_LockMutex(MDFN_Mutex *lock)
|
||||
{
|
||||
slock_lock((slock_t*)lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int MDFND_UnlockMutex(MDFN_Mutex *lock)
|
||||
{
|
||||
slock_unlock((slock_t*)lock);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
@ -31,11 +31,6 @@
|
||||
#include "file.h"
|
||||
#include "FileWrapper.h"
|
||||
|
||||
#ifdef NEED_CD
|
||||
#include "cdrom/cdromif.h"
|
||||
#include "cdrom/CDUtility.h"
|
||||
#endif
|
||||
|
||||
#include "mempatcher.h"
|
||||
#include "md5.h"
|
||||
#include "clamp.h"
|
||||
@ -44,43 +39,8 @@
|
||||
#include "msvc_compat.h"
|
||||
#endif
|
||||
|
||||
MDFNGI *MDFNGameInfo = NULL;
|
||||
|
||||
#if defined(WANT_NES_EMU)
|
||||
extern MDFNGI EmulatedNES;
|
||||
#define MDFNGI_CORE &EmulatedNES
|
||||
#elif defined WANT_SNES_EMU
|
||||
extern MDFNGI EmulatedSNES;
|
||||
#define MDFNGI_CORE &EmulatedSNES
|
||||
extern MDFNGI EmulatedGB;
|
||||
#elif defined WANT_GB_EMU
|
||||
#define MDFNGI_CORE &EmulatedGB
|
||||
#elif defined WANT_GBA_EMU
|
||||
extern MDFNGI EmulatedGBA;
|
||||
#define MDFNGI_CORE &EmulatedGBA
|
||||
#elif defined WANT_PCE_EMU
|
||||
extern MDFNGI EmulatedPCE;
|
||||
#define MDFNGI_CORE &EmulatedPCE
|
||||
#elif defined WANT_LYNX_EMU
|
||||
extern MDFNGI EmulatedLynx;
|
||||
#define MDFNGI_CORE &EmulatedLynx
|
||||
#elif defined WANT_MD_EMU
|
||||
extern MDFNGI EmulatedMD;
|
||||
#define MDFNGI_CORE &EmulatedMD
|
||||
#elif defined WANT_PCFX_EMU
|
||||
extern MDFNGI EmulatedPCFX;
|
||||
#define MDFNGI_CORE &EmulatedPCFX
|
||||
#elif defined WANT_WSWAN_EMU
|
||||
extern MDFNGI EmulatedWSwan;
|
||||
#define MDFNGI_CORE &EmulatedWSwan
|
||||
#elif defined WANT_SMS_EMU
|
||||
extern MDFNGI EmulatedSMS;
|
||||
#define MDFNGI_CORE &EmulatedSMS
|
||||
#elif defined(WANT_SMS_EMU) && defined(WANT_GG_EMU)
|
||||
extern MDFNGI EmulatedGG;
|
||||
#define MDFNGI_CORE &EmulatedGG
|
||||
#endif
|
||||
|
||||
MDFNGI *MDFNGameInfo = &EmulatedWSwan;
|
||||
|
||||
/* forward declarations */
|
||||
extern void MDFND_DispMessage(unsigned char *str);
|
||||
@ -103,171 +63,11 @@ void MDFN_ResetMessages(void)
|
||||
}
|
||||
|
||||
|
||||
#ifdef NEED_CD
|
||||
static void ReadM3U(std::vector<std::string> &file_list, std::string path, unsigned depth = 0)
|
||||
{
|
||||
std::vector<std::string> ret;
|
||||
FileWrapper m3u_file(path.c_str(), FileWrapper::MODE_READ, _("M3U CD Set"));
|
||||
std::string dir_path;
|
||||
char linebuf[2048];
|
||||
|
||||
MDFN_GetFilePathComponents(path, &dir_path);
|
||||
|
||||
while(m3u_file.get_line(linebuf, sizeof(linebuf)))
|
||||
{
|
||||
std::string efp;
|
||||
|
||||
if(linebuf[0] == '#') continue;
|
||||
MDFN_rtrim(linebuf);
|
||||
if(linebuf[0] == 0) continue;
|
||||
|
||||
efp = MDFN_EvalFIP(dir_path, std::string(linebuf));
|
||||
|
||||
if(efp.size() >= 4 && efp.substr(efp.size() - 4) == ".m3u")
|
||||
{
|
||||
if(efp == path)
|
||||
throw(MDFN_Error(0, _("M3U at \"%s\" references self."), efp.c_str()));
|
||||
|
||||
if(depth == 99)
|
||||
throw(MDFN_Error(0, _("M3U load recursion too deep!")));
|
||||
|
||||
ReadM3U(file_list, efp, depth++);
|
||||
}
|
||||
else
|
||||
file_list.push_back(efp);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef NEED_CD
|
||||
static std::vector<CDIF *> CDInterfaces; // FIXME: Cleanup on error out.
|
||||
#endif
|
||||
// TODO: LoadCommon()
|
||||
|
||||
MDFNGI *MDFNI_LoadCD(const char *force_module, const char *devicename)
|
||||
{
|
||||
uint8 LayoutMD5[16];
|
||||
|
||||
MDFN_printf(_("Loading %s...\n\n"), devicename ? devicename : _("PHYSICAL CD"));
|
||||
|
||||
try
|
||||
{
|
||||
if(devicename && strlen(devicename) > 4 && !strcasecmp(devicename + strlen(devicename) - 4, ".m3u"))
|
||||
{
|
||||
std::vector<std::string> file_list;
|
||||
|
||||
ReadM3U(file_list, devicename);
|
||||
|
||||
for(unsigned i = 0; i < file_list.size(); i++)
|
||||
{
|
||||
CDInterfaces.push_back(CDIF_Open(file_list[i].c_str(), false, false /* cdimage_memcache */));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CDInterfaces.push_back(CDIF_Open(devicename, false, false /* cdimage_memcache */));
|
||||
}
|
||||
}
|
||||
catch(std::exception &e)
|
||||
{
|
||||
MDFND_PrintError(e.what());
|
||||
MDFN_PrintError(_("Error opening CD."));
|
||||
return(0);
|
||||
}
|
||||
|
||||
//
|
||||
// Print out a track list for all discs.
|
||||
//
|
||||
MDFN_indent(1);
|
||||
for(unsigned i = 0; i < CDInterfaces.size(); i++)
|
||||
{
|
||||
CDUtility::TOC toc;
|
||||
|
||||
CDInterfaces[i]->ReadTOC(&toc);
|
||||
|
||||
MDFN_printf(_("CD %d Layout:\n"), i + 1);
|
||||
MDFN_indent(1);
|
||||
|
||||
for(int32 track = toc.first_track; track <= toc.last_track; track++)
|
||||
{
|
||||
MDFN_printf(_("Track %2d, LBA: %6d %s\n"), track, toc.tracks[track].lba, (toc.tracks[track].control & 0x4) ? "DATA" : "AUDIO");
|
||||
}
|
||||
|
||||
MDFN_printf("Leadout: %6d\n", toc.tracks[100].lba);
|
||||
MDFN_indent(-1);
|
||||
MDFN_printf("\n");
|
||||
}
|
||||
MDFN_indent(-1);
|
||||
|
||||
// Calculate layout MD5. The system emulation LoadCD() code is free to ignore this value and calculate
|
||||
// its own, or to use it to look up a game in its database.
|
||||
{
|
||||
md5_context layout_md5;
|
||||
|
||||
layout_md5.starts();
|
||||
|
||||
for(unsigned i = 0; i < CDInterfaces.size(); i++)
|
||||
{
|
||||
CD_TOC toc;
|
||||
|
||||
CDInterfaces[i]->ReadTOC(&toc);
|
||||
|
||||
layout_md5.update_u32_as_lsb(toc.first_track);
|
||||
layout_md5.update_u32_as_lsb(toc.last_track);
|
||||
layout_md5.update_u32_as_lsb(toc.tracks[100].lba);
|
||||
|
||||
for(uint32 track = toc.first_track; track <= toc.last_track; track++)
|
||||
{
|
||||
layout_md5.update_u32_as_lsb(toc.tracks[track].lba);
|
||||
layout_md5.update_u32_as_lsb(toc.tracks[track].control & 0x4);
|
||||
}
|
||||
}
|
||||
|
||||
layout_md5.finish(LayoutMD5);
|
||||
}
|
||||
|
||||
// This if statement will be true if force_module references a system without CDROM support.
|
||||
if(!MDFNGameInfo->LoadCD)
|
||||
{
|
||||
MDFN_PrintError(_("Specified system \"%s\" doesn't support CDs!"), force_module);
|
||||
return(0);
|
||||
}
|
||||
|
||||
MDFN_printf(_("Using module: %s(%s)\n\n"), MDFNGameInfo->shortname, MDFNGameInfo->fullname);
|
||||
|
||||
// TODO: include module name in hash
|
||||
memcpy(MDFNGameInfo->MD5, LayoutMD5, 16);
|
||||
|
||||
if(!(MDFNGameInfo->LoadCD(&CDInterfaces)))
|
||||
{
|
||||
for(unsigned i = 0; i < CDInterfaces.size(); i++)
|
||||
delete CDInterfaces[i];
|
||||
CDInterfaces.clear();
|
||||
|
||||
MDFNGameInfo = NULL;
|
||||
return(0);
|
||||
}
|
||||
|
||||
//MDFNI_SetLayerEnableMask(~0ULL);
|
||||
|
||||
MDFN_ResetMessages(); // Save state, status messages, etc.
|
||||
|
||||
MDFN_LoadGameCheats(NULL);
|
||||
MDFNMP_InstallReadPatches();
|
||||
|
||||
return(MDFNGameInfo);
|
||||
}
|
||||
#endif
|
||||
|
||||
MDFNGI *MDFNI_LoadGame(const char *force_module, const char *name)
|
||||
{
|
||||
MDFNFILE GameFile;
|
||||
std::vector<FileExtensionSpecStruct> valid_iae;
|
||||
MDFNGameInfo = MDFNGI_CORE;
|
||||
|
||||
#ifdef NEED_CD
|
||||
if(strlen(name) > 4 && (!strcasecmp(name + strlen(name) - 4, ".cue") || !strcasecmp(name + strlen(name) - 4, ".ccd") || !strcasecmp(name + strlen(name) - 4, ".toc") || !strcasecmp(name + strlen(name) - 4, ".m3u")))
|
||||
return(MDFNI_LoadCD(force_module, name));
|
||||
#endif
|
||||
MDFNGameInfo = &EmulatedWSwan;
|
||||
|
||||
MDFN_printf(_("Loading %s...\n"),name);
|
||||
|
||||
@ -348,21 +148,11 @@ void MDFNI_CloseGame(void)
|
||||
MDFNMP_Kill();
|
||||
|
||||
MDFNGameInfo = NULL;
|
||||
|
||||
#ifdef NEED_CD
|
||||
for(unsigned i = 0; i < CDInterfaces.size(); i++)
|
||||
delete CDInterfaces[i];
|
||||
CDInterfaces.clear();
|
||||
#endif
|
||||
}
|
||||
|
||||
bool MDFNI_InitializeModule(void)
|
||||
{
|
||||
|
||||
#ifdef NEED_CD
|
||||
CDUtility::CDUtility_Init();
|
||||
#endif
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
@ -21,10 +21,6 @@
|
||||
#include <string>
|
||||
#include "settings.h"
|
||||
|
||||
#if defined(WANT_GBA_EMU)
|
||||
uint32_t setting_gba_hle = 1;
|
||||
#endif
|
||||
|
||||
bool MDFN_SaveSettings(const char *path)
|
||||
{
|
||||
return(1);
|
||||
@ -32,18 +28,6 @@ bool MDFN_SaveSettings(const char *path)
|
||||
|
||||
uint64 MDFN_GetSettingUI(const char *name)
|
||||
{
|
||||
#if defined(WANT_PCFX_EMU)
|
||||
if (!strcmp("pcfx.cdspeed", name))
|
||||
return 2;
|
||||
if (!strcmp("pcfx.slend", name))
|
||||
return 239;
|
||||
if (!strcmp("pcfx.slstart", name))
|
||||
return 0;
|
||||
if (!strcmp("pcfx.high_dotclock_width", name))
|
||||
return 1024; /* TODO - make configurable */
|
||||
if (!strcmp("pcfx.resamp_quality", name))
|
||||
return 3; /* TODO - make configurable */
|
||||
#elif defined(WANT_WSWAN_EMU)
|
||||
if (!strcmp("wswan.ocmultiplier", name))
|
||||
return 1;
|
||||
if (!strcmp("wswan.bday", name))
|
||||
@ -56,7 +40,6 @@ uint64 MDFN_GetSettingUI(const char *name)
|
||||
return 4;
|
||||
if (!strcmp("wswan.slend", name))
|
||||
return 235;
|
||||
#endif
|
||||
|
||||
fprintf(stderr, "unhandled setting UI: %s\n", name);
|
||||
return 0;
|
||||
@ -64,30 +47,18 @@ uint64 MDFN_GetSettingUI(const char *name)
|
||||
|
||||
int64 MDFN_GetSettingI(const char *name)
|
||||
{
|
||||
#if defined(WANT_PCFX_EMU)
|
||||
if (!strcmp("pcfx.cpu_emulation", name))
|
||||
return 2;
|
||||
#elif defined(WANT_WSWAN_EMU)
|
||||
if (!strcmp("wswan.sex", name))
|
||||
return 0;
|
||||
if (!strcmp("wswan.blood", name))
|
||||
return 0;
|
||||
#endif
|
||||
fprintf(stderr, "unhandled setting I: %s\n", name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
double MDFN_GetSettingF(const char *name)
|
||||
{
|
||||
#if defined(WANT_PCFX_EMU)
|
||||
if (!strcmp("pcfx.resamp_rate_error", name))
|
||||
return 0.0000009;
|
||||
if (!strcmp("pcfx.mouse_sensitivity", name))
|
||||
return 1.25; /* TODO - make configurable */
|
||||
#elif defined(WANT_WSWAN_EMU)
|
||||
if (!strcmp("wswan.mouse_sensitivity", name))
|
||||
return 0.50;
|
||||
#endif
|
||||
|
||||
fprintf(stderr, "unhandled setting F: %s\n", name);
|
||||
return 0;
|
||||
@ -100,40 +71,12 @@ bool MDFN_GetSettingB(const char *name)
|
||||
/* LIBRETRO */
|
||||
if (!strcmp("libretro.cd_load_into_ram", name))
|
||||
return 0;
|
||||
#if defined(WANT_PCFX_EMU)
|
||||
if (!strcmp("pcfx.disable_softreset", name))
|
||||
return 0; /* TODO - make configurable */
|
||||
if (!strcmp("pcfx.disable_softreset", name))
|
||||
return 0; /* TODO - make configurable */
|
||||
if (!strcmp("pcfx.input.port1.multitap", name))
|
||||
return 0; /* TODO - make configurable */
|
||||
if (!strcmp("pcfx.input.port2.multitap", name))
|
||||
return 0; /* TODO - make configurable */
|
||||
if (!strcmp("pcfx.nospritelimit", name))
|
||||
return 0; /* TODO - make configurable */
|
||||
if (!strcmp("pcfx.adpcm.suppress_channel_reset_clicks", name))
|
||||
return 0; /* TODO - make configurable */
|
||||
if (!strcmp("pcfx.disable_bram", name))
|
||||
return 0; /* TODO - make configurable */
|
||||
if (!strcmp("pcfx.adpcm.emulate_buggy_codec", name))
|
||||
return 0; /* TODO - make configurable */
|
||||
if (!strcmp("pcfx.rainbow.chromaip", name))
|
||||
return 0; /* TODO - make configurable */
|
||||
#elif defined(WANT_SNES_EMU)
|
||||
if (!strcmp("snes.correct_aspect", name))
|
||||
return 0;
|
||||
if (!strcmp("snes.input.port1.multitap", name))
|
||||
return 0;
|
||||
if (!strcmp("snes.input.port2.multitap", name))
|
||||
return 0;
|
||||
#elif defined(WANT_WSWAN_EMU)
|
||||
if (!strcmp("wswan.forcemono", name))
|
||||
return 0;
|
||||
if (!strcmp("wswan.language", name))
|
||||
return 1;
|
||||
if (!strcmp("wswan.correct_aspect", name))
|
||||
return 1;
|
||||
#endif
|
||||
/* CDROM */
|
||||
if (!strcmp("cdrom.lec_eval", name))
|
||||
return 1;
|
||||
@ -151,18 +94,8 @@ extern std::string retro_base_name;
|
||||
|
||||
std::string MDFN_GetSettingS(const char *name)
|
||||
{
|
||||
#if defined(WANT_GBA_EMU)
|
||||
if (!strcmp("gba.bios", name))
|
||||
return setting_gba_hle ? std::string("") : std::string("gba_bios.bin");
|
||||
#elif defined(WANT_PCFX_EMU)
|
||||
if (!strcmp("pcfx.bios", name))
|
||||
return std::string("pcfx.bios");
|
||||
if (!strcmp("pcfx.fxscsi", name))
|
||||
return std::string("pcfx.fxscsi");
|
||||
#elif defined(WANT_WSWAN_EMU)
|
||||
if (!strcmp("wswan.name", name))
|
||||
return std::string("Mednafen");
|
||||
#endif
|
||||
/* FILESYS */
|
||||
if (!strcmp("filesys.path_firmware", name))
|
||||
return retro_base_directory;
|
||||
|
@ -3,10 +3,6 @@
|
||||
|
||||
#include <string>
|
||||
|
||||
#if defined(WANT_GBA_EMU)
|
||||
extern uint32_t setting_gba_hle;
|
||||
#endif
|
||||
|
||||
bool MDFN_LoadSettings(const char *path, const char *section = NULL, bool override = false);
|
||||
bool MDFN_MergeSettings(const void*);
|
||||
bool MDFN_MergeSettings(const std::vector<void> &);
|
||||
|
362
threads.c
362
threads.c
@ -1,362 +0,0 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen
|
||||
* Copyright (C) 2011-2014 - Daniel De Matteis
|
||||
*
|
||||
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
||||
* of the GNU General Public License as published by the Free Software Found-
|
||||
* ation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with RetroArch.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "thread.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
#if defined(_WIN32)
|
||||
#ifdef _XBOX
|
||||
#include <xtl.h>
|
||||
#else
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#endif
|
||||
#elif defined(GEKKO)
|
||||
#include "thread/gx_pthread.h"
|
||||
#else
|
||||
#include <pthread.h>
|
||||
#include <time.h>
|
||||
#endif
|
||||
|
||||
#ifdef __MACH__
|
||||
#include <mach/clock.h>
|
||||
#include <mach/mach.h>
|
||||
#endif
|
||||
|
||||
struct thread_data
|
||||
{
|
||||
void (*func)(void*);
|
||||
void *userdata;
|
||||
};
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
struct sthread
|
||||
{
|
||||
HANDLE thread;
|
||||
};
|
||||
|
||||
static DWORD CALLBACK thread_wrap(void *data_)
|
||||
{
|
||||
struct thread_data *data = (struct thread_data*)data_;
|
||||
data->func(data->userdata);
|
||||
free(data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
sthread_t *sthread_create(void (*thread_func)(void*), void *userdata)
|
||||
{
|
||||
sthread_t *thread = (sthread_t*)calloc(1, sizeof(*thread));
|
||||
if (!thread)
|
||||
return NULL;
|
||||
|
||||
struct thread_data *data = (struct thread_data*)calloc(1, sizeof(*data));
|
||||
if (!data)
|
||||
{
|
||||
free(thread);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
data->func = thread_func;
|
||||
data->userdata = userdata;
|
||||
|
||||
thread->thread = CreateThread(NULL, 0, thread_wrap, data, 0, NULL);
|
||||
if (!thread->thread)
|
||||
{
|
||||
free(data);
|
||||
free(thread);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return thread;
|
||||
}
|
||||
|
||||
int sthread_detach(sthread_t *thread)
|
||||
{
|
||||
CloseHandle(thread->thread);
|
||||
free(thread);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void sthread_join(sthread_t *thread)
|
||||
{
|
||||
WaitForSingleObject(thread->thread, INFINITE);
|
||||
CloseHandle(thread->thread);
|
||||
free(thread);
|
||||
}
|
||||
|
||||
struct slock
|
||||
{
|
||||
HANDLE lock;
|
||||
};
|
||||
|
||||
slock_t *slock_new(void)
|
||||
{
|
||||
slock_t *lock = (slock_t*)calloc(1, sizeof(*lock));
|
||||
if (!lock)
|
||||
return NULL;
|
||||
|
||||
lock->lock = CreateMutex(NULL, FALSE, "");
|
||||
if (!lock->lock)
|
||||
{
|
||||
free(lock);
|
||||
return NULL;
|
||||
}
|
||||
return lock;
|
||||
}
|
||||
|
||||
void slock_free(slock_t *lock)
|
||||
{
|
||||
CloseHandle(lock->lock);
|
||||
free(lock);
|
||||
}
|
||||
|
||||
void slock_lock(slock_t *lock)
|
||||
{
|
||||
WaitForSingleObject(lock->lock, INFINITE);
|
||||
}
|
||||
|
||||
void slock_unlock(slock_t *lock)
|
||||
{
|
||||
ReleaseMutex(lock->lock);
|
||||
}
|
||||
|
||||
struct scond
|
||||
{
|
||||
HANDLE event;
|
||||
};
|
||||
|
||||
scond_t *scond_new(void)
|
||||
{
|
||||
scond_t *cond = (scond_t*)calloc(1, sizeof(*cond));
|
||||
if (!cond)
|
||||
return NULL;
|
||||
|
||||
cond->event = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
if (!cond->event)
|
||||
{
|
||||
free(cond);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return cond;
|
||||
}
|
||||
|
||||
void scond_wait(scond_t *cond, slock_t *lock)
|
||||
{
|
||||
WaitForSingleObject(cond->event, 0);
|
||||
|
||||
SignalObjectAndWait(lock->lock, cond->event, INFINITE, FALSE);
|
||||
|
||||
slock_lock(lock);
|
||||
}
|
||||
|
||||
bool scond_wait_timeout(scond_t *cond, slock_t *lock, int64_t timeout_us)
|
||||
{
|
||||
WaitForSingleObject(cond->event, 0);
|
||||
|
||||
DWORD res = SignalObjectAndWait(lock->lock, cond->event, (DWORD)(timeout_us) / 1000, FALSE);
|
||||
|
||||
slock_lock(lock);
|
||||
return res == WAIT_OBJECT_0;
|
||||
}
|
||||
|
||||
void scond_signal(scond_t *cond)
|
||||
{
|
||||
SetEvent(cond->event);
|
||||
}
|
||||
|
||||
/* FIXME - check how this function should differ from scond_signal implementation */
|
||||
int scond_broadcast(scond_t *cond)
|
||||
{
|
||||
SetEvent(cond->event);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void scond_free(scond_t *cond)
|
||||
{
|
||||
CloseHandle(cond->event);
|
||||
free(cond);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
struct sthread
|
||||
{
|
||||
pthread_t id;
|
||||
};
|
||||
|
||||
static void *thread_wrap(void *data_)
|
||||
{
|
||||
struct thread_data *data = (struct thread_data*)data_;
|
||||
data->func(data->userdata);
|
||||
free(data);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sthread_t *sthread_create(void (*thread_func)(void*), void *userdata)
|
||||
{
|
||||
sthread_t *thr = (sthread_t*)calloc(1, sizeof(*thr));
|
||||
if (!thr)
|
||||
return NULL;
|
||||
|
||||
struct thread_data *data = (struct thread_data*)calloc(1, sizeof(*data));
|
||||
if (!data)
|
||||
{
|
||||
free(thr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
data->func = thread_func;
|
||||
data->userdata = userdata;
|
||||
|
||||
if (pthread_create(&thr->id, NULL, thread_wrap, data) < 0)
|
||||
{
|
||||
free(data);
|
||||
free(thr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return thr;
|
||||
}
|
||||
|
||||
int sthread_detach(sthread_t *thread)
|
||||
{
|
||||
return pthread_detach(thread->id);
|
||||
}
|
||||
|
||||
void sthread_join(sthread_t *thread)
|
||||
{
|
||||
pthread_join(thread->id, NULL);
|
||||
free(thread);
|
||||
}
|
||||
|
||||
struct slock
|
||||
{
|
||||
pthread_mutex_t lock;
|
||||
};
|
||||
|
||||
slock_t *slock_new(void)
|
||||
{
|
||||
slock_t *lock = (slock_t*)calloc(1, sizeof(*lock));
|
||||
if (!lock)
|
||||
return NULL;
|
||||
|
||||
if (pthread_mutex_init(&lock->lock, NULL) < 0)
|
||||
{
|
||||
free(lock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return lock;
|
||||
}
|
||||
|
||||
void slock_free(slock_t *lock)
|
||||
{
|
||||
pthread_mutex_destroy(&lock->lock);
|
||||
free(lock);
|
||||
}
|
||||
|
||||
void slock_lock(slock_t *lock)
|
||||
{
|
||||
pthread_mutex_lock(&lock->lock);
|
||||
}
|
||||
|
||||
void slock_unlock(slock_t *lock)
|
||||
{
|
||||
pthread_mutex_unlock(&lock->lock);
|
||||
}
|
||||
|
||||
struct scond
|
||||
{
|
||||
pthread_cond_t cond;
|
||||
};
|
||||
|
||||
scond_t *scond_new(void)
|
||||
{
|
||||
scond_t *cond = (scond_t*)calloc(1, sizeof(*cond));
|
||||
if (!cond)
|
||||
return NULL;
|
||||
|
||||
if (pthread_cond_init(&cond->cond, NULL) < 0)
|
||||
{
|
||||
free(cond);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return cond;
|
||||
}
|
||||
|
||||
void scond_free(scond_t *cond)
|
||||
{
|
||||
pthread_cond_destroy(&cond->cond);
|
||||
free(cond);
|
||||
}
|
||||
|
||||
void scond_wait(scond_t *cond, slock_t *lock)
|
||||
{
|
||||
pthread_cond_wait(&cond->cond, &lock->lock);
|
||||
}
|
||||
|
||||
int scond_broadcast(scond_t *cond)
|
||||
{
|
||||
return pthread_cond_broadcast(&cond->cond);
|
||||
}
|
||||
|
||||
bool scond_wait_timeout(scond_t *cond, slock_t *lock, int64_t timeout_us)
|
||||
{
|
||||
struct timespec now = {0};
|
||||
|
||||
#ifdef __MACH__ // OSX doesn't have clock_gettime ... :(
|
||||
clock_serv_t cclock;
|
||||
mach_timespec_t mts;
|
||||
host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
|
||||
clock_get_time(cclock, &mts);
|
||||
mach_port_deallocate(mach_task_self(), cclock);
|
||||
now.tv_sec = mts.tv_sec;
|
||||
now.tv_nsec = mts.tv_nsec;
|
||||
#elif defined(__CELLOS_LV2__)
|
||||
sys_time_sec_t s;
|
||||
sys_time_nsec_t n;
|
||||
sys_time_get_current_time(&s, &n);
|
||||
now.tv_sec = s;
|
||||
now.tv_nsec = n;
|
||||
#elif defined(__mips__)
|
||||
struct timeval tm;
|
||||
gettimeofday(&tm, NULL);
|
||||
now.tv_sec = tm.tv_sec;
|
||||
now.tv_nsec = tm.tv_usec * 1000;
|
||||
#elif !defined(GEKKO) // timeout on libogc is duration, not end time
|
||||
clock_gettime(CLOCK_REALTIME, &now);
|
||||
#endif
|
||||
|
||||
now.tv_sec += timeout_us / 1000000LL;
|
||||
now.tv_nsec += timeout_us * 1000LL;
|
||||
|
||||
now.tv_sec += now.tv_nsec / 1000000000LL;
|
||||
now.tv_nsec = now.tv_nsec % 1000000000LL;
|
||||
|
||||
int ret = pthread_cond_timedwait(&cond->cond, &lock->lock, &now);
|
||||
return ret == 0;
|
||||
}
|
||||
|
||||
void scond_signal(scond_t *cond)
|
||||
{
|
||||
pthread_cond_signal(&cond->cond);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user