pub type NameId = u32;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct Track(pub u32);
impl Track {
pub const MAIN: Track = Track(0);
pub const LOOP: Track = Track(1);
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum Origin {
Kui,
Host,
Extension(NameId),
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct Session {
pub kui: String,
pub app: String,
pub platform: String,
pub refresh_hz: f32,
pub budget_ms: f32,
pub scale: f32,
pub wall_ms: u64,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Span {
pub track: Track,
pub id: u32,
pub parent: u32,
pub name: NameId,
pub origin: Origin,
pub start: u64,
pub dur: u64,
pub cpu: Option<u64>,
pub node: u64,
pub cut: bool,
}
impl Span {
pub fn end(&self) -> u64 {
self.start.saturating_add(self.dur)
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum LoopEvent {
Sleep { until: Option<u64> },
Woke { by: NameId },
Os { kind: NameId },
}
#[derive(Clone, Debug, PartialEq)]
pub enum Record {
Session(Session),
Name {
id: NameId,
text: String,
},
Track {
id: Track,
name: NameId,
},
FrameBegin {
t: u64,
frame: u64,
causes: Vec<NameId>,
},
Holder {
frame: u64,
what: NameId,
name: NameId,
node: u64,
},
FrameEnd {
t: u64,
frame: u64,
unchanged: Option<bool>,
nodes: u32,
},
Present {
t: u64,
frame: u64,
render: u64,
wait: u64,
},
Span(Span),
Input {
t: u64,
kind: NameId,
os_t: Option<u64>,
count: u32,
until: u64,
},
Event {
t: u64,
kind: NameId,
node: u64,
},
Wake {
t: u64,
name: NameId,
},
Request {
t: u64,
why: NameId,
at: NameId,
},
Loop {
t: u64,
event: LoopEvent,
},
Counter {
t: u64,
frame: u64,
name: NameId,
value: i64,
},
Gauge {
t: u64,
name: NameId,
value: f64,
},
Mark {
t: u64,
track: Track,
name: NameId,
},
Note {
t: u64,
text: String,
},
Placement {
t: u64,
node: u64,
component: NameId,
answer: NameId,
why: NameId,
},
}
impl Record {
pub fn t(&self) -> Option<u64> {
Some(match self {
Record::Session(_)
| Record::Name { .. }
| Record::Track { .. }
| Record::Holder { .. } => return None,
Record::FrameBegin { t, .. }
| Record::FrameEnd { t, .. }
| Record::Present { t, .. }
| Record::Input { t, .. }
| Record::Event { t, .. }
| Record::Wake { t, .. }
| Record::Request { t, .. }
| Record::Loop { t, .. }
| Record::Counter { t, .. }
| Record::Gauge { t, .. }
| Record::Mark { t, .. }
| Record::Note { t, .. }
| Record::Placement { t, .. } => *t,
Record::Span(s) => s.start,
})
}
}