#[cfg(feature = "alloc")]
use crate::Vec;
use crate::{PcmRawBuf, PcmSpec, PcmWavError, PcmWavFmt, Riff, RiffChunkIter};
#[doc = crate::_tags!(audio data)]
#[doc = crate::_doc_meta!{
location("media/audio"),
#[cfg(target_pointer_width = "64")]
test_size_of(PcmWavBuf_Slice: PcmWavBuf<&[u8]> = 64|512),
#[cfg(target_pointer_width = "64")]
test_size_of(PcmWavBuf_Vec: PcmWavBuf<Vec<u8>> = 72|576),
}]
#[must_use]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct PcmWavBuf<B> {
bytes: B,
fmt: PcmWavFmt,
data_offset: usize,
data_len: usize,
}
#[rustfmt::skip]
impl<B> PcmWavBuf<B> {
pub(crate) const fn _new(bytes: B, fmt: PcmWavFmt, data_offset: usize, data_len: usize)
-> Self { Self { bytes, fmt, data_offset, data_len } }
pub const fn fmt(&self) -> PcmWavFmt { self.fmt }
#[must_use]
pub const fn data_offset(&self) -> usize { self.data_offset }
#[must_use]
pub const fn data_len(&self) -> usize { self.data_len }
#[must_use]
pub const fn data_span(&self) -> (usize, usize) { (self.data_offset, self.data_len) }
#[must_use]
pub const fn frames(&self) -> usize { self.data_len / self.fmt.block_align as usize }
pub const fn spec(&self) -> Result<PcmSpec, PcmWavError> { self.fmt.spec() }
}
#[rustfmt::skip]
impl<B: AsRef<[u8]>> PcmWavBuf<B> {
#[must_use]
pub fn bytes(&self) -> &[u8] { self.bytes.as_ref() }
#[must_use]
pub fn data_bytes(&self) -> &[u8] {
let start = self.data_offset;
let end = start + self.data_len;
&self.bytes.as_ref()[start..end]
}
#[must_use]
pub fn is_empty(&self) -> bool { self.data_len == 0 }
pub fn chunks(&self) -> Result<RiffChunkIter<'_>, PcmWavError> {
let root = Riff::root(self.bytes()).map_err(PcmWavError::Riff)?;
root.subchunks().map_err(PcmWavError::Riff)
}
pub fn raw(&self) -> Result<PcmRawBuf<&[u8]>, PcmWavError> {
let spec = self.spec()?;
Ok(PcmRawBuf::_new(self.data_bytes(), spec))
}
}
#[rustfmt::skip]
impl<'a> PcmWavBuf<&'a [u8]> {
#[must_use]
pub const fn bytes_const(&self) -> &'a [u8] { self.bytes }
}
#[rustfmt::skip]
#[cfg(feature = "alloc")]
impl PcmWavBuf<Vec<u8>> {
pub fn as_borrowed(&self) -> PcmWavBuf<&[u8]> {
PcmWavBuf::_new(self.bytes.as_slice(), self.fmt, self.data_offset, self.data_len)
}
#[must_use]
pub fn into_bytes(self) -> Vec<u8> { self.bytes }
}