#![allow(clippy::missing_safety_doc)]
use crate::c;
use core::mem::size_of_val;
use corevm_types::{AudioMode, VideoFrameFormat, VideoMode};
#[inline]
pub fn gas() -> u64 {
unsafe { c::gas() }
}
#[inline]
pub unsafe fn alloc(size: u64) -> *mut u8 {
c::alloc(size) as *mut u8
}
#[inline]
pub unsafe fn free(address: *mut u8, size: u64) {
c::free(address as u64, size)
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ConsoleStream {
Stdout = 1,
Stderr = 2,
}
#[inline]
pub fn yield_console_data<S: AsRef<[u8]>>(stream: ConsoleStream, data: S) {
let bytes = data.as_ref();
let len = bytes.len() as u64;
unsafe { c::yield_console_data(stream as u64, bytes.as_ptr() as u64, len) };
}
#[inline]
pub fn yield_video_frame(frame: &[u8], format: VideoFrameFormat) {
let address = frame.as_ptr() as u64;
let len = size_of_val(frame) as u64;
unsafe { c::yield_video_frame(address, len, format as u64) };
}
#[inline]
pub fn video_mode(mode: VideoMode) {
unsafe {
c::video_mode(
u64::from(mode.width.get()),
u64::from(mode.height.get()),
u64::from(mode.refresh_rate.get()),
mode.options.as_u64(),
)
}
}
#[inline]
pub fn yield_audio_samples<T: AudioSample>(samples: &[T]) {
let address = samples.as_ptr() as u64;
let len = size_of_val(samples) as u64;
unsafe { c::yield_audio_samples(address, len) };
}
pub trait AudioSample: Copy + Sized {}
impl AudioSample for u8 {}
impl AudioSample for i16 {}
#[inline]
pub fn audio_mode(mode: AudioMode) {
unsafe {
c::audio_mode(
u64::from(mode.channels.get()),
u64::from(mode.sample_rate.get()),
mode.sample_format as u64,
)
}
}