From 84c87d0b57c8bfa8f911ab04f43d10f34888e92b Mon Sep 17 00:00:00 2001 From: Brian Harrison Date: Thu, 23 Apr 2026 13:02:55 -0400 Subject: [PATCH] fix(protocol): adjust waveform download to use full_waveform for accurate event streaming --- sfm/server.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/sfm/server.py b/sfm/server.py index 462955c..58c69da 100644 --- a/sfm/server.py +++ b/sfm/server.py @@ -885,13 +885,13 @@ def device_event_blastware_file( def _do(): with _build_client(port, baud, host, tcp_port, timeout=120.0) as client: info = client.connect() - # Use full_waveform=False (metadata-only, stop_after_metadata=True) — - # Blastware writes waveform files from only the first ~8 A5 frames, NOT - # the full bulk download. Using full_waveform=True produces a file - # ~8x larger than Blastware's because it includes all post-event - # silence chunks. The metadata-only a5_frames (with terminator) are - # sufficient for byte-perfect write_blastware_file output. - events = client.get_events(full_waveform=False, stop_after_index=index) + # Use full_waveform=True (stop_after_metadata=False) so the device + # signals its own end-of-stream rather than us stopping at "Project:". + # BW downloads until natural end-of-stream for each event — for this + # 5-chunk event that gives the correct body + footer. For events with + # many silence chunks (35+) the file will be larger than BW's, but + # correctness takes priority over size matching for now. + events = client.get_events(full_waveform=True, stop_after_index=index) matching = [ev for ev in events if ev.index == index] return matching[0] if matching else None, info ev, info = _run_with_retry(_do, is_tcp=_is_tcp(host))