use audio_core::{Buf, BufMut, Channel, ExactSizeBuf, ReadBuf, WriteBuf};
pub struct ReadWrite<B> {
buf: B,
read: usize,
written: usize,
}
impl<B> ReadWrite<B> {
pub fn new(buf: B) -> Self
where
B: ExactSizeBuf,
{
let written = buf.frames();
Self {
buf,
read: 0,
written,
}
}
pub fn empty(buf: B) -> Self {
Self {
buf,
read: 0,
written: 0,
}
}
#[inline]
pub fn as_ref(&self) -> &B {
&self.buf
}
#[inline]
pub fn as_mut(&mut self) -> &mut B {
&mut self.buf
}
#[inline]
pub fn into_inner(self) -> B {
self.buf
}
#[inline]
pub fn clear(&mut self) {
self.read = 0;
self.written = 0;
}
#[inline]
pub fn set_read(&mut self, read: usize) {
self.read = read;
}
#[inline]
pub fn set_written(&mut self, written: usize) {
self.written = written;
}
}
impl<B> ExactSizeBuf for ReadWrite<B>
where
B: ExactSizeBuf,
{
fn frames(&self) -> usize {
self.buf.frames()
}
}
impl<B> ReadWrite<B>
where
B: Buf,
{
pub fn iter(&self) -> Iter<'_, B> {
let len = self.remaining();
Iter {
iter: self.buf.iter_channels(),
len,
read: self.read,
}
}
}
impl<B> ReadWrite<B>
where
B: BufMut,
{
pub fn iter_mut(&mut self) -> IterMut<'_, B> {
IterMut {
iter: self.buf.iter_channels_mut(),
written: self.written,
}
}
}
impl<B> Buf for ReadWrite<B>
where
B: Buf,
{
type Sample = B::Sample;
type Channel<'this>
= B::Channel<'this>
where
Self: 'this;
type IterChannels<'this>
= Iter<'this, B>
where
Self: 'this;
#[inline]
fn frames_hint(&self) -> Option<usize> {
self.buf.frames_hint()
}
#[inline]
fn channels(&self) -> usize {
self.buf.channels()
}
#[inline]
fn get_channel(&self, channel: usize) -> Option<Self::Channel<'_>> {
let channel = self.buf.get_channel(channel)?;
let len = self.remaining();
Some(channel.skip(self.read).limit(len))
}
#[inline]
fn iter_channels(&self) -> Self::IterChannels<'_> {
(*self).iter()
}
}
impl<B> BufMut for ReadWrite<B>
where
B: ExactSizeBuf + BufMut,
{
type ChannelMut<'this>
= B::ChannelMut<'this>
where
Self: 'this;
type IterChannelsMut<'this>
= IterMut<'this, B>
where
Self: 'this;
#[inline]
fn get_channel_mut(&mut self, channel: usize) -> Option<Self::ChannelMut<'_>> {
Some(self.buf.get_channel_mut(channel)?.skip(self.written))
}
#[inline]
fn copy_channel(&mut self, from: usize, to: usize)
where
Self::Sample: Copy,
{
self.buf.copy_channel(from, to);
}
#[inline]
fn iter_channels_mut(&mut self) -> Self::IterChannelsMut<'_> {
(*self).iter_mut()
}
}
impl<B> ReadBuf for ReadWrite<B> {
#[inline]
fn remaining(&self) -> usize {
self.written.saturating_sub(self.read)
}
#[inline]
fn advance(&mut self, n: usize) {
self.read = self.read.saturating_add(n);
}
}
impl<B> WriteBuf for ReadWrite<B>
where
B: ExactSizeBuf,
{
#[inline]
fn remaining_mut(&self) -> usize {
self.buf.frames().saturating_sub(self.written)
}
#[inline]
fn advance_mut(&mut self, n: usize) {
self.written = self.written.saturating_add(n);
}
}
iter! {
len: usize,
read: usize,
=>
self.skip(read).limit(len)
}
iter_mut! {
written: usize,
=>
self.skip(written)
}