Mercurial > dsp > rdsp
changeset 6:527d411fb83c
lib: implement Mixer signal
Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author | Josef 'Jeff' Sipek <jeffpc@josefsipek.net> |
---|---|
date | Fri, 05 Jun 2020 21:34:25 -0400 |
parents | 16f7f95b576d |
children | ea5fb2efae53 |
files | src/lib/signal.rs src/lib/signal/mixer.rs |
diffstat | 2 files changed, 72 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/signal.rs Fri Jun 05 21:43:11 2020 -0400 +++ b/src/lib/signal.rs Fri Jun 05 21:34:25 2020 -0400 @@ -23,6 +23,7 @@ mod filesink; mod filesource; mod gain; +mod mixer; use super::IQSample; @@ -30,6 +31,7 @@ pub use filesink::FileSinkSignal; pub use filesource::FileSourceSignal; pub use gain::Gain; +pub use mixer::Mixer; pub trait SignalFormatter { const SAMPLE_SIZE: usize;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib/signal/mixer.rs Fri Jun 05 21:34:25 2020 -0400 @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2020 Josef 'Jeff' Sipek <jeffpc@josefsipek.net> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +use crate::IQSample; +use super::Signal; + +pub struct Mixer<T: Signal, U: Signal> { + rate: u64, + /* TODO: freq */ + lhs: T, + rhs: U, +} + +impl<T: Signal, U: Signal> Mixer<T, U> { + pub fn new(lhs: T, rhs: U) -> Mixer<T, U> { + if lhs.sample_rate() != rhs.sample_rate() { + panic!("sample rate mismatch: {} {}", lhs.sample_rate(), rhs.sample_rate()); + } + + Mixer { + rate: lhs.sample_rate(), + lhs: lhs, + rhs: rhs, + } + } +} + +impl<T: Signal, U: Signal> Signal for Mixer<T, U> { + fn sample_rate(&self) -> u64 { + self.rate + } + + fn sample_size(&self) -> usize { + std::mem::size_of::<IQSample>() + } + + fn freq(&self) -> u64 { + panic!("TODO"); + } +} + +impl<T: Signal, U: Signal> Iterator for Mixer<T, U> { + type Item = IQSample; + + fn next(&mut self) -> Option<Self::Item> { + match (self.lhs.next(), self.rhs.next()) { + (Some(a), Some(b)) => Some(a * b), + _ => None + } + } +}