Skip to content

Commit 148a03c

Browse files
authored
Merge pull request #379 from HEnquist/ringbuf_in_delay_and_dither
Replace circularqueue in delay and dither with ringbuf
2 parents 39203d6 + 17e2aca commit 148a03c

File tree

3 files changed

+14
-12
lines changed

3 files changed

+14
-12
lines changed

Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ cpal = { version = "0.13.3", optional = true }
7171
#rawsample = { path = "../../rust/rawsample" }
7272
#rawsample = { git = "https://github.com/HEnquist/rawsample", branch = "main" }
7373
rawsample = "0.2.0"
74-
circular-queue = "0.2.6"
7574
parking_lot = { version = "0.12.1", features = ["hardware-lock-elision"] }
7675
crossbeam-channel = "0.5"
7776
rayon = "1.10.0"

src/basicfilters.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use std::sync::Arc;
22

3-
use circular_queue::CircularQueue;
3+
use ringbuf::storage::Heap;
4+
use ringbuf::traits::*;
5+
use ringbuf::LocalRb;
46

57
use crate::audiodevice::AudioChunk;
68
use crate::biquad::{Biquad, BiquadCoefficients};
@@ -21,7 +23,7 @@ pub struct Gain {
2123
pub struct Delay {
2224
pub name: String,
2325
samplerate: usize,
24-
queue: CircularQueue<PrcFmt>,
26+
queue: LocalRb<Heap<PrcFmt>>,
2527
biquad: Option<Biquad>,
2628
}
2729

@@ -347,9 +349,9 @@ impl Delay {
347349

348350
// for super-small delays, store at least a single sample
349351
let integerdelay = integerdelay.max(1);
350-
let mut queue = CircularQueue::with_capacity(integerdelay);
352+
let mut queue = LocalRb::new(integerdelay);
351353
for _ in 0..integerdelay {
352-
queue.push(0.0);
354+
let _ = queue.try_push(0.0);
353355
}
354356

355357
Self {
@@ -379,7 +381,7 @@ impl Filter for Delay {
379381
fn process_waveform(&mut self, waveform: &mut [PrcFmt]) -> Res<()> {
380382
for item in waveform.iter_mut() {
381383
// this returns the item that was popped while pushing
382-
*item = self.queue.push(*item).unwrap();
384+
*item = self.queue.push_overwrite(*item).unwrap();
383385
}
384386
if let Some(bq) = &mut self.biquad {
385387
bq.process_waveform(waveform)?;

src/dither.rs

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
use circular_queue::CircularQueue;
21
use rand::{rngs::SmallRng, SeedableRng};
32
use rand_distr::{Distribution, Triangular, Uniform};
3+
use ringbuf::storage::Heap;
4+
use ringbuf::traits::*;
5+
use ringbuf::LocalRb;
46

57
use crate::{config, filters::Filter, NewValue, PrcFmt, Res};
68

@@ -14,17 +16,16 @@ pub struct Dither<'a> {
1416
shaper: Option<NoiseShaper<'a>>,
1517
}
1618

17-
#[derive(Clone, Debug)]
1819
pub struct NoiseShaper<'a> {
1920
// optimization: lifetime allows taking coefficients
2021
// from an array instead of allocating a `Vec`.
2122
filter: &'a [PrcFmt],
22-
buffer: CircularQueue<PrcFmt>,
23+
buffer: LocalRb<Heap<PrcFmt>>,
2324
}
2425

2526
impl<'a> NoiseShaper<'a> {
2627
pub fn new(filter: &'a [PrcFmt]) -> Self {
27-
let buffer = CircularQueue::with_capacity(filter.len());
28+
let buffer = LocalRb::new(filter.len());
2829
Self { filter, buffer }
2930
}
3031

@@ -438,15 +439,15 @@ impl<'a> NoiseShaper<'a> {
438439

439440
pub fn process(&mut self, scaled: PrcFmt, dither: PrcFmt) -> PrcFmt {
440441
let mut filt_buf = 0.0;
441-
for (item, coeff) in self.buffer.iter().zip(self.filter) {
442+
for (item, coeff) in self.buffer.iter().zip(self.filter.iter().rev()) {
442443
filt_buf += coeff * item;
443444
}
444445

445446
let scaled_plus_err = scaled + filt_buf;
446447
let result = scaled_plus_err + dither;
447448
let result_r = result.round(); // away from zero
448449

449-
self.buffer.push(scaled_plus_err - result_r);
450+
self.buffer.push_overwrite(scaled_plus_err - result_r);
450451

451452
result_r
452453
}

0 commit comments

Comments
 (0)