use e_utils::{
auto_any_res_c,
parse::{AutoParse as _, CAutoParse},
ui::{HWND, RECT},
CResult,
};
use libloading::{Library, Symbol};
use std::ffi::*;
use super::{PlayM4LastError, PlayStreamOpenMode};
use crate::net_sdk::play::DecCBFunWin;
use crate::Lib;
#[repr(C)]
#[derive(Default)]
pub struct HcNetPlayCoreSdk {
handle: c_long,
lib: Lib,
}
unsafe impl Send for HcNetPlayCoreSdk {}
unsafe impl Sync for HcNetPlayCoreSdk {}
impl HcNetPlayCoreSdk {
pub fn set_lib(&mut self, lib: Lib) {
self.lib = lib;
}
pub fn lib(&self) -> &Library {
self.lib.get()
}
pub fn free(&mut self) -> Option<()> {
self.lib.free()
}
}
impl HcNetPlayCoreSdk {
pub unsafe extern "C" fn get_last_error(&self, msg: *const c_char) -> CResult<PlayM4LastError> {
let func: Symbol<'_, unsafe extern "C" fn(nPort: c_long) -> c_ushort> =
auto_any_res_c!(self.lib().get(b"PlayM4_GetLastError\0"));
let res = func(self.handle);
CResult::Ok(PlayM4LastError {
code: res,
msg: format!("PlayM4LastError<{}<{}>>", msg.c_to_string(), res).to_c_char(),
})
}
pub unsafe extern "C" fn stop(&mut self) -> CResult<bool> {
let func: Symbol<'_, unsafe extern "C" fn(lRealHandle: c_long) -> bool> =
auto_any_res_c!(self.lib().get(b"PlayM4_Stop\0"));
let res = func(self.handle);
if res {
self.handle = -1
}
CResult::Ok(res)
}
pub unsafe extern "C" fn close_stream(&self) -> CResult<bool> {
let func: Symbol<'_, unsafe extern "C" fn(lRealHandle: c_long) -> bool> =
auto_any_res_c!(self.lib().get(b"PlayM4_CloseStream\0"));
let res = func(self.handle);
CResult::Ok(res)
}
pub unsafe extern "C" fn free_port(&self) -> CResult<bool> {
let func: Symbol<'_, unsafe extern "C" fn(lRealHandle: c_long) -> bool> =
auto_any_res_c!(self.lib().get(b"PlayM4_FreePort\0"));
let res = func(self.handle);
CResult::Ok(res)
}
pub unsafe extern "C" fn get_port_sdk(&mut self) -> CResult<bool> {
let func: Symbol<'_, unsafe extern "C" fn(lRealHandle: *mut c_long) -> bool> =
auto_any_res_c!(self.lib().get(b"PlayM4_GetPort\0"));
let res = func(&mut self.handle);
CResult::Ok(res)
}
pub unsafe extern "C" fn input_data(
&self,
p_buf: *const c_uchar,
n_size: c_uint,
) -> CResult<bool> {
let func: Symbol<
'_,
unsafe extern "C" fn(nPort: c_long, pBuf: *const c_uchar, nSize: c_uint) -> bool,
> = auto_any_res_c!(self.lib().get(b"PlayM4_InputData\0"));
let res = func(self.handle, p_buf, n_size);
CResult::Ok(res)
}
pub unsafe extern "C" fn start(&self, hwnd: HWND) -> CResult<bool> {
let func: Symbol<'_, unsafe extern "C" fn(nPort: c_long, hWnd: HWND) -> bool> =
auto_any_res_c!(self.lib().get(b"PlayM4_Play\0"));
let res = func(self.handle, hwnd);
CResult::Ok(res)
}
pub unsafe extern "C" fn set_display_region(
&self,
region_num: c_uint,
src_rect: *const RECT,
hwnd: HWND,
enable: bool,
) -> CResult<bool> {
let func: Symbol<
'_,
unsafe extern "C" fn(
nPort: c_long,
nRegionNum: c_uint,
pSrcRect: *const RECT,
hDestWnd: HWND,
bEnable: bool,
) -> bool,
> = auto_any_res_c!(self.lib().get(b"PlayM4_SetDisplayRegion\0"));
let res = func(self.handle, region_num, src_rect, hwnd, enable);
CResult::Ok(res)
}
pub unsafe extern "C" fn open_stream(
&self,
file_head_buf: *const c_uchar,
size: c_uint,
buf_pool_size: c_uint,
) -> CResult<bool> {
let func: Symbol<
'_,
unsafe extern "C" fn(
nPort: c_long,
pFileHeadBuf: *const c_uchar,
nSize: c_uint,
nBufPoolSize: c_uint,
) -> bool,
> = auto_any_res_c!(self.lib().get(b"PlayM4_OpenStream\0"));
let res = func(self.handle, file_head_buf, size, buf_pool_size);
CResult::Ok(res)
}
pub unsafe extern "C" fn set_stream_open_mode(&self, mode: PlayStreamOpenMode) -> CResult<bool> {
let func: Symbol<'_, unsafe extern "C" fn(nPort: c_long, nMode: c_uint) -> bool> =
auto_any_res_c!(self.lib().get(b"PlayM4_SetStreamOpenMode\0"));
let res = func(self.handle, mode as c_uint);
CResult::Ok(res)
}
pub unsafe extern "C" fn set_dec_callback_exmend(
&self,
dec_cb_fun: DecCBFunWin,
dest: *const c_void,
dest_size: c_long,
user: *const c_void,
) -> CResult<bool> {
let func: Symbol<
'_,
unsafe extern "C" fn(
nPort: c_long,
fDecCBFun: DecCBFunWin,
pDest: *const c_void,
nDestSize: c_long,
nUser: *const c_void,
) -> bool,
> = auto_any_res_c!(self.lib().get(b"PlayM4_SetDecCallBackExMend\0"));
let res = func(self.handle, dec_cb_fun, dest, dest_size, user);
CResult::Ok(res)
}
pub unsafe extern "C" fn convert_to_jpeg_file(
&self,
buf: *const c_char,
size: c_long,
width: c_long,
height: c_long,
ntype: c_long,
fname: *const c_char,
) -> CResult<bool> {
let func: Symbol<
'_,
unsafe extern "C" fn(
pBuf: *const c_char,
nSize: c_long,
nWidth: c_long,
nHeight: c_long,
nType: c_long,
sFileName: *const c_char,
) -> bool,
> = auto_any_res_c!(self.lib().get(b"PlayM4_ConvertToJpegFile\0"));
let res = func(buf, size, width, height, ntype, fname);
CResult::Ok(res)
}
pub unsafe extern "C" fn get_jepg(
&self,
play_handle: c_long,
jpeg: *mut c_uchar,
buf_size: c_uint,
jpeg_size: *mut c_uint,
) -> CResult<bool> {
let func: Symbol<
'_,
unsafe extern "C" fn(
nPort: c_long,
pJpeg: *mut c_uchar,
nBufSize: c_uint,
pJpegSize: *mut c_uint,
) -> bool,
> = auto_any_res_c!(self.lib().get(b"PlayM4_GetJPEG\0"));
let res = func(play_handle, jpeg, buf_size, jpeg_size);
CResult::Ok(res)
}
}