play96 0.3.2

Programmable libretro harness for *96 fantasy-console cores
Documentation
#ifndef PLAY96_H
#define PLAY96_H

#include <stddef.h>
#include <stdint.h>

#ifdef _WIN32
#ifdef PLAY96_BUILD
#define PLAY96_API __declspec(dllexport)
#else
#define PLAY96_API __declspec(dllimport)
#endif
#else
#define PLAY96_API
#endif

#ifdef __cplusplus
extern "C" {
#endif

typedef struct play96_session play96_session;

typedef struct play96_color {
    uint8_t red;
    uint8_t green;
    uint8_t blue;
    uint8_t alpha;
} play96_color;

typedef enum play96_mouse_button {
    PLAY96_MOUSE_LEFT = 2,
    PLAY96_MOUSE_RIGHT = 3,
    PLAY96_MOUSE_MIDDLE = 6,
    PLAY96_MOUSE_BUTTON4 = 9,
    PLAY96_MOUSE_BUTTON5 = 10
} play96_mouse_button;

typedef enum play96_input_device {
    PLAY96_DEVICE_NONE = 0,
    PLAY96_DEVICE_JOYPAD = 1,
    PLAY96_DEVICE_MOUSE = 2,
    PLAY96_DEVICE_KEYBOARD = 3
} play96_input_device;

enum {
    PLAY96_KEY_BACKSPACE = 8,
    PLAY96_KEY_TAB = 9,
    PLAY96_KEY_RETURN = 13,
    PLAY96_KEY_ESCAPE = 27,
    PLAY96_KEY_SPACE = 32,
    PLAY96_KEY_DELETE = 127,
    PLAY96_KEY_UP = 273,
    PLAY96_KEY_DOWN = 274,
    PLAY96_KEY_RIGHT = 275,
    PLAY96_KEY_LEFT = 276,
    PLAY96_KEY_LEFT_SHIFT = 304,
    PLAY96_KEY_LEFT_CTRL = 306,
    PLAY96_KEY_LEFT_ALT = 308
};

/* Returns NULL on success. The returned error remains valid until the next API call on this session. */
PLAY96_API const char* play96_create(const char* core_path, const char* cartridge_path, play96_session** out_session);
PLAY96_API void play96_destroy(play96_session* session);
PLAY96_API const char* play96_run_frame(play96_session* session);
PLAY96_API const char* play96_run_frames(play96_session* session, size_t frames);
PLAY96_API const char* play96_set_button(play96_session* session, unsigned port, unsigned button, int pressed);
PLAY96_API const char* play96_clear_buttons(play96_session* session, unsigned port);
PLAY96_API const char* play96_set_controller_device(play96_session* session, unsigned port, play96_input_device device);
PLAY96_API const char* play96_set_key(play96_session* session, uint32_t keycode, int pressed);
PLAY96_API const char* play96_clear_keys(play96_session* session);
PLAY96_API const char* play96_set_mouse_delta(play96_session* session, int16_t x, int16_t y);
PLAY96_API const char* play96_set_mouse_button(play96_session* session, size_t button, int pressed);
PLAY96_API const char* play96_clear_mouse_buttons(play96_session* session);
PLAY96_API const char* play96_set_mouse_wheel(play96_session* session, int16_t vertical, int16_t horizontal);
PLAY96_API unsigned play96_framebuffer_width(const play96_session* session);
PLAY96_API unsigned play96_framebuffer_height(const play96_session* session);
PLAY96_API uint32_t play96_pixel_xrgb(const play96_session* session, unsigned x, unsigned y);
PLAY96_API const char* play96_assert_pixel(const play96_session* session, unsigned x, unsigned y, play96_color expected);
PLAY96_API const char* play96_assert_pixel_xrgb(const play96_session* session, unsigned x, unsigned y, uint32_t expected);
/* Interleaved signed 16-bit stereo samples from the most recently run frame. */
PLAY96_API const int16_t* play96_audio_samples(const play96_session* session);
PLAY96_API size_t play96_audio_sample_count(const play96_session* session);
PLAY96_API size_t play96_audio_frame_count(const play96_session* session);
PLAY96_API double play96_audio_sample_rate(const play96_session* session);
PLAY96_API uint64_t play96_audio_hash(const play96_session* session);
PLAY96_API const char* play96_assert_audio_sample(const play96_session* session, size_t frame, size_t channel, int16_t expected, uint16_t tolerance);
PLAY96_API const char* play96_assert_audio_hash(const play96_session* session, uint64_t expected);
PLAY96_API const char* play96_save_state(play96_session* session, const char* path);
PLAY96_API const char* play96_load_state(play96_session* session, const char* path);
PLAY96_API const char* play96_write_png(const play96_session* session, const char* path);
PLAY96_API const char* play96_last_error(const play96_session* session);

#ifdef __cplusplus
}
#endif

#endif