diff --git a/Makefile b/Makefile index 125718afd5..2324efebce 100644 --- a/Makefile +++ b/Makefile @@ -247,7 +247,6 @@ else ifeq ($(HAVE_CG), 1) endif ifeq ($(HAVE_DYLIB), 1) - OBJ += gfx/ext_gfx.o audio/ext_audio.o LIBS += $(DYLIB_LIB) endif diff --git a/Makefile.win b/Makefile.win index bf2fbb4001..fdef579d7a 100644 --- a/Makefile.win +++ b/Makefile.win @@ -181,10 +181,6 @@ ifeq ($(HAVE_FBO), 1) DEFINES += -DHAVE_FBO endif -ifeq ($(HAVE_DYLIB), 1) - OBJ += gfx/ext_gfx.o audio/ext_audio.o -endif - ifeq ($(HAVE_PYTHON), 1) LIBS += -lpython32 DEFINES += -DHAVE_PYTHON -Ipython diff --git a/audio/ext/rarch_audio.h b/audio/ext/rarch_audio.h deleted file mode 100644 index fc5b3b1e8d..0000000000 --- a/audio/ext/rarch_audio.h +++ /dev/null @@ -1,128 +0,0 @@ -///// -// API header for external RetroArch audio driver plugins. -// -// - -#ifndef __RARCH_AUDIO_DRIVER_PLUGIN_H -#define __RARCH_AUDIO_DRIVER_PLUGIN_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _WIN32 -#ifdef RARCH_DLL_IMPORT -#define RARCH_API_EXPORT __declspec(dllimport) -#else -#define RARCH_API_EXPORT __declspec(dllexport) -#endif -#define RARCH_API_CALLTYPE __cdecl -#else -#define RARCH_API_EXPORT -#define RARCH_API_CALLTYPE -#endif - -#ifndef RARCH_TRUE -#define RARCH_TRUE 1 -#endif - -#ifndef RARCH_FALSE -#define RARCH_FALSE 0 -#endif - -#ifndef RARCH_OK -#define RARCH_OK 1 -#endif - -#ifndef RARCH_ERROR -#define RARCH_ERROR 0 -#endif - -#define RARCH_AUDIO_API_VERSION 2 - -typedef struct rarch_audio_driver_info -{ - // A hint for a subdevice of the audio driver. - // This is driver independent, and not relevant for all - // audio drivers. I.e. ALSA driver might use "hw:0", - // OSS "/dev/audio", etc. - const char *device; - - // Audio sample rate. - unsigned sample_rate; - - // Maximum audio latency requested for output, - // measured in milliseconds. - // If driver is not able to provide this latency, it can - // be disregarded. - unsigned latency; -} rarch_audio_driver_info_t; - -typedef struct rarch_audio_driver -{ - // Initializes the device. - void *(*init)(const rarch_audio_driver_info_t *info); - - // Write data in buffer to audio driver. - // A frame here is defined as one combined sample of left and right - // channels. (I.e. 44.1kHz, 16-bit stereo has 88.2k samples/s, and - // 44.1k frames/s.) - // - // Samples are interleaved in format LRLRLRLRLR ... - // If the driver returns true in use_float(), a floating point - // format will be used, with range [-1.0, 1.0]. - // If not, signed 16-bit samples in native byte ordering will be used. - // - // This function returns the number of frames successfully written. - // If an error occurs, -1 should be returned. - // Note that non-blocking behavior that cannot write at this time - // should return 0 as returning -1 will terminate the driver. - // - // Unless said otherwise with set_nonblock_state(), all writes - // are blocking, and it should block till it has written all frames. - int (*write)(void *data, const void *buffer, unsigned frames); - - // Temporarily pauses the audio driver. - int (*stop)(void *data); - - // Resumes audio driver from the paused state. - int (*start)(void *data); - - // If state is true, nonblocking operation is assumed. - // This is typically used for fast-forwarding. If driver cannot - // implement nonblocking writes, this can be disregarded, but should - // log a message to stderr. - void (*set_nonblock_state)(void *data, int state); - - // Stops and frees the audio driver. - void (*free)(void *data); - - // If true is returned, the audio driver is capable of using - // floating point data. This will likely increase performance as the - // resampler unit uses floating point. The sample range is - // [-1.0, 1.0]. - int (*use_float)(void *data); - - // The driver might be forced to use a certain output frequency - // (i.e. Jack), and thus to avoid double resampling, the driver - // can request RetroArch to resample to a different sample rate. - // This function can be set to NULL if the driver does not - // desire to override the sample rate. - unsigned (*sample_rate)(void *data); - - // Human readable identification string for the driver. - const char *ident; - - // Must be set to RARCH_AUDIO_API_VERSION. - // Used for detecting API mismatch. - int api_version; -} rarch_audio_driver_t; - -RARCH_API_EXPORT const rarch_audio_driver_t* RARCH_API_CALLTYPE - rarch_audio_driver_init(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/audio/ext_audio.c b/audio/ext_audio.c deleted file mode 100644 index 4cd79f29fd..0000000000 --- a/audio/ext_audio.c +++ /dev/null @@ -1,162 +0,0 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2010-2012 - Hans-Kristian Arntzen - * - * 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 . - */ - -#include "ext/rarch_audio.h" -#include "../boolean.h" -#include -#include -#include "../driver.h" -#include "../dynamic.h" -#include "../general.h" -#include - -typedef struct audio_ext -{ - dylib_t lib; - const rarch_audio_driver_t *driver; - void *handle; - bool is_float; -} audio_ext_t; - -static void audio_ext_free(void *data) -{ - audio_ext_t *ext = (audio_ext_t*)data; - if (ext) - { - if (ext->driver && ext->handle) - ext->driver->free(ext->handle); - if (ext->lib) - dylib_close(ext->lib); - free(ext); - } -} - -static void *audio_ext_init(const char *device, unsigned rate, unsigned latency) -{ - if (!(*g_settings.audio.external_driver)) - { - RARCH_ERR("Please define an external audio driver.\n"); - return NULL; - } - - audio_ext_t *ext = (audio_ext_t*)calloc(1, sizeof(*ext)); - if (!ext) - return NULL; - - rarch_audio_driver_info_t info = {0}; - const rarch_audio_driver_t *(*plugin_load)(void) = NULL; - - ext->lib = dylib_load(g_settings.audio.external_driver); - if (!ext->lib) - { - RARCH_ERR("Failed to load external library \"%s\"\n", g_settings.audio.external_driver); - goto error; - } - - plugin_load = (const rarch_audio_driver_t *(*)(void))dylib_proc(ext->lib, "rarch_audio_driver_init"); - - if (!plugin_load) - { - RARCH_ERR("Failed to find symbol \"rarch_audio_driver_init\" in plugin.\n"); - goto error; - } - - ext->driver = plugin_load(); - if (!ext->driver) - { - RARCH_ERR("Received invalid driver from plugin.\n"); - goto error; - } - - RARCH_LOG("Loaded external audio driver: \"%s\"\n", ext->driver->ident ? ext->driver->ident : "Unknown"); - - if (ext->driver->api_version != RARCH_AUDIO_API_VERSION) - { - RARCH_ERR("API mismatch in external audio plugin. RetroArch: %d, Plugin: %d ...\n", RARCH_AUDIO_API_VERSION, ext->driver->api_version); - goto error; - } - - info.device = device; - info.sample_rate = rate; - info.latency = latency; - - ext->handle = ext->driver->init(&info); - if (!ext->handle) - { - RARCH_ERR("Failed to init audio driver.\n"); - goto error; - } - - if (ext->driver->sample_rate) - g_settings.audio.out_rate = ext->driver->sample_rate(ext->handle); - - if (!g_settings.audio.sync) - ext->driver->set_nonblock_state(ext->handle, RARCH_TRUE); - - return ext; - -error: - audio_ext_free(ext); - return NULL; -} - -static ssize_t audio_ext_write(void *data, const void *buf, size_t size) -{ - audio_ext_t *ext = (audio_ext_t*)data; - unsigned frame_size = ext->is_float ? (2 * sizeof(float)) : (2 * sizeof(int16_t)); - size /= frame_size; - - int ret = ext->driver->write(ext->handle, buf, size); - if (ret < 0) - return -1; - return ret * frame_size; -} - -static bool audio_ext_start(void *data) -{ - audio_ext_t *ext = (audio_ext_t*)data; - return ext->driver->start(ext->handle); -} - -static bool audio_ext_stop(void *data) -{ - audio_ext_t *ext = (audio_ext_t*)data; - return ext->driver->stop(ext->handle); -} - -static void audio_ext_set_nonblock_state(void *data, bool toggle) -{ - audio_ext_t *ext = (audio_ext_t*)data; - ext->driver->set_nonblock_state(ext->handle, toggle); -} - -static bool audio_ext_use_float(void *data) -{ - audio_ext_t *ext = (audio_ext_t*)data; - ext->is_float = ext->driver->use_float(ext->handle); - return ext->is_float; -} - -const audio_driver_t audio_ext = { - audio_ext_init, - audio_ext_write, - audio_ext_stop, - audio_ext_start, - audio_ext_set_nonblock_state, - audio_ext_free, - audio_ext_use_float, - "ext" -}; - diff --git a/driver.c b/driver.c index 88281248a2..1e2b758fe0 100644 --- a/driver.c +++ b/driver.c @@ -67,9 +67,6 @@ static const audio_driver_t *audio_drivers[] = { #ifdef HAVE_PULSE &audio_pulse, #endif -#ifdef HAVE_DYLIB - &audio_ext, -#endif #ifdef __CELLOS_LV2__ &audio_ps3, #endif @@ -110,9 +107,6 @@ static const video_driver_t *video_drivers[] = { #ifdef HAVE_XVIDEO &video_xvideo, #endif -#ifdef HAVE_DYLIB - &video_ext, -#endif #ifdef GEKKO &video_gx, #endif diff --git a/driver.h b/driver.h index a9b77b2482..1c2ea2e938 100644 --- a/driver.h +++ b/driver.h @@ -291,7 +291,6 @@ extern const audio_driver_t audio_jack; extern const audio_driver_t audio_sdl; extern const audio_driver_t audio_xa; extern const audio_driver_t audio_pulse; -extern const audio_driver_t audio_ext; extern const audio_driver_t audio_dsound; extern const audio_driver_t audio_coreaudio; extern const audio_driver_t audio_xenon360; @@ -309,7 +308,6 @@ extern const video_driver_t video_xvideo; extern const video_driver_t video_xdk_d3d; extern const video_driver_t video_sdl; extern const video_driver_t video_vg; -extern const video_driver_t video_ext; extern const video_driver_t video_null; extern const input_driver_t input_android; extern const input_driver_t input_sdl; diff --git a/general.h b/general.h index f0240a322e..424727d570 100644 --- a/general.h +++ b/general.h @@ -147,7 +147,6 @@ struct settings bool gpu_screenshot; bool allow_rotate; - char external_driver[PATH_MAX]; } video; struct @@ -162,7 +161,6 @@ struct settings bool sync; char dsp_plugin[PATH_MAX]; - char external_driver[PATH_MAX]; bool rate_control; float rate_control_delta; diff --git a/gfx/ext/rarch_video.h b/gfx/ext/rarch_video.h deleted file mode 100644 index 456110b5b8..0000000000 --- a/gfx/ext/rarch_video.h +++ /dev/null @@ -1,285 +0,0 @@ -///// -// API header for external RetroArch video and input plugins. -// -// - -#ifndef __RARCH_VIDEO_DRIVER_H -#define __RARCH_VIDEO_DRIVER_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _WIN32 -#ifdef RARCH_DLL_IMPORT -#define RARCH_API_EXPORT __declspec(dllimport) -#else -#define RARCH_API_EXPORT __declspec(dllexport) -#endif -#define RARCH_API_CALLTYPE __cdecl -#else -#define RARCH_API_EXPORT -#define RARCH_API_CALLTYPE -#endif - -#define RARCH_GRAPHICS_API_VERSION 5 - -// Since we don't want to rely on C++ or C99 for a proper boolean type, -// make sure return semantics are perfectly clear ... ;) - -#ifndef RARCH_OK -#define RARCH_OK 1 -#endif - -#ifndef RARCH_ERROR -#define RARCH_ERROR 0 -#endif - -#ifndef RARCH_TRUE -#define RARCH_TRUE 1 -#endif - -#ifndef RARCH_FALSE -#define RARCH_FALSE 0 -#endif - -#define RARCH_COLOR_FORMAT_RGB565 0 -#define RARCH_COLOR_FORMAT_XRGB8888 1 - -#define RARCH_INPUT_SCALE_BASE 256 - -typedef struct py_state py_state_t; - -// Create a new runtime for Python. -// py_script: The python script to be loaded. If is_file is true, this will be the full path to a file. -// If false, it will be an UTF-8 encoded string of the script. -// is_file: Tells if py_script is the path to a script, or a script itself. -// py_class: name of the class being instantiated. -typedef py_state_t *(*python_state_new_cb)(const char *py_script, unsigned is_file, const char *py_class); -// Grabs a value from the Python runtime. -// id: The uniform (class method) to be called. -// frame_count: Passes frame_count as an argument to the script. -typedef float (*python_state_get_cb)(py_state_t *handle, const char *id, unsigned frame_count); -// Frees the runtime. -typedef void (*python_state_free_cb)(py_state_t *handle); - -typedef struct rarch_video_info -{ - // Width of window. - // If fullscreen mode is requested, - // a width of 0 means the resolution of the desktop should be used. - unsigned width; - - // Height of window. - // If fullscreen mode is requested, - // a height of 0 means the resolutiof the desktop should be used. - unsigned height; - - // If true, start the window in fullscreen mode. - int fullscreen; - - // If true, VSync should be enabled. - int vsync; - - // If true, the output image should have the aspect ratio - // as set in aspect_ratio. - int force_aspect; - - // Aspect ratio. Only takes effect if force_aspect is enabled. - float aspect_ratio; - - // Requests that the image is smoothed, - // using bilinear filtering or otherwise. - // If this cannot be implemented efficiently, this can be disregarded. - // If smooth is false, nearest-neighbor scaling is requested. - int smooth; - - // input_scale defines the maximum size of the picture that will - // ever be used with the frame callback. - // The maximum resolution is a multiple of 256x256 size (RARCH_INPUT_SCALE_BASE), - // so an input scale of 2 - // means you should allocate a texture or of 512x512. - unsigned input_scale; - - // Defines the coloring format used of the input frame. - // XRGB1555 format is 16-bit and has byte ordering: 0RRRRRGGGGGBBBBB, - // in native endian. - // ARGB8888 is AAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB, native endian. - // Alpha channel should be disregarded. - int color_format; - - // If non-NULL, requests the use of an XML shader. - // Can be disregarded. - const char *xml_shader; - // If non-NULL, requests the use of a Cg shader. - // Can be disregarded. - // If both are non-NULL, - // Cg or XML could be used at the discretion of the plugin. - const char *cg_shader; - - // Requestes that a certain - // TTF font is used for rendering messages to the screen. - // Can be disregarded. - const char *ttf_font; - unsigned ttf_font_size; - unsigned ttf_font_color; // Font color, in format ARGB8888. Alpha should be disregarded. - - // A title that should be displayed in the title bar of the window. - const char *title_hint; - - // Functions to peek into the python runtime for shaders. - // Check typedefs above for explanation. - // These may be NULL if RetroArch is not built with Python support. - python_state_new_cb python_state_new; - python_state_get_cb python_state_get; - python_state_free_cb python_state_free; -} rarch_video_info_t; - -// Some convenience macros. -// Extract which axes to test for in negative or positive direction. -// May be equal to RARCH_NO_AXIS, which means testing should not occur. -#define RARCH_AXIS_NEG_GET(x) (((unsigned)(x) >> 16) & 0xFFFFU) -#define RARCH_AXIS_POS_GET(x) ((unsigned)(x) & 0xFFFFU) - -// I hope no joypad will ever have this many buttons or axes ... ;) -// If joykey is this value, do not check that button. -#define RARCH_NO_AXIS (0xFFFFFFFFU) -#define RARCH_NO_BTN ((unsigned short)0xFFFFU) - -// Masks to test on joykey which hat direction is to be tested for. -#define RARCH_HAT_UP_MASK (1 << 15) -#define RARCH_HAT_DOWN_MASK (1 << 14) -#define RARCH_HAT_LEFT_MASK (1 << 13) -#define RARCH_HAT_RIGHT_MASK (1 << 12) -#define RARCH_HAT_MAP(x, hat) ((x & ((1 << 12) - 1)) | hat) - -#define RARCH_HAT_MASK (RARCH_HAT_UP_MASK | RARCH_HAT_DOWN_MASK | \ - RARCH_HAT_LEFT_MASK | RARCH_HAT_RIGHT_MASK) - -// Test this on the joykey. If true, we want to test for a joypad hat -// rather than a button. -#define RARCH_GET_HAT_DIR(x) (x & RARCH_HAT_MASK) - -// Gets the joypad hat to be tested for. -// Only valid when RARCH_GET_HAT_DIR() returns true. -#define RARCH_GET_HAT(x) (x & (~RARCH_HAT_MASK)) - -// key, joykey and joyaxis are all checked at the same time. -// If any one of these are pressed, return 1 in state callback. -struct rarch_keybind -{ - // Keyboard key. The key values use the SDL 1.2 keysyms, - // which probably need to be transformed to the native format. - // The actual keysyms RetroArch uses are found in libretro.h. - unsigned short key; - - // Joypad key. Joypad POV (hats) are embedded into this key as well. - unsigned short joykey; - - // Joypad axis. Negative and positive axes are embedded into this variable. - unsigned joyaxis; -}; - -typedef struct rarch_input_driver -{ - // Inits input driver. - // Joypad index denotes which joypads are desired for the various players. - // Should an entry be negative, - // do not open joypad for that player. - // Threshold states the minimum offset that a joypad axis - // has to be held for it to be registered. - // The range of this is [0, 1], - // where 0 means any displacement will register, - // and 1 means the axis has to be pressed all the way to register. - void *(*init)(const int joypad_index[8], float axis_threshold); - - // Polls input. Called once every frame. - void (*poll)(void *data); - - // Queries input state for a certain key on a certain player. - // Players are 1 - 8. - // For digital inputs, pressed key is 1, not pressed key is 0. - // Analog values have same range as a signed 16-bit integer. - short (*input_state)(void *data, const struct rarch_keybind *bind, - unsigned player); - - // Queries analog input state for a certain key on a certain player in the range of [-0x8000, 0x7fff]. - // Only the direction of the bind should be returned. - // - // E.g. if the bind has bind for negative axis 5, and the axis is pressed to the positive - // axis, the returned value should be 0. - short (*input_state_analog)(void *data, unsigned joyaxis, - unsigned player); - - // Frees the input struct. - void (*free)(void *data); - - // Human readable indentification string. - const char *ident; -} rarch_input_driver_t; - -typedef struct rarch_video_driver -{ - // Inits the video driver. Returns an opaque handle pointer to the driver. - // Returns NULL on error. - // - // Should the video driver request that a certain input driver is used, - // it is possible to set the driver to *input. - // If no certain driver is desired, set *input to NULL. - void *(*init)(const rarch_video_info_t *video, - const rarch_input_driver_t **input); - - // Updates frame on the screen. - // Frame can be either XRGB1555 or ARGB32 format - // depending on rgb32 setting in rarch_video_info_t. - // Pitch is the distance in bytes between two scanlines in memory. - // - // When msg is non-NULL, - // it's a message that should be displayed to the user. - int (*frame)(void *data, const void *frame, - unsigned width, unsigned height, unsigned pitch, const char *msg); - - // Requests nonblocking operation. - // True = VSync is turned off. - // False = VSync is turned on. - void (*set_nonblock_state)(void *data, int toggle); - - // This must return false when the user exits the emulator. - int (*alive)(void *data); - - // Does the window have focus? - int (*focus)(void *data); - - // Frees the video driver. - void (*free)(void *data); - - // A human-readable identification of the video driver. - const char *ident; - - // Needs to be defined to RARCH_GRAPHICS_API_VERSION. - // This is used to detect API/ABI mismatches. - int api_version; - - // The final image should be rotated counter-clockwise by rot * 90 degrees. - void (*set_rotation)(void *data, unsigned rot); - - // Gets the current width/height of the viewport. - void (*viewport_size)(void *data, unsigned *width, unsigned *height); - - // Reads the content of the viewport into memory. - // Tightly packed BGR888. Pitch is width * 3. - int (*read_viewport)(void *data, unsigned char *buffer); -} rarch_video_driver_t; - -// Called by RetroArch on startup to get a driver handle. -// This is NOT dynamically allocated. -RARCH_API_EXPORT const rarch_video_driver_t* RARCH_API_CALLTYPE - rarch_video_init(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/gfx/ext_gfx.c b/gfx/ext_gfx.c deleted file mode 100644 index 2c8b07898c..0000000000 --- a/gfx/ext_gfx.c +++ /dev/null @@ -1,424 +0,0 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2010-2012 - Hans-Kristian Arntzen - * - * 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 . - */ - -// Loader for external API plugins. - -#define RARCH_DLL_IMPORT -#include "ext/rarch_video.h" -#include "../boolean.h" -#include -#include -#include "../dynamic.h" -#include "../general.h" -#include "gfx_common.h" - -#ifdef HAVE_FREETYPE -#include "fonts/fonts.h" -#endif - -#ifdef HAVE_PYTHON -#define PY_STATE_OMIT_DECLARATION -#include "py_state/py_state.h" -#endif - -static bool g_input_dead = true; -static bool g_video_dead = true; -static dylib_t g_lib = NULL; - -/////////// Input hook - -typedef struct -{ - const rarch_input_driver_t *driver; - void *handle; -} input_ext_t; - -static void *input_ext_init(void) -{ - g_input_dead = false; - return calloc(1, sizeof(input_ext_t)); -} - -static void input_ext_poll(void *data) -{ - input_ext_t *ext = (input_ext_t*)data; - ext->driver->poll(ext->handle); -} - -static int16_t input_ext_input_state(void *data, const struct retro_keybind **retro_keybinds, unsigned port, unsigned device, unsigned index, unsigned id) -{ - input_ext_t *ext = (input_ext_t*)data; - unsigned player = port + 1; - struct rarch_keybind bind = {0}; - - switch (device) - { - case RETRO_DEVICE_JOYPAD: - { - if (id >= RARCH_BIND_LIST_END) - return 0; - - const struct retro_keybind *rarch_bind = &retro_keybinds[player - 1][id]; - if (!rarch_bind->valid) - return 0; - - bind.key = rarch_bind->key; - bind.joykey = rarch_bind->joykey; - bind.joyaxis = rarch_bind->joyaxis; - break; - } - - // TODO: RETRO_DEVICE_ANALOG. - - case RETRO_DEVICE_KEYBOARD: - if (id >= RETROK_LAST) - return 0; - - bind.key = id; - bind.joykey = NO_BTN; - bind.joyaxis = AXIS_NONE; - break; - - default: - return 0; - } - - return ext->driver->input_state(ext->handle, &bind, player); -} - -static bool input_ext_key_pressed(void *data, int key) -{ - input_ext_t *ext = (input_ext_t*)data; - - if (key >= 0 && key < RARCH_BIND_LIST_END) - { - const struct retro_keybind *rarch_bind = &g_settings.input.binds[0][key]; - if (!rarch_bind->valid) - return false; - - struct rarch_keybind bind = {0}; - bind.key = rarch_bind->key; - bind.joykey = rarch_bind->joykey; - bind.joyaxis = rarch_bind->joyaxis; - - return ext->driver->input_state(ext->handle, &bind, 1); - } - else - return false; -} - -static void input_ext_free(void *data) -{ - input_ext_t *ext = (input_ext_t*)data; - if (ext) - { - if (ext->driver && ext->handle) - ext->driver->free(ext->handle); - - if (g_video_dead) - { - dylib_close(g_lib); - g_lib = NULL; - } - - g_input_dead = true; - - free(ext); - } -} - -#ifdef RARCH_CONSOLE -static void input_ext_set_default_keybind_lut(unsigned device, unsigned port) -{ - (void)device; - (void)port; -} - -static void input_ext_set_analog_dpad_mapping(unsigned device, unsigned map_dpad_enum, unsigned controller_id) -{ - (void)device; - (void)map_dpad_enum; - (void)controller_id; -} - -static void input_ext_input_post_init(void) {} -#endif - -static const input_driver_t input_ext = { - input_ext_init, - input_ext_poll, - input_ext_input_state, - input_ext_key_pressed, - input_ext_free, -#ifdef RARCH_CONSOLE - input_ext_set_default_keybind_lut, - input_ext_set_analog_dpad_mapping, - input_ext_input_post_init, - 2, -#endif - "ext" -}; - -//////////// Video hook -typedef struct -{ - const rarch_video_driver_t *driver; - void *handle; -} ext_t; - -static void video_ext_free(void *data) -{ - ext_t *ext = (ext_t*)data; - if (ext) - { - if (ext->driver && ext->handle) - ext->driver->free(ext->handle); - - if (g_input_dead) - { - dylib_close(g_lib); - g_lib = NULL; - } - - g_video_dead = true; - - free(ext); - } -} - -static bool video_ext_focus(void *data) -{ - ext_t *ext = (ext_t*)data; - return ext->driver->focus(ext->handle); -} - -static bool video_ext_alive(void *data) -{ - ext_t *ext = (ext_t*)data; - return ext->driver->alive(ext->handle); -} - -static void video_ext_set_nonblock_state(void *data, bool state) -{ - ext_t *ext = (ext_t*)data; - ext->driver->set_nonblock_state(ext->handle, state); -} - -static bool video_ext_frame(void *data, const void *frame, unsigned width, unsigned height, unsigned pitch, const char *msg) -{ - if (!frame) - return true; - - ext_t *ext = (ext_t*)data; - return ext->driver->frame(ext->handle, frame, width, height, pitch, msg); -} - -static void *setup_input(ext_t *ext, const rarch_input_driver_t *driver) -{ - int joypad_index[8]; - for (unsigned i = 0; i < 8; i++) - joypad_index[i] = g_settings.input.joypad_map[i] < 0 ? -1 : g_settings.input.joypad_map[i]; - - void *handle = driver->init(joypad_index, g_settings.input.axis_threshold); - if (!handle) - return NULL; - - input_ext_t *wrap_handle = (input_ext_t*)input_ext.init(); - if (!wrap_handle) - return NULL; - - wrap_handle->handle = handle; - wrap_handle->driver = driver; - - return wrap_handle; -} - -static bool setup_video(ext_t *ext, const video_info_t *video, const input_driver_t **input, void **input_data) -{ - RARCH_LOG("Loaded driver: \"%s\"\n", ext->driver->ident ? ext->driver->ident : "Unknown"); - - if (RARCH_GRAPHICS_API_VERSION != ext->driver->api_version) - { - RARCH_ERR("API version mismatch detected.\n"); - RARCH_ERR("Required API version: %d, Library version: %d\n", RARCH_GRAPHICS_API_VERSION, ext->driver->api_version); - return false; - } - - const char *cg_shader = NULL; - const char *xml_shader = NULL; - - enum rarch_shader_type type = g_settings.video.shader_type; - - if ((type == RARCH_SHADER_CG || type == RARCH_SHADER_AUTO) && *g_settings.video.cg_shader_path) - cg_shader = g_settings.video.cg_shader_path; - else if ((type == RARCH_SHADER_BSNES || type == RARCH_SHADER_AUTO) && *g_settings.video.bsnes_shader_path) - xml_shader = g_settings.video.bsnes_shader_path; - - int font_color_r = g_settings.video.msg_color_r * 255; - int font_color_g = g_settings.video.msg_color_g * 255; - int font_color_b = g_settings.video.msg_color_b * 255; - font_color_r = font_color_r > 255 ? 255 : (font_color_r < 0 ? 0 : font_color_r); - font_color_g = font_color_g > 255 ? 255 : (font_color_g < 0 ? 0 : font_color_g); - font_color_b = font_color_b > 255 ? 255 : (font_color_b < 0 ? 0 : font_color_b); - - const char *font = NULL; - if (g_settings.video.font_enable) - { - font = *g_settings.video.font_path ? - g_settings.video.font_path : NULL; - } - - char title_buf[128]; - gfx_window_title_reset(); - gfx_get_fps(title_buf, sizeof(title_buf), false); - - rarch_video_info_t info = {0}; - info.width = video->width; - info.height = video->height; - info.fullscreen = video->fullscreen; - info.vsync = video->vsync; - info.force_aspect = video->force_aspect; - info.aspect_ratio = g_settings.video.aspect_ratio; - info.smooth = video->smooth; - info.input_scale = video->input_scale; - info.color_format = video->rgb32 ? RARCH_COLOR_FORMAT_XRGB8888 : RARCH_COLOR_FORMAT_RGB565; - info.xml_shader = xml_shader; - info.cg_shader = cg_shader; - info.ttf_font = font; - info.ttf_font_size = g_settings.video.font_size; - info.ttf_font_color = (font_color_r << 16) | (font_color_g << 8) | (font_color_b << 0); - info.title_hint = title_buf; - -#ifdef HAVE_PYTHON - info.python_state_new = py_state_new; - info.python_state_get = py_state_get; - info.python_state_free = py_state_free; -#endif - - const rarch_input_driver_t *input_driver = NULL; - ext->handle = ext->driver->init(&info, &input_driver); - if (!ext->handle) - return false; - - *input = input_driver ? &input_ext : NULL; - if (input_driver) - *input_data = setup_input(ext, input_driver); - else - *input_data = NULL; - - return true; -} - -static void *video_ext_init(const video_info_t *video, const input_driver_t **input, void **input_data) -{ - ext_t *ext = (ext_t*)calloc(1, sizeof(*ext)); - if (!ext) - return NULL; - - const rarch_video_driver_t *(*video_init)(void) = NULL; - - if (!(*g_settings.video.external_driver)) - { - RARCH_ERR("External driver needs video_external_driver path to be set.\n"); - goto error; - } - - g_lib = dylib_load(g_settings.video.external_driver); - if (!g_lib) - { - RARCH_ERR("Failed to open library: \"%s\"\n", g_settings.video.external_driver); - goto error; - } - - video_init = (const rarch_video_driver_t *(*)(void))dylib_proc(g_lib, "rarch_video_init"); - - if (!video_init) - { - RARCH_ERR("Couldn't find function rarch_video_init in library ...\n"); - goto error; - } - - ext->driver = video_init(); - if (!ext->driver) - { - RARCH_ERR("External driver returned invalid driver handle.\n"); - goto error; - } - - if (!setup_video(ext, video, input, input_data)) - { - RARCH_ERR("Failed to start driver.\n"); - goto error; - } - - g_video_dead = false; - return ext; - -error: - video_ext_free(ext); - return NULL; -} - -static void video_set_rotation(void *data, unsigned rot) -{ - ext_t *ext = (ext_t*)data; - ext->driver->set_rotation(ext->handle, rot); -} - -static void video_viewport_info(void *data, struct rarch_viewport *vp) -{ - ext_t *ext = (ext_t*)data; - - unsigned width = 0, height = 0; - ext->driver->viewport_size(ext->handle, &width, &height); - vp->x = vp->y = 0; - vp->width = width; - vp->height = height; -} - -static bool video_read_viewport(void *data, uint8_t *buffer) -{ - ext_t *ext = (ext_t*)data; - return ext->driver->read_viewport(ext->handle, buffer); -} - -#ifdef RARCH_CONSOLE -static void video_ext_gfx_start(void) {} -static void video_ext_gfx_restart(void) {} -static void video_ext_gfx_stop(void) {} -static void video_ext_gfx_apply_state_changes(void) {} -#endif - -const video_driver_t video_ext = { - video_ext_init, - video_ext_frame, - video_ext_set_nonblock_state, - video_ext_alive, - video_ext_focus, - NULL, - video_ext_free, - "ext", -#ifdef RARCH_CONSOLE - video_ext_gfx_start, - video_ext_gfx_stop, - video_ext_gfx_restart, - video_ext_gfx_apply_state_changes, -#endif - - video_set_rotation, - video_viewport_info, - video_read_viewport, -}; - diff --git a/retroarch.c b/retroarch.c index b2323dcec4..20f630176f 100644 --- a/retroarch.c +++ b/retroarch.c @@ -563,7 +563,7 @@ static void print_features(void) _PSUPP(dsound, "DirectSound", "audio driver"); _PSUPP(xaudio, "XAudio2", "audio driver"); _PSUPP(al, "OpenAL", "audio driver"); - _PSUPP(dylib, "External", "External filter and driver support"); + _PSUPP(dylib, "External", "External filter and plugin support"); _PSUPP(cg, "Cg", "Cg pixel shaders"); _PSUPP(xml, "XML", "bSNES XML pixel shaders"); _PSUPP(sdl_image, "SDL_image", "SDL_image image loading"); diff --git a/retroarch.cfg b/retroarch.cfg index 5880f94dd8..4bbef20b51 100644 --- a/retroarch.cfg +++ b/retroarch.cfg @@ -36,12 +36,9 @@ #### Video -# Video driver to use. "gl", "xvideo", "sdl" or "ext" (external API driver) +# Video driver to use. "gl", "xvideo", "sdl" # video_driver = "gl" -# Path to external video driver using the RetroArch driver API. -# video_external_driver = - # Windowed xscale and yscale # (Real x res: base_size * xscale * aspect_ratio, real y res: base_size * yscale) # video_xscale = 3.0 @@ -158,12 +155,9 @@ # When altering audio_in_rate on-the-fly, define by how much each time. # audio_rate_step = 0.25 -# Audio driver backend. Depending on configuration possible candidates are: alsa, pulse, oss, jack, rsound, roar, openal, sdl, xaudio and ext (external driver). +# Audio driver backend. Depending on configuration possible candidates are: alsa, pulse, oss, jack, rsound, roar, openal, sdl, xaudio. # audio_driver = -# Path to external audio driver using the RetroArch audio driver API. -# audio_external_driver = - # Override the default audio device the audio_driver uses. This is driver dependant. E.g. ALSA wants a PCM device, OSS wants a path (e.g. /dev/dsp), Jack wants portnames (e.g. system:playback1,system:playback_2), and so on ... # audio_device = diff --git a/settings.c b/settings.c index ff9a28a8c9..eae1e174b8 100644 --- a/settings.c +++ b/settings.c @@ -478,8 +478,6 @@ bool config_load_file(const char *path) #ifdef HAVE_DYLIB CONFIG_GET_PATH(video.filter_path, "video_filter"); - CONFIG_GET_PATH(video.external_driver, "video_external_driver"); - CONFIG_GET_PATH(audio.external_driver, "audio_external_driver"); #endif #if defined(HAVE_CG) || defined(HAVE_XML)