@@ -339,7 +339,7 @@ func (a *Audio) needAutoSwitchOutputPort() bool {
339339// 自动切换端口,至少要保证声卡的profile是配置文件中设置的profile
340340// 如果不是,可能还在切换中,等待一下
341341func (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
534541func (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
619631func (a * Audio ) handleSinkInputEvent (eventType int , idx uint32 ) {
0 commit comments