Skip to content

Commit 23b7c6a

Browse files
committed
Change the Signal trait to return Self::Frame
Closes #55.
1 parent 0e00a97 commit 23b7c6a

File tree

9 files changed

+666
-712
lines changed

9 files changed

+666
-712
lines changed

examples/resample.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,21 @@ extern crate sample;
44

55
use hound::{WavReader, WavSpec, WavWriter};
66
use sample::interpolate::{Sinc, Converter};
7-
use sample::Sample;
7+
use sample::{signal, Sample, Signal};
88

99
fn main() {
1010
let assets = find_folder::Search::ParentsThenKids(5, 5).for_folder("assets").unwrap();
1111
let mut reader = WavReader::open(assets.join("two_vowels.wav")).unwrap();
1212
let samples: Vec<[f64; 1]> = reader.samples::<i16>()
1313
.map(|s| [s.unwrap().to_sample()])
1414
.collect();
15+
let len = samples.len();
16+
let signal = signal::from_slice(&samples[..]);
1517

1618
let sample_rate = reader.spec().sample_rate as f64;
1719
let new_sample_rate = 10_000.0;
1820
let sinc = Sinc::zero_padded(50);
19-
let conv = Converter::from_hz_to_hz(samples.iter().cloned(), sinc, sample_rate, new_sample_rate);
21+
let conv = Converter::from_hz_to_hz(signal, sinc, sample_rate, new_sample_rate);
2022

2123
let spec = WavSpec {
2224
channels: 1,
@@ -26,7 +28,8 @@ fn main() {
2628
};
2729

2830
let mut writer = WavWriter::create(assets.join("two_vowels_10k.wav"), spec).unwrap();
29-
for f in conv {
31+
let len = (len as f64 * new_sample_rate / sample_rate) as usize;
32+
for f in conv.take(len) {
3033
writer.write_sample((f[0].to_sample::<i16>())).unwrap();
3134
}
3235
}

examples/synth.rs

+4-6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
extern crate portaudio as pa;
22
extern crate sample;
33

4-
use sample::{Frame, Sample, Signal, ToFrameSliceMut};
5-
use sample::signal;
4+
use sample::{signal, Frame, Sample, Signal, ToFrameSliceMut};
65

76
const FRAMES_PER_BUFFER: u32 = 512;
87
const NUM_CHANNELS: i32 = 1;
@@ -17,13 +16,12 @@ fn run() -> Result<(), pa::Error> {
1716
// Create a signal chain to play back 1 second of each oscillator at A4.
1817
let hz = signal::rate(SAMPLE_RATE).const_hz(440.0);
1918
let one_sec = SAMPLE_RATE as usize;
20-
let mut signal = hz.clone().sine().take(one_sec)
19+
let mut waves = hz.clone().sine().take(one_sec)
2120
.chain(hz.clone().saw().take(one_sec))
2221
.chain(hz.clone().square().take(one_sec))
2322
.chain(hz.clone().noise_simplex().take(one_sec))
2423
.chain(signal::noise(0).take(one_sec))
25-
.map(|f| f.map(|s| s.to_sample::<f32>()))
26-
.scale_amp(0.2);
24+
.map(|f| f.map(|s| s.to_sample::<f32>() * 0.2));
2725

2826
// Initialise PortAudio.
2927
let pa = try!(pa::PortAudio::new());
@@ -35,7 +33,7 @@ fn run() -> Result<(), pa::Error> {
3533
let callback = move |pa::OutputStreamCallbackArgs { buffer, .. }| {
3634
let buffer: &mut [[f32; 1]] = buffer.to_frame_slice_mut().unwrap();
3735
for out_frame in buffer {
38-
match signal.next() {
36+
match waves.next() {
3937
Some(frame) => *out_frame = frame,
4038
None => return pa::Complete,
4139
}

examples/wav.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,12 @@ fn frames(file_name: &'static str) -> Vec<wav::Frame> {
6363
let sample_file = assets.join(file_name);
6464
let mut reader = hound::WavReader::open(&sample_file).unwrap();
6565
let spec = reader.spec();
66+
let duration = reader.duration();
67+
let new_duration = (duration as f64 * (SAMPLE_RATE as f64 / spec.sample_rate as f64)) as usize;
6668
let samples = reader.samples().map(|s| s.unwrap());
67-
let mut signal = signal::from_interleaved_samples::<_, wav::Frame>(samples);
68-
let interp = Linear::from_source(&mut signal).unwrap();
69+
let mut signal = signal::from_interleaved_samples_iter::<_, wav::Frame>(samples);
70+
let interp = Linear::from_source(&mut signal);
6971
signal.from_hz_to_hz(interp, spec.sample_rate as f64, SAMPLE_RATE as f64)
72+
.take(new_duration)
7073
.collect()
7174
}

0 commit comments

Comments
 (0)