use audio_samples::{AudioSamples, traits::StandardSample};
use crate::{
WriteSeek,
error::AudioIOResult,
traits::{AudioStreamWrite, AudioStreamWriter},
};
#[derive(Debug)]
pub enum StreamedAudioWriter<W>
where
W: WriteSeek,
{
#[cfg(feature = "wav")]
Wav(crate::wav::StreamedWavWriter<W>),
#[cfg(feature = "flac")]
Flac(crate::flac::StreamedFlacWriter<W>),
}
impl<W> AudioStreamWriter for StreamedAudioWriter<W>
where
W: WriteSeek,
{
fn flush(&mut self) -> AudioIOResult<()> {
match self {
#[cfg(feature = "wav")]
Self::Wav(w) => w.flush(),
#[cfg(feature = "flac")]
Self::Flac(w) => w.flush(),
}
}
fn finalize(&mut self) -> AudioIOResult<()> {
match self {
#[cfg(feature = "wav")]
Self::Wav(w) => w.finalize(),
#[cfg(feature = "flac")]
Self::Flac(w) => w.finalize(),
}
}
fn is_finalized(&self) -> bool {
match self {
#[cfg(feature = "wav")]
Self::Wav(w) => w.is_finalized(),
#[cfg(feature = "flac")]
Self::Flac(w) => w.is_finalized(),
}
}
fn frames_written(&self) -> usize {
match self {
#[cfg(feature = "wav")]
Self::Wav(w) => w.frames_written(),
#[cfg(feature = "flac")]
Self::Flac(w) => w.frames_written(),
}
}
fn sample_rate(&self) -> u32 {
match self {
#[cfg(feature = "wav")]
Self::Wav(w) => AudioStreamWriter::sample_rate(w),
#[cfg(feature = "flac")]
Self::Flac(w) => AudioStreamWriter::sample_rate(w),
}
}
fn num_channels(&self) -> u16 {
match self {
#[cfg(feature = "wav")]
Self::Wav(w) => AudioStreamWriter::num_channels(w),
#[cfg(feature = "flac")]
Self::Flac(w) => AudioStreamWriter::num_channels(w),
}
}
}
impl<W> AudioStreamWrite for StreamedAudioWriter<W>
where
W: WriteSeek,
{
fn write_frames<T>(&mut self, samples: &AudioSamples<'_, T>) -> AudioIOResult<usize>
where
T: StandardSample + 'static,
{
match self {
#[cfg(feature = "wav")]
Self::Wav(w) => w.write_frames(samples),
#[cfg(feature = "flac")]
Self::Flac(w) => w.write_frames(samples),
}
}
}