mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2024-11-26 05:21:00 +00:00
Simplify audioecho code a bit
This commit is contained in:
parent
80341fd90e
commit
97ad0c0bc2
1 changed files with 20 additions and 18 deletions
|
@ -239,7 +239,7 @@ impl BaseTransformImpl<RsBaseTransform> for AudioEcho {
|
||||||
Some(ref mut state) => state,
|
Some(ref mut state) => state,
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut map = match buf.get_mut().unwrap().map_writable() {
|
let mut map = match buf.get_mut().and_then(|b| b.map_writable()) {
|
||||||
None => return gst::FlowReturn::Error,
|
None => return gst::FlowReturn::Error,
|
||||||
Some(map) => map,
|
Some(map) => map,
|
||||||
};
|
};
|
||||||
|
@ -317,9 +317,8 @@ pub fn register(plugin: &gst::Plugin) {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct RingBuffer {
|
struct RingBuffer {
|
||||||
buffer: Vec<f64>,
|
buffer: Box<[f64]>,
|
||||||
pos: usize,
|
pos: usize,
|
||||||
size: usize,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RingBuffer {
|
impl RingBuffer {
|
||||||
|
@ -328,9 +327,8 @@ impl RingBuffer {
|
||||||
buffer.extend(iter::repeat(0.0).take(size as usize));
|
buffer.extend(iter::repeat(0.0).take(size as usize));
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
buffer: buffer,
|
buffer: buffer.into_boxed_slice(),
|
||||||
pos: 0,
|
pos: 0,
|
||||||
size: size,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -341,26 +339,26 @@ impl RingBuffer {
|
||||||
|
|
||||||
struct RingBufferIter<'a> {
|
struct RingBufferIter<'a> {
|
||||||
buffer: &'a mut RingBuffer,
|
buffer: &'a mut RingBuffer,
|
||||||
ptr: *mut f64,
|
|
||||||
read_pos: usize,
|
read_pos: usize,
|
||||||
write_pos: usize,
|
write_pos: usize,
|
||||||
|
size: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> RingBufferIter<'a> {
|
impl<'a> RingBufferIter<'a> {
|
||||||
fn new(buffer: &'a mut RingBuffer, delay: usize) -> RingBufferIter<'a> {
|
fn new(buffer: &'a mut RingBuffer, delay: usize) -> RingBufferIter<'a> {
|
||||||
assert!(buffer.size >= delay);
|
let size = buffer.buffer.len();
|
||||||
assert_ne!(buffer.size, 0);
|
|
||||||
|
|
||||||
let ptr = buffer.buffer.as_mut_ptr();
|
assert!(size >= delay);
|
||||||
|
assert_ne!(size, 0);
|
||||||
|
|
||||||
let read_pos = (buffer.size - delay + buffer.pos) % buffer.size;
|
let read_pos = (size - delay + buffer.pos) % size;
|
||||||
let write_pos = buffer.pos % buffer.size;
|
let write_pos = buffer.pos % size;
|
||||||
|
|
||||||
RingBufferIter {
|
RingBufferIter {
|
||||||
buffer: buffer,
|
buffer: buffer,
|
||||||
ptr: ptr,
|
|
||||||
read_pos: read_pos,
|
read_pos: read_pos,
|
||||||
write_pos: write_pos,
|
write_pos: write_pos,
|
||||||
|
size: size,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -369,13 +367,17 @@ impl<'a> Iterator for RingBufferIter<'a> {
|
||||||
type Item = (&'a mut f64, f64);
|
type Item = (&'a mut f64, f64);
|
||||||
|
|
||||||
fn next(&mut self) -> Option<Self::Item> {
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
unsafe {
|
let res = unsafe {
|
||||||
let res = (&mut *self.ptr.offset(self.write_pos as isize), *self.ptr.offset(self.read_pos as isize));
|
let r = *self.buffer.buffer.get_unchecked(self.read_pos);
|
||||||
self.write_pos = (self.write_pos + 1) % self.buffer.size;
|
let w = self.buffer.buffer.get_unchecked_mut(self.write_pos);
|
||||||
self.read_pos = (self.read_pos + 1) % self.buffer.size;
|
// Cast needed to get from &mut f64 to &'a mut f64
|
||||||
|
(&mut *(w as *mut f64), r)
|
||||||
|
};
|
||||||
|
|
||||||
Some(res)
|
self.write_pos = (self.write_pos + 1) % self.size;
|
||||||
}
|
self.read_pos = (self.read_pos + 1) % self.size;
|
||||||
|
|
||||||
|
Some(res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue