use crate::error::LibResult;
use crate::scribe::Scribe;
use crate::Error;
use snafu::ResultExt;
use std::convert::TryFrom;
use std::io::Write;
clamp!(
QuarterNoteDivision,
u16,
1,
16383,
1024,
pub
);
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd, Hash)]
pub enum Division {
QuarterNote(QuarterNoteDivision),
Smpte(SmpteRate),
}
impl Default for Division {
fn default() -> Self {
Division::QuarterNote(QuarterNoteDivision::default())
}
}
const DIVISION_TYPE_BIT: u16 = 0b1000000000000000;
impl Division {
pub(crate) fn from_u16(value: u16) -> LibResult<Self> {
if value & DIVISION_TYPE_BIT == DIVISION_TYPE_BIT {
crate::error::OtherSnafu { site: site!() }.fail()
} else {
Ok(Division::QuarterNote(QuarterNoteDivision::new(value)))
}
}
pub(crate) fn write<W: Write>(&self, w: &mut Scribe<W>) -> LibResult<()> {
match self {
Division::QuarterNote(q) => Ok(w.write_all(&q.get().to_be_bytes()).context(wr!())?),
Division::Smpte(_) => crate::error::OtherSnafu { site: site!() }.fail(),
}
}
}
impl TryFrom<u16> for Division {
type Error = Error;
fn try_from(value: u16) -> crate::Result<Self> {
Ok(Division::from_u16(value)?)
}
}
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd, Hash)]
#[allow(dead_code)]
#[derive(Default)]
pub enum FrameRate {
#[default]
N24,
N25,
N29,
N30,
}
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd, Hash)]
pub struct SmpteRate {
frame_rate: FrameRate,
resolution: u8,
}
impl Default for SmpteRate {
fn default() -> Self {
SmpteRate {
frame_rate: FrameRate::N25,
resolution: 40,
}
}
}
impl SmpteRate {
pub fn frame_rate(&self) -> FrameRate {
self.frame_rate
}
pub fn resolution(&self) -> u8 {
self.resolution
}
}