From 69438b725340cde6465b6d0ab6c31a9e47a674ac Mon Sep 17 00:00:00 2001 From: fuleyi Date: Fri, 26 Dec 2025 17:44:22 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E9=9F=B3=E9=A2=91?= =?UTF-8?q?=E7=AB=AF=E5=8F=A3=E5=88=9D=E5=A7=8B=E5=8C=96=E6=97=B6=E4=B8=BA?= =?UTF-8?q?null-sink=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 初始化时会加载null-sink, 概率性触发底层事件,将默认输入输出设置为null-sink. 当输入输出设置为null-sink时,再检查一次端口是否有可用端口,如果有则切换 Log: PMS: BUG-340327 Influence: audio --- audio1/audio.go | 28 ++++++++++++++++------------ audio1/audio_events.go | 20 ++++++++++++-------- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/audio1/audio.go b/audio1/audio.go index 1b4d1601d..b00cdb851 100644 --- a/audio1/audio.go +++ b/audio1/audio.go @@ -626,7 +626,6 @@ func (a *Audio) refreshSinks() { sinkInfoMap := make(map[uint32]*pulse.Sink) sinkInfoList := a.ctx.GetSinkList() - hasNullSink := false for _, sinkInfo := range sinkInfoList { if sinkInfo.Name == dndVirtualSinkName { port := pulse.PortInfo{ @@ -638,9 +637,6 @@ func (a *Audio) refreshSinks() { sinkInfo.Ports = append(sinkInfo.Ports, port) sinkInfo.ActivePort = port } - if sinkInfo.Name == nullSinkName { - hasNullSink = true - } sinkInfoMap[sinkInfo.Index] = sinkInfo sink, exist := a.sinks[sinkInfo.Index] if exist { @@ -663,11 +659,6 @@ func (a *Audio) refreshSinks() { delete(a.sinks, key) } } - - // 加载module-null-sink,噪音抑制时,将sink-input端口Echo-Cancel Playback引入到null-sink - if !hasNullSink { - a.LoadNullSinkModule() - } } func (a *Audio) refreshSources() { @@ -795,6 +786,8 @@ func (a *Audio) init() error { if err != nil { return err } + // 加载module-null-sink,噪音抑制时,将sink-input端口Echo-Cancel Playback引入到null-sink + a.LoadNullSinkModule() // 更新本地数据 a.refresh() @@ -1328,9 +1321,14 @@ func (a *Audio) refreshBluetoothOpts() { func (a *Audio) updateDefaultSink(sinkName string) { sinkInfo := a.getPhySinkInfoByName(sinkName) if sinkInfo == nil { - logger.Warning("failed to get sinkInfo for name:", sinkName) + // 如果是null-sink再检查一次,是否可以自动切换端口 a.setPropDefaultSink("/") a.defaultSink = nil + if strings.Contains(sinkName, "null-sink") { + a.autoSwitchOutputPort() + } else { + logger.Warning("failed to get sinkInfo for name:", sinkName) + } return } a.moveSinkInputsToSink(nil) @@ -1391,9 +1389,13 @@ func (a *Audio) updateDefaultSink(sinkName string) { func (a *Audio) updateDefaultSource(sourceName string) { sourceInfo := a.getPhySourceInfoByName(sourceName) if sourceInfo == nil { - logger.Warning("failed to get sourceInfo for name:", sourceName) a.setPropDefaultSource("/") a.defaultSource = nil + if strings.Contains(sourceName, "null-sink") { + a.autoSwitchInputPort() + } else { + logger.Warning("failed to get sourceInfo for name:", sourceName) + } return } if a.defaultSource != nil && a.defaultSource.Name == sourceName { @@ -1867,7 +1869,9 @@ func (a *Audio) handleVolumeIncrease() { } func (a *Audio) LoadNullSinkModule() { - a.context().LoadModule(nullSinkModuleName, "") + if !a.isModuleExist(nullSinkModuleName) { + a.ctx.LoadModule(nullSinkModuleName, "") + } } func (a *Audio) unsetReduceNoise() { diff --git a/audio1/audio_events.go b/audio1/audio_events.go index 60167af88..6ba269a3d 100644 --- a/audio1/audio_events.go +++ b/audio1/audio_events.go @@ -207,11 +207,13 @@ func (a *Audio) autoSwitchOutputPort() bool { auto, cardId, portName := a.checkAutoSwitchOutputPort() if auto { if cardId == 0 || portName == "" { - if !a.isModuleExist(nullSinkModuleName) { - a.ctx.LoadModule(nullSinkModuleName, "") + if !strings.Contains(a.ctx.GetDefaultSink(), "null-sink") { + a.LoadNullSinkModule() + logger.Info("no prefer port, set default sink to", nullSinkName) + a.ctx.SetDefaultSink(nullSinkName) + } else { + logger.Info("no prefer port, default sink is null-sink already") } - logger.Info("no prefer port, set defaut sink to", nullSinkName) - a.ctx.SetDefaultSink(nullSinkName) return true } else { err := a.setPort(cardId, portName, pulse.DirectionSink, true) @@ -269,11 +271,13 @@ func (a *Audio) autoSwitchInputPort() bool { auto, cardId, portName := a.checkAutoSwitchInputPort() if auto { if cardId == 0 || portName == "" { - if !a.isModuleExist(nullSinkModuleName) { - a.ctx.LoadModule(nullSinkModuleName, "") + if !strings.Contains(a.ctx.GetDefaultSource(), "null-sink") { + a.LoadNullSinkModule() + logger.Info("no prefer port, set default source to", nullSinkName) + a.ctx.SetDefaultSource(nullSinkName + ".monitor") + } else { + logger.Info("no prefer port, default source is null-sink already") } - logger.Info("no prefer port, set defaut source to", nullSinkName) - a.ctx.SetDefaultSource(nullSinkName + ".monitor") return true } else { err := a.setPort(cardId, portName, pulse.DirectionSource, true)