Skip to main content

State

Struct State 

Source
pub struct State {
    pub serialization_options: SerializationOptions,
    /* private fields */
}
Expand description

Internal state of context.

Fields§

§serialization_options: SerializationOptions

A set of flags, that can be used to define what should be skipped during the serialization of a sound context.

Implementations§

Source§

impl State

Source

pub const SOURCES: &'static str = "sources"

Source

pub const LISTENER: &'static str = "listener"

Source

pub const RENDER_DURATION: &'static str = "render_duration"

Source

pub const RENDERER: &'static str = "renderer"

Source

pub const BUS_GRAPH: &'static str = "bus_graph"

Source

pub const DISTANCE_MODEL: &'static str = "distance_model"

Source

pub const PAUSED: &'static str = "paused"

Source§

impl State

Source

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.

Source

pub fn put_back( &mut self, ticket: Ticket<SoundSource>, node: SoundSource, ) -> Handle<SoundSource>

Puts source back by given ticket.

Source

pub fn forget_ticket(&mut self, ticket: Ticket<SoundSource>)

Makes source handle vacant again.

Source

pub fn pause(&mut self, pause: bool)

Pause/unpause the sound context. Paused context won’t play any sounds.

Source

pub fn is_paused(&self) -> bool

Returns true if the sound context is paused, false - otherwise.

Source

pub fn set_distance_model(&mut self, distance_model: DistanceModel)

Sets new distance model.

Source

pub fn distance_model(&self) -> DistanceModel

Returns current distance model.

Source

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.

Source

pub fn full_render_duration(&self) -> Duration

Returns amount of time context spent on rendering all sound sources.

Examples found in repository?
examples/hrtf.rs (line 113)
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
Hide additional examples
examples/reverb.rs (line 126)
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}
Source

pub fn set_renderer(&mut self, renderer: Renderer) -> Renderer

Sets new renderer.

Examples found in repository?
examples/hrtf.rs (lines 57-59)
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
Hide additional examples
examples/reverb.rs (lines 57-59)
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}
Source

pub fn renderer(&self) -> &Renderer

Returns shared reference to current renderer.

Source

pub fn renderer_mut(&mut self) -> &mut Renderer

Returns mutable reference to current renderer.

Source

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?
examples/raw_streaming.rs (line 95)
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
Hide additional examples
examples/streaming.rs (line 63)
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}
examples/raw_samples.rs (line 67)
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}
examples/play_sound.rs (line 64)
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}
examples/play_spatial_sound.rs (line 67)
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}
examples/write_wav.rs (line 62)
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}
Source

pub fn remove_source(&mut self, source: Handle<SoundSource>)

Removes sound source from the context.

Source

pub fn sources(&self) -> &Pool<SoundSource>

Returns shared reference to a pool with all sound sources.

Source

pub fn sources_mut(&mut self) -> &mut Pool<SoundSource>

Returns mutable reference to a pool with all sound sources.

Source

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.

Source

pub fn is_valid_handle(&self, handle: Handle<SoundSource>) -> bool

Checks whether a handle to a sound source is valid or not.

Source

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?
examples/play_spatial_sound.rs (line 76)
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
Hide additional examples
examples/hrtf.rs (line 103)
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}
examples/reverb.rs (line 116)
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}
Source

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.

Source

pub fn listener(&self) -> &Listener

Returns shared reference to listener. Engine has only one listener.

Source

pub fn listener_mut(&mut self) -> &mut Listener

Returns mutable reference to listener. Engine has only one listener.

Examples found in repository?
examples/listener.rs (line 77)
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}
Source

pub fn bus_graph_ref(&self) -> &AudioBusGraph

Returns a reference to the audio bus graph.

Source

pub fn bus_graph_mut(&mut self) -> &mut AudioBusGraph

Returns a reference to the audio bus graph.

Examples found in repository?
examples/reverb.rs (line 69)
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 Clone for State

Source§

fn clone(&self) -> State

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for State

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for State

Source§

fn default() -> State

Returns the “default value” for a type. Read more
Source§

impl Reflect for State
where Self: 'static,

Source§

fn source_path() -> &'static str

Source§

fn try_clone_box(&self) -> Option<Box<dyn Reflect>>

Source§

fn type_name(&self) -> &'static str

Source§

fn derived_types() -> &'static [TypeId]

Source§

fn query_derived_types(&self) -> &'static [TypeId]

Source§

fn doc(&self) -> &'static str

Source§

fn assembly_name(&self) -> &'static str

Returns a parent assembly name of the type that implements this trait. WARNING: You should use proc-macro (#[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

Returns a parent assembly name of the type that implements this trait. WARNING: You should use proc-macro (#[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 fields_ref(&self, func: &mut dyn FnMut(&[FieldRef<'_, '_>]))

Source§

fn fields_mut(&mut self, func: &mut dyn FnMut(&mut [FieldMut<'_, '_>]))

Source§

fn into_any(self: Box<Self>) -> Box<dyn Any>

Source§

fn set( &mut self, value: Box<dyn Reflect>, ) -> Result<Box<dyn Reflect>, Box<dyn Reflect>>

Source§

fn as_any(&self, func: &mut dyn FnMut(&dyn Any))

Source§

fn as_any_mut(&mut self, func: &mut dyn FnMut(&mut dyn Any))

Source§

fn as_reflect(&self, func: &mut dyn FnMut(&dyn Reflect))

Source§

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>), )

Calls user method specified with #[reflect(setter = ..)] or falls back to Reflect::field_mut
Source§

fn field( &self, name: &str, func: &mut dyn FnMut(Option<&(dyn Reflect + 'static)>), )

Source§

fn field_mut( &mut self, name: &str, func: &mut dyn FnMut(Option<&mut (dyn Reflect + 'static)>), )

Source§

fn as_array(&self, func: &mut dyn FnMut(Option<&(dyn ReflectArray + 'static)>))

Source§

fn as_array_mut( &mut self, func: &mut dyn FnMut(Option<&mut (dyn ReflectArray + 'static)>), )

Source§

fn as_list(&self, func: &mut dyn FnMut(Option<&(dyn ReflectList + 'static)>))

Source§

fn as_list_mut( &mut self, func: &mut dyn FnMut(Option<&mut (dyn ReflectList + 'static)>), )

Source§

fn as_inheritable_variable( &self, func: &mut dyn FnMut(Option<&(dyn ReflectInheritableVariable + 'static)>), )

Source§

fn as_inheritable_variable_mut( &mut self, func: &mut dyn FnMut(Option<&mut (dyn ReflectInheritableVariable + 'static)>), )

Source§

fn as_hash_map( &self, func: &mut dyn FnMut(Option<&(dyn ReflectHashMap + 'static)>), )

Source§

fn as_hash_map_mut( &mut self, func: &mut dyn FnMut(Option<&mut (dyn ReflectHashMap + 'static)>), )

Source§

fn as_handle( &self, func: &mut dyn FnMut(Option<&(dyn ReflectHandle + 'static)>), )

Source§

fn as_handle_mut( &mut self, func: &mut dyn FnMut(Option<&mut (dyn ReflectHandle + 'static)>), )

Source§

impl Visit for State

Source§

fn visit(&mut self, name: &str, visitor: &mut Visitor) -> VisitResult

Read or write this value, depending on whether Visitor::is_reading() is true or false. Read more

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> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> AsyncTaskResult for T
where T: Any + Send + 'static,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> FieldValue for T
where T: Reflect,

Source§

fn field_value_as_any_ref(&self) -> &(dyn Any + 'static)

Casts self to a &dyn Any
Source§

fn field_value_as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Casts self to a &mut dyn Any
Source§

fn field_value_as_reflect(&self) -> &(dyn Reflect + 'static)

Source§

fn field_value_as_reflect_mut(&mut self) -> &mut (dyn Reflect + 'static)

Source§

fn type_name(&self) -> &'static str

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<R> GetField for R
where R: Reflect,

Source§

fn get_field<T>(&self, name: &str, func: &mut dyn FnMut(Option<&T>))
where T: 'static,

Source§

fn get_field_mut<T>(&mut self, name: &str, func: &mut dyn FnMut(Option<&mut T>))
where T: 'static,

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<F, T> IntoSample<T> for F
where T: FromSample<F>,

Source§

fn into_sample(self) -> T

Source§

impl<T, U> ObjectOrVariant<T> for U

Source§

impl<T> ReflectBase for T
where T: Reflect,

Source§

fn as_any_raw(&self) -> &(dyn Any + 'static)

Source§

fn as_any_raw_mut(&mut self) -> &mut (dyn Any + 'static)

Source§

impl<T> ResolvePath for T
where T: Reflect,

Source§

fn resolve_path<'p>( &self, path: &'p str, func: &mut dyn FnMut(Result<&(dyn Reflect + 'static), ReflectPathError<'p>>), )

Source§

fn resolve_path_mut<'p>( &mut self, path: &'p str, func: &mut dyn FnMut(Result<&mut (dyn Reflect + 'static), ReflectPathError<'p>>), )

Source§

fn get_resolve_path<'p, T>( &self, path: &'p str, func: &mut dyn FnMut(Result<&T, ReflectPathError<'p>>), )
where T: Reflect,

Source§

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<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V