#[derive(Debug, Clone)]
pub enum AudioCodecOptions {
Opus(OpusOptions),
Aac(AacOptions),
Mp3(Mp3Options),
Flac(FlacOptions),
}
#[derive(Debug, Clone)]
pub struct OpusOptions {
pub application: OpusApplication,
pub frame_duration_ms: Option<u32>,
}
impl Default for OpusOptions {
fn default() -> Self {
Self {
application: OpusApplication::Audio,
frame_duration_ms: None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum OpusApplication {
#[default]
Audio,
Voip,
LowDelay,
}
impl OpusApplication {
pub(super) fn as_str(self) -> &'static str {
match self {
Self::Audio => "audio",
Self::Voip => "voip",
Self::LowDelay => "lowdelay",
}
}
}
#[derive(Debug, Clone)]
pub struct AacOptions {
pub profile: AacProfile,
pub vbr_quality: Option<u8>,
}
impl Default for AacOptions {
fn default() -> Self {
Self {
profile: AacProfile::Lc,
vbr_quality: None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum AacProfile {
#[default]
Lc,
He,
Hev2,
}
impl AacProfile {
pub(super) fn as_str(self) -> &'static str {
match self {
Self::Lc => "aac_low",
Self::He => "aac_he",
Self::Hev2 => "aac_he_v2",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Mp3Quality {
Vbr(u8),
Cbr(u32),
}
#[derive(Debug, Clone)]
pub struct Mp3Options {
pub quality: Mp3Quality,
}
impl Default for Mp3Options {
fn default() -> Self {
Self {
quality: Mp3Quality::Vbr(4),
}
}
}
#[derive(Debug, Clone)]
pub struct FlacOptions {
pub compression_level: u8,
}
impl Default for FlacOptions {
fn default() -> Self {
Self {
compression_level: 5,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn opus_application_should_return_correct_str() {
assert_eq!(OpusApplication::Audio.as_str(), "audio");
assert_eq!(OpusApplication::Voip.as_str(), "voip");
assert_eq!(OpusApplication::LowDelay.as_str(), "lowdelay");
}
#[test]
fn opus_options_default_should_have_audio_application_and_no_frame_duration() {
let opts = OpusOptions::default();
assert_eq!(opts.application, OpusApplication::Audio);
assert!(opts.frame_duration_ms.is_none());
}
#[test]
fn aac_profile_should_return_correct_str() {
assert_eq!(AacProfile::Lc.as_str(), "aac_low");
assert_eq!(AacProfile::He.as_str(), "aac_he");
assert_eq!(AacProfile::Hev2.as_str(), "aac_he_v2");
}
#[test]
fn aac_options_default_should_have_lc_profile_and_no_vbr() {
let opts = AacOptions::default();
assert_eq!(opts.profile, AacProfile::Lc);
assert!(opts.vbr_quality.is_none());
}
#[test]
fn mp3_options_default_should_have_vbr_quality_4() {
let opts = Mp3Options::default();
assert_eq!(opts.quality, Mp3Quality::Vbr(4));
}
#[test]
fn mp3_quality_enum_variants_are_accessible() {
let _vbr = Mp3Quality::Vbr(0);
let _cbr = Mp3Quality::Cbr(192_000);
}
#[test]
fn flac_options_default_should_have_compression_level_5() {
let opts = FlacOptions::default();
assert_eq!(opts.compression_level, 5);
}
#[test]
fn audio_codec_options_enum_variants_are_accessible() {
let _opus = AudioCodecOptions::Opus(OpusOptions::default());
let _aac = AudioCodecOptions::Aac(AacOptions::default());
let _mp3 = AudioCodecOptions::Mp3(Mp3Options::default());
let _flac = AudioCodecOptions::Flac(FlacOptions::default());
}
}