diff --git a/audio1/audio.go b/audio1/audio.go index c9dfa4a68..58d3452d5 100644 --- a/audio1/audio.go +++ b/audio1/audio.go @@ -31,6 +31,7 @@ const ( gsKeyHeadphoneOutputVolume = "headphone-output-volume" gsKeyHeadphoneUnplugAutoPause = "headphone-unplug-auto-pause" gsKeyVolumeIncrease = "volume-increase" + gsKeyReduceNoise = "reduce-input-noise" gsKeyOutputAutoSwitchCountMax = "output-auto-switch-count-max" @@ -47,6 +48,7 @@ const ( increaseMaxVolume = 1.5 normalMaxVolume = 1.0 + dsgkeyPausePlayer = "pausePlayer" dsgKeyAutoSwitchPort = "autoSwitchPort" dsgKeyBluezModeFilterList = "bluezModeFilterList" dsgKeyPortFilterList = "portFilterList" @@ -97,6 +99,7 @@ type Audio struct { // dbusutil-gen: equal=objectPathSliceEqual Sinks []dbus.ObjectPath // dbusutil-gen: equal=objectPathSliceEqual + configManagerPath dbus.ObjectPath Sources []dbus.ObjectPath DefaultSink dbus.ObjectPath DefaultSource dbus.ObjectPath @@ -109,7 +112,10 @@ type Audio struct { // dbusutil-gen: ignore IncreaseVolume gsprop.Bool `prop:"access:rw"` - ReduceNoise bool `prop:"access:rw"` + PausePlayer bool `prop:"access:rw"` + + ReduceNoise bool `prop:"access:rw"` + defaultPaCfg defaultPaConfig // 最大音量 @@ -188,6 +194,7 @@ func newAudio(service *dbusutil.Service) *Audio { a.settings.Reset(gsKeyInputVolume) a.settings.Reset(gsKeyOutputVolume) a.IncreaseVolume.Bind(a.settings, gsKeyVolumeIncrease) + a.PausePlayer = false a.ReduceNoise = false a.emitPropChangedReduceNoise(a.ReduceNoise) a.headphoneUnplugAutoPause = a.settings.GetBoolean(gsKeyHeadphoneUnplugAutoPause) @@ -407,6 +414,9 @@ func (a *Audio) refershSinkInputs() { } func (a *Audio) shouldAutoPause() bool { + if !a.PausePlayer { + return false + } if a.defaultSink == nil { logger.Debug("default sink is nil") return false @@ -1407,7 +1417,7 @@ func (a *Audio) NoRestartPulseAudio() *dbus.Error { return nil } -//当蓝牙声卡配置文件选择a2dp时,不支持声音输入,所以需要禁用掉,否则会录入 +// 当蓝牙声卡配置文件选择a2dp时,不支持声音输入,所以需要禁用掉,否则会录入 func (a *Audio) disableBluezSourceIfProfileIsA2dp() { a.mu.Lock() source, ok := a.sources[a.sourceIdx] @@ -1491,16 +1501,15 @@ func (a *Audio) initDsgProp() error { a.systemSigLoop = dbusutil.NewSignalLoop(systemBus, 10) - var configManagerPath dbus.ObjectPath systemConnObj := systemBus.Object("org.desktopspec.ConfigManager", "/") - err = systemConnObj.Call("org.desktopspec.ConfigManager.acquireManager", 0, "org.deepin.dde.daemon", "org.deepin.dde.daemon.audio", "").Store(&configManagerPath) + err = systemConnObj.Call("org.desktopspec.ConfigManager.acquireManager", 0, "org.deepin.dde.daemon", "org.deepin.dde.daemon.audio", "").Store(&a.configManagerPath) if err != nil { logger.Warning(err) return nil } err = dbusutil.NewMatchRuleBuilder().Type("signal"). - PathNamespace(string(configManagerPath)). + PathNamespace(string(a.configManagerPath)). Interface("org.desktopspec.ConfigManager.Manager"). Member("valueChanged").Build().AddTo(systemBus) if err != nil { @@ -1509,7 +1518,7 @@ func (a *Audio) initDsgProp() error { } var val bool - systemConnObj = systemBus.Object("org.desktopspec.ConfigManager", configManagerPath) + systemConnObj = systemBus.Object("org.desktopspec.ConfigManager", a.configManagerPath) err = systemConnObj.Call("org.desktopspec.ConfigManager.Manager.value", 0, dsgKeyAutoSwitchPort).Store(&val) if err != nil { logger.Warning(err) @@ -1520,6 +1529,17 @@ func (a *Audio) initDsgProp() error { a.PropsMu.Unlock() } + var keyPausePlayer bool + err = systemConnObj.Call("org.desktopspec.ConfigManager.Manager.value", 0, dsgkeyPausePlayer).Store(&keyPausePlayer) + if err != nil { + logger.Warning(err) + } else { + logger.Info("auto switch port:", keyPausePlayer) + a.PropsMu.Lock() + a.PausePlayer = keyPausePlayer + a.PropsMu.Unlock() + } + var ret []dbus.Variant err = systemConnObj.Call("org.desktopspec.ConfigManager.Manager.value", 0, dsgKeyBluezModeFilterList).Store(&ret) if err != nil { @@ -1566,6 +1586,19 @@ func (a *Audio) initDsgProp() error { } } + if ok && key == dsgkeyPausePlayer { + var pausePlayer bool + err = systemConnObj.Call("org.desktopspec.ConfigManager.Manager.value", 0, key).Store(&pausePlayer) + if err != nil { + logger.Warning(err) + } else { + logger.Info("pausePlayer config:", pausePlayer) + a.PropsMu.Lock() + a.PausePlayer = pausePlayer + a.emitPropChangedPausePlayer(pausePlayer) + a.PropsMu.Unlock() + } + } } }) diff --git a/audio1/audio_dbusutil.go b/audio1/audio_dbusutil.go index c49285abc..2ea040d98 100644 --- a/audio1/audio_dbusutil.go +++ b/audio1/audio_dbusutil.go @@ -123,6 +123,19 @@ func (v *Audio) emitPropChangedBluetoothAudioModeOpts(value []string) error { return v.service.EmitPropertyChanged(v, "BluetoothAudioModeOpts", value) } +func (v *Audio) setPropPausePlayer(value bool) (changed bool) { + if v.PausePlayer != value { + v.PausePlayer = value + v.emitPropChangedPausePlayer(value) + return true + } + return false +} + +func (v *Audio) emitPropChangedPausePlayer(value bool) error { + return v.service.EmitPropertyChanged(v, "PausePlayer", value) +} + func (v *Audio) setPropReduceNoise(value bool) (changed bool) { if v.ReduceNoise != value { v.ReduceNoise = value diff --git a/audio1/audio_events.go b/audio1/audio_events.go index fac710bcf..3423dd543 100644 --- a/audio1/audio_events.go +++ b/audio1/audio_events.go @@ -609,6 +609,25 @@ func (a *Audio) writeReduceNoise(write *dbusutil.PropertyWrite) *dbus.Error { return nil } +func (a *Audio) writeKeyPausePlayer(write *dbusutil.PropertyWrite) *dbus.Error { + pausePlayer, ok := write.Value.(bool) + if !ok { + return dbusutil.ToError(errors.New("type is not bool")) + } + systemBus, err := dbus.SystemBus() + if err != nil { + return dbus.MakeFailedError(err) + } + + systemConnObj := systemBus.Object("org.desktopspec.ConfigManager", a.configManagerPath) + err = systemConnObj.Call("org.desktopspec.ConfigManager.Manager.setValue", 0, dsgkeyPausePlayer, dbus.MakeVariant(pausePlayer)).Err + if err != nil { + return dbusutil.ToError(errors.New("dconfig Cannot set value " + dsgkeyPausePlayer)) + } + a.setPropPausePlayer(pausePlayer) + return nil +} + func (a *Audio) notifyBluezCardPortInsert(card *Card) { logger.Debugf("notify bluez card %d:%s", card.Id, card.core.Name) oldCard, err := a.oldCards.getByName(card.core.Name) diff --git a/audio1/module.go b/audio1/module.go index 928de9ee7..89751946d 100644 --- a/audio1/module.go +++ b/audio1/module.go @@ -65,6 +65,16 @@ func (m *Module) start() error { so := service.GetServerObject(m.audio) err = so.SetWriteCallback(m.audio, "ReduceNoise", m.audio.writeReduceNoise) + if err != nil { + logger.Warning("failed to bind callback for ReduceNoise:", err) + } + + err = so.SetWriteCallback(m.audio, "PausePlayer", m.audio.writeKeyPausePlayer) + + if err != nil { + logger.Warning("failed to bind callback for PausePlayer:", err) + } + err = m.audio.syncConfig.Register() if err != nil { logger.Warning("failed to register for deepin sync:", err) diff --git a/misc/dsg-configs/org.deepin.dde.daemon.audio.json b/misc/dsg-configs/org.deepin.dde.daemon.audio.json index 1cce1f211..f3d23884c 100644 --- a/misc/dsg-configs/org.deepin.dde.daemon.audio.json +++ b/misc/dsg-configs/org.deepin.dde.daemon.audio.json @@ -2,6 +2,16 @@ "magic": "dsg.config.meta", "version": "1.0", "contents": { + "pausePlayer": { + "value": false, + "serial":0, + "flags" : [], + "name": "PlayerPause", + "name[zh_CN]": "插拔声音设备暂停输出", + "description": "auto pause player", + "permissions": "readwrite", + "visibility": "private" + }, "autoSwitchPort": { "value": true, "serial": 0,