@@ -64,15 +64,17 @@ ModemEngine::ModemEngine() {
6464
6565 // Set callbacks to wire into existing ModemEngine callbacks
6666 streaming_decoder_->setFrameCallback ([this ](const DecodeResult& result) {
67- if (result.success && !result.frame_data .empty ()) {
68- deliverFrame (result.frame_data );
69- notifyFrameParsed (result.frame_data , result.frame_type );
70- }
71- // Update stats
67+ // Update SNR/sync stats before delivering frame so downstream callbacks
68+ // (ProtocolEngine via raw_data_callback_) read fresh channel estimates.
7269 updateStats ([&](LoopbackStats& s) {
7370 s.snr_db = result.snr_db ;
7471 s.synced = result.success ;
7572 });
73+
74+ if (result.success && !result.frame_data .empty ()) {
75+ deliverFrame (result.frame_data );
76+ notifyFrameParsed (result.frame_data , result.frame_type );
77+ }
7678 // Save peer CFO for future frames
7779 if (std::abs (result.cfo_hz ) > 0 .1f ) {
7880 peer_cfo_hz_ = result.cfo_hz ;
@@ -84,7 +86,11 @@ ModemEngine::ModemEngine() {
8486 if (ping_received_callback_) {
8587 ping_received_callback_ (snr_db);
8688 }
87- updateStats ([](LoopbackStats& s) { s.frames_received ++; });
89+ updateStats ([&](LoopbackStats& s) {
90+ s.frames_received ++;
91+ s.snr_db = snr_db;
92+ s.synced = true ;
93+ });
8894 last_rx_complete_time_ = std::chrono::steady_clock::now ();
8995 });
9096
0 commit comments