#[cfg_attr(
feature = "serde",
derive(serde::Serialize, serde::Deserialize),
serde(default)
)]
#[cfg_attr(
feature = "quickcheck",
derive(::quickcheck_richderive::Arbitrary),
quickcheck(arbitrary = "crate::quickcheck_helpers::composite::replay_gain")
)]
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct ReplayGain {
track_gain_db: f32,
track_peak: f32,
album_gain_db: Option<f32>,
album_peak: Option<f32>,
}
impl Default for ReplayGain {
#[cfg_attr(not(tarpaulin), inline(always))]
fn default() -> Self {
Self::new(0.0, 0.0, None, None)
}
}
impl ReplayGain {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn new(
track_gain_db: f32,
track_peak: f32,
album_gain_db: Option<f32>,
album_peak: Option<f32>,
) -> Self {
Self {
track_gain_db,
track_peak,
album_gain_db,
album_peak,
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn track_gain_db(&self) -> f32 {
self.track_gain_db
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn track_peak(&self) -> f32 {
self.track_peak
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn album_gain_db(&self) -> Option<f32> {
self.album_gain_db
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn album_peak(&self) -> Option<f32> {
self.album_peak
}
#[must_use]
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_track_gain_db(mut self, v: f32) -> Self {
self.track_gain_db = v;
self
}
#[must_use]
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_track_peak(mut self, v: f32) -> Self {
self.track_peak = v;
self
}
#[must_use]
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_album_gain_db(mut self, v: Option<f32>) -> Self {
self.album_gain_db = v;
self
}
#[must_use]
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_album_peak(mut self, v: Option<f32>) -> Self {
self.album_peak = v;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_track_gain_db(&mut self, v: f32) -> &mut Self {
self.track_gain_db = v;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_track_peak(&mut self, v: f32) -> &mut Self {
self.track_peak = v;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_album_gain_db(&mut self, v: Option<f32>) -> &mut Self {
self.album_gain_db = v;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_album_peak(&mut self, v: Option<f32>) -> &mut Self {
self.album_peak = v;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn new_holds_supplied_fields() {
let g = ReplayGain::new(-6.4, 0.97, Some(-7.1), Some(0.99));
assert_eq!(g.track_gain_db(), -6.4);
assert_eq!(g.track_peak(), 0.97);
assert_eq!(g.album_gain_db(), Some(-7.1));
assert_eq!(g.album_peak(), Some(0.99));
}
#[test]
fn default_is_zero_track_none_album() {
let g = ReplayGain::default();
assert_eq!(g.track_gain_db(), 0.0);
assert_eq!(g.track_peak(), 0.0);
assert_eq!(g.album_gain_db(), None);
assert_eq!(g.album_peak(), None);
}
#[test]
fn with_chain_builds_full_value() {
let g = ReplayGain::default()
.with_track_gain_db(-6.4)
.with_track_peak(0.97)
.with_album_gain_db(Some(-7.1))
.with_album_peak(Some(0.99));
assert_eq!(g, ReplayGain::new(-6.4, 0.97, Some(-7.1), Some(0.99)));
}
#[test]
fn setters_mutate_in_place() {
let mut g = ReplayGain::default();
g.set_track_gain_db(-6.4)
.set_track_peak(0.97)
.set_album_gain_db(Some(-7.1))
.set_album_peak(Some(0.99));
assert_eq!(g, ReplayGain::new(-6.4, 0.97, Some(-7.1), Some(0.99)));
}
#[test]
fn album_fields_are_independent() {
let g = ReplayGain::default()
.with_track_gain_db(-6.4)
.with_track_peak(0.97);
assert_eq!(g.album_gain_db(), None);
assert_eq!(g.album_peak(), None);
}
}