pub struct State { /* private fields */ }Expand description
Internal state of the sound engine.
Implementations§
Source§impl State
impl State
Sourcepub fn add_context(&mut self, context: SoundContext)
pub fn add_context(&mut self, context: SoundContext)
Adds new context to the engine. Each context must be added to the engine to emit sounds.
Examples found in repository?
examples/raw_streaming.rs (line 81)
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
examples/streaming.rs (line 40)
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 37)
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 40)
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 44)
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 40)
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}Additional examples can be found in:
Sourcepub fn remove_context(&mut self, context: SoundContext)
pub fn remove_context(&mut self, context: SoundContext)
Removes a context from the engine. Removed context will no longer produce any sound.
Sourcepub fn remove_all_contexts(&mut self)
pub fn remove_all_contexts(&mut self)
Removes all contexts from the engine.
Sourcepub fn has_context(&self, context: &SoundContext) -> bool
pub fn has_context(&self, context: &SoundContext) -> bool
Checks if a context is registered in the engine.
Sourcepub fn contexts(&self) -> &[SoundContext]
pub fn contexts(&self) -> &[SoundContext]
Returns a reference to context container.
Sourcepub fn render_buffer_len() -> usize
pub fn render_buffer_len() -> usize
Returns the length of buf to be passed to Self::render().
Examples found in repository?
examples/write_wav.rs (line 74)
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 render(&mut self, buf: &mut [(f32, f32)])
pub fn render(&mut self, buf: &mut [(f32, f32)])
Renders the sound into buf. The buf must have at least Self::render_buffer_len()
elements. This method must be used if and only if the engine was created via
SoundEngine::without_device.
§Deadlocks
This method internally locks added sound contexts so it must be called when all the contexts are unlocked or you’ll get a deadlock.
Examples found in repository?
examples/write_wav.rs (line 80)
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}Trait Implementations§
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
Mutably borrows from an owned value. Read more
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<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>
The inverse inclusion map: attempts to construct
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
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
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
fn from_subset(element: &SS) -> SP
The inclusion map: converts
self to the equivalent element of its superset.