From ae5e1ce9feadce4c5587016ac5cbd644fc1a9d8b Mon Sep 17 00:00:00 2001 From: David Alasow Date: Wed, 9 Aug 2023 18:58:24 +0200 Subject: [PATCH 1/2] Add methods to define region ends --- src/audio.rs | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/audio.rs b/src/audio.rs index 0c8d330..4014bf3 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -11,7 +11,7 @@ use bevy::asset::{Handle, HandleId}; use bevy::ecs::system::Resource; use bevy::prelude::{default, IntoSystemConfigs, PostUpdate}; use kira::sound::static_sound::{StaticSoundData, StaticSoundHandle}; -use kira::sound::{EndPosition, PlaybackPosition, Region}; +use kira::sound::EndPosition; use kira::tween::Value; use kira::Volume; use std::marker::PhantomData; @@ -29,10 +29,12 @@ pub(crate) enum AudioCommand { #[derive(Clone, Default)] pub(crate) struct PartialSoundSettings { - pub(crate) loop_start: Option>, + pub(crate) loop_start: Option, + pub(crate) loop_end: Option, pub(crate) volume: Option, pub(crate) playback_rate: Option, pub(crate) start_position: Option, + pub(crate) end_position: Option, pub(crate) panning: Option, pub(crate) reverse: Option, pub(crate) fade_in: Option, @@ -104,14 +106,10 @@ impl From<&AudioTween> for kira::tween::Tween { impl PartialSoundSettings { pub(crate) fn apply(&self, sound: &mut StaticSoundData) { if let Some(loop_start) = self.loop_start { - if let Some(start) = loop_start { - sound.settings.loop_region = Some(Region { - start: PlaybackPosition::Seconds(start), - end: EndPosition::EndOfAudio, - }) - } else { - sound.settings.loop_region = None; - } + sound.settings.loop_region.get_or_insert_with(Default::default).start = loop_start.into(); + } + if let Some(loop_end) = self.loop_end { + sound.settings.loop_region.get_or_insert_with(Default::default).end = EndPosition::Custom(loop_end.into()); } if let Some(volume) = self.volume { sound.settings.volume = Value::Fixed(volume); @@ -120,10 +118,10 @@ impl PartialSoundSettings { sound.settings.playback_rate = playback_rate.into(); } if let Some(start) = self.start_position { - sound.settings.playback_region = Region { - start: PlaybackPosition::Seconds(start), - end: EndPosition::EndOfAudio, - }; + sound.settings.playback_region.start = start.into(); + } + if let Some(end) = self.end_position { + sound.settings.playback_region.end = EndPosition::Custom(end.into()); } if let Some(panning) = self.panning { sound.settings.panning = Value::Fixed(panning); @@ -184,14 +182,21 @@ impl<'a> PlayAudioCommand<'a> { /// Loop the playing sound. pub fn looped(&mut self) -> &mut Self { - self.settings.loop_start = Some(Some(0.0)); + self.settings.loop_start = Some(0.0); self } /// Loop the playing sound, starting from the given position. pub fn loop_from(&mut self, loop_start_position: f64) -> &mut Self { - self.settings.loop_start = Some(Some(loop_start_position)); + self.settings.loop_start = Some(loop_start_position); + + self + } + + /// Loop the playing sound, ending at the given position. + pub fn loop_to(&mut self, loop_end_position: f64) -> &mut Self { + self.settings.loop_end = Some(loop_end_position); self } @@ -217,6 +222,13 @@ impl<'a> PlayAudioCommand<'a> { self } + /// End the sound at the given position in seconds. + pub fn end_at(&mut self, end_position: f64) -> &mut Self { + self.settings.end_position = Some(end_position); + + self + } + /// Set the panning of the sound. /// /// The default value is 0.5. From 03f1c14c74c877bb3248c1725a675b62705e7b57 Mon Sep 17 00:00:00 2001 From: David Alasow Date: Wed, 9 Aug 2023 19:11:16 +0200 Subject: [PATCH 2/2] cargo fmt --- src/audio.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/audio.rs b/src/audio.rs index 4014bf3..c91fd71 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -106,10 +106,18 @@ impl From<&AudioTween> for kira::tween::Tween { impl PartialSoundSettings { pub(crate) fn apply(&self, sound: &mut StaticSoundData) { if let Some(loop_start) = self.loop_start { - sound.settings.loop_region.get_or_insert_with(Default::default).start = loop_start.into(); + sound + .settings + .loop_region + .get_or_insert_with(Default::default) + .start = loop_start.into(); } if let Some(loop_end) = self.loop_end { - sound.settings.loop_region.get_or_insert_with(Default::default).end = EndPosition::Custom(loop_end.into()); + sound + .settings + .loop_region + .get_or_insert_with(Default::default) + .end = EndPosition::Custom(loop_end.into()); } if let Some(volume) = self.volume { sound.settings.volume = Value::Fixed(volume);