pub struct SpatialSource { /* private fields */ }Expand description
See module docs.
Implementations§
Source§impl SpatialSource
Property key constants
impl SpatialSource
Property key constants
Source§impl SpatialSource
impl SpatialSource
Sourcepub fn set_position(&mut self, position: Vector3<f32>) -> &mut Self
pub fn set_position(&mut self, position: Vector3<f32>) -> &mut Self
Sets position of source in world space.
Examples found in repository?
15fn main() {
16 // Initialize sound engine with default output device.
17 let engine = SoundEngine::new();
18
19 // Initialize new sound context.
20 let context = SoundContext::new();
21
22 engine.lock().unwrap().add_context(context.clone());
23
24 // Load sound buffer.
25 let drop_buffer = SoundBufferResource::new_generic(
26 block_on(DataSource::from_file("examples/data/drop.wav")).unwrap(),
27 )
28 .unwrap();
29
30 // Create spatial source - spatial sources can be positioned in space.
31 let source = SpatialSourceBuilder::new(
32 GenericSourceBuilder::new()
33 .with_buffer(drop_buffer)
34 .with_looping(true)
35 .with_status(Status::Playing)
36 .build()
37 .unwrap(),
38 )
39 .build_source();
40
41 // Each sound sound must be added to context, context takes ownership on source
42 // and returns pool handle to it by which it can be accessed later on if needed.
43 let source_handle: Handle<SoundSource> = context.state().add_source(source);
44
45 // Move sound around listener for some time.
46 let start_time = time::Instant::now();
47 let mut angle = 0.0f32;
48 while (time::Instant::now() - start_time).as_secs() < 11 {
49 if let SoundSource::Spatial(spatial) = context.state().source_mut(source_handle) {
50 let axis = Vector3::y_axis();
51 let rotation_matrix =
52 UnitQuaternion::from_axis_angle(&axis, angle.to_radians()).to_homogeneous();
53 spatial.set_position(
54 rotation_matrix
55 .transform_point(&Point3::new(0.0, 0.0, 3.0))
56 .coords,
57 );
58 }
59 angle += 3.6;
60
61 // Limit rate of updates.
62 thread::sleep(Duration::from_millis(100));
63 }
64}More examples
17fn main() {
18 // Initialize sound engine with default output device.
19 let engine = SoundEngine::new();
20
21 let hrir_sphere =
22 HrirSphere::from_file("examples/data/IRC_1002_C.bin", context::SAMPLE_RATE).unwrap();
23
24 // Initialize new sound context with default output device.
25 let context = SoundContext::new();
26
27 engine.lock().unwrap().add_context(context.clone());
28
29 // Set HRTF renderer instead of default.
30 context
31 .state()
32 .set_renderer(Renderer::HrtfRenderer(HrtfRenderer::new(hrir_sphere)));
33
34 // Create some sounds.
35 let sound_buffer = SoundBufferResource::new_generic(
36 block_on(DataSource::from_file("examples/data/door_open.wav")).unwrap(),
37 )
38 .unwrap();
39 let source = SpatialSourceBuilder::new(
40 GenericSourceBuilder::new()
41 .with_buffer(sound_buffer)
42 .with_status(Status::Playing)
43 .build()
44 .unwrap(),
45 )
46 .build_source();
47 context.state().add_source(source);
48
49 let sound_buffer = SoundBufferResource::new_generic(
50 block_on(DataSource::from_file("examples/data/helicopter.wav")).unwrap(),
51 )
52 .unwrap();
53 let source = SpatialSourceBuilder::new(
54 GenericSourceBuilder::new()
55 .with_buffer(sound_buffer)
56 .with_status(Status::Playing)
57 .with_looping(true)
58 .build()
59 .unwrap(),
60 )
61 .build_source();
62 let source_handle = context.state().add_source(source);
63
64 // Move source sound around listener for some time.
65 let start_time = time::Instant::now();
66 let mut angle = 0.0f32;
67 while (time::Instant::now() - start_time).as_secs() < 360 {
68 // Separate scope for update to make sure that mutex lock will be released before
69 // thread::sleep will be called so context can actually work in background thread.
70 {
71 if let SoundSource::Spatial(spatial) = context.state().source_mut(source_handle) {
72 let axis = Vector3::y_axis();
73 let rotation_matrix =
74 UnitQuaternion::from_axis_angle(&axis, angle.to_radians()).to_homogeneous();
75 spatial.set_position(
76 rotation_matrix
77 .transform_point(&Point3::new(0.0, 0.0, 3.0))
78 .coords,
79 );
80 }
81
82 angle += 1.6;
83
84 println!(
85 "Sound render time {:?}",
86 context.state().full_render_duration()
87 );
88 }
89
90 // Limit rate of updates.
91 thread::sleep(Duration::from_millis(100));
92 }
93}17fn main() {
18 let hrir_sphere =
19 HrirSphere::from_file("examples/data/IRC_1002_C.bin", context::SAMPLE_RATE).unwrap();
20
21 // Initialize sound engine with default output device.
22 let engine = SoundEngine::new();
23
24 // Initialize new sound context.
25 let context = SoundContext::new();
26
27 engine.lock().unwrap().add_context(context.clone());
28
29 // Set HRTF renderer instead of default for binaural sound.
30 context
31 .state()
32 .set_renderer(Renderer::HrtfRenderer(HrtfRenderer::new(hrir_sphere)));
33
34 let base_effect = BaseEffect::default();
35
36 // Create reverb effect and set its decay time.
37 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 // Create some sounds.
42 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 // Each sound source must be attached to effect, otherwise sound won't be passed to effect
57 // and you'll hear sound without any difference.
58 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 // Move sound around listener for some time.
84 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 // Limit rate of context updates.
106 thread::sleep(Duration::from_millis(100));
107 }
108}Sourcepub fn set_radius(&mut self, radius: f32) -> &mut Self
pub fn set_radius(&mut self, radius: f32) -> &mut Self
Sets radius of imaginable sphere around source in which no distance attenuation is applied.
Sourcepub fn set_rolloff_factor(&mut self, rolloff_factor: f32) -> &mut Self
pub fn set_rolloff_factor(&mut self, rolloff_factor: f32) -> &mut Self
Sets rolloff factor. Rolloff factor is used in distance attenuation and has different meaning in various distance models. It is applicable only for InverseDistance and ExponentDistance distance models. See DistanceModel docs for formulae.
Sourcepub fn rolloff_factor(&self) -> f32
pub fn rolloff_factor(&self) -> f32
Returns rolloff factor.
Sourcepub fn set_max_distance(&mut self, max_distance: f32) -> &mut Self
pub fn set_max_distance(&mut self, max_distance: f32) -> &mut Self
Sets maximum distance until which distance gain will be applicable. Basically it doing this min(max(distance, radius), max_distance) which clamps distance in radius..max_distance range. From listener’s perspective this will sound like source has stopped decreasing its volume even if distance continue to grow.
Sourcepub fn max_distance(&self) -> f32
pub fn max_distance(&self) -> f32
Returns max distance.
Sourcepub fn generic(&self) -> &GenericSource
pub fn generic(&self) -> &GenericSource
Returns shared reference to inner generic source.
Sourcepub fn generic_mut(&mut self) -> &mut GenericSource
pub fn generic_mut(&mut self) -> &mut GenericSource
Returns mutable reference to inner generic source.
Methods from Deref<Target = GenericSource>§
pub const NAME: &'static str = "name"
pub const BUFFER: &'static str = "buffer"
pub const PANNING: &'static str = "panning"
pub const PITCH: &'static str = "pitch"
pub const GAIN: &'static str = "gain"
pub const LOOPING: &'static str = "looping"
pub const RESAMPLING_MULTIPLIER: &'static str = "resampling_multiplier"
pub const STATUS: &'static str = "status"
pub const PLAY_ONCE: &'static str = "play_once"
Sourcepub fn name_owned(&self) -> String
pub fn name_owned(&self) -> String
Returns the name of the sound source.
Sourcepub fn set_buffer(
&mut self,
buffer: Option<SoundBufferResource>,
) -> Result<Option<SoundBufferResource>, SoundError>
pub fn set_buffer( &mut self, buffer: Option<SoundBufferResource>, ) -> Result<Option<SoundBufferResource>, SoundError>
Changes buffer of source. Returns old buffer. Source will continue playing from beginning, old position will be discarded.
Sourcepub fn buffer(&self) -> Option<SoundBufferResource>
pub fn buffer(&self) -> Option<SoundBufferResource>
Returns current buffer if any.
Sourcepub fn set_play_once(&mut self, play_once: bool)
pub fn set_play_once(&mut self, play_once: bool)
Marks buffer for single play. It will be automatically destroyed when it will finish playing.
§Notes
Make sure you not using handles to “play once” sounds, attempt to get reference of “play once” sound may result in panic if source already deleted. Looping sources will never be automatically deleted because their playback never stops.
Sourcepub fn is_play_once(&self) -> bool
pub fn is_play_once(&self) -> bool
Returns true if this source is marked for single play, false - otherwise.
Sourcepub fn set_gain(&mut self, gain: f32) -> &mut Self
pub fn set_gain(&mut self, gain: f32) -> &mut Self
Sets new gain (volume) of sound. Value should be in 0..1 range, but it is not clamped and larger values can be used to “overdrive” sound.
§Notes
Physical volume has non-linear scale (logarithmic) so perception of sound at 0.25 gain will be different if logarithmic scale was used.
Sourcepub fn set_panning(&mut self, panning: f32) -> &mut Self
pub fn set_panning(&mut self, panning: f32) -> &mut Self
Sets panning coefficient. Value must be in -1..+1 range. Where -1 - only left channel will be audible, 0 - both, +1 - only right.
Sourcepub fn panning(&self) -> f32
pub fn panning(&self) -> f32
Returns current panning coefficient in -1..+1 range. For more info see set_panning. Default value is 0.
Sourcepub fn set_looping(&mut self, looping: bool) -> &mut Self
pub fn set_looping(&mut self, looping: bool) -> &mut Self
Enabled or disables sound looping. Looping sound will never stop by itself, but can be stopped or paused
by calling stop or pause methods. Useful for music, ambient sounds, etc.
Sourcepub fn is_looping(&self) -> bool
pub fn is_looping(&self) -> bool
Returns looping status.
Sourcepub fn set_pitch(&mut self, pitch: f64) -> &mut Self
pub fn set_pitch(&mut self, pitch: f64) -> &mut Self
Sets sound pitch. Defines “tone” of sounds. Default value is 1.0
Sourcepub fn stop(&mut self) -> Result<(), SoundError>
pub fn stop(&mut self) -> Result<(), SoundError>
Stops sound source. Automatically rewinds streaming buffers.
Sourcepub fn playback_time(&self) -> Duration
pub fn playback_time(&self) -> Duration
Returns playback duration.
Sourcepub fn set_playback_time(&mut self, time: Duration)
pub fn set_playback_time(&mut self, time: Duration)
Sets playback duration.
Trait Implementations§
Source§impl Clone for SpatialSource
impl Clone for SpatialSource
Source§fn clone(&self) -> SpatialSource
fn clone(&self) -> SpatialSource
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for SpatialSource
impl Debug for SpatialSource
Source§impl Default for SpatialSource
impl Default for SpatialSource
Source§impl Deref for SpatialSource
impl Deref for SpatialSource
Source§impl DerefMut for SpatialSource
impl DerefMut for SpatialSource
Source§impl Inspect for SpatialSource
impl Inspect for SpatialSource
Source§fn properties(&self) -> Vec<PropertyInfo<'_>>
fn properties(&self) -> Vec<PropertyInfo<'_>>
Source§impl Visit for SpatialSource
impl Visit for SpatialSource
Auto Trait Implementations§
impl Freeze for SpatialSource
impl !RefUnwindSafe for SpatialSource
impl Send for SpatialSource
impl Sync for SpatialSource
impl Unpin for SpatialSource
impl UnsafeUnpin for SpatialSource
impl !UnwindSafe for SpatialSource
Blanket Implementations§
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> PropertyValue for Twhere
T: Debug + 'static,
impl<T> PropertyValue for Twhere
T: Debug + 'static,
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.