pub struct State {
pub serialization_options: SerializationOptions,
/* private fields */
}Expand description
Internal state of context.
Fields§
§serialization_options: SerializationOptionsA set of flags, that can be used to define what should be skipped during the serialization of a sound context.
Implementations§
Source§impl State
impl State
pub const SOURCES: &'static str = "sources"
pub const LISTENER: &'static str = "listener"
pub const RENDER_DURATION: &'static str = "render_duration"
pub const RENDERER: &'static str = "renderer"
pub const BUS_GRAPH: &'static str = "bus_graph"
pub const DISTANCE_MODEL: &'static str = "distance_model"
pub const PAUSED: &'static str = "paused"
Source§impl State
impl State
Sourcepub fn take_reserve(
&mut self,
handle: Handle<SoundSource>,
) -> (Ticket<SoundSource>, SoundSource)
pub fn take_reserve( &mut self, handle: Handle<SoundSource>, ) -> (Ticket<SoundSource>, SoundSource)
Extracts a source from the context and reserves its handle. It is used to temporarily take ownership over source, and then put node back using given ticket.
Sourcepub fn put_back(
&mut self,
ticket: Ticket<SoundSource>,
node: SoundSource,
) -> Handle<SoundSource>
pub fn put_back( &mut self, ticket: Ticket<SoundSource>, node: SoundSource, ) -> Handle<SoundSource>
Puts source back by given ticket.
Sourcepub fn forget_ticket(&mut self, ticket: Ticket<SoundSource>)
pub fn forget_ticket(&mut self, ticket: Ticket<SoundSource>)
Makes source handle vacant again.
Sourcepub fn pause(&mut self, pause: bool)
pub fn pause(&mut self, pause: bool)
Pause/unpause the sound context. Paused context won’t play any sounds.
Sourcepub fn is_paused(&self) -> bool
pub fn is_paused(&self) -> bool
Returns true if the sound context is paused, false - otherwise.
Sourcepub fn set_distance_model(&mut self, distance_model: DistanceModel)
pub fn set_distance_model(&mut self, distance_model: DistanceModel)
Sets new distance model.
Sourcepub fn distance_model(&self) -> DistanceModel
pub fn distance_model(&self) -> DistanceModel
Returns current distance model.
Sourcepub fn normalize_frequency(&self, f: f32) -> f32
pub fn normalize_frequency(&self, f: f32) -> f32
Normalizes given frequency using context’s sampling rate. Normalized frequency then can be used to create filters.
Sourcepub fn full_render_duration(&self) -> Duration
pub fn full_render_duration(&self) -> Duration
Returns amount of time context spent on rendering all sound sources.
Examples found in repository?
42fn main() {
43 // Initialize sound engine with default output device.
44 let engine = SoundEngine::new().unwrap();
45
46 let hrir_path = PathBuf::from("examples/data/IRC_1002_C.bin");
47 let hrir_sphere = HrirSphere::from_file(&hrir_path, context::SAMPLE_RATE).unwrap();
48
49 // Initialize new sound context with default output device.
50 let context = SoundContext::new();
51
52 engine.state().add_context(context.clone());
53
54 // Set HRTF renderer instead of default.
55 context
56 .state()
57 .set_renderer(Renderer::HrtfRenderer(HrtfRenderer::new(
58 HrirSphereResource::from_hrir_sphere(hrir_sphere, ResourceKind::External),
59 )));
60
61 // Create some sounds.
62 let sound_buffer = SoundBufferResource::new_generic(
63 block_on(DataSource::from_file(
64 "examples/data/door_open.wav", // Load from the default resource io (File system)
65 &FsResourceIo,
66 ))
67 .unwrap(),
68 )
69 .unwrap();
70 let source = SoundSourceBuilder::new()
71 .with_buffer(sound_buffer)
72 .with_status(Status::Playing)
73 .build()
74 .unwrap();
75 context.state().add_source(source);
76
77 let sound_buffer = SoundBufferResource::new_generic(
78 block_on(DataSource::from_file(
79 "examples/data/helicopter.wav", // Load from the default resource io (File system)
80 &FsResourceIo,
81 ))
82 .unwrap(),
83 )
84 .unwrap();
85 let source = SoundSourceBuilder::new()
86 .with_buffer(sound_buffer)
87 .with_status(Status::Playing)
88 .with_looping(true)
89 .build()
90 .unwrap();
91 let source_handle = context.state().add_source(source);
92
93 // Move source sound around listener for some time.
94 let start_time = time::Instant::now();
95 let mut angle = 0.0f32;
96 while (time::Instant::now() - start_time).as_secs() < 360 {
97 // Separate scope for update to make sure that mutex lock will be released before
98 // thread::sleep will be called so context can actually work in background thread.
99 {
100 let axis = Vector3::y_axis();
101 let rotation_matrix =
102 UnitQuaternion::from_axis_angle(&axis, angle.to_radians()).to_homogeneous();
103 context.state().source_mut(source_handle).set_position(
104 rotation_matrix
105 .transform_point(&Point3::new(0.0, 0.0, 3.0))
106 .coords,
107 );
108
109 angle += 1.6;
110
111 println!(
112 "Sound render time {:?}",
113 context.state().full_render_duration()
114 );
115 }
116
117 // Limit rate of updates.
118 thread::sleep(Duration::from_millis(100));
119 }
120}More examples
42fn main() {
43 let hrir_path = PathBuf::from("examples/data/IRC_1002_C.bin");
44 let hrir_sphere = HrirSphere::from_file(&hrir_path, context::SAMPLE_RATE).unwrap();
45
46 // Initialize sound engine with default output device.
47 let engine = SoundEngine::new().unwrap();
48
49 // Initialize new sound context.
50 let context = SoundContext::new();
51
52 engine.state().add_context(context.clone());
53
54 // Set HRTF renderer instead of default for binaural sound.
55 context
56 .state()
57 .set_renderer(Renderer::HrtfRenderer(HrtfRenderer::new(
58 HrirSphereResource::from_hrir_sphere(hrir_sphere, ResourceKind::External),
59 )));
60
61 {
62 // Create reverb effect and set its decay time.
63 let mut reverb = Reverb::new();
64 reverb.set_decay_time(10.0);
65
66 // Add the reverb to the primary bus.
67 let mut state = context.state();
68 state
69 .bus_graph_mut()
70 .primary_bus_mut()
71 .add_effect(Effect::Reverb(reverb));
72 }
73
74 // Create some sounds.
75 let sound_buffer = SoundBufferResource::new_generic(
76 block_on(DataSource::from_file(
77 "examples/data/door_open.wav", // Load from the default resource io (File system)
78 &FsResourceIo,
79 ))
80 .unwrap(),
81 )
82 .unwrap();
83 let source = SoundSourceBuilder::new()
84 // Each sound must specify the bus to which it will output the samples. By default it is "Primary" bus.
85 .with_bus("Primary")
86 .with_buffer(sound_buffer)
87 .with_status(Status::Playing)
88 .build()
89 .unwrap();
90 context.state().add_source(source);
91
92 let sound_buffer = SoundBufferResource::new_generic(
93 block_on(DataSource::from_file(
94 "examples/data/drop.wav",
95 // Load from the default resource io (File system)
96 &FsResourceIo,
97 ))
98 .unwrap(),
99 )
100 .unwrap();
101 let source = SoundSourceBuilder::new()
102 .with_buffer(sound_buffer)
103 .with_status(Status::Playing)
104 .with_looping(true)
105 .build()
106 .unwrap();
107 let drop_sound_handle = context.state().add_source(source);
108
109 // Move sound around listener for some time.
110 let start_time = time::Instant::now();
111 let mut angle = 0.0f32;
112 while (time::Instant::now() - start_time).as_secs() < 360 {
113 let axis = Vector3::y_axis();
114 let rotation_matrix =
115 UnitQuaternion::from_axis_angle(&axis, angle.to_radians()).to_homogeneous();
116 context.state().source_mut(drop_sound_handle).set_position(
117 rotation_matrix
118 .transform_point(&Point3::new(0.0, 0.0, 1.0))
119 .coords,
120 );
121
122 angle += 1.6;
123
124 println!(
125 "Sound render time {:?}",
126 context.state().full_render_duration()
127 );
128
129 // Limit rate of context updates.
130 thread::sleep(Duration::from_millis(100));
131 }
132}Sourcepub fn set_renderer(&mut self, renderer: Renderer) -> Renderer
pub fn set_renderer(&mut self, renderer: Renderer) -> Renderer
Sets new renderer.
Examples found in repository?
42fn main() {
43 // Initialize sound engine with default output device.
44 let engine = SoundEngine::new().unwrap();
45
46 let hrir_path = PathBuf::from("examples/data/IRC_1002_C.bin");
47 let hrir_sphere = HrirSphere::from_file(&hrir_path, context::SAMPLE_RATE).unwrap();
48
49 // Initialize new sound context with default output device.
50 let context = SoundContext::new();
51
52 engine.state().add_context(context.clone());
53
54 // Set HRTF renderer instead of default.
55 context
56 .state()
57 .set_renderer(Renderer::HrtfRenderer(HrtfRenderer::new(
58 HrirSphereResource::from_hrir_sphere(hrir_sphere, ResourceKind::External),
59 )));
60
61 // Create some sounds.
62 let sound_buffer = SoundBufferResource::new_generic(
63 block_on(DataSource::from_file(
64 "examples/data/door_open.wav", // Load from the default resource io (File system)
65 &FsResourceIo,
66 ))
67 .unwrap(),
68 )
69 .unwrap();
70 let source = SoundSourceBuilder::new()
71 .with_buffer(sound_buffer)
72 .with_status(Status::Playing)
73 .build()
74 .unwrap();
75 context.state().add_source(source);
76
77 let sound_buffer = SoundBufferResource::new_generic(
78 block_on(DataSource::from_file(
79 "examples/data/helicopter.wav", // Load from the default resource io (File system)
80 &FsResourceIo,
81 ))
82 .unwrap(),
83 )
84 .unwrap();
85 let source = SoundSourceBuilder::new()
86 .with_buffer(sound_buffer)
87 .with_status(Status::Playing)
88 .with_looping(true)
89 .build()
90 .unwrap();
91 let source_handle = context.state().add_source(source);
92
93 // Move source sound around listener for some time.
94 let start_time = time::Instant::now();
95 let mut angle = 0.0f32;
96 while (time::Instant::now() - start_time).as_secs() < 360 {
97 // Separate scope for update to make sure that mutex lock will be released before
98 // thread::sleep will be called so context can actually work in background thread.
99 {
100 let axis = Vector3::y_axis();
101 let rotation_matrix =
102 UnitQuaternion::from_axis_angle(&axis, angle.to_radians()).to_homogeneous();
103 context.state().source_mut(source_handle).set_position(
104 rotation_matrix
105 .transform_point(&Point3::new(0.0, 0.0, 3.0))
106 .coords,
107 );
108
109 angle += 1.6;
110
111 println!(
112 "Sound render time {:?}",
113 context.state().full_render_duration()
114 );
115 }
116
117 // Limit rate of updates.
118 thread::sleep(Duration::from_millis(100));
119 }
120}More examples
42fn main() {
43 let hrir_path = PathBuf::from("examples/data/IRC_1002_C.bin");
44 let hrir_sphere = HrirSphere::from_file(&hrir_path, context::SAMPLE_RATE).unwrap();
45
46 // Initialize sound engine with default output device.
47 let engine = SoundEngine::new().unwrap();
48
49 // Initialize new sound context.
50 let context = SoundContext::new();
51
52 engine.state().add_context(context.clone());
53
54 // Set HRTF renderer instead of default for binaural sound.
55 context
56 .state()
57 .set_renderer(Renderer::HrtfRenderer(HrtfRenderer::new(
58 HrirSphereResource::from_hrir_sphere(hrir_sphere, ResourceKind::External),
59 )));
60
61 {
62 // Create reverb effect and set its decay time.
63 let mut reverb = Reverb::new();
64 reverb.set_decay_time(10.0);
65
66 // Add the reverb to the primary bus.
67 let mut state = context.state();
68 state
69 .bus_graph_mut()
70 .primary_bus_mut()
71 .add_effect(Effect::Reverb(reverb));
72 }
73
74 // Create some sounds.
75 let sound_buffer = SoundBufferResource::new_generic(
76 block_on(DataSource::from_file(
77 "examples/data/door_open.wav", // Load from the default resource io (File system)
78 &FsResourceIo,
79 ))
80 .unwrap(),
81 )
82 .unwrap();
83 let source = SoundSourceBuilder::new()
84 // Each sound must specify the bus to which it will output the samples. By default it is "Primary" bus.
85 .with_bus("Primary")
86 .with_buffer(sound_buffer)
87 .with_status(Status::Playing)
88 .build()
89 .unwrap();
90 context.state().add_source(source);
91
92 let sound_buffer = SoundBufferResource::new_generic(
93 block_on(DataSource::from_file(
94 "examples/data/drop.wav",
95 // Load from the default resource io (File system)
96 &FsResourceIo,
97 ))
98 .unwrap(),
99 )
100 .unwrap();
101 let source = SoundSourceBuilder::new()
102 .with_buffer(sound_buffer)
103 .with_status(Status::Playing)
104 .with_looping(true)
105 .build()
106 .unwrap();
107 let drop_sound_handle = context.state().add_source(source);
108
109 // Move sound around listener for some time.
110 let start_time = time::Instant::now();
111 let mut angle = 0.0f32;
112 while (time::Instant::now() - start_time).as_secs() < 360 {
113 let axis = Vector3::y_axis();
114 let rotation_matrix =
115 UnitQuaternion::from_axis_angle(&axis, angle.to_radians()).to_homogeneous();
116 context.state().source_mut(drop_sound_handle).set_position(
117 rotation_matrix
118 .transform_point(&Point3::new(0.0, 0.0, 1.0))
119 .coords,
120 );
121
122 angle += 1.6;
123
124 println!(
125 "Sound render time {:?}",
126 context.state().full_render_duration()
127 );
128
129 // Limit rate of context updates.
130 thread::sleep(Duration::from_millis(100));
131 }
132}Sourcepub fn renderer_mut(&mut self) -> &mut Renderer
pub fn renderer_mut(&mut self) -> &mut Renderer
Returns mutable reference to current renderer.
Sourcepub fn add_source(&mut self, source: SoundSource) -> Handle<SoundSource>
pub fn add_source(&mut self, source: SoundSource) -> Handle<SoundSource>
Adds new sound source and returns handle of it by which it can be accessed later on.
Examples found in repository?
74fn main() {
75 // Initialize sound engine with default output device.
76 let engine = SoundEngine::new().unwrap();
77
78 // Initialize new sound context.
79 let context = SoundContext::new();
80
81 engine.state().add_context(context.clone());
82
83 // Create sine wave generator
84 let sine_wave = DataSource::RawStreaming(Box::new(SamplesGenerator::new()));
85
86 let sine_wave_buffer = SoundBufferResource::new_streaming(sine_wave).unwrap();
87
88 // Create generic source (without spatial effects) using that buffer.
89 let source = SoundSourceBuilder::new()
90 .with_buffer(sine_wave_buffer)
91 .with_status(Status::Playing)
92 .build()
93 .unwrap();
94
95 context.state().add_source(source);
96
97 // Play sound for some time.
98 thread::sleep(Duration::from_secs(10));
99}More examples
33fn main() {
34 // Initialize sound engine with default output device.
35 let engine = SoundEngine::new().unwrap();
36
37 // Initialize new sound context.
38 let context = SoundContext::new();
39
40 engine.state().add_context(context.clone());
41
42 // Load sound buffer.
43 let waterfall_buffer = SoundBufferResource::new_streaming(
44 block_on(DataSource::from_file(
45 "examples/data/waterfall.ogg",
46 // Load from the default resource io (File system)
47 &FsResourceIo,
48 ))
49 .unwrap(),
50 )
51 .unwrap();
52
53 // Create flat source (without spatial effects) using that buffer.
54 let source = SoundSourceBuilder::new()
55 .with_buffer(waterfall_buffer)
56 .with_status(Status::Playing)
57 .with_looping(true)
58 .build()
59 .unwrap();
60
61 // Each sound sound must be added to context, context takes ownership on source
62 // and returns pool handle to it by which it can be accessed later on if needed.
63 let _source_handle: Handle<SoundSource> = context.state().add_source(source);
64
65 thread::sleep(Duration::from_secs(30))
66}30fn main() {
31 // Initialize sound engine with default output device.
32 let engine = SoundEngine::new().unwrap();
33
34 // Initialize new sound context.
35 let context = SoundContext::new();
36
37 engine.state().add_context(context.clone());
38
39 // Create sine wave.
40 let sample_rate = 44100;
41 let sine_wave = DataSource::Raw {
42 sample_rate,
43 channel_count: 1,
44 samples: {
45 let frequency = 440.0;
46 let amplitude = 0.75;
47 (0..44100)
48 .map(|i| {
49 amplitude
50 * ((2.0 * std::f32::consts::PI * i as f32 * frequency) / sample_rate as f32)
51 .sin()
52 })
53 .collect()
54 },
55 };
56
57 let sine_wave_buffer = SoundBufferResource::new_generic(sine_wave).unwrap();
58
59 // Create generic source (without spatial effects) using that buffer.
60 let source = SoundSourceBuilder::new()
61 .with_buffer(sine_wave_buffer)
62 .with_status(Status::Playing)
63 .with_looping(true)
64 .build()
65 .unwrap();
66
67 context.state().add_source(source);
68
69 // Play sound for some time.
70 thread::sleep(Duration::from_secs(10));
71}32fn main() {
33 // Initialize sound engine with default output device.
34 let engine = SoundEngine::new().unwrap();
35
36 // Create new context.
37 let context = SoundContext::new();
38
39 // Register context in the engine.
40 engine.state().add_context(context.clone());
41
42 // Load sound buffer.
43 let door_open_buffer = SoundBufferResource::new_generic(
44 fyrox_sound::futures::executor::block_on(DataSource::from_file(
45 "examples/data/door_open.wav",
46 // Load from the default resource io (File system)
47 &FsResourceIo,
48 ))
49 .unwrap(),
50 )
51 .unwrap();
52
53 // Create generic source (without spatial effects) using that buffer.
54 let source = SoundSourceBuilder::new()
55 .with_buffer(door_open_buffer)
56 .with_status(Status::Playing)
57 // Ensure that no spatial effects will be applied.
58 .with_spatial_blend_factor(0.0)
59 .build()
60 .unwrap();
61
62 // Each sound sound must be added to context, context takes ownership on source
63 // and returns pool handle to it by which it can be accessed later on if needed.
64 let _source_handle: Handle<SoundSource> = context.state().add_source(source);
65
66 // Wait until sound will play completely.
67 thread::sleep(Duration::from_secs(3));
68}37fn main() {
38 // Initialize sound engine with default output device.
39 let engine = SoundEngine::new().unwrap();
40
41 // Initialize new sound context.
42 let context = SoundContext::new();
43
44 engine.state().add_context(context.clone());
45
46 // Load sound buffer.
47 let drop_buffer = SoundBufferResource::new_generic(
48 block_on(DataSource::from_file(
49 "examples/data/drop.wav",
50 // Load from the default resource io (File system)
51 &FsResourceIo,
52 ))
53 .unwrap(),
54 )
55 .unwrap();
56
57 // Create spatial source - spatial sources can be positioned in space.
58 let source = SoundSourceBuilder::new()
59 .with_buffer(drop_buffer)
60 .with_looping(true)
61 .with_status(Status::Playing)
62 .build()
63 .unwrap();
64
65 // Each sound sound must be added to context, context takes ownership on source
66 // and returns pool handle to it by which it can be accessed later on if needed.
67 let source_handle: Handle<SoundSource> = context.state().add_source(source);
68
69 // Move sound around listener for some time.
70 let start_time = time::Instant::now();
71 let mut angle = 0.0f32;
72 while (time::Instant::now() - start_time).as_secs() < 11 {
73 let axis = Vector3::y_axis();
74 let rotation_matrix =
75 UnitQuaternion::from_axis_angle(&axis, angle.to_radians()).to_homogeneous();
76 context.state().source_mut(source_handle).set_position(
77 rotation_matrix
78 .transform_point(&Point3::new(0.0, 0.0, 3.0))
79 .coords,
80 );
81
82 angle += 3.6;
83
84 // Limit rate of updates.
85 thread::sleep(Duration::from_millis(100));
86 }
87}32fn main() {
33 // Initialize sound engine without output device.
34 let engine = SoundEngine::without_device();
35
36 // Create new context.
37 let context = SoundContext::new();
38
39 // Register context in the engine.
40 engine.state().add_context(context.clone());
41
42 // Load sound buffer.
43 let door_open_buffer = SoundBufferResource::new_generic(
44 fyrox_sound::futures::executor::block_on(DataSource::from_file(
45 "examples/data/door_open.wav",
46 // Load from the default resource io (File system)
47 &FsResourceIo,
48 ))
49 .unwrap(),
50 )
51 .unwrap();
52
53 // Create generic source (without spatial effects) using that buffer.
54 let source = SoundSourceBuilder::new()
55 .with_buffer(door_open_buffer)
56 .with_status(Status::Playing)
57 .build()
58 .unwrap();
59
60 // Each sound sound must be added to context, context takes ownership on source
61 // and returns pool handle to it by which it can be accessed later on if needed.
62 let _source_handle: Handle<SoundSource> = context.state().add_source(source);
63
64 // Create output wav file. The sample rate is currently fixed.
65 let wav_spec = hound::WavSpec {
66 channels: 2,
67 sample_rate: fyrox_sound::context::SAMPLE_RATE,
68 bits_per_sample: 32,
69 sample_format: hound::SampleFormat::Float,
70 };
71 let mut wav_writer = hound::WavWriter::create("output.wav", wav_spec).unwrap();
72
73 // Create an output buffer.
74 let buf_len = State::render_buffer_len();
75 let mut buf = vec![(0.0f32, 0.0f32); buf_len];
76 let mut samples_written = 0;
77
78 // Wait until sound will play completely.
79 while samples_written < 3 * fyrox_sound::context::SAMPLE_RATE {
80 engine.state().render(&mut buf);
81 for &(l, r) in buf.iter() {
82 wav_writer.write_sample(l).unwrap();
83 wav_writer.write_sample(r).unwrap();
84 }
85 samples_written += buf_len as u32;
86 }
87
88 wav_writer.finalize().unwrap();
89}Sourcepub fn remove_source(&mut self, source: Handle<SoundSource>)
pub fn remove_source(&mut self, source: Handle<SoundSource>)
Removes sound source from the context.
Sourcepub fn sources(&self) -> &Pool<SoundSource>
pub fn sources(&self) -> &Pool<SoundSource>
Returns shared reference to a pool with all sound sources.
Sourcepub fn sources_mut(&mut self) -> &mut Pool<SoundSource>
pub fn sources_mut(&mut self) -> &mut Pool<SoundSource>
Returns mutable reference to a pool with all sound sources.
Sourcepub fn source(&self, handle: Handle<SoundSource>) -> &SoundSource
pub fn source(&self, handle: Handle<SoundSource>) -> &SoundSource
Returns shared reference to sound source at given handle. If handle is invalid, this method will panic.
Sourcepub fn is_valid_handle(&self, handle: Handle<SoundSource>) -> bool
pub fn is_valid_handle(&self, handle: Handle<SoundSource>) -> bool
Checks whether a handle to a sound source is valid or not.
Sourcepub fn source_mut(&mut self, handle: Handle<SoundSource>) -> &mut SoundSource
pub fn source_mut(&mut self, handle: Handle<SoundSource>) -> &mut SoundSource
Returns mutable reference to sound source at given handle. If handle is invalid, this method will panic.
Examples found in repository?
37fn main() {
38 // Initialize sound engine with default output device.
39 let engine = SoundEngine::new().unwrap();
40
41 // Initialize new sound context.
42 let context = SoundContext::new();
43
44 engine.state().add_context(context.clone());
45
46 // Load sound buffer.
47 let drop_buffer = SoundBufferResource::new_generic(
48 block_on(DataSource::from_file(
49 "examples/data/drop.wav",
50 // Load from the default resource io (File system)
51 &FsResourceIo,
52 ))
53 .unwrap(),
54 )
55 .unwrap();
56
57 // Create spatial source - spatial sources can be positioned in space.
58 let source = SoundSourceBuilder::new()
59 .with_buffer(drop_buffer)
60 .with_looping(true)
61 .with_status(Status::Playing)
62 .build()
63 .unwrap();
64
65 // Each sound sound must be added to context, context takes ownership on source
66 // and returns pool handle to it by which it can be accessed later on if needed.
67 let source_handle: Handle<SoundSource> = context.state().add_source(source);
68
69 // Move sound around listener for some time.
70 let start_time = time::Instant::now();
71 let mut angle = 0.0f32;
72 while (time::Instant::now() - start_time).as_secs() < 11 {
73 let axis = Vector3::y_axis();
74 let rotation_matrix =
75 UnitQuaternion::from_axis_angle(&axis, angle.to_radians()).to_homogeneous();
76 context.state().source_mut(source_handle).set_position(
77 rotation_matrix
78 .transform_point(&Point3::new(0.0, 0.0, 3.0))
79 .coords,
80 );
81
82 angle += 3.6;
83
84 // Limit rate of updates.
85 thread::sleep(Duration::from_millis(100));
86 }
87}More examples
42fn main() {
43 // Initialize sound engine with default output device.
44 let engine = SoundEngine::new().unwrap();
45
46 let hrir_path = PathBuf::from("examples/data/IRC_1002_C.bin");
47 let hrir_sphere = HrirSphere::from_file(&hrir_path, context::SAMPLE_RATE).unwrap();
48
49 // Initialize new sound context with default output device.
50 let context = SoundContext::new();
51
52 engine.state().add_context(context.clone());
53
54 // Set HRTF renderer instead of default.
55 context
56 .state()
57 .set_renderer(Renderer::HrtfRenderer(HrtfRenderer::new(
58 HrirSphereResource::from_hrir_sphere(hrir_sphere, ResourceKind::External),
59 )));
60
61 // Create some sounds.
62 let sound_buffer = SoundBufferResource::new_generic(
63 block_on(DataSource::from_file(
64 "examples/data/door_open.wav", // Load from the default resource io (File system)
65 &FsResourceIo,
66 ))
67 .unwrap(),
68 )
69 .unwrap();
70 let source = SoundSourceBuilder::new()
71 .with_buffer(sound_buffer)
72 .with_status(Status::Playing)
73 .build()
74 .unwrap();
75 context.state().add_source(source);
76
77 let sound_buffer = SoundBufferResource::new_generic(
78 block_on(DataSource::from_file(
79 "examples/data/helicopter.wav", // Load from the default resource io (File system)
80 &FsResourceIo,
81 ))
82 .unwrap(),
83 )
84 .unwrap();
85 let source = SoundSourceBuilder::new()
86 .with_buffer(sound_buffer)
87 .with_status(Status::Playing)
88 .with_looping(true)
89 .build()
90 .unwrap();
91 let source_handle = context.state().add_source(source);
92
93 // Move source sound around listener for some time.
94 let start_time = time::Instant::now();
95 let mut angle = 0.0f32;
96 while (time::Instant::now() - start_time).as_secs() < 360 {
97 // Separate scope for update to make sure that mutex lock will be released before
98 // thread::sleep will be called so context can actually work in background thread.
99 {
100 let axis = Vector3::y_axis();
101 let rotation_matrix =
102 UnitQuaternion::from_axis_angle(&axis, angle.to_radians()).to_homogeneous();
103 context.state().source_mut(source_handle).set_position(
104 rotation_matrix
105 .transform_point(&Point3::new(0.0, 0.0, 3.0))
106 .coords,
107 );
108
109 angle += 1.6;
110
111 println!(
112 "Sound render time {:?}",
113 context.state().full_render_duration()
114 );
115 }
116
117 // Limit rate of updates.
118 thread::sleep(Duration::from_millis(100));
119 }
120}42fn main() {
43 let hrir_path = PathBuf::from("examples/data/IRC_1002_C.bin");
44 let hrir_sphere = HrirSphere::from_file(&hrir_path, context::SAMPLE_RATE).unwrap();
45
46 // Initialize sound engine with default output device.
47 let engine = SoundEngine::new().unwrap();
48
49 // Initialize new sound context.
50 let context = SoundContext::new();
51
52 engine.state().add_context(context.clone());
53
54 // Set HRTF renderer instead of default for binaural sound.
55 context
56 .state()
57 .set_renderer(Renderer::HrtfRenderer(HrtfRenderer::new(
58 HrirSphereResource::from_hrir_sphere(hrir_sphere, ResourceKind::External),
59 )));
60
61 {
62 // Create reverb effect and set its decay time.
63 let mut reverb = Reverb::new();
64 reverb.set_decay_time(10.0);
65
66 // Add the reverb to the primary bus.
67 let mut state = context.state();
68 state
69 .bus_graph_mut()
70 .primary_bus_mut()
71 .add_effect(Effect::Reverb(reverb));
72 }
73
74 // Create some sounds.
75 let sound_buffer = SoundBufferResource::new_generic(
76 block_on(DataSource::from_file(
77 "examples/data/door_open.wav", // Load from the default resource io (File system)
78 &FsResourceIo,
79 ))
80 .unwrap(),
81 )
82 .unwrap();
83 let source = SoundSourceBuilder::new()
84 // Each sound must specify the bus to which it will output the samples. By default it is "Primary" bus.
85 .with_bus("Primary")
86 .with_buffer(sound_buffer)
87 .with_status(Status::Playing)
88 .build()
89 .unwrap();
90 context.state().add_source(source);
91
92 let sound_buffer = SoundBufferResource::new_generic(
93 block_on(DataSource::from_file(
94 "examples/data/drop.wav",
95 // Load from the default resource io (File system)
96 &FsResourceIo,
97 ))
98 .unwrap(),
99 )
100 .unwrap();
101 let source = SoundSourceBuilder::new()
102 .with_buffer(sound_buffer)
103 .with_status(Status::Playing)
104 .with_looping(true)
105 .build()
106 .unwrap();
107 let drop_sound_handle = context.state().add_source(source);
108
109 // Move sound around listener for some time.
110 let start_time = time::Instant::now();
111 let mut angle = 0.0f32;
112 while (time::Instant::now() - start_time).as_secs() < 360 {
113 let axis = Vector3::y_axis();
114 let rotation_matrix =
115 UnitQuaternion::from_axis_angle(&axis, angle.to_radians()).to_homogeneous();
116 context.state().source_mut(drop_sound_handle).set_position(
117 rotation_matrix
118 .transform_point(&Point3::new(0.0, 0.0, 1.0))
119 .coords,
120 );
121
122 angle += 1.6;
123
124 println!(
125 "Sound render time {:?}",
126 context.state().full_render_duration()
127 );
128
129 // Limit rate of context updates.
130 thread::sleep(Duration::from_millis(100));
131 }
132}Sourcepub fn try_get_source_mut(
&mut self,
handle: Handle<SoundSource>,
) -> Result<&mut SoundSource, PoolError>
pub fn try_get_source_mut( &mut self, handle: Handle<SoundSource>, ) -> Result<&mut SoundSource, PoolError>
Returns mutable reference to sound source at given handle. If handle is invalid, this method will panic.
Sourcepub fn listener(&self) -> &Listener
pub fn listener(&self) -> &Listener
Returns shared reference to listener. Engine has only one listener.
Sourcepub fn listener_mut(&mut self) -> &mut Listener
pub fn listener_mut(&mut self) -> &mut Listener
Returns mutable reference to listener. Engine has only one listener.
Examples found in repository?
37fn main() {
38 // Initialize sound engine with default output device.
39 let engine = SoundEngine::new().unwrap();
40
41 // Initialize new sound context.
42 let context = SoundContext::new();
43
44 engine.state().add_context(context.clone());
45
46 // Load sound buffer.
47 let drop_buffer = SoundBufferResource::new_generic(
48 block_on(DataSource::from_file(
49 "examples/data/drop.wav", // Load from the default resource io (File system)
50 &FsResourceIo,
51 ))
52 .unwrap(),
53 )
54 .unwrap();
55
56 // Create spatial source - spatial sources can be positioned in space.
57 let source = SoundSourceBuilder::new()
58 .with_buffer(drop_buffer)
59 .with_looping(true)
60 .with_status(Status::Playing)
61 .build()
62 .unwrap();
63
64 // Each sound sound must be added to context, context takes ownership on source
65 // and returns pool handle to it by which it can be accessed later on if needed.
66 context.state().add_source(source);
67
68 // Rotate listener for some time.
69 let start_time = time::Instant::now();
70 let mut angle = 0.0f32;
71 while (time::Instant::now() - start_time).as_secs() < 20 {
72 // Separate scope for update to make sure that mutex lock will be released before
73 // thread::sleep will be called so context can actually work in background thread.
74 {
75 let mut context = context.state();
76
77 let listener = context.listener_mut();
78
79 // Define up-axis of listener.
80 let up = Vector3::y_axis();
81
82 // And rotate look axis.
83 let rotation_matrix =
84 UnitQuaternion::from_axis_angle(&up, angle.to_radians()).to_homogeneous();
85 let look = rotation_matrix
86 .transform_point(&Point3::new(0.0, 0.0, 1.0))
87 .coords;
88
89 // Finally combine axes. _lh suffix here means that we using left-handed coordinate system.
90 // there is also _rh (right handed) version. Also basis can be set directly by using `set_basis`
91 listener.set_orientation_lh(look, *up);
92
93 // Move listener a bit back from sound source.
94 listener.set_position(Vector3::new(0.0, 0.0, -2.0));
95
96 // Continue rotation.
97 angle += 2.0;
98 }
99
100 // Limit rate of updates.
101 thread::sleep(Duration::from_millis(100));
102 }
103}Sourcepub fn bus_graph_ref(&self) -> &AudioBusGraph
pub fn bus_graph_ref(&self) -> &AudioBusGraph
Returns a reference to the audio bus graph.
Sourcepub fn bus_graph_mut(&mut self) -> &mut AudioBusGraph
pub fn bus_graph_mut(&mut self) -> &mut AudioBusGraph
Returns a reference to the audio bus graph.
Examples found in repository?
42fn main() {
43 let hrir_path = PathBuf::from("examples/data/IRC_1002_C.bin");
44 let hrir_sphere = HrirSphere::from_file(&hrir_path, context::SAMPLE_RATE).unwrap();
45
46 // Initialize sound engine with default output device.
47 let engine = SoundEngine::new().unwrap();
48
49 // Initialize new sound context.
50 let context = SoundContext::new();
51
52 engine.state().add_context(context.clone());
53
54 // Set HRTF renderer instead of default for binaural sound.
55 context
56 .state()
57 .set_renderer(Renderer::HrtfRenderer(HrtfRenderer::new(
58 HrirSphereResource::from_hrir_sphere(hrir_sphere, ResourceKind::External),
59 )));
60
61 {
62 // Create reverb effect and set its decay time.
63 let mut reverb = Reverb::new();
64 reverb.set_decay_time(10.0);
65
66 // Add the reverb to the primary bus.
67 let mut state = context.state();
68 state
69 .bus_graph_mut()
70 .primary_bus_mut()
71 .add_effect(Effect::Reverb(reverb));
72 }
73
74 // Create some sounds.
75 let sound_buffer = SoundBufferResource::new_generic(
76 block_on(DataSource::from_file(
77 "examples/data/door_open.wav", // Load from the default resource io (File system)
78 &FsResourceIo,
79 ))
80 .unwrap(),
81 )
82 .unwrap();
83 let source = SoundSourceBuilder::new()
84 // Each sound must specify the bus to which it will output the samples. By default it is "Primary" bus.
85 .with_bus("Primary")
86 .with_buffer(sound_buffer)
87 .with_status(Status::Playing)
88 .build()
89 .unwrap();
90 context.state().add_source(source);
91
92 let sound_buffer = SoundBufferResource::new_generic(
93 block_on(DataSource::from_file(
94 "examples/data/drop.wav",
95 // Load from the default resource io (File system)
96 &FsResourceIo,
97 ))
98 .unwrap(),
99 )
100 .unwrap();
101 let source = SoundSourceBuilder::new()
102 .with_buffer(sound_buffer)
103 .with_status(Status::Playing)
104 .with_looping(true)
105 .build()
106 .unwrap();
107 let drop_sound_handle = context.state().add_source(source);
108
109 // Move sound around listener for some time.
110 let start_time = time::Instant::now();
111 let mut angle = 0.0f32;
112 while (time::Instant::now() - start_time).as_secs() < 360 {
113 let axis = Vector3::y_axis();
114 let rotation_matrix =
115 UnitQuaternion::from_axis_angle(&axis, angle.to_radians()).to_homogeneous();
116 context.state().source_mut(drop_sound_handle).set_position(
117 rotation_matrix
118 .transform_point(&Point3::new(0.0, 0.0, 1.0))
119 .coords,
120 );
121
122 angle += 1.6;
123
124 println!(
125 "Sound render time {:?}",
126 context.state().full_render_duration()
127 );
128
129 // Limit rate of context updates.
130 thread::sleep(Duration::from_millis(100));
131 }
132}Trait Implementations§
Source§impl Reflect for Statewhere
Self: 'static,
impl Reflect for Statewhere
Self: 'static,
fn source_path() -> &'static str
fn try_clone_box(&self) -> Option<Box<dyn Reflect>>
fn type_name(&self) -> &'static str
fn derived_types() -> &'static [TypeId]
fn query_derived_types(&self) -> &'static [TypeId]
fn doc(&self) -> &'static str
Source§fn assembly_name(&self) -> &'static str
fn assembly_name(&self) -> &'static str
#[derive(Reflect)]) to ensure that this method will return correct assembly
name. In other words - there’s no guarantee, that any implementation other than proc-macro
will return a correct name of the assembly. Alternatively, you can use env!("CARGO_PKG_NAME")
as an implementation.Source§fn type_assembly_name() -> &'static str
fn type_assembly_name() -> &'static str
#[derive(Reflect)]) to ensure that this method will return correct assembly
name. In other words - there’s no guarantee, that any implementation other than proc-macro
will return a correct name of the assembly. Alternatively, you can use env!("CARGO_PKG_NAME")
as an implementation.fn fields_ref(&self, func: &mut dyn FnMut(&[FieldRef<'_, '_>]))
fn fields_mut(&mut self, func: &mut dyn FnMut(&mut [FieldMut<'_, '_>]))
fn into_any(self: Box<Self>) -> Box<dyn Any>
fn set( &mut self, value: Box<dyn Reflect>, ) -> Result<Box<dyn Reflect>, Box<dyn Reflect>>
fn as_any(&self, func: &mut dyn FnMut(&dyn Any))
fn as_any_mut(&mut self, func: &mut dyn FnMut(&mut dyn Any))
fn as_reflect(&self, func: &mut dyn FnMut(&dyn Reflect))
fn as_reflect_mut(&mut self, func: &mut dyn FnMut(&mut dyn Reflect))
Source§fn set_field(
&mut self,
field_name: &str,
value: Box<dyn Reflect>,
func: &mut dyn FnMut(Result<Box<dyn Reflect>, SetFieldError>),
)
fn set_field( &mut self, field_name: &str, value: Box<dyn Reflect>, func: &mut dyn FnMut(Result<Box<dyn Reflect>, SetFieldError>), )
#[reflect(setter = ..)] or falls back to
Reflect::field_mutfn field( &self, name: &str, func: &mut dyn FnMut(Option<&(dyn Reflect + 'static)>), )
fn field_mut( &mut self, name: &str, func: &mut dyn FnMut(Option<&mut (dyn Reflect + 'static)>), )
fn as_array(&self, func: &mut dyn FnMut(Option<&(dyn ReflectArray + 'static)>))
fn as_array_mut( &mut self, func: &mut dyn FnMut(Option<&mut (dyn ReflectArray + 'static)>), )
fn as_list(&self, func: &mut dyn FnMut(Option<&(dyn ReflectList + 'static)>))
fn as_list_mut( &mut self, func: &mut dyn FnMut(Option<&mut (dyn ReflectList + 'static)>), )
fn as_inheritable_variable( &self, func: &mut dyn FnMut(Option<&(dyn ReflectInheritableVariable + 'static)>), )
fn as_inheritable_variable_mut( &mut self, func: &mut dyn FnMut(Option<&mut (dyn ReflectInheritableVariable + 'static)>), )
fn as_hash_map( &self, func: &mut dyn FnMut(Option<&(dyn ReflectHashMap + 'static)>), )
fn as_hash_map_mut( &mut self, func: &mut dyn FnMut(Option<&mut (dyn ReflectHashMap + 'static)>), )
fn as_handle( &self, func: &mut dyn FnMut(Option<&(dyn ReflectHandle + 'static)>), )
fn as_handle_mut( &mut self, func: &mut dyn FnMut(Option<&mut (dyn ReflectHandle + 'static)>), )
Auto Trait Implementations§
impl Freeze for State
impl !RefUnwindSafe for State
impl Send for State
impl Sync for State
impl Unpin for State
impl UnsafeUnpin for State
impl !UnwindSafe for State
Blanket Implementations§
Source§impl<T> AsyncTaskResult for T
impl<T> AsyncTaskResult for T
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FieldValue for Twhere
T: Reflect,
impl<T> FieldValue for Twhere
T: Reflect,
Source§fn field_value_as_any_ref(&self) -> &(dyn Any + 'static)
fn field_value_as_any_ref(&self) -> &(dyn Any + 'static)
self to a &dyn AnySource§fn field_value_as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn field_value_as_any_mut(&mut self) -> &mut (dyn Any + 'static)
self to a &mut dyn Anyfn field_value_as_reflect(&self) -> &(dyn Reflect + 'static)
fn field_value_as_reflect_mut(&mut self) -> &mut (dyn Reflect + 'static)
fn type_name(&self) -> &'static str
Source§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
Source§impl<T, U> ObjectOrVariant<T> for Uwhere
PhantomData<U>: ObjectOrVariantHelper<T, U>,
impl<T, U> ObjectOrVariant<T> for Uwhere
PhantomData<U>: ObjectOrVariantHelper<T, U>,
Source§impl<T> ReflectBase for Twhere
T: Reflect,
impl<T> ReflectBase for Twhere
T: Reflect,
fn as_any_raw(&self) -> &(dyn Any + 'static)
fn as_any_raw_mut(&mut self) -> &mut (dyn Any + 'static)
Source§impl<T> ResolvePath for Twhere
T: Reflect,
impl<T> ResolvePath for Twhere
T: Reflect,
fn resolve_path<'p>( &self, path: &'p str, func: &mut dyn FnMut(Result<&(dyn Reflect + 'static), ReflectPathError<'p>>), )
fn resolve_path_mut<'p>( &mut self, path: &'p str, func: &mut dyn FnMut(Result<&mut (dyn Reflect + 'static), ReflectPathError<'p>>), )
fn get_resolve_path<'p, T>(
&self,
path: &'p str,
func: &mut dyn FnMut(Result<&T, ReflectPathError<'p>>),
)where
T: Reflect,
fn get_resolve_path_mut<'p, T>(
&mut self,
path: &'p str,
func: &mut dyn FnMut(Result<&mut T, ReflectPathError<'p>>),
)where
T: Reflect,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.