/* RetroArch - A frontend for libretro.
* Copyright (C) 2011-2015 - 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 .
*/
#ifndef __RETROARCH_DATA_RUNLOOP_H
#define __RETROARCH_DATA_RUNLOOP_H
#include
#include
#include
#include
#include
#ifdef HAVE_THREADS
#include
#endif
#ifdef HAVE_LIBRETRODB
#include "database_info.h"
#endif
#include "tasks/tasks.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef int (*transfer_cb_t)(void *data, size_t len);
enum runloop_data_type
{
DATA_TYPE_NONE = 0,
DATA_TYPE_FILE,
DATA_TYPE_IMAGE,
DATA_TYPE_HTTP,
DATA_TYPE_OVERLAY,
DATA_TYPE_DB,
};
#ifdef HAVE_NETWORKING
enum http_status_enum
{
HTTP_STATUS_POLL = 0,
HTTP_STATUS_CONNECTION_TRANSFER,
HTTP_STATUS_CONNECTION_TRANSFER_PARSE,
HTTP_STATUS_TRANSFER,
HTTP_STATUS_TRANSFER_PARSE,
HTTP_STATUS_TRANSFER_PARSE_FREE,
};
typedef struct http_handle
{
struct
{
struct http_connection_t *handle;
transfer_cb_t cb;
char elem1[PATH_MAX_LENGTH];
} connection;
msg_queue_t *msg_queue;
struct http_t *handle;
transfer_cb_t cb;
unsigned status;
} http_handle_t;
#endif
typedef struct nbio_image_handle
{
struct texture_image ti;
bool is_blocking;
bool is_blocking_on_processing;
bool is_finished;
transfer_cb_t cb;
#ifdef HAVE_RPNG
struct rpng_t *handle;
#endif
unsigned processing_pos_increment;
unsigned pos_increment;
uint64_t frame_count;
uint64_t processing_frame_count;
int processing_final_state;
msg_queue_t *msg_queue;
unsigned status;
} nbio_image_handle_t;
enum nbio_image_status_enum
{
NBIO_IMAGE_STATUS_POLL = 0,
NBIO_IMAGE_STATUS_TRANSFER,
NBIO_IMAGE_STATUS_TRANSFER_PARSE,
NBIO_IMAGE_STATUS_PROCESS_TRANSFER,
NBIO_IMAGE_STATUS_PROCESS_TRANSFER_PARSE,
NBIO_IMAGE_STATUS_TRANSFER_PARSE_FREE,
};
enum nbio_status_enum
{
NBIO_STATUS_POLL = 0,
NBIO_STATUS_TRANSFER,
NBIO_STATUS_TRANSFER_PARSE,
NBIO_STATUS_TRANSFER_PARSE_FREE,
};
typedef struct nbio_handle
{
nbio_image_handle_t image;
bool is_finished;
transfer_cb_t cb;
struct nbio_t *handle;
unsigned pos_increment;
uint64_t frame_count;
msg_queue_t *msg_queue;
unsigned status;
} nbio_handle_t;
#ifdef HAVE_LIBRETRODB
typedef struct database_state_handle
{
database_info_list_t *info;
struct string_list *list;
size_t list_index;
size_t entry_index;
uint32_t crc;
uint8_t *buf;
char zip_name[PATH_MAX_LENGTH];
} database_state_handle_t;
typedef struct db_handle
{
database_state_handle_t state;
database_info_handle_t *handle;
msg_queue_t *msg_queue;
unsigned status;
} db_handle_t;
#endif
typedef struct data_runloop
{
#ifdef HAVE_NETWORKING
http_handle_t http;
#endif
#ifdef HAVE_LIBRETRODB
db_handle_t db;
#endif
nbio_handle_t nbio;
bool inited;
#ifdef HAVE_THREADS
bool thread_inited;
unsigned thread_code;
bool alive;
slock_t *lock;
slock_t *cond_lock;
slock_t *overlay_lock;
scond_t *cond;
sthread_t *thread;
#endif
} data_runloop_t;
void rarch_main_data_msg_queue_push(unsigned type,
const char *msg, const char *msg2,
unsigned prio, unsigned duration, bool flush);
void rarch_main_data_clear_state(void);
void rarch_main_data_iterate(void);
void rarch_main_data_deinit(void);
void rarch_main_data_free(void);
void rarch_main_data_init_queues(void);
bool rarch_main_data_active(data_runloop_t *runloop);
data_runloop_t *rarch_main_data_get_ptr(void);
#ifdef __cplusplus
}
#endif
#endif