From b32e55a956e6f25517468cc2563c79bc59e16f1b Mon Sep 17 00:00:00 2001 From: "Dylan M. Taylor" Date: Fri, 13 Nov 2026 09:21:57 +0000 Subject: [PATCH] Preserve session repairs and frame grid boundaries --- crates/scraft-format/src/session.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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)