use libfmod::ffi::{
FMOD_CHANNELCONTROL_DSP_HEAD, FMOD_CHANNELCONTROL_DSP_TAIL, FMOD_DEFAULT, FMOD_INIT_NORMAL,
};
use libfmod::{DspConnectionType, DspParameterFft, DspType, Error, System};
#[test]
fn test_dsp_effect_to_channel() -> Result<(), Error> {
let system = System::create()?;
system.init(512, FMOD_INIT_NORMAL, None)?;
let sound = system.create_sound("./tests/data/Assets/1.ogg", FMOD_DEFAULT, None)?;
let channel = system.play_sound(sound, None, false)?;
let echo = system.create_dsp_by_type(DspType::Echo)?;
channel.add_dsp(0, echo)?;
while channel.is_playing()? {
}
system.release()
}
#[test]
fn test_fft_dsp() -> Result<(), Error> {
let system = System::create()?;
system.init(512, FMOD_INIT_NORMAL, None)?;
let sound = system.create_sound("./tests/data/Assets/2.ogg", FMOD_DEFAULT, None)?;
let channel = system.play_sound(sound, None, false)?;
let dsp = system.create_dsp_by_type(DspType::Fft)?;
channel.add_dsp(0, dsp)?;
while channel.is_playing()? {}
let fft = DspParameterFft::try_from(dsp)?;
assert_eq!(fft.spectrum.len(), 2);
assert_eq!(fft.length, 2048);
assert_eq!(fft.spectrum[0].len(), 2048);
assert_eq!(fft.spectrum[1].len(), 2048);
system.release()
}
#[test]
fn test_fft_from_type_mismatched_dsp() -> Result<(), Error> {
let system = System::create()?;
system.init(512, FMOD_INIT_NORMAL, None)?;
let sound = system.create_sound("./tests/data/Assets/1.ogg", FMOD_DEFAULT, None)?;
let channel = system.play_sound(sound, None, false)?;
let echo_dsp = system.create_dsp_by_type(DspType::Echo)?;
channel.add_dsp(0, echo_dsp)?;
let fft = DspParameterFft::try_from(echo_dsp);
assert_eq!(
"trying get FFT from DSP which not FFT",
format!("{}", fft.err().unwrap())
);
system.release()
}
#[test]
fn test_dps_description_name() -> Result<(), Error> {
let system = System::create()?;
system.init(512, FMOD_INIT_NORMAL, None)?;
let description = system.get_dsp_info_by_type(DspType::Echo)?;
let bytes = description.name.map(|char| char as u8).to_vec();
let name = String::from_utf8(bytes[..9].to_vec());
assert_eq!(name, Ok("FMOD Echo".to_string()));
system.release()
}
#[test]
fn test_channels_dsp() -> Result<(), Error> {
let system = System::create()?;
system.init(512, FMOD_INIT_NORMAL, None)?;
let reverb = system.create_dsp_by_type(DspType::Sfxreverb)?;
let master = system.get_master_channel_group()?;
let tail = master.get_dsp(FMOD_CHANNELCONTROL_DSP_TAIL)?;
tail.add_input(reverb, DspConnectionType::Send)?;
reverb.set_active(true)?;
let sound = system.create_sound("./tests/data/Assets/2.ogg", FMOD_DEFAULT, None)?;
let channel = system.play_sound(sound, Some(master), true)?;
let head = channel.get_dsp(FMOD_CHANNELCONTROL_DSP_HEAD)?;
reverb.add_input(head, DspConnectionType::Send)?;
channel.set_paused(false)?;
while channel.is_playing()? {
}
system.release()
}
#[test]
fn test_controlling_mix_level() -> Result<(), Error> {
let system = System::create()?;
system.init(512, FMOD_INIT_NORMAL, None)?;
let reverb = system.create_dsp_by_type(DspType::Sfxreverb)?;
let sound = system.create_sound("./tests/data/Assets/1.ogg", FMOD_DEFAULT, None)?;
let channel = system.play_sound(sound, None, true)?;
let head = channel.get_dsp(FMOD_CHANNELCONTROL_DSP_HEAD)?;
let connection = reverb.add_input(head, DspConnectionType::Send)?;
connection.set_mix(0.0)?;
system.release()
}
#[test]
fn test_output_pan_matrix() -> Result<(), Error> {
let system = System::create()?;
system.init(512, FMOD_INIT_NORMAL, None)?;
let sound = system.create_sound("./tests/data/Assets/2.ogg", FMOD_DEFAULT, None)?;
let channel = system.play_sound(sound, None, true)?;
let head = channel.get_dsp(FMOD_CHANNELCONTROL_DSP_HEAD)?;
let mut matrix = [
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0,
];
let (_, connection) = head.get_output(0)?;
connection.set_mix_matrix(Some(matrix.as_mut_ptr()), 4, 4, None)?;
system.release()
}