log support
This commit is contained in:
parent
140f988e99
commit
d9f1d789ca
|
@ -4,6 +4,9 @@ version = "0.1.0"
|
||||||
authors = ["lifning <lifning+git@pm.me>"]
|
authors = ["lifning <lifning+git@pm.me>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
cc = "^1"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
libretro-sys = "^0.1"
|
libretro-sys = "^0.1"
|
||||||
failure = "^0.1"
|
failure = "^0.1"
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
cc::Build::new()
|
||||||
|
.file("src/retro/c_ext/log_wrapper.c")
|
||||||
|
.compile("log_wrapper");
|
||||||
|
}
|
|
@ -261,6 +261,10 @@ impl retro::wrapper::Handler for MyEmulator {
|
||||||
self.av_info.geometry = geom;
|
self.av_info.geometry = geom;
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn log_print(&mut self, level: retro::ffi::LogLevel, msg: &str) {
|
||||||
|
eprint!("[{:?}] {}", level, msg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include "libretro.h"
|
||||||
|
|
||||||
|
typedef void (*rust_retro_ffi_log_print_t)(enum retro_log_level level, const char* msg);
|
||||||
|
rust_retro_ffi_log_print_t g_rust_retro_ffi_log_print = NULL;
|
||||||
|
|
||||||
|
void retro_log_snprintf_wrapper(enum retro_log_level level, const char* fmt, ...)
|
||||||
|
{
|
||||||
|
if (g_rust_retro_ffi_log_print != NULL)
|
||||||
|
{
|
||||||
|
char msg[4096];
|
||||||
|
|
||||||
|
va_list args;
|
||||||
|
va_start(args, fmt);
|
||||||
|
vsnprintf(msg, sizeof(msg), fmt, args);
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
g_rust_retro_ffi_log_print(level, msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool c_ext_handle_get_log_interface(struct retro_log_callback* retro_cb)
|
||||||
|
{
|
||||||
|
retro_cb->log = retro_log_snprintf_wrapper;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void c_ext_set_log_print_cb(rust_retro_ffi_log_print_t cb)
|
||||||
|
{
|
||||||
|
g_rust_retro_ffi_log_print = cb;
|
||||||
|
}
|
|
@ -2,7 +2,7 @@ use core::convert::TryInto;
|
||||||
use core::ffi::c_void;
|
use core::ffi::c_void;
|
||||||
use core::slice::from_raw_parts;
|
use core::slice::from_raw_parts;
|
||||||
|
|
||||||
use std::ffi::CString;
|
use std::ffi::{CString, CStr};
|
||||||
use std::os::raw::{c_uint, c_char};
|
use std::os::raw::{c_uint, c_char};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
|
@ -17,6 +17,19 @@ static mut CB_SINGLETON: StaticCallbacks = StaticCallbacks {
|
||||||
handler: None,
|
handler: None,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub type WrappedLogPrintFn = extern "C" fn(level: LogLevel, fmt: *const c_char);
|
||||||
|
extern "C" {
|
||||||
|
fn c_ext_handle_get_log_interface(cb: *mut LogCallback) -> bool;
|
||||||
|
fn c_ext_set_log_print_cb(cb: WrappedLogPrintFn);
|
||||||
|
}
|
||||||
|
extern "C" fn rust_retro_ffi_log_print(level: LogLevel, msg: *const c_char) {
|
||||||
|
unsafe {
|
||||||
|
if let Some(cb) = CB_SINGLETON.handler.as_mut() {
|
||||||
|
cb.log_print(level, CStr::from_ptr(msg).to_string_lossy().as_ref());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
pub trait Handler: Unpin + 'static {
|
pub trait Handler: Unpin + 'static {
|
||||||
fn _delegate_handler(&self) -> Option<&mut dyn Handler> { None }
|
fn _delegate_handler(&self) -> Option<&mut dyn Handler> { None }
|
||||||
|
@ -66,6 +79,9 @@ pub trait Handler: Unpin + 'static {
|
||||||
fn get_username(&mut self) -> Option<String> { None }
|
fn get_username(&mut self) -> Option<String> { None }
|
||||||
fn get_language(&mut self) -> Option<Language> { None }
|
fn get_language(&mut self) -> Option<Language> { None }
|
||||||
// fn set_serialization_quirks(&mut self, quirks: &mut u64) -> bool { false }
|
// fn set_serialization_quirks(&mut self, quirks: &mut u64) -> bool { false }
|
||||||
|
|
||||||
|
// -- environment-set callbacks (API extensions) --
|
||||||
|
fn log_print(&mut self, level: LogLevel, msg: &str) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
|
@ -123,7 +139,7 @@ impl StaticCallbacks {
|
||||||
EnvCmd::GetInputDeviceCapabilities => Self::clone_into_void(data, &handler.get_input_device_capabilities()?)?,
|
EnvCmd::GetInputDeviceCapabilities => Self::clone_into_void(data, &handler.get_input_device_capabilities()?)?,
|
||||||
// TODO EnvCmd::GetSensorInterface => {},
|
// TODO EnvCmd::GetSensorInterface => {},
|
||||||
// TODO EnvCmd::GetCameraInterface => {},
|
// TODO EnvCmd::GetCameraInterface => {},
|
||||||
// TODO EnvCmd::GetLogInterface => {},
|
EnvCmd::GetLogInterface => unsafe { c_ext_handle_get_log_interface(data as *mut LogCallback) },
|
||||||
// TODO EnvCmd::GetPerfInterface => {},
|
// TODO EnvCmd::GetPerfInterface => {},
|
||||||
// TODO EnvCmd::GetLocationInterface => {},
|
// TODO EnvCmd::GetLocationInterface => {},
|
||||||
EnvCmd::GetCoreAssetsDirectory => Self::path_into_void(data, handler.get_core_assets_directory()?)?,
|
EnvCmd::GetCoreAssetsDirectory => Self::path_into_void(data, handler.get_core_assets_directory()?)?,
|
||||||
|
@ -210,6 +226,7 @@ impl From<LibretroApi> for LibretroWrapper {
|
||||||
api.set_audio_sample_batch(StaticCallbacks::audio_sample_batch_cb);
|
api.set_audio_sample_batch(StaticCallbacks::audio_sample_batch_cb);
|
||||||
api.set_input_poll(StaticCallbacks::input_poll_cb);
|
api.set_input_poll(StaticCallbacks::input_poll_cb);
|
||||||
api.set_input_state(StaticCallbacks::input_state_cb);
|
api.set_input_state(StaticCallbacks::input_state_cb);
|
||||||
|
unsafe { c_ext_set_log_print_cb(rust_retro_ffi_log_print); }
|
||||||
LibretroWrapper { api }
|
LibretroWrapper { api }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue