@@ -633,6 +633,47 @@ void main() {
633633 expect (backend.stopKeepAliveCalls, 1 );
634634 });
635635
636+ test ('MediaSentencePlaybackDriver在播放中即时更新并保留新速度' , () async {
637+ final engine = container.read (mediaEngineProvider.notifier);
638+ await engine.loadMedia (item (), 1.0 );
639+ final driver = MediaSentencePlaybackDriver (engine);
640+ final playbackSessionId = driver.newSession ();
641+
642+ final firstPlayback = driver.playSentence (
643+ Sentence (
644+ index: 0 ,
645+ text: 'first sentence' ,
646+ startTime: const Duration (seconds: 1 ),
647+ endTime: const Duration (seconds: 3 ),
648+ ),
649+ playbackSessionId,
650+ );
651+ await Future <void >.delayed (Duration .zero);
652+ expect (backend.playing, isTrue);
653+ expect (backend.rate, 1.0 );
654+
655+ await driver.setSpeed (1.5 );
656+ expect (backend.rate, 1.5 );
657+
658+ backend.emitPosition (const Duration (seconds: 3 ));
659+ expect (await firstPlayback, SentencePlaybackResult .completed);
660+
661+ final secondPlayback = driver.playSentence (
662+ Sentence (
663+ index: 1 ,
664+ text: 'second sentence' ,
665+ startTime: const Duration (seconds: 3 ),
666+ endTime: const Duration (seconds: 5 ),
667+ ),
668+ playbackSessionId,
669+ );
670+ await Future <void >.delayed (Duration .zero);
671+ expect (backend.rateCalls.last, 1.5 );
672+
673+ backend.emitPosition (const Duration (seconds: 5 ));
674+ expect (await secondPlayback, SentencePlaybackResult .completed);
675+ });
676+
636677 test ('ProviderContainer dispose 时释放 backend,避免热重启残留 native 链路' , () async {
637678 final engine = container.read (mediaEngineProvider.notifier);
638679 await engine.loadMedia (item (), 1.0 );
0 commit comments