diff --git a/crates/scraft-format/src/session.rs b/crates/scraft-format/src/session.rs index 5f73f940e..021cab8bc 100644 --- a/crates/scraft-format/src/session.rs +++ b/crates/scraft-format/src/session.rs @@ -348,6 +348,7 @@ impl AutoName { pub struct Session { pub format_version: u32, pub name: String, + #[serde(deserialize_with = "sample_rate_or_default")] pub sample_rate: SampleRate, pub bit_depth: BitDepthSetting, pub frame_rate: FrameRate, @@ -384,6 +385,17 @@ pub struct Session { pub folder: Option, } +/// Older SoundCraft builds repaired an in-range but invalid sample rate after reading a session. +/// `craft-time` validates `SampleRate` during serde, so keep that file compatibility at this +/// domain boundary while retaining strict serde validation for direct `SampleRate` use. +fn sample_rate_or_default<'de, D>(deserializer: D) -> Result +where + D: serde::Deserializer<'de>, +{ + let hz = ::deserialize(deserializer)?; + Ok(SampleRate::new(hz).unwrap_or_default()) +} + impl Default for Session { fn default() -> Self { Session::new("Untitled", SampleRate::HZ_48000)