soloud 1.1.1

Rust bindings for the soloud audio engine
Documentation
macro_rules! impl_load_ext {
    ($name: ident) => {
        paste::paste! {
            unsafe impl LoadExt for $name {
                fn load<P: AsRef<Path>>(&mut self, path: P) -> Result<(), SoloudError> {
                    let c = path.as_ref().to_str().ok_or(SoloudError::Internal(SoloudErrorKind::FileLoadFailed))?;
                    let val = if cfg!(target_os = "windows") {
                        c.chars().all(|c| c.is_ascii_lowercase())
                    } else {
                        true
                    };
                    if !val {
                        let bytes = std::fs::read(path)?;
                        self.load_mem(&bytes)?;
                        Ok(())
                    } else {
                        unsafe {
                            let path = std::ffi::CString::new(path.as_ref().to_str().ok_or(SoloudError::Internal(SoloudErrorKind::FileLoadFailed))?)?;
                            let ret = soloud_sys::soloud::[<$name _load>](self.inner, path.as_ref().as_ptr());
                            if ret != 0 {
                                Err(SoloudError::Internal(SoloudErrorKind::from_i32(ret)))
                            } else {
                                Ok(())
                            }
                        }
                    }
                }

                unsafe fn _load_mem_ex(&mut self, data: &[u8], copy: bool, take_ownership: bool) -> Result<(), SoloudError> {
                    unsafe {
                        let ret = soloud_sys::soloud::[<$name _loadMemEx>](self.inner, data.as_ptr(), data.len() as u32, copy as i32, take_ownership as i32);
                        if ret != 0 {
                            Err(SoloudError::Internal(SoloudErrorKind::from_i32(ret)))
                        } else {
                            Ok(())
                        }
                    }
                }
            }
        }
    };
}

pub(crate) use impl_load_ext;