use std::ffi::CStr;
use std::os::raw::c_char;
use crate::backend::{Signal, Waveform, WaveformArgs};
use crate::frontends::c::waveform_result::WaveformResult;
#[no_mangle]
pub extern "C" fn babycat_waveform_args_init_default() -> WaveformArgs {
WaveformArgs::default()
}
#[allow(clippy::missing_safety_doc)]
#[no_mangle]
pub unsafe extern "C" fn babycat_waveform_free(waveform: *mut Waveform) {
Box::from_raw(waveform);
}
#[no_mangle]
pub extern "C" fn babycat_waveform_from_frames_of_silence(
frame_rate_hz: u32,
num_channels: u16,
num_frames: usize,
) -> *mut Waveform {
Waveform::from_frames_of_silence(frame_rate_hz, num_channels, num_frames).into()
}
#[allow(clippy::missing_safety_doc)]
#[allow(clippy::missing_panics_doc)]
#[no_mangle]
pub extern "C" fn babycat_waveform_from_milliseconds_of_silence(
frame_rate_hz: u32,
num_channels: u16,
duration_milliseconds: usize,
) -> *mut Waveform {
Waveform::from_milliseconds_of_silence(frame_rate_hz, num_channels, duration_milliseconds)
.into()
}
#[allow(clippy::missing_safety_doc)]
#[allow(clippy::missing_panics_doc)]
#[no_mangle]
pub unsafe extern "C" fn babycat_waveform_from_encoded_bytes_with_hint(
encoded_bytes: *mut u8,
encoded_bytes_len: usize,
waveform_args: WaveformArgs,
file_extension: *const c_char,
mime_type: *const c_char,
) -> WaveformResult {
let encoded_bytes_vec =
Vec::<u8>::from_raw_parts(encoded_bytes, encoded_bytes_len, encoded_bytes_len);
let file_extension_str = CStr::from_ptr(file_extension).to_str().unwrap();
let mime_type_str = CStr::from_ptr(mime_type).to_str().unwrap();
Waveform::from_encoded_bytes_with_hint(
&encoded_bytes_vec,
waveform_args,
file_extension_str,
mime_type_str,
)
.into()
}
#[allow(clippy::missing_safety_doc)]
#[no_mangle]
pub unsafe extern "C" fn babycat_waveform_from_encoded_bytes(
encoded_bytes: *mut u8,
encoded_bytes_len: usize,
waveform_args: WaveformArgs,
) -> WaveformResult {
let encoded_bytes_vec =
Vec::<u8>::from_raw_parts(encoded_bytes, encoded_bytes_len, encoded_bytes_len);
Waveform::from_encoded_bytes(&encoded_bytes_vec, waveform_args).into()
}
#[allow(clippy::missing_safety_doc)]
#[allow(clippy::missing_panics_doc)]
#[no_mangle]
pub unsafe extern "C" fn babycat_waveform_from_file(
filename: *const c_char,
waveform_args: WaveformArgs,
) -> WaveformResult {
let filename_rust = CStr::from_ptr(filename).to_str().unwrap();
Waveform::from_file(filename_rust, waveform_args).into()
}
#[allow(clippy::missing_safety_doc)]
#[no_mangle]
pub unsafe extern "C" fn babycat_waveform_get_frame_rate_hz(waveform: *mut Waveform) -> u32 {
(*(waveform)).frame_rate_hz()
}
#[allow(clippy::missing_safety_doc)]
#[no_mangle]
pub unsafe extern "C" fn babycat_waveform_get_num_channels(waveform: *mut Waveform) -> u16 {
(*(waveform)).num_channels()
}
#[allow(clippy::missing_safety_doc)]
#[no_mangle]
pub unsafe extern "C" fn babycat_waveform_get_num_frames(waveform: *mut Waveform) -> usize {
(*(waveform)).num_frames()
}
#[allow(clippy::missing_safety_doc)]
#[no_mangle]
pub unsafe extern "C" fn babycat_waveform_get_num_samples(waveform: *mut Waveform) -> usize {
let w = &*(waveform);
w.num_frames() * w.num_channels() as usize
}
#[allow(clippy::missing_safety_doc)]
#[allow(clippy::missing_panics_doc)]
#[no_mangle]
pub unsafe extern "C" fn babycat_waveform_to_interleaved_samples(
waveform: *mut Waveform,
) -> *const f32 {
waveform.as_ref().unwrap().to_interleaved_samples().as_ptr()
}
#[allow(clippy::missing_safety_doc)]
#[allow(clippy::missing_panics_doc)]
#[no_mangle]
pub unsafe extern "C" fn babycat_waveform_get_unchecked_sample(
waveform: *mut Waveform,
frame_idx: usize,
channel_idx: u16,
) -> f32 {
waveform
.as_ref()
.unwrap()
.get_unchecked_sample(frame_idx, channel_idx)
}
#[allow(clippy::missing_safety_doc)]
#[no_mangle]
pub unsafe extern "C" fn babycat_waveform_resample(
waveform: *mut Waveform,
frame_rate_hz: u32,
) -> WaveformResult {
(*(waveform)).resample(frame_rate_hz).into()
}
#[allow(clippy::missing_safety_doc)]
#[no_mangle]
pub unsafe extern "C" fn babycat_waveform_resample_by_mode(
waveform: *mut Waveform,
frame_rate_hz: u32,
resample_mode: u32,
) -> WaveformResult {
(*(waveform))
.resample_by_mode(frame_rate_hz, resample_mode)
.into()
}