use std::error::Error;
use std::fmt::Debug;
use std::path::PathBuf;
use super::WriteBlock;
use crate::FileInfo;
#[derive(Debug, Clone, Copy)]
pub enum WriteStatus {
Ok,
ReachedMaxSize { num_files: u32 },
}
pub trait Encoder: Sized + 'static {
type T: Copy + Clone + Default + Send;
type AdditionalOpts: Send + Default + Debug;
type FileParams: Clone + Send;
type OpenError: Error + Send;
type FatalError: Error + Send;
const DEFAULT_BLOCK_SIZE: usize;
const DEFAULT_NUM_WRITE_BLOCKS: usize;
fn new(
file: PathBuf,
num_channels: u16,
sample_rate: u32,
block_size: usize,
num_write_blocks: usize,
additional_opts: Self::AdditionalOpts,
) -> Result<(Self, FileInfo<Self::FileParams>), Self::OpenError>;
fn encode(
&mut self,
write_block: &WriteBlock<Self::T>,
) -> Result<WriteStatus, Self::FatalError>;
fn finish_file(&mut self) -> Result<(), Self::FatalError>;
fn discard_file(&mut self) -> Result<(), Self::FatalError>;
fn discard_and_restart(&mut self) -> Result<(), Self::FatalError>;
}
pub fn num_files_to_file_name_extension(num_files: u32) -> String {
if num_files <= 1 {
return String::from("");
}
let extension_num = num_files - 1;
if extension_num < 10 {
format!("_00{}", extension_num)
} else if extension_num < 100 {
format!("_0{}", extension_num)
} else {
format!("_{}", extension_num)
}
}