use std::ptr::NonNull;
use std::{ffi::c_int, mem::MaybeUninit};
use crate::Guid;
use crate::studio::{Bank, Bus, EventDescription, Vca, get_string_out_size};
use crate::{FmodResultExt, Result};
use fmod_sys::*;
use lanyard::Utf8CString;
impl Bank {
pub fn bus_count(&self) -> Result<c_int> {
let mut count = 0;
unsafe {
FMOD_Studio_Bank_GetBusCount(self.inner.as_ptr(), &raw mut count).to_result()?;
}
Ok(count)
}
pub fn get_bus_list(&self) -> Result<Vec<Bus>> {
let expected_count = self.bus_count()?;
let mut count = 0;
let mut list = vec![
Bus {
inner: NonNull::dangling(), };
expected_count as usize
];
unsafe {
FMOD_Studio_Bank_GetBusList(
self.inner.as_ptr(),
list.as_mut_ptr().cast::<*mut FMOD_STUDIO_BUS>(),
list.capacity() as c_int,
&raw mut count,
)
.to_result()?;
debug_assert_eq!(count, expected_count);
Ok(list)
}
}
pub fn get_bus_list_into(&self, slice: &mut [Option<Bus>]) -> Result<c_int> {
let mut count = 0;
unsafe {
FMOD_Studio_Bank_GetBusList(
self.inner.as_ptr(),
slice.as_mut_ptr().cast(),
slice.len() as c_int,
&raw mut count,
)
.to_result()?;
Ok(count)
}
}
pub fn event_count(&self) -> Result<c_int> {
let mut count = 0;
unsafe {
FMOD_Studio_Bank_GetEventCount(self.inner.as_ptr(), &raw mut count).to_result()?;
}
Ok(count)
}
pub fn get_event_list(&self) -> Result<Vec<EventDescription>> {
let expected_count = self.event_count()?;
let mut count = 0;
let mut list = vec![std::ptr::null_mut(); expected_count as usize];
unsafe {
FMOD_Studio_Bank_GetEventList(
self.inner.as_ptr(),
list.as_mut_ptr(),
list.capacity() as c_int,
&raw mut count,
)
.to_result()?;
debug_assert_eq!(count, expected_count);
Ok(std::mem::transmute::<
Vec<*mut fmod_sys::FMOD_STUDIO_EVENTDESCRIPTION>,
Vec<EventDescription>,
>(list))
}
}
pub fn get_event_list_into(&self, slice: &mut [Option<EventDescription>]) -> Result<c_int> {
let mut count = 0;
unsafe {
FMOD_Studio_Bank_GetEventList(
self.inner.as_ptr(),
slice.as_mut_ptr().cast(),
slice.len() as c_int,
&raw mut count,
)
.to_result()?;
Ok(count)
}
}
pub fn string_count(&self) -> Result<c_int> {
let mut count = 0;
unsafe {
FMOD_Studio_Bank_GetStringCount(self.inner.as_ptr(), &raw mut count).to_result()?;
}
Ok(count)
}
pub fn get_string_info(&self, index: c_int) -> Result<(Guid, Utf8CString)> {
let mut guid = MaybeUninit::zeroed();
let path = get_string_out_size(|path, size, ret| unsafe {
FMOD_Studio_Bank_GetStringInfo(
self.inner.as_ptr(),
index,
guid.as_mut_ptr(),
path,
size,
ret,
)
})?;
let guid = unsafe { guid.assume_init().into() };
Ok((guid, path))
}
pub fn vca_count(&self) -> Result<c_int> {
let mut count = 0;
unsafe {
FMOD_Studio_Bank_GetVCACount(self.inner.as_ptr(), &raw mut count).to_result()?;
}
Ok(count)
}
pub fn get_vca_list(&self) -> Result<Vec<Vca>> {
let expected_count = self.event_count()?;
let mut count = 0;
let mut list = vec![
Vca {
inner: NonNull::dangling(), };
expected_count as usize
];
unsafe {
FMOD_Studio_Bank_GetVCAList(
self.inner.as_ptr(),
list.as_mut_ptr().cast::<*mut FMOD_STUDIO_VCA>(),
list.capacity() as c_int,
&raw mut count,
)
.to_result()?;
debug_assert_eq!(count, expected_count);
Ok(list)
}
}
pub fn get_vca_list_into(&self, slice: &mut [Option<Vca>]) -> Result<c_int> {
let mut count = 0;
unsafe {
FMOD_Studio_Bank_GetVCAList(
self.inner.as_ptr(),
slice.as_mut_ptr().cast(),
slice.len() as c_int,
&raw mut count,
)
.to_result()?;
Ok(count)
}
}
}