1use rg3d_sound::engine::SoundEngine;
2use rg3d_sound::futures::executor::block_on;
3use rg3d_sound::{
4 algebra::{Point3, UnitQuaternion, Vector3},
5 buffer::{DataSource, SoundBufferResource},
6 context::{self, SoundContext},
7 effects::{reverb::Reverb, BaseEffect, Effect, EffectInput},
8 hrtf::HrirSphere,
9 renderer::{hrtf::HrtfRenderer, Renderer},
10 source::{generic::GenericSourceBuilder, spatial::SpatialSourceBuilder, SoundSource, Status},
11};
12use std::{
13 thread,
14 time::{self, Duration},
15};
16
17fn main() {
18 let hrir_sphere =
19 HrirSphere::from_file("examples/data/IRC_1002_C.bin", context::SAMPLE_RATE).unwrap();
20
21 let engine = SoundEngine::new();
23
24 let context = SoundContext::new();
26
27 engine.lock().unwrap().add_context(context.clone());
28
29 context
31 .state()
32 .set_renderer(Renderer::HrtfRenderer(HrtfRenderer::new(hrir_sphere)));
33
34 let base_effect = BaseEffect::default();
35
36 let mut reverb = Reverb::new(base_effect);
38 reverb.set_decay_time(Duration::from_secs_f32(10.0));
39 let reverb_handle = context.state().add_effect(Effect::Reverb(reverb));
40
41 let sound_buffer = SoundBufferResource::new_generic(
43 block_on(DataSource::from_file("examples/data/door_open.wav")).unwrap(),
44 )
45 .unwrap();
46 let source = SpatialSourceBuilder::new(
47 GenericSourceBuilder::new()
48 .with_buffer(sound_buffer)
49 .with_status(Status::Playing)
50 .build()
51 .unwrap(),
52 )
53 .build_source();
54 let door_sound = context.state().add_source(source);
55
56 context
59 .state()
60 .effect_mut(reverb_handle)
61 .add_input(EffectInput::direct(door_sound));
62
63 let sound_buffer = SoundBufferResource::new_generic(
64 block_on(DataSource::from_file("examples/data/drop.wav")).unwrap(),
65 )
66 .unwrap();
67 let source = SpatialSourceBuilder::new(
68 GenericSourceBuilder::new()
69 .with_buffer(sound_buffer)
70 .with_status(Status::Playing)
71 .with_looping(true)
72 .build()
73 .unwrap(),
74 )
75 .build_source();
76 let drop_sound_handle = context.state().add_source(source);
77
78 context
79 .state()
80 .effect_mut(reverb_handle)
81 .add_input(EffectInput::direct(drop_sound_handle));
82
83 let start_time = time::Instant::now();
85 let mut angle = 0.0f32;
86 while (time::Instant::now() - start_time).as_secs() < 360 {
87 if let SoundSource::Spatial(sound) = context.state().source_mut(drop_sound_handle) {
88 let axis = Vector3::y_axis();
89 let rotation_matrix =
90 UnitQuaternion::from_axis_angle(&axis, angle.to_radians()).to_homogeneous();
91 sound.set_position(
92 rotation_matrix
93 .transform_point(&Point3::new(0.0, 0.0, 1.0))
94 .coords,
95 );
96 }
97
98 angle += 1.6;
99
100 println!(
101 "Sound render time {:?}",
102 context.state().full_render_duration()
103 );
104
105 thread::sleep(Duration::from_millis(100));
107 }
108}