1#[derive(Clone, Copy, Debug, PartialEq, Eq)]
4pub enum Source {
5 Exact,
6 Measured,
7}
8
9#[derive(Clone, Copy, Debug, PartialEq)]
11pub struct Dropped {
12 pub hz: f64,
13 pub db: f64,
14}
15
16macro_rules! rules {
17 ($($variant:ident => $text:literal,)+) => {
18 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
19 pub enum Rule {
20 $($variant,)+
21 }
22
23 impl Rule {
24 pub fn as_str(self) -> &'static str {
26 match self {
27 $(Rule::$variant => $text,)+
28 }
29 }
30
31 pub fn named(text: &str) -> Option<Rule> {
32 match text {
33 $($text => Some(Rule::$variant),)+
34 _ => None,
35 }
36 }
37 }
38 };
39}
40
41rules! {
42 LineSpectrumSummed => "line spectrum, summed directly",
43 BandLimited => "band-limited projection",
44 CroppedPair => "cropped pair, tail truncated",
45 PointSampled => "point sampling",
46 Istft => "inverse short-time transform",
47 Reading => "reading",
48 Added => "sum, addend by addend",
49}
50
51#[derive(Clone, Debug, PartialEq)]
52pub enum Detail {
53 Lines {
54 rule: Rule,
55 summed: usize,
56 dropped: Vec<Dropped>,
57 dropped_more: usize,
58 tail_db: Option<f64>,
59 },
60 Continuous {
61 rule: Rule,
62 },
63 Cropped {
64 rule: Rule,
65 tail_db: Option<f64>,
66 },
67 Point {
68 rule: Rule,
69 alias_db: Option<f64>,
70 tail_db: Option<f64>,
71 },
72 Roundtrip {
73 rule: Rule,
74 edited: bool,
75 },
76 Reading {
78 rule: Rule,
79 },
80 Added {
82 parts: Vec<Detail>,
83 },
84}
85
86#[derive(Clone, Debug, PartialEq)]
87pub struct CuttingBelowSilenceThreshold {
88 pub silence_threshold_dbfs: f64,
89 pub treated_as_silent_from_sample: Vec<(String, i64)>,
90}
91
92#[derive(Clone, Debug, PartialEq)]
93pub struct Label {
94 pub source: Source,
95 pub profile: &'static str,
96 pub rate: u32,
97 pub detail: Detail,
98 pub moved: Option<f64>,
100 pub cutting_below_silence_threshold: Option<CuttingBelowSilenceThreshold>,
101 pub resampled: Vec<crate::resample::Resampled>,
103}
104
105impl Label {
106 pub fn measured(profile: &'static str, rate: u32) -> Label {
107 Label {
108 source: Source::Measured,
109 profile,
110 rate,
111 detail: Detail::Reading {
112 rule: Rule::Reading,
113 },
114 moved: None,
115 cutting_below_silence_threshold: None,
116 resampled: Vec::new(),
117 }
118 }
119
120 pub fn new(source: Source, profile: &'static str, rate: u32, detail: Detail) -> Label {
121 Label {
122 source,
123 profile,
124 rate,
125 detail,
126 moved: None,
127 cutting_below_silence_threshold: None,
128 resampled: Vec::new(),
129 }
130 }
131
132 pub fn rule(&self) -> Rule {
133 self.detail.rule()
134 }
135}
136
137impl Detail {
138 pub fn rule(&self) -> Rule {
139 match *self {
140 Detail::Lines { rule, .. }
141 | Detail::Continuous { rule }
142 | Detail::Cropped { rule, .. }
143 | Detail::Point { rule, .. }
144 | Detail::Roundtrip { rule, .. }
145 | Detail::Reading { rule } => rule,
146 Detail::Added { .. } => Rule::Added,
147 }
148 }
149}