@@ -123,6 +123,22 @@ pub fn run_prepared(rx: mpsc::Receiver<PrepareMsg>, env: PrepareEnv, status: Arc
123123 return ;
124124 }
125125 } ;
126+ // 加载期间可能已收到 Cancel/断开(release 先于加载完成——引擎加载不可中断,
127+ // 请求排队的语义收口):先消费再宣告 Ready,避免"已完成→随即取消"的自相
128+ // 矛盾日志(dev StrictMode 双挂载下可稳定复现的误读观感)。
129+ // Start 理论上不会出现在加载期(start 仅在 status=Ready 时发交接;Loading
130+ // 期 start 走内联回退并先取消预备),但不可吞消息——交接到手就就地转会话
131+ match rx. try_recv ( ) {
132+ Ok ( PrepareMsg :: Cancel ) | Err ( mpsc:: TryRecvError :: Disconnected ) => {
133+ eprintln ! ( "[LiveSession] 加载期间已请求取消,释放引擎" ) ;
134+ return ;
135+ }
136+ Ok ( PrepareMsg :: Start ( handoff) ) => {
137+ run_with_handoff ( engine, * handoff) ;
138+ return ;
139+ }
140+ Err ( mpsc:: TryRecvError :: Empty ) => { }
141+ }
126142 * status. lock ( ) . expect ( "prepare status lock poisoned" ) = PrepareStatus :: Ready ;
127143 eprintln ! ( "[LiveSession] 引擎预热完成(等待开始/取消)" ) ;
128144
@@ -131,26 +147,7 @@ pub fn run_prepared(rx: mpsc::Receiver<PrepareMsg>, env: PrepareEnv, status: Arc
131147 loop {
132148 match rx. recv_timeout ( Duration :: from_millis ( PREPARE_POLL_MS ) ) {
133149 Ok ( PrepareMsg :: Start ( handoff) ) => {
134- let StartHandoff {
135- params,
136- session_id,
137- stop,
138- latest_frame,
139- pause,
140- session_info,
141- } = * handoff;
142- // 会话纪元在交接后创建(模型已加载——无 A1 秒级偏移)
143- let epoch = Instant :: now ( ) ;
144- crate :: live_session:: run_session_after_engine (
145- engine,
146- stop,
147- params,
148- session_id,
149- latest_frame,
150- pause,
151- epoch,
152- session_info,
153- ) ;
150+ run_with_handoff ( engine, * handoff) ;
154151 return ;
155152 }
156153 Ok ( PrepareMsg :: Cancel ) | Err ( RecvTimeoutError :: Disconnected ) => {
@@ -166,3 +163,20 @@ pub fn run_prepared(rx: mpsc::Receiver<PrepareMsg>, env: PrepareEnv, status: Arc
166163 }
167164 }
168165}
166+
167+ /// Start 交接执行(run_prepared 的就绪前/就绪后两处共用——防语义漂移)。
168+ fn run_with_handoff ( engine : StreamingAsrEngine , handoff : StartHandoff ) {
169+ let StartHandoff {
170+ params,
171+ session_id,
172+ stop,
173+ latest_frame,
174+ pause,
175+ session_info,
176+ } = handoff;
177+ // 会话纪元在交接后创建(模型已加载——无 A1 秒级偏移)
178+ let epoch = Instant :: now ( ) ;
179+ crate :: live_session:: run_session_after_engine (
180+ engine, stop, params, session_id, latest_frame, pause, epoch, session_info,
181+ ) ;
182+ }
0 commit comments