use std::{ffi::c_float, mem::MaybeUninit, ptr::NonNull};
use fmod_sys::*;
use lanyard::Utf8CString;
use crate::Guid;
use crate::{FmodResultExt, Result};
use super::get_string_out_size;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[repr(transparent)] pub struct Vca {
pub(crate) inner: NonNull<FMOD_STUDIO_VCA>,
}
#[cfg(not(feature = "thread-unsafe"))]
unsafe impl Send for Vca {}
#[cfg(not(feature = "thread-unsafe"))]
unsafe impl Sync for Vca {}
impl Vca {
pub unsafe fn from_ffi(value: *mut FMOD_STUDIO_VCA) -> Self {
let inner = NonNull::new(value).unwrap();
Vca { inner }
}
pub fn as_ptr(self) -> *mut FMOD_STUDIO_VCA {
self.inner.as_ptr()
}
}
impl From<Vca> for *mut FMOD_STUDIO_VCA {
fn from(value: Vca) -> Self {
value.inner.as_ptr()
}
}
impl Vca {
pub fn set_volume(&self, volume: c_float) -> Result<()> {
unsafe { FMOD_Studio_VCA_SetVolume(self.inner.as_ptr(), volume).to_result() }
}
pub fn get_volume(&self) -> Result<(c_float, c_float)> {
let mut volume = 0.0;
let mut final_volume = 0.0;
unsafe {
FMOD_Studio_VCA_GetVolume(self.inner.as_ptr(), &raw mut volume, &raw mut final_volume)
.to_result()?;
}
Ok((volume, final_volume))
}
}
impl Vca {
pub fn get_id(&self) -> Result<Guid> {
let mut guid = MaybeUninit::zeroed();
unsafe {
FMOD_Studio_VCA_GetID(self.inner.as_ptr(), guid.as_mut_ptr()).to_result()?;
let guid = guid.assume_init().into();
Ok(guid)
}
}
pub fn get_path(&self) -> Result<Utf8CString> {
get_string_out_size(|path, size, ret| unsafe {
FMOD_Studio_VCA_GetPath(self.inner.as_ptr(), path, size, ret)
})
}
pub fn is_valid(&self) -> bool {
unsafe { FMOD_Studio_VCA_IsValid(self.inner.as_ptr()).into() }
}
}