Skip to content

Commit 9ea54c1

Browse files
committed
See what happens if channels and sample_rate are options.
This is a major refactor touching all the parts. The idea behind it is that for the exceptional case of `Empty` we can supply None to either and otherwise we either have supplied values or some "sane" defaults available to use
1 parent ccfbeb6 commit 9ea54c1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+228
-231
lines changed

benches/resampler.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ fn no_resampling(bencher: Bencher) {
1717
(source.channels(), source.sample_rate(), source)
1818
})
1919
.bench_values(|(channels, sample_rate, source)| {
20-
UniformSourceIterator::<_, i16>::new(source, channels, sample_rate)
20+
UniformSourceIterator::<_, i16>::new(source, channels.unwrap(), sample_rate.unwrap())
2121
.for_each(divan::black_box_drop)
2222
})
2323
}
@@ -36,7 +36,7 @@ fn resample_to(bencher: Bencher, target_sample_rate: u32) {
3636
(source.channels(), source)
3737
})
3838
.bench_values(|(channels, source)| {
39-
UniformSourceIterator::<_, i16>::new(source, channels, target_sample_rate)
39+
UniformSourceIterator::<_, i16>::new(source, channels.unwrap(), target_sample_rate)
4040
.for_each(divan::black_box_drop)
4141
})
4242
}

benches/shared.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@ impl<T: rodio::Sample> Source for TestSource<T> {
3030
None // forever
3131
}
3232

33-
fn channels(&self) -> u16 {
34-
self.channels
33+
fn channels(&self) -> Option<u16> {
34+
Some(self.channels)
3535
}
3636

37-
fn sample_rate(&self) -> u32 {
38-
self.sample_rate
37+
fn sample_rate(&self) -> Option<u32> {
38+
Some(self.sample_rate)
3939
}
4040

4141
fn total_duration(&self) -> Option<Duration> {
@@ -54,8 +54,8 @@ impl TestSource<i16> {
5454
.take_duration(duration);
5555

5656
TestSource {
57-
channels: sound.channels(),
58-
sample_rate: sound.sample_rate(),
57+
channels: sound.channels().unwrap(),
58+
sample_rate: sound.sample_rate().unwrap(),
5959
total_duration: duration,
6060
samples: sound.into_iter().collect::<Vec<_>>().into_iter(),
6161
}

src/buffer.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,13 @@ where
7474
}
7575

7676
#[inline]
77-
fn channels(&self) -> u16 {
78-
self.channels
77+
fn channels(&self) -> Option<u16> {
78+
Some(self.channels)
7979
}
8080

8181
#[inline]
82-
fn sample_rate(&self) -> u32 {
83-
self.sample_rate
82+
fn sample_rate(&self) -> Option<u32> {
83+
Some(self.sample_rate)
8484
}
8585

8686
#[inline]
@@ -95,14 +95,16 @@ where
9595
/// This jumps in memory till the sample for `pos`.
9696
#[inline]
9797
fn try_seek(&mut self, pos: Duration) -> Result<(), SeekError> {
98-
let curr_channel = self.pos % self.channels() as usize;
99-
let new_pos = pos.as_secs_f32() * self.sample_rate() as f32 * self.channels() as f32;
98+
let curr_channel = self.pos % self.channels().unwrap() as usize;
99+
let new_pos = pos.as_secs_f32()
100+
* self.sample_rate().unwrap() as f32
101+
* self.channels().unwrap() as f32;
100102
// saturate pos at the end of the source
101103
let new_pos = new_pos as usize;
102104
let new_pos = new_pos.min(self.data.len());
103105

104106
// make sure the next sample is for the right channel
105-
let new_pos = new_pos.next_multiple_of(self.channels() as usize);
107+
let new_pos = new_pos.next_multiple_of(self.channels().unwrap() as usize);
106108
let new_pos = new_pos - curr_channel;
107109

108110
self.pos = new_pos;

src/conversions/channels.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,12 @@ where
3030
to: cpal::ChannelCount,
3131
) -> ChannelCountConverter<I> {
3232
assert!(to >= 1);
33-
let from = match from {
33+
assert!(from >= 1);
34+
/*let from = match from {
3435
0 => to,
3536
n => n,
3637
};
38+
*/
3739

3840
ChannelCountConverter {
3941
input,
@@ -182,10 +184,17 @@ mod test {
182184
assert_eq!(output.len(), 2);
183185
}
184186

185-
#[test]
187+
#[should_panic]
186188
fn zero_input() {
187189
let input = vec![1u16, 2, 3, 4, 5, 6];
188-
let output = ChannelCountConverter::new(input.into_iter(), 0, 3);
189-
assert_eq!(output.len(), 6);
190+
// Panics because from is 0
191+
let _output = ChannelCountConverter::new(input.into_iter(), 0, 3);
192+
}
193+
194+
#[should_panic]
195+
fn zero_output() {
196+
let input = vec![1u16, 2, 3, 4, 5, 6];
197+
// Panics because to is 0
198+
let _output = ChannelCountConverter::new(input.into_iter(), 3, 0);
190199
}
191200
}

src/conversions/sample_rate.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ mod test {
356356

357357
let to = SampleRate(to);
358358
let source = SineWave::new(freq).take_duration(d);
359-
let from = SampleRate(source.sample_rate());
359+
let from = SampleRate(source.sample_rate().unwrap());
360360

361361
let resampled =
362362
SampleRateConverter::new(source, from, to, 1);

src/decoder/flac.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,13 @@ where
6464
}
6565

6666
#[inline]
67-
fn channels(&self) -> u16 {
68-
self.channels
67+
fn channels(&self) -> Option<u16> {
68+
Some(self.channels)
6969
}
7070

7171
#[inline]
72-
fn sample_rate(&self) -> u32 {
73-
self.sample_rate
72+
fn sample_rate(&self) -> Option<u32> {
73+
Some(self.sample_rate)
7474
}
7575

7676
#[inline]

src/decoder/mod.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ impl<R: Read + Seek> DecoderImpl<R> {
118118
}
119119

120120
#[inline]
121-
fn channels(&self) -> u16 {
121+
fn channels(&self) -> Option<u16> {
122122
match self {
123123
#[cfg(all(feature = "wav", not(feature = "symphonia-wav")))]
124124
DecoderImpl::Wav(source) => source.channels(),
@@ -130,12 +130,12 @@ impl<R: Read + Seek> DecoderImpl<R> {
130130
DecoderImpl::Mp3(source) => source.channels(),
131131
#[cfg(feature = "symphonia")]
132132
DecoderImpl::Symphonia(source) => source.channels(),
133-
DecoderImpl::None(_) => 0,
133+
DecoderImpl::None(_) => None, // FIX-ME? I changed this from `0` to `None` instead of `Some(0)`
134134
}
135135
}
136136

137137
#[inline]
138-
fn sample_rate(&self) -> u32 {
138+
fn sample_rate(&self) -> Option<u32> {
139139
match self {
140140
#[cfg(all(feature = "wav", not(feature = "symphonia-wav")))]
141141
DecoderImpl::Wav(source) => source.sample_rate(),
@@ -147,7 +147,7 @@ impl<R: Read + Seek> DecoderImpl<R> {
147147
DecoderImpl::Mp3(source) => source.sample_rate(),
148148
#[cfg(feature = "symphonia")]
149149
DecoderImpl::Symphonia(source) => source.sample_rate(),
150-
DecoderImpl::None(_) => 1,
150+
DecoderImpl::None(_) => Some(1),
151151
}
152152
}
153153

@@ -418,11 +418,11 @@ where
418418
}
419419

420420
#[inline]
421-
fn channels(&self) -> u16 {
421+
fn channels(&self) -> Option<u16> {
422422
self.0.channels()
423423
}
424424

425-
fn sample_rate(&self) -> u32 {
425+
fn sample_rate(&self) -> Option<u32> {
426426
self.0.sample_rate()
427427
}
428428

@@ -516,12 +516,12 @@ where
516516
}
517517

518518
#[inline]
519-
fn channels(&self) -> u16 {
519+
fn channels(&self) -> Option<u16> {
520520
self.0.channels()
521521
}
522522

523523
#[inline]
524-
fn sample_rate(&self) -> u32 {
524+
fn sample_rate(&self) -> Option<u32> {
525525
self.0.sample_rate()
526526
}
527527

src/decoder/symphonia.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -159,13 +159,13 @@ impl Source for SymphoniaDecoder {
159159
}
160160

161161
#[inline]
162-
fn channels(&self) -> u16 {
163-
self.spec.channels.count() as u16
162+
fn channels(&self) -> Option<u16> {
163+
Some(self.spec.channels.count() as u16)
164164
}
165165

166166
#[inline]
167-
fn sample_rate(&self) -> u32 {
168-
self.spec.rate
167+
fn sample_rate(&self) -> Option<u32> {
168+
Some(self.spec.rate)
169169
}
170170

171171
#[inline]
@@ -188,7 +188,7 @@ impl Source for SymphoniaDecoder {
188188
};
189189

190190
// make sure the next sample is for the right channel
191-
let to_skip = self.current_frame_offset % self.channels() as usize;
191+
let to_skip = self.current_frame_offset % self.channels().unwrap() as usize;
192192

193193
let seek_res = self
194194
.format
@@ -285,7 +285,7 @@ impl SymphoniaDecoder {
285285
let decoded = decoded.map_err(SeekError::Decoding)?;
286286
decoded.spec().clone_into(&mut self.spec);
287287
self.buffer = SymphoniaDecoder::get_buffer(decoded, &self.spec);
288-
self.current_frame_offset = samples_to_pass as usize * self.channels() as usize;
288+
self.current_frame_offset = samples_to_pass as usize * self.channels().unwrap() as usize;
289289
Ok(())
290290
}
291291
}

src/decoder/vorbis.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,13 @@ where
6262
}
6363

6464
#[inline]
65-
fn channels(&self) -> u16 {
66-
self.stream_reader.ident_hdr.audio_channels as u16
65+
fn channels(&self) -> Option<u16> {
66+
Some(self.stream_reader.ident_hdr.audio_channels as u16)
6767
}
6868

6969
#[inline]
70-
fn sample_rate(&self) -> u32 {
71-
self.stream_reader.ident_hdr.audio_sample_rate
70+
fn sample_rate(&self) -> Option<u32> {
71+
Some(self.stream_reader.ident_hdr.audio_sample_rate)
7272
}
7373

7474
#[inline]

src/decoder/wav.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -115,13 +115,13 @@ where
115115
}
116116

117117
#[inline]
118-
fn channels(&self) -> u16 {
119-
self.channels
118+
fn channels(&self) -> Option<u16> {
119+
Some(self.channels)
120120
}
121121

122122
#[inline]
123-
fn sample_rate(&self) -> u32 {
124-
self.sample_rate
123+
fn sample_rate(&self) -> Option<u32> {
124+
Some(self.sample_rate)
125125
}
126126

127127
#[inline]
@@ -133,18 +133,18 @@ where
133133
fn try_seek(&mut self, pos: Duration) -> Result<(), SeekError> {
134134
let file_len = self.reader.reader.duration();
135135

136-
let new_pos = pos.as_secs_f32() * self.sample_rate() as f32;
136+
let new_pos = pos.as_secs_f32() * self.sample_rate as f32;
137137
let new_pos = new_pos as u32;
138138
let new_pos = new_pos.min(file_len); // saturate pos at the end of the source
139139

140140
// make sure the next sample is for the right channel
141-
let to_skip = self.reader.samples_read % self.channels() as u32;
141+
let to_skip = self.reader.samples_read % self.channels as u32;
142142

143143
self.reader
144144
.reader
145145
.seek(new_pos)
146146
.map_err(SeekError::HoundDecoder)?;
147-
self.reader.samples_read = new_pos * self.channels() as u32;
147+
self.reader.samples_read = new_pos * self.channels as u32;
148148

149149
for _ in 0..to_skip {
150150
self.next();

src/mixer.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,13 @@ where
9090
}
9191

9292
#[inline]
93-
fn channels(&self) -> u16 {
94-
self.input.channels
93+
fn channels(&self) -> Option<u16> {
94+
Some(self.input.channels)
9595
}
9696

9797
#[inline]
98-
fn sample_rate(&self) -> u32 {
99-
self.input.sample_rate
98+
fn sample_rate(&self) -> Option<u32> {
99+
Some(self.input.sample_rate)
100100
}
101101

102102
#[inline]
@@ -113,21 +113,21 @@ where
113113
// uncomment when #510 is implemented (query position of playback)
114114

115115
// let mut org_positions = Vec::with_capacity(self.current_sources.len());
116-
// let mut encounterd_err = None;
116+
// let mut encountered_err = None;
117117
//
118118
// for source in &mut self.current_sources {
119119
// let pos = /* source.playback_pos() */ todo!();
120120
// if let Err(e) = source.try_seek(pos) {
121-
// encounterd_err = Some(e);
121+
// encountered_err = Some(e);
122122
// break;
123123
// } else {
124124
// // store pos in case we need to roll back
125125
// org_positions.push(pos);
126126
// }
127127
// }
128128
//
129-
// if let Some(e) = encounterd_err {
130-
// // rollback seeks that happend before err
129+
// if let Some(e) = encountered_err {
130+
// // rollback seeks that happened before err
131131
// for (pos, source) in org_positions
132132
// .into_iter()
133133
// .zip(self.current_sources.iter_mut())
@@ -182,7 +182,7 @@ where
182182
let mut pending = self.input.pending_sources.lock().unwrap(); // TODO: relax ordering?
183183

184184
for source in pending.drain(..) {
185-
let in_step = self.sample_count % source.channels() as usize == 0;
185+
let in_step = self.sample_count % source.channels().unwrap() as usize == 0;
186186

187187
if in_step {
188188
self.current_sources.push(source);
@@ -224,8 +224,8 @@ mod tests {
224224
tx.add(SamplesBuffer::new(1, 48000, vec![10i16, -10, 10, -10]));
225225
tx.add(SamplesBuffer::new(1, 48000, vec![5i16, 5, 5, 5]));
226226

227-
assert_eq!(rx.channels(), 1);
228-
assert_eq!(rx.sample_rate(), 48000);
227+
assert_eq!(rx.channels(), Some(1));
228+
assert_eq!(rx.sample_rate(), Some(48000));
229229
assert_eq!(rx.next(), Some(15));
230230
assert_eq!(rx.next(), Some(-5));
231231
assert_eq!(rx.next(), Some(15));
@@ -240,8 +240,8 @@ mod tests {
240240
tx.add(SamplesBuffer::new(1, 48000, vec![10i16, -10, 10, -10]));
241241
tx.add(SamplesBuffer::new(1, 48000, vec![5i16, 5, 5, 5]));
242242

243-
assert_eq!(rx.channels(), 2);
244-
assert_eq!(rx.sample_rate(), 48000);
243+
assert_eq!(rx.channels(), Some(2));
244+
assert_eq!(rx.sample_rate(), Some(48000));
245245
assert_eq!(rx.next(), Some(15));
246246
assert_eq!(rx.next(), Some(15));
247247
assert_eq!(rx.next(), Some(-5));
@@ -260,8 +260,8 @@ mod tests {
260260
tx.add(SamplesBuffer::new(1, 48000, vec![10i16, -10, 10, -10]));
261261
tx.add(SamplesBuffer::new(1, 48000, vec![5i16, 5, 5, 5]));
262262

263-
assert_eq!(rx.channels(), 1);
264-
assert_eq!(rx.sample_rate(), 96000);
263+
assert_eq!(rx.channels(), Some(1));
264+
assert_eq!(rx.sample_rate(), Some(96000));
265265
assert_eq!(rx.next(), Some(15));
266266
assert_eq!(rx.next(), Some(5));
267267
assert_eq!(rx.next(), Some(-5));

0 commit comments

Comments
 (0)