Skip to content

Commit e9dfccd

Browse files
committed
fix: 解决音频端口初始化时为null-sink的问题
初始化时会加载null-sink, 概率性触发底层事件,将默认输入输出设置为null-sink. 当输入输出设置为null-sink时,再检查一次端口是否有可用端口,如果有则切换 Log: PMS: BUG-340327 Influence: audio
1 parent 5540d08 commit e9dfccd

2 files changed

Lines changed: 28 additions & 20 deletions

File tree

audio1/audio.go

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,6 @@ func (a *Audio) refreshSinks() {
626626
sinkInfoMap := make(map[uint32]*pulse.Sink)
627627
sinkInfoList := a.ctx.GetSinkList()
628628

629-
hasNullSink := false
630629
for _, sinkInfo := range sinkInfoList {
631630
if sinkInfo.Name == dndVirtualSinkName {
632631
port := pulse.PortInfo{
@@ -638,9 +637,6 @@ func (a *Audio) refreshSinks() {
638637
sinkInfo.Ports = append(sinkInfo.Ports, port)
639638
sinkInfo.ActivePort = port
640639
}
641-
if sinkInfo.Name == nullSinkName {
642-
hasNullSink = true
643-
}
644640
sinkInfoMap[sinkInfo.Index] = sinkInfo
645641
sink, exist := a.sinks[sinkInfo.Index]
646642
if exist {
@@ -663,11 +659,6 @@ func (a *Audio) refreshSinks() {
663659
delete(a.sinks, key)
664660
}
665661
}
666-
667-
// 加载module-null-sink,噪音抑制时,将sink-input端口Echo-Cancel Playback引入到null-sink
668-
if !hasNullSink {
669-
a.LoadNullSinkModule()
670-
}
671662
}
672663

673664
func (a *Audio) refreshSources() {
@@ -795,6 +786,8 @@ func (a *Audio) init() error {
795786
if err != nil {
796787
return err
797788
}
789+
// 加载module-null-sink,噪音抑制时,将sink-input端口Echo-Cancel Playback引入到null-sink
790+
a.LoadNullSinkModule()
798791

799792
// 更新本地数据
800793
a.refresh()
@@ -1328,9 +1321,14 @@ func (a *Audio) refreshBluetoothOpts() {
13281321
func (a *Audio) updateDefaultSink(sinkName string) {
13291322
sinkInfo := a.getPhySinkInfoByName(sinkName)
13301323
if sinkInfo == nil {
1331-
logger.Warning("failed to get sinkInfo for name:", sinkName)
1324+
// 如果是null-sink再检查一次,是否可以自动切换端口
13321325
a.setPropDefaultSink("/")
13331326
a.defaultSink = nil
1327+
if strings.Contains(sinkName, "null-sink") {
1328+
a.autoSwitchOutputPort()
1329+
} else {
1330+
logger.Warning("failed to get sinkInfo for name:", sinkName)
1331+
}
13341332
return
13351333
}
13361334
a.moveSinkInputsToSink(nil)
@@ -1391,9 +1389,13 @@ func (a *Audio) updateDefaultSink(sinkName string) {
13911389
func (a *Audio) updateDefaultSource(sourceName string) {
13921390
sourceInfo := a.getPhySourceInfoByName(sourceName)
13931391
if sourceInfo == nil {
1394-
logger.Warning("failed to get sourceInfo for name:", sourceName)
13951392
a.setPropDefaultSource("/")
13961393
a.defaultSource = nil
1394+
if strings.Contains(sourceName, "null-sink") {
1395+
a.autoSwitchInputPort()
1396+
} else {
1397+
logger.Warning("failed to get sourceInfo for name:", sourceName)
1398+
}
13971399
return
13981400
}
13991401
if a.defaultSource != nil && a.defaultSource.Name == sourceName {
@@ -1867,7 +1869,9 @@ func (a *Audio) handleVolumeIncrease() {
18671869
}
18681870

18691871
func (a *Audio) LoadNullSinkModule() {
1870-
a.context().LoadModule(nullSinkModuleName, "")
1872+
if !a.isModuleExist(nullSinkModuleName) {
1873+
a.ctx.LoadModule(nullSinkModuleName, "")
1874+
}
18711875
}
18721876

18731877
func (a *Audio) unsetReduceNoise() {

audio1/audio_events.go

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -207,11 +207,13 @@ func (a *Audio) autoSwitchOutputPort() bool {
207207
auto, cardId, portName := a.checkAutoSwitchOutputPort()
208208
if auto {
209209
if cardId == 0 || portName == "" {
210-
if !a.isModuleExist(nullSinkModuleName) {
211-
a.ctx.LoadModule(nullSinkModuleName, "")
210+
if !strings.Contains(a.ctx.GetDefaultSink(), "null-sink") {
211+
a.LoadNullSinkModule()
212+
logger.Info("no prefer port, set default sink to", nullSinkName)
213+
a.ctx.SetDefaultSink(nullSinkName)
214+
} else {
215+
logger.Info("no prefer port, default sink is null-sink already")
212216
}
213-
logger.Info("no prefer port, set defaut sink to", nullSinkName)
214-
a.ctx.SetDefaultSink(nullSinkName)
215217
return true
216218
} else {
217219
err := a.setPort(cardId, portName, pulse.DirectionSink, true)
@@ -269,11 +271,13 @@ func (a *Audio) autoSwitchInputPort() bool {
269271
auto, cardId, portName := a.checkAutoSwitchInputPort()
270272
if auto {
271273
if cardId == 0 || portName == "" {
272-
if !a.isModuleExist(nullSinkModuleName) {
273-
a.ctx.LoadModule(nullSinkModuleName, "")
274+
if !strings.Contains(a.ctx.GetDefaultSource(), "null-sink") {
275+
a.LoadNullSinkModule()
276+
logger.Info("no prefer port, set default source to", nullSinkName)
277+
a.ctx.SetDefaultSource(nullSinkName + ".monitor")
278+
} else {
279+
logger.Info("no prefer port, default source is null-sink already")
274280
}
275-
logger.Info("no prefer port, set defaut source to", nullSinkName)
276-
a.ctx.SetDefaultSource(nullSinkName + ".monitor")
277281
return true
278282
} else {
279283
err := a.setPort(cardId, portName, pulse.DirectionSource, true)

0 commit comments

Comments
 (0)