#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
};
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);
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