var.key = "pcsx_rearmed_spu_thread";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
{
+ int spu_thread_old = spu_config.iUseThread;
if (strcmp(var.value, "enabled") == 0)
spu_config.iUseThread = 1;
else
spu_config.iUseThread = 0;
+ if (spu_config.iUseThread != spu_thread_old)
+ SPU_configure();
}
#endif
"pcsx_rearmed_display_fps_v2",
"Display Internal FPS",
NULL,
- "Show the internal frame rate at which the emulated PlayStation system is rendering content. Note: Requires on-screen notifications to be enabled in the libretro frontend.",
+ "Show the internal frame rate at which the emulated system is rendering content. Note: Requires on-screen notifications to be enabled in the libretro frontend.",
NULL,
"video",
{
#include "../libpcsxcore/ppf.h"
#include "../libpcsxcore/new_dynarec/new_dynarec.h"
#include "../plugins/dfsound/spu_config.h"
+#include "pcsxr-threads.h"
#include "psemu_plugin_defs.h"
#include "compiler_features.h"
#include "arm_features.h"
static int menu_loop_plugin_options(int id, int keys)
{
static int sel = 0;
+ int spu_thread_old = spu_config.iUseThread;
menu_iopts[0] = Config.SlowBoot;
menu_iopts[1] = pl_rearmed_cbs.thread_rendering + 1;
#ifndef C64X_DSP
- me_enable(e_menu_plugin_options, MA_OPT_SPU_THREAD, spu_config.iThreadAvail);
+ me_enable(e_menu_plugin_options, MA_OPT_SPU_THREAD, pcsxr_sthread_core_count > 1);
#endif
me_loop(e_menu_plugin_options, &sel);
Config.SlowBoot = menu_iopts[0];
pl_rearmed_cbs.thread_rendering = menu_iopts[1] - 1;
+ if (spu_config.iUseThread != spu_thread_old)
+ SPU_configure();
// sync BIOS/plugins
snprintf(Config.Bios[0], sizeof(Config.Bios[0]), "%s", bioses[bios_sel]);
#ifndef USE_C11_THREADS
+#include "rthreads/rthreads.h"
#include "../deps/libretro-common/rthreads/rthreads.c"
#include "features/features_cpu.h"
#ifndef USE_C11_THREADS
/* use libretro-common rthreads */
-#include "rthreads/rthreads.h"
+//#include "rthreads/rthreads.h"
+struct sthread;
+struct slock;
+struct scond;
+typedef struct sthread sthread_t;
+typedef struct slock slock_t;
+typedef struct scond scond_t;
#define STRHEAD_RET_TYPE void
#define STRHEAD_RETURN()
-sthread_t *pcsxr_sthread_create(void (*thread_func)(void*),
+struct sthread *pcsxr_sthread_create(void (*thread_func)(void*),
enum pcsxr_thread_type type);
+void sthread_join(struct sthread *thread);
+
+struct slock *slock_new(void);
+void slock_free(struct slock *lock);
+void slock_lock(struct slock *lock);
+void slock_unlock(struct slock *lock);
+
+struct scond *scond_new(void);
+void scond_free(struct scond *cond);
+void scond_wait(struct scond *cond, struct slock *lock);
+void scond_signal(struct scond *cond);
#else
DIRECT_SPU(SPUshutdown),
DIRECT_SPU(SPUopen),
DIRECT_SPU(SPUclose),
+ DIRECT_SPU(SPUconfigure),
DIRECT_SPU(SPUwriteRegister),
DIRECT_SPU(SPUreadRegister),
DIRECT_SPU(SPUwriteDMAMem),
SPUshutdown SPU_shutdown;
SPUopen SPU_open;
SPUclose SPU_close;
+SPUconfigure SPU_configure;
SPUwriteRegister SPU_writeRegister;
SPUreadRegister SPU_readRegister;
SPUwriteDMAMem SPU_writeDMAMem;
LoadSpuSym1(shutdown, "SPUshutdown");
LoadSpuSym1(open, "SPUopen");
LoadSpuSym1(close, "SPUclose");
+ LoadSpuSym1(configure, "SPUconfigure");
LoadSpuSym1(writeRegister, "SPUwriteRegister");
LoadSpuSym1(readRegister, "SPUreadRegister");
LoadSpuSym1(writeDMAMem, "SPUwriteDMAMem");
typedef long (CALLBACK* SPUinit)(void); \r
typedef long (CALLBACK* SPUshutdown)(void); \r
typedef long (CALLBACK* SPUclose)(void); \r
+typedef void (CALLBACK* SPUconfigure)(void); \r
typedef void (CALLBACK* SPUwriteRegister)(unsigned long, unsigned short, unsigned int);\r
typedef unsigned short (CALLBACK* SPUreadRegister)(unsigned long, unsigned int);\r
typedef void (CALLBACK* SPUwriteDMAMem)(unsigned short *, int, unsigned int);\r
extern SPUshutdown SPU_shutdown;\r
extern SPUopen SPU_open;\r
extern SPUclose SPU_close;\r
+extern SPUconfigure SPU_configure;\r
extern SPUwriteRegister SPU_writeRegister;\r
extern SPUreadRegister SPU_readRegister;\r
extern SPUwriteDMAMem SPU_writeDMAMem;\r
#elif P_HAVE_PTHREAD
-#include <pthread.h>
+#include "../../frontend/pcsxr-threads.h"
+#ifdef _3DS
+#include <3ds/svc.h> // semaphore.h dep
+#endif
#include <semaphore.h>
-#include <unistd.h>
static struct {
- pthread_t thread;
+ sthread_t *thread;
sem_t sem_avail;
sem_t sem_done;
} t;
{
}
-static void *spu_worker_thread(void *unused)
+static STRHEAD_RET_TYPE spu_worker_thread(void *unused)
{
struct work_item *work;
sem_post(&t.sem_done);
}
- return NULL;
+ STRHEAD_RETURN();
}
static void init_spu_thread(void)
{
int ret;
- spu.sb_thread = spu.sb_thread_;
-
- if (sysconf(_SC_NPROCESSORS_ONLN) <= 1)
+ if (worker)
return;
-
worker = calloc(1, sizeof(*worker));
if (worker == NULL)
return;
if (ret != 0)
goto fail_sem_done;
- ret = pthread_create(&t.thread, NULL, spu_worker_thread, NULL);
- if (ret != 0)
+ t.thread = pcsxr_sthread_create(spu_worker_thread, PCSXRT_SPU);
+ if (!t.thread)
goto fail_thread;
- spu_config.iThreadAvail = 1;
return;
fail_thread:
fail_sem_avail:
free(worker);
worker = NULL;
- spu_config.iThreadAvail = 0;
}
static void exit_spu_thread(void)
return;
worker->exit_thread = 1;
sem_post(&t.sem_avail);
- pthread_join(t.thread, NULL);
+ sthread_join(t.thread);
sem_destroy(&t.sem_done);
sem_destroy(&t.sem_avail);
free(worker);
if (spu_config.iVolume == 0)
spu_config.iVolume = 768; // 1024 is 1.0
- init_spu_thread();
+ spu.sb_thread = spu.sb_thread_;
+#ifndef C64X_DSP
+ if (spu_config.iUseThread)
+#endif
+ init_spu_thread();
for (i = 0; i < MAXCHAN; i++) // loop sound channels
{
return 0;
}
+void CALLBACK SPUconfigure(void)
+{
+ if (spu.bSpuInit && spu_config.iUseThread)
+ init_spu_thread();
+ else
+ exit_spu_thread();
+}
+
// SETUP CALLBACKS
// this functions will be called once,
// passes a callback that should be called on SPU-IRQ/cdda volume change
long CALLBACK SPUinit(void);\r
long CALLBACK SPUshutdown(void);\r
long CALLBACK SPUclose(void);\r
+void CALLBACK SPUconfigure(void);\r
void CALLBACK SPUwriteRegister(unsigned long, unsigned short, unsigned int);\r
unsigned short CALLBACK SPUreadRegister(unsigned long, unsigned int);\r
void CALLBACK SPUregisterCallback(void (*cb)(int));\r
int iTempo;
int iUseThread;
+#ifdef C64X_DSP
// status
int iThreadAvail;
+#endif
} SPUConfig;
extern SPUConfig spu_config;
return 0;
}
+void CALLBACK SPUconfigure(void)
+{
+}
+
////////////////////////////////////////////////////////////////////////
// MISC STUFF
////////////////////////////////////////////////////////////////////////