@@ -544,6 +544,63 @@ export const usePlaySettings = (): SettingConfig => {
544544 set : ( v ) => handleAudioEngineSelect ( v ) ,
545545 } ) ,
546546 } ,
547+ {
548+ key : "audioLatencyHint" ,
549+ label : "Web Audio 延迟策略" ,
550+ type : "select" ,
551+ tags : [ { text : "Beta" , type : "warning" } ] ,
552+ description :
553+ "调整 Web Audio 的延迟策略,修改后需重启。<br>" +
554+ "“低延迟模式(interactive)”延迟更低但可能不稳定;<br>" +
555+ "“高效能模式(playback)”延迟偏高但播放更稳定。<br>" +
556+ "已针对“高效能模式(playback)”补偿了音频输出延迟,理论上不会造成歌词与音频不同步的问题。" ,
557+ options : [
558+ { label : "低延迟模式(interactive)" , value : "interactive" } ,
559+ { label : "高效能模式(playback)" , value : "playback" } ,
560+ ] ,
561+ value : computed ( {
562+ get : ( ) => settingStore . audioLatencyHint ,
563+ set : ( v ) => {
564+ window . $dialog . warning ( {
565+ title : "更改延迟策略" ,
566+ content : "此操作需要重启应用才能生效,是否立即重启?" ,
567+ positiveText : "重启" ,
568+ negativeText : "取消" ,
569+ onPositiveClick : ( ) => {
570+ settingStore . audioLatencyHint = v ;
571+ if ( isElectron ) {
572+ window . electron . ipcRenderer . send ( "win-restart" ) ;
573+ } else {
574+ window . location . reload ( ) ;
575+ }
576+ } ,
577+ } ) ;
578+ } ,
579+ } ) ,
580+ show : computed (
581+ ( ) =>
582+ settingStore . playbackEngine === "web-audio" &&
583+ settingStore . audioEngine === "element" ,
584+ ) ,
585+ } ,
586+ {
587+ key : "audioDelayCompensation" ,
588+ label : "音频与歌词同步补偿" ,
589+ type : "input-number" ,
590+ description :
591+ "手动补偿音频与歌词进度延迟。<br>正值歌词变快,负值歌词进度变慢。<br>适用于移动端等自动延迟检测不准的设备。" ,
592+ tags : [ { text : "Beta" , type : "warning" } ] ,
593+ show : computed ( ( ) => settingStore . audioLatencyHint === "playback" ) ,
594+ min : - 1000 ,
595+ max : 1000 ,
596+ step : 10 ,
597+ suffix : "ms" ,
598+ value : computed ( {
599+ get : ( ) => settingStore . audioDelayCompensation ,
600+ set : ( v ) => ( settingStore . audioDelayCompensation = v ?? 0 ) ,
601+ } ) ,
602+ defaultValue : 0 ,
603+ } ,
547604 {
548605 key : "playSongDemo" ,
549606 label : "播放试听" ,
0 commit comments