Skip to content

Commit 8492735

Browse files
committed
fix: 解决接入有限耳机, 输入输出还是null的问题
处理一些特殊场景,当声卡的端口可用性发生变化时,没有自动切换端口,因为此时sink/source还没有更新,导致切换失败. 当sink/source收到事件时,也只是change的事件,不会触发端口切换逻辑,导致端口一直没有变化. 一些warning日志不太重要,应该为debug或者info级别的调试辅助信息. Log: 解决接入优先耳机,输入和输出为null的问题 PMS: BUG-346985 Influence: audio
1 parent 18a32cd commit 8492735

2 files changed

Lines changed: 19 additions & 7 deletions

File tree

audio1/audio.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1245,7 +1245,7 @@ func (a *Audio) resumeSinkConfig(s *Sink) {
12451245
logger.Warning(dbusErr)
12461246
}
12471247

1248-
logger.Warningf("set %v mute %v", s.Name, GetConfigKeeper().Mute.MuteOutput || !portConfig.Enabled)
1248+
logger.Debugf("set %v mute %v", s.Name, GetConfigKeeper().Mute.MuteOutput || !portConfig.Enabled)
12491249
s.setMute(GetConfigKeeper().Mute.MuteOutput || !portConfig.Enabled)
12501250
s.setMono(a.Mono)
12511251
}
@@ -1591,7 +1591,7 @@ func (a *Audio) StopAudioService() *dbus.Error {
15911591
return
15921592
} else {
15931593
runningServices, _ = runningServices.Delete(serviceMap[jobPath])
1594-
logger.Warningf("service %s stopped, %v is running", serviceMap[jobPath], runningServices)
1594+
logger.Infof("service %s stopped, %v is running", serviceMap[jobPath], runningServices)
15951595
if len(runningServices) == 0 {
15961596
done <- true
15971597
}

audio1/audio_events.go

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ func (a *Audio) needAutoSwitchOutputPort() bool {
339339
// 自动切换端口,至少要保证声卡的profile是配置文件中设置的profile
340340
// 如果不是,可能还在切换中,等待一下
341341
func (a *Audio) autoSwitchPort() {
342-
logger.Warning("auto switch port")
342+
logger.Debug("auto switch port")
343343
a.autoSwitchOutputPort()
344344
a.autoSwitchInputPort()
345345
}
@@ -353,7 +353,10 @@ func (a *Audio) handleCardEvent(eventType int, idx uint32) {
353353
case pulse.EventTypeRemove: // 删除声卡
354354
a.handleCardRemoved(idx)
355355
shouldAutoSwitch = true
356-
case pulse.EventTypeChange: // 声卡属性变化,也可能是有线耳机插拔了端口
356+
case pulse.EventTypeChange:
357+
// 声卡属性变化,也可能是有线耳机插拔了端口
358+
// 端口可用性的变化未能引起sink/source的变化,但有可能是优选端口,
359+
// 例如:变化的端口和当前端口不属于同一个配置,且变化的端口不在已存在的source中,因此不会有事件变化,需要在此处理
357360
shouldAutoSwitch = a.handleCardChanged(idx)
358361
default:
359362
logger.Warningf("unhandled card event, card=%d, type=%d", idx, eventType)
@@ -528,7 +531,11 @@ func (a *Audio) handleSinkChanged(idx uint32) {
528531
if _, ok := a.sinks[idx]; ok {
529532
a.sinks[idx].update(sink)
530533
}
531-
534+
// 处理场景: 当sink的端口可用性发生变化时,切换端口
535+
// cardchange事件也会触发,但是处理不了,因为这时sink可能还没更新,无可用端口
536+
if isPhysicalDevice(sink.Name) && a.checkCardIsReady(sink.Card) {
537+
a.autoSwitchPort()
538+
}
532539
}
533540

534541
func (a *Audio) handleSourceEvent(eventType int, idx uint32) {
@@ -571,7 +578,7 @@ func (a *Audio) handleSourceAdded(idx uint32) {
571578
// 其他的虚拟通道不做自动切换处理
572579
return
573580
} else if a.checkCardIsReady(source.Card) {
574-
a.autoSwitchPort()
581+
a.autoSwitchInputPort()
575582
}
576583

577584
}
@@ -598,7 +605,7 @@ func (a *Audio) handleSourceRemoved(idx uint32) {
598605
a.defaultSource = nil
599606
}
600607
if isPhy && a.checkCardIsReady(cardId) {
601-
a.autoSwitchPort()
608+
a.autoSwitchInputPort()
602609
}
603610
}
604611

@@ -614,6 +621,11 @@ func (a *Audio) handleSourceChanged(idx uint32) {
614621
if _, ok := a.sources[idx]; ok {
615622
a.sources[idx].update(source)
616623
}
624+
// 处理场景: 当source的端口可用性发生变化时,切换端口
625+
// cardchange事件也会触发,但是处理不了,因为这时source可能还没更新,无可用端口
626+
if isPhysicalDevice(source.Name) && a.checkCardIsReady(source.Card) {
627+
a.autoSwitchInputPort()
628+
}
617629
}
618630

619631
func (a *Audio) handleSinkInputEvent(eventType int, idx uint32) {

0 commit comments

Comments
 (0)