diff --git a/src/source/empty.rs b/src/source/empty.rs new file mode 100644 index 0000000..13b0576 --- /dev/null +++ b/src/source/empty.rs @@ -0,0 +1,46 @@ +use std::marker::PhantomData; +use std::time::Duration; +use Sample; +use Source; + +/// An empty source. +#[derive(Debug, Copy, Clone)] +pub struct Empty(PhantomData); + +impl Empty { + #[inline] + pub fn new() -> Empty { + Empty(PhantomData) + } +} + +impl Iterator for Empty { + type Item = S; + + #[inline] + fn next(&mut self) -> Option { + None + } +} + +impl Source for Empty where S: Sample { + #[inline] + fn get_current_frame_len(&self) -> Option { + None + } + + #[inline] + fn get_channels(&self) -> u16 { + 1 + } + + #[inline] + fn get_samples_rate(&self) -> u32 { + 48000 + } + + #[inline] + fn get_total_duration(&self) -> Option { + Some(Duration::new(0, 0)) + } +} diff --git a/src/source/mod.rs b/src/source/mod.rs index 50feb24..77e4740 100644 --- a/src/source/mod.rs +++ b/src/source/mod.rs @@ -5,6 +5,7 @@ use Sample; pub use self::amplify::Amplify; pub use self::buffered::Buffered; pub use self::delay::Delay; +pub use self::empty::Empty; pub use self::fadein::FadeIn; pub use self::mix::Mix; pub use self::pauseable::Pauseable; @@ -14,10 +15,12 @@ pub use self::speed::Speed; pub use self::take::TakeDuration; pub use self::uniform::UniformSourceIterator; pub use self::volume_filter::VolumeFilter; +pub use self::zero::Zero; mod amplify; mod buffered; mod delay; +mod empty; mod fadein; mod mix; mod pauseable; @@ -27,6 +30,7 @@ mod speed; mod take; mod uniform; mod volume_filter; +mod zero; /// A source of samples. pub trait Source: Iterator diff --git a/src/source/zero.rs b/src/source/zero.rs new file mode 100644 index 0000000..c89e69f --- /dev/null +++ b/src/source/zero.rs @@ -0,0 +1,54 @@ +use std::marker::PhantomData; +use std::time::Duration; +use Sample; +use Source; + +/// An infinite source that produces zero. +#[derive(Clone, Debug)] +pub struct Zero { + channels: u16, + samples_rate: u32, + marker: PhantomData, +} + +impl Zero { + #[inline] + pub fn new(channels: u16, samples_rate: u32) -> Zero { + Zero { + channels: channels, + samples_rate: samples_rate, + marker: PhantomData, + } + } +} + +impl Iterator for Zero where S: Sample { + type Item = S; + + #[inline] + fn next(&mut self) -> Option { + Some(S::zero_value()) + } +} + +impl Source for Zero where S: Sample { + #[inline] + fn get_current_frame_len(&self) -> Option { + None + } + + #[inline] + fn get_channels(&self) -> u16 { + self.channels + } + + #[inline] + fn get_samples_rate(&self) -> u32 { + self.samples_rate + } + + #[inline] + fn get_total_duration(&self) -> Option { + None + } +}