@@ -7,14 +7,16 @@ package audio
77import (
88 "errors"
99 "fmt"
10- "github.com/linuxdeepin/go-lib/strv"
1110 "math"
1211 "os"
12+ "regexp"
1313 "sort"
1414 "strings"
1515 "sync"
1616 "time"
1717
18+ "github.com/linuxdeepin/go-lib/strv"
19+
1820 dbus "github.com/godbus/dbus/v5"
1921 "github.com/linuxdeepin/dde-daemon/common/dsync"
2022 notifications "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.notifications"
@@ -1653,6 +1655,10 @@ func (a *Audio) refreshBluetoothOpts() {
16531655}
16541656
16551657func (a * Audio ) updateDefaultSink (sinkName string ) {
1658+ if a .defaultSink .Name == sinkName {
1659+ logger .Warningf ("defaultSink %s is the same as sinkName %s" , a .defaultSink .Name , sinkName )
1660+ return
1661+ }
16561662 sinkInfo := a .getSinkInfoByName (sinkName )
16571663
16581664 if sinkInfo == nil {
@@ -1663,11 +1669,16 @@ func (a *Audio) updateDefaultSink(sinkName string) {
16631669 logger .Debugf ("updateDefaultSink #%d %s" , sinkInfo .Index , sinkName )
16641670 a .moveSinkInputsToSink (sinkInfo .Index )
16651671 if ! isPhysicalDevice (sinkName ) {
1666- sinkInfo = a .getSinkInfoByName ( sinkInfo . PropList [ "device.master_device" ] )
1667- if sinkInfo == nil {
1672+ master : = a .getMasterNameFromVirtualDevice ( sinkName )
1673+ if master == "" {
16681674 logger .Warning ("failed to get virtual device sinkInfo for name:" , sinkName )
16691675 return
16701676 }
1677+ sinkInfo = a .getSinkInfoByName (master )
1678+ if sinkInfo == nil {
1679+ logger .Warning ("failed to get virtual device sinkInfo for name:" , master )
1680+ return
1681+ }
16711682 }
16721683 a .mu .Lock ()
16731684 sink , ok := a .sinks [sinkInfo .Index ]
@@ -1748,6 +1759,10 @@ func (a *Audio) updateSinks(index uint32) (sink *Sink) {
17481759}
17491760
17501761func (a * Audio ) updateDefaultSource (sourceName string ) {
1762+ if a .defaultSource .Name == sourceName {
1763+ logger .Warningf ("defaultSource %s is the same as sourceName %s" , a .defaultSource .Name , sourceName )
1764+ return
1765+ }
17511766 sourceInfo := a .getSourceInfoByName (sourceName )
17521767 if sourceInfo == nil {
17531768 logger .Warning ("failed to get sourceInfo for name:" , sourceName )
@@ -1757,7 +1772,12 @@ func (a *Audio) updateDefaultSource(sourceName string) {
17571772 logger .Debugf ("updateDefaultSource #%d %s" , sourceInfo .Index , sourceName )
17581773
17591774 if ! isPhysicalDevice (sourceName ) {
1760- sourceInfo = a .getSourceInfoByName (sourceInfo .Proplist ["device.master_device" ])
1775+ master := a .getMasterNameFromVirtualDevice (sourceName )
1776+ if master == "" {
1777+ logger .Error ("failed to get virtual device for name:" , sourceName )
1778+ return
1779+ }
1780+ sourceInfo = a .getSourceInfoByName (master )
17611781 if sourceInfo == nil {
17621782 logger .Warning ("failed to get virtual device sourceInfo for name:" , sourceName )
17631783 return
@@ -1858,6 +1878,20 @@ func (a *Audio) getDefaultSinkName() string {
18581878 return v
18591879}
18601880
1881+ func (a * Audio ) getMasterNameFromVirtualDevice (device string ) string {
1882+ modules := a .ctx .GetModuleList ()
1883+ for _ , module := range modules {
1884+ if strings .Contains (module .Name , "echo-cancel" ) {
1885+ re := regexp .MustCompile (`source_master=([^\s]+)` )
1886+ match := re .FindStringSubmatch (module .Argument )
1887+ if len (match ) > 1 {
1888+ return match [1 ]
1889+ }
1890+ }
1891+ }
1892+ return ""
1893+ }
1894+
18611895func (a * Audio ) getSinkInfoByName (sinkName string ) * pulse.Sink {
18621896 for _ , sinkInfo := range a .ctx .GetSinkList () {
18631897 if sinkInfo .Name == sinkName {
0 commit comments