@@ -191,7 +191,7 @@ impl PreviewRenderer {
191191 SamplesBuffer :: new ( channels, sample_rate, audio. samples . clone ( ) ) ;
192192 sink. append ( source) ;
193193
194- if sink. is_paused ( ) {
194+ if sink. is_paused ( ) && self . controller . state ( ) == PlaybackState :: Playing {
195195 sink. play ( ) ;
196196 }
197197 }
@@ -229,6 +229,11 @@ impl PreviewRenderer {
229229 } else {
230230 self . controller . pause ( ) ;
231231 self . mixer_iter = None ;
232+ if let Some ( sink) = & self . audio_sink
233+ && let Ok ( sink) = sink. lock ( )
234+ {
235+ sink. pause ( ) ;
236+ }
232237 }
233238 }
234239
@@ -245,6 +250,7 @@ impl PreviewRenderer {
245250 } ) ?;
246251
247252 let sink = AudioSink :: connect_new ( & device_sink. mixer ( ) ) ;
253+ sink. set_volume ( self . controller . volume ( ) ) ;
248254
249255 self . audio_stream = Some ( device_sink) ;
250256 self . audio_sink = Some ( Arc :: new ( Mutex :: new ( sink) ) ) ;
@@ -291,6 +297,7 @@ impl PreviewRenderer {
291297 && let Ok ( sink) = sink. lock ( )
292298 && sink. is_paused ( )
293299 {
300+ sink. set_volume ( self . controller . volume ( ) ) ;
294301 sink. play ( ) ;
295302 }
296303
@@ -335,6 +342,27 @@ impl PreviewRenderer {
335342 self . db_level_cache_left . clear ( ) ;
336343 self . db_level_cache_right . clear ( ) ;
337344 self . advance_frame ( ) ?;
345+
346+ // 如果无法获取帧(例如在轨道末尾),尝试向前回退获取前一帧
347+ if self . current_frame . is_none ( ) {
348+ let frame_duration = Duration :: from_secs_f64 ( 1.0 / self . config . frame_rate ( ) ) ;
349+ for offset in 1 ..10 {
350+ let fallback_position = position. saturating_sub ( frame_duration * offset) ;
351+ if fallback_position. is_zero ( ) && offset > 1 {
352+ break ;
353+ }
354+
355+ self . controller . set_position ( fallback_position) ;
356+ self . mixer_iter = None ;
357+ self . advance_frame ( ) ?;
358+
359+ if self . current_frame . is_some ( ) {
360+ self . controller . set_position ( position) ; // 成功获取帧后,恢复原始位置
361+ break ;
362+ }
363+ }
364+ }
365+
338366 Ok ( ( ) )
339367 }
340368
@@ -375,7 +403,7 @@ impl PreviewRenderer {
375403 SamplesBuffer :: new ( channels, sample_rate, audio. samples . clone ( ) ) ;
376404 sink. append ( source) ;
377405
378- if sink. is_paused ( ) {
406+ if sink. is_paused ( ) && self . controller . state ( ) == PlaybackState :: Playing {
379407 sink. play ( ) ;
380408 }
381409 }
@@ -398,6 +426,11 @@ impl PreviewRenderer {
398426 } else {
399427 self . controller . pause ( ) ;
400428 self . mixer_iter = None ;
429+ if let Some ( sink) = & self . audio_sink
430+ && let Ok ( sink) = sink. lock ( )
431+ {
432+ sink. pause ( ) ;
433+ }
401434 }
402435 }
403436
0 commit comments