use ff_format::AudioFrame;
use super::builder::{AudioEncoder, AudioEncoderBuilder};
use crate::EncodeError;
use crate::async_encoder::{AsyncEncoder, SyncEncoder};
impl SyncEncoder<AudioFrame> for AudioEncoder {
fn push_frame(&mut self, frame: &AudioFrame) -> Result<(), EncodeError> {
self.push(frame)
}
fn drain_and_finish(self) -> Result<(), EncodeError> {
self.finish()
}
}
pub struct AsyncAudioEncoder {
inner: AsyncEncoder<AudioFrame>,
}
impl std::fmt::Debug for AsyncAudioEncoder {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("AsyncAudioEncoder").finish_non_exhaustive()
}
}
impl AsyncAudioEncoder {
pub fn from_builder(builder: AudioEncoderBuilder) -> Result<Self, EncodeError> {
let encoder = builder.build()?;
Ok(Self {
inner: AsyncEncoder::new(encoder),
})
}
pub async fn push(&mut self, frame: AudioFrame) -> Result<(), EncodeError> {
self.inner.push(frame).await
}
pub async fn finish(self) -> Result<(), EncodeError> {
self.inner.finish().await
}
}
#[cfg(test)]
mod tests {
use super::*;
fn _assert_send() {
fn is_send<T: Send>() {}
is_send::<AsyncAudioEncoder>();
}
#[test]
fn from_builder_should_fail_on_invalid_config() {
let result = AsyncAudioEncoder::from_builder(AudioEncoder::create("out.m4a"));
assert!(
result.is_err(),
"expected error for unconfigured builder, got Ok"
);
assert!(
matches!(result.unwrap_err(), EncodeError::InvalidConfig { .. }),
"expected InvalidConfig"
);
}
}