From 0b4cb88ce1e76357350f11e503795a639e1931d4 Mon Sep 17 00:00:00 2001 From: fuleyi Date: Tue, 3 Dec 2024 09:37:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20pipewire=E4=B8=8B=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=8D=95=E5=A3=B0=E9=81=93=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pipewire下支持单声道设置 Log: pipewire下支持单声道设置 pms: TASK-369199 --- audio1/audio.go | 88 ++++- audio1/audio_dbusutil.go | 351 +++++++++--------- audio1/exported_methods_auto.go | 5 + audio1/sink.go | 13 + go.mod | 8 +- go.sum | 12 +- .../org.deepin.dde.daemon.audio.json | 11 + 7 files changed, 294 insertions(+), 194 deletions(-) diff --git a/audio1/audio.go b/audio1/audio.go index f0e2ba75b..3dbad4818 100644 --- a/audio1/audio.go +++ b/audio1/audio.go @@ -69,6 +69,7 @@ const ( dsgKeyInputDefaultPriorities = "inputDefaultPrioritiesByType" dsgKeyOutputDefaultPriorities = "outputDefaultPrioritiesByType" dsgKeyBluezModeDefault = "bluezModeDefault" + dsgKeyMonoEnabled = "monoEnabled" changeIconStart = "notification-change-start" changeIconFailed = "notification-change-failed" @@ -156,6 +157,9 @@ type Audio struct { // 最大音量 MaxUIVolume float64 // readonly + // 单声道设置 + Mono bool + headphoneUnplugAutoPause bool settings *gio.Settings @@ -945,6 +949,13 @@ func (a *Audio) init() error { } else { logger.Warning(err) } + if strings.Contains(strings.ToLower(a.CurrentAudioServer), "pipewire") { + if a.defaultSink != nil { + if err := a.defaultSink.SetMono(a.Mono); err != nil { + logger.Warning(err) + } + } + } GetBluezAudioManager().Load() GetConfigKeeper().Load() @@ -1575,6 +1586,13 @@ func (a *Audio) updateDefaultSink(sinkName string) { a.defaultSink = sink defaultSinkPath := sink.getPath() + if strings.Contains(strings.ToLower(a.CurrentAudioServer), "pipewire") { + if sink != nil { + if err := sink.SetMono(a.Mono); err != nil { + logger.Warning(err) + } + } + } a.resumeSinkConfig(sink) @@ -2015,8 +2033,14 @@ func (a *Audio) initDsgProp() error { } } } - getBluezModeDefault() + getMonoEnabled := func() { + err = systemConnObj.Call("org.desktopspec.ConfigManager.Manager.value", 0, dsgKeyMonoEnabled).Store(&a.Mono) + if err != nil { + logger.Warning(err) + } + } + getMonoEnabled() // 监听dsg配置变化 a.systemSigLoop.AddHandler(&dbusutil.SignalRule{ Name: "org.desktopspec.ConfigManager.Manager.valueChanged", @@ -2037,20 +2061,20 @@ func (a *Audio) initDsgProp() error { } case dsgKeyBluezModeDefault: getBluezModeDefault() - } - } - - 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() + case 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() + } + case dsgKeyMonoEnabled: + getMonoEnabled() } } } @@ -2068,3 +2092,37 @@ func (a *Audio) canAutoSwitchPort() bool { return a.enableAutoSwitchPort } + +func (a *Audio) SetMono(enable bool) *dbus.Error { + err := a.setMono(enable) + return dbusutil.ToError(err) +} + +func (a *Audio) setMono(enable bool) error { + // 只有pipewire支持设置 + if !strings.Contains(strings.ToLower(a.CurrentAudioServer), "pipewire") { + err := fmt.Errorf("Current audio server is not support set mono") + logger.Warning(err) + return err + } + sink := a.getDefaultSink() + if sink != nil { + err := sink.SetMono(enable) + if err != nil { + logger.Warning(err) + return err + } + } + + a.setPropMono(enable) + 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, dsgKeyMonoEnabled, dbus.MakeVariant(enable)).Err + if err != nil { + return dbusutil.ToError(errors.New("dconfig Cannot set value " + dsgKeyMonoEnabled)) + } + return nil +} diff --git a/audio1/audio_dbusutil.go b/audio1/audio_dbusutil.go index 537f4e1ad..b6ac90bdd 100644 --- a/audio1/audio_dbusutil.go +++ b/audio1/audio_dbusutil.go @@ -6,6 +6,175 @@ import ( "github.com/godbus/dbus/v5" ) +func (v *Source) setPropName(value string) (changed bool) { + if v.Name != value { + v.Name = value + v.emitPropChangedName(value) + return true + } + return false +} + +func (v *Source) emitPropChangedName(value string) error { + return v.service.EmitPropertyChanged(v, "Name", value) +} + +func (v *Source) setPropDescription(value string) (changed bool) { + if v.Description != value { + v.Description = value + v.emitPropChangedDescription(value) + return true + } + return false +} + +func (v *Source) emitPropChangedDescription(value string) error { + return v.service.EmitPropertyChanged(v, "Description", value) +} + +func (v *Source) setPropBaseVolume(value float64) (changed bool) { + if v.BaseVolume != value { + v.BaseVolume = value + v.emitPropChangedBaseVolume(value) + return true + } + return false +} + +func (v *Source) emitPropChangedBaseVolume(value float64) error { + return v.service.EmitPropertyChanged(v, "BaseVolume", value) +} + +func (v *Source) setPropMute(value bool) (changed bool) { + if v.Mute != value { + v.Mute = value + v.emitPropChangedMute(value) + return true + } + return false +} + +func (v *Source) emitPropChangedMute(value bool) error { + return v.service.EmitPropertyChanged(v, "Mute", value) +} + +func (v *Source) setPropVolume(value float64) (changed bool) { + if v.Volume != value { + v.Volume = value + v.emitPropChangedVolume(value) + return true + } + return false +} + +func (v *Source) emitPropChangedVolume(value float64) error { + return v.service.EmitPropertyChanged(v, "Volume", value) +} + +func (v *Source) setPropBalance(value float64) (changed bool) { + if v.Balance != value { + v.Balance = value + v.emitPropChangedBalance(value) + return true + } + return false +} + +func (v *Source) emitPropChangedBalance(value float64) error { + return v.service.EmitPropertyChanged(v, "Balance", value) +} + +func (v *Source) setPropSupportBalance(value bool) (changed bool) { + if v.SupportBalance != value { + v.SupportBalance = value + v.emitPropChangedSupportBalance(value) + return true + } + return false +} + +func (v *Source) emitPropChangedSupportBalance(value bool) error { + return v.service.EmitPropertyChanged(v, "SupportBalance", value) +} + +func (v *Source) setPropFade(value float64) (changed bool) { + if v.Fade != value { + v.Fade = value + v.emitPropChangedFade(value) + return true + } + return false +} + +func (v *Source) emitPropChangedFade(value float64) error { + return v.service.EmitPropertyChanged(v, "Fade", value) +} + +func (v *Source) setPropSupportFade(value bool) (changed bool) { + if v.SupportFade != value { + v.SupportFade = value + v.emitPropChangedSupportFade(value) + return true + } + return false +} + +func (v *Source) emitPropChangedSupportFade(value bool) error { + return v.service.EmitPropertyChanged(v, "SupportFade", value) +} + +func (v *Source) setPropPorts(value []Port) (changed bool) { + if !portsEqual(v.Ports, value) { + v.Ports = value + v.emitPropChangedPorts(value) + return true + } + return false +} + +func (v *Source) emitPropChangedPorts(value []Port) error { + return v.service.EmitPropertyChanged(v, "Ports", value) +} + +func (v *Source) setPropActivePort(value Port) (changed bool) { + if v.ActivePort != value { + v.ActivePort = value + v.emitPropChangedActivePort(value) + return true + } + return false +} + +func (v *Source) emitPropChangedActivePort(value Port) error { + return v.service.EmitPropertyChanged(v, "ActivePort", value) +} + +func (v *Source) setPropCard(value uint32) (changed bool) { + if v.Card != value { + v.Card = value + v.emitPropChangedCard(value) + return true + } + return false +} + +func (v *Source) emitPropChangedCard(value uint32) error { + return v.service.EmitPropertyChanged(v, "Card", value) +} + +func (v *Meter) setPropVolume(value float64) (changed bool) { + if v.Volume != value { + v.Volume = value + v.emitPropChangedVolume(value) + return true + } + return false +} + +func (v *Meter) emitPropChangedVolume(value float64) error { + return v.service.EmitPropertyChanged(v, "Volume", value) +} + func (v *Audio) setPropSinkInputs(value []dbus.ObjectPath) (changed bool) { if !objectPathSliceEqual(v.SinkInputs, value) { v.SinkInputs = value @@ -188,6 +357,19 @@ func (v *Audio) emitPropChangedMaxUIVolume(value float64) error { return v.service.EmitPropertyChanged(v, "MaxUIVolume", value) } +func (v *Audio) setPropMono(value bool) (changed bool) { + if v.Mono != value { + v.Mono = value + v.emitPropChangedMono(value) + return true + } + return false +} + +func (v *Audio) emitPropChangedMono(value bool) error { + return v.service.EmitPropertyChanged(v, "Mono", value) +} + func (v *Sink) setPropName(value string) (changed bool) { if v.Name != value { v.Name = value @@ -460,172 +642,3 @@ func (v *SinkInput) setPropSinkIndex(value uint32) (changed bool) { func (v *SinkInput) emitPropChangedSinkIndex(value uint32) error { return v.service.EmitPropertyChanged(v, "SinkIndex", value) } - -func (v *Source) setPropName(value string) (changed bool) { - if v.Name != value { - v.Name = value - v.emitPropChangedName(value) - return true - } - return false -} - -func (v *Source) emitPropChangedName(value string) error { - return v.service.EmitPropertyChanged(v, "Name", value) -} - -func (v *Source) setPropDescription(value string) (changed bool) { - if v.Description != value { - v.Description = value - v.emitPropChangedDescription(value) - return true - } - return false -} - -func (v *Source) emitPropChangedDescription(value string) error { - return v.service.EmitPropertyChanged(v, "Description", value) -} - -func (v *Source) setPropBaseVolume(value float64) (changed bool) { - if v.BaseVolume != value { - v.BaseVolume = value - v.emitPropChangedBaseVolume(value) - return true - } - return false -} - -func (v *Source) emitPropChangedBaseVolume(value float64) error { - return v.service.EmitPropertyChanged(v, "BaseVolume", value) -} - -func (v *Source) setPropMute(value bool) (changed bool) { - if v.Mute != value { - v.Mute = value - v.emitPropChangedMute(value) - return true - } - return false -} - -func (v *Source) emitPropChangedMute(value bool) error { - return v.service.EmitPropertyChanged(v, "Mute", value) -} - -func (v *Source) setPropVolume(value float64) (changed bool) { - if v.Volume != value { - v.Volume = value - v.emitPropChangedVolume(value) - return true - } - return false -} - -func (v *Source) emitPropChangedVolume(value float64) error { - return v.service.EmitPropertyChanged(v, "Volume", value) -} - -func (v *Source) setPropBalance(value float64) (changed bool) { - if v.Balance != value { - v.Balance = value - v.emitPropChangedBalance(value) - return true - } - return false -} - -func (v *Source) emitPropChangedBalance(value float64) error { - return v.service.EmitPropertyChanged(v, "Balance", value) -} - -func (v *Source) setPropSupportBalance(value bool) (changed bool) { - if v.SupportBalance != value { - v.SupportBalance = value - v.emitPropChangedSupportBalance(value) - return true - } - return false -} - -func (v *Source) emitPropChangedSupportBalance(value bool) error { - return v.service.EmitPropertyChanged(v, "SupportBalance", value) -} - -func (v *Source) setPropFade(value float64) (changed bool) { - if v.Fade != value { - v.Fade = value - v.emitPropChangedFade(value) - return true - } - return false -} - -func (v *Source) emitPropChangedFade(value float64) error { - return v.service.EmitPropertyChanged(v, "Fade", value) -} - -func (v *Source) setPropSupportFade(value bool) (changed bool) { - if v.SupportFade != value { - v.SupportFade = value - v.emitPropChangedSupportFade(value) - return true - } - return false -} - -func (v *Source) emitPropChangedSupportFade(value bool) error { - return v.service.EmitPropertyChanged(v, "SupportFade", value) -} - -func (v *Source) setPropPorts(value []Port) (changed bool) { - if !portsEqual(v.Ports, value) { - v.Ports = value - v.emitPropChangedPorts(value) - return true - } - return false -} - -func (v *Source) emitPropChangedPorts(value []Port) error { - return v.service.EmitPropertyChanged(v, "Ports", value) -} - -func (v *Source) setPropActivePort(value Port) (changed bool) { - if v.ActivePort != value { - v.ActivePort = value - v.emitPropChangedActivePort(value) - return true - } - return false -} - -func (v *Source) emitPropChangedActivePort(value Port) error { - return v.service.EmitPropertyChanged(v, "ActivePort", value) -} - -func (v *Source) setPropCard(value uint32) (changed bool) { - if v.Card != value { - v.Card = value - v.emitPropChangedCard(value) - return true - } - return false -} - -func (v *Source) emitPropChangedCard(value uint32) error { - return v.service.EmitPropertyChanged(v, "Card", value) -} - -func (v *Meter) setPropVolume(value float64) (changed bool) { - if v.Volume != value { - v.Volume = value - v.emitPropChangedVolume(value) - return true - } - return false -} - -func (v *Meter) emitPropChangedVolume(value float64) error { - return v.service.EmitPropertyChanged(v, "Volume", value) -} diff --git a/audio1/exported_methods_auto.go b/audio1/exported_methods_auto.go index 1263869d6..9ea77da49 100644 --- a/audio1/exported_methods_auto.go +++ b/audio1/exported_methods_auto.go @@ -42,6 +42,11 @@ func (v *Audio) GetExportedMethods() dbusutil.ExportedMethods { Fn: v.SetCurrentAudioServer, InArgs: []string{"serverName"}, }, + { + Name: "SetMono", + Fn: v.SetMono, + InArgs: []string{"enable"}, + }, } } func (v *Meter) GetExportedMethods() dbusutil.ExportedMethods { diff --git a/audio1/sink.go b/audio1/sink.go index 18e17025d..71faeda02 100644 --- a/audio1/sink.go +++ b/audio1/sink.go @@ -118,6 +118,19 @@ func (s *Sink) SetVolume(value float64, isPlay bool) *dbus.Error { return nil } +func (s *Sink) SetMono(enable bool) error { + err := s.CheckPort() + if err != nil { + logger.Warning(err.Body...) + return err + } + s.PropsMu.RLock() + cv := s.cVolume.SetMono(s.Volume, enable) + s.PropsMu.RUnlock() + s.audio.context().SetSinkVolumeByIndex(s.index, cv) + return nil +} + // 设置左右声道平衡值 // // v: 声道平衡值 diff --git a/go.mod b/go.mod index cb4abedbd..36926be72 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.20 require ( github.com/Lofanmi/pinyin-golang v0.0.0-20211114132645-1db892057f20 + github.com/adrg/xdg v0.5.3 github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 github.com/davecgh/go-spew v1.1.1 github.com/fsnotify/fsnotify v1.7.0 @@ -11,7 +12,7 @@ require ( github.com/gosexy/gettext v0.0.0-20160830220431-74466a0a0c4a github.com/jouyouyun/hardware v0.1.8 github.com/linuxdeepin/dde-api v0.0.0-20240902063014-bac87797f4c3 - github.com/linuxdeepin/go-dbus-factory v0.0.0-20240903081145-85d3b34776c4 + github.com/linuxdeepin/go-dbus-factory v0.0.0-20241114095502-09e43c651aea github.com/linuxdeepin/go-gir v0.0.0-20230710064042-bd15f0549c87 github.com/linuxdeepin/go-lib v0.0.0-20240105075242-dddda54ea9f0 github.com/linuxdeepin/go-x11-client v0.0.0-20240415051504-c8e43d028ff9 @@ -22,7 +23,7 @@ require ( golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 google.golang.org/protobuf v1.34.2 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c - gopkg.in/yaml.v2 v2.4.0 + gopkg.in/yaml.v3 v3.0.1 ) require ( @@ -41,7 +42,6 @@ require ( golang.org/x/image v0.10.0 // indirect golang.org/x/net v0.27.0 // indirect golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.22.0 // indirect + golang.org/x/sys v0.26.0 // indirect golang.org/x/text v0.17.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 1ad9dbf49..484cebca1 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ github.com/Lofanmi/pinyin-golang v0.0.0-20211114132645-1db892057f20 h1:QUwRV0ZgSjXBJnKOJh0T5rqe1jLWxlR5AvBLWSYJ7qg= github.com/Lofanmi/pinyin-golang v0.0.0-20211114132645-1db892057f20/go.mod h1:J7A5UW8HA8b8lsEO/OshykiGGfmdQEnbDE53D23JsXE= +github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78= +github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+IrOD63t4i/RW7RqrAVl9LTZ9UqQ= @@ -32,8 +34,8 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/linuxdeepin/dde-api v0.0.0-20240902063014-bac87797f4c3 h1:SlPsz953m6CeFoawhtL5S/3huF0s4PtPxiTeIp7CKIw= github.com/linuxdeepin/dde-api v0.0.0-20240902063014-bac87797f4c3/go.mod h1:Ms92CRDOjzkDmX1x0x6+b0vQSYHJ7Ab9jQMY2JYWiio= -github.com/linuxdeepin/go-dbus-factory v0.0.0-20240903081145-85d3b34776c4 h1:96iVJxs0JqL/Hb5mqtf6+NwGRkjFGxCA652OlNTHOmg= -github.com/linuxdeepin/go-dbus-factory v0.0.0-20240903081145-85d3b34776c4/go.mod h1:iIlTR50SA8MJ9ORPyMOpKWMF4g+AUorbER5AX0RD9Jk= +github.com/linuxdeepin/go-dbus-factory v0.0.0-20241114095502-09e43c651aea h1:ysK5BolL/6OCf/4RmgrMFwT1frLRYlv0FGutA+xtRNk= +github.com/linuxdeepin/go-dbus-factory v0.0.0-20241114095502-09e43c651aea/go.mod h1:iIlTR50SA8MJ9ORPyMOpKWMF4g+AUorbER5AX0RD9Jk= github.com/linuxdeepin/go-gir v0.0.0-20230331033513-a8d7a9e89f9b/go.mod h1:a0tox5vepTQu5iO6rdKc4diGT+fkyXZlRROM8ULEvaI= github.com/linuxdeepin/go-gir v0.0.0-20230710064042-bd15f0549c87 h1:ga3ioifiDJJDfWv0ZJPX8e//fQNIzINXxJb4BMQofOo= github.com/linuxdeepin/go-gir v0.0.0-20230710064042-bd15f0549c87/go.mod h1:a0tox5vepTQu5iO6rdKc4diGT+fkyXZlRROM8ULEvaI= @@ -106,8 +108,8 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -135,8 +137,6 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/misc/dsg-configs/org.deepin.dde.daemon.audio.json b/misc/dsg-configs/org.deepin.dde.daemon.audio.json index d8d0e837d..81284fab6 100644 --- a/misc/dsg-configs/org.deepin.dde.daemon.audio.json +++ b/misc/dsg-configs/org.deepin.dde.daemon.audio.json @@ -98,6 +98,17 @@ "description": "bluetooth audio default mode", "permissions": "readwrite", "visibility": "private" + }, + "monoEnabled":{ + "value": false, + "serial": 0, + "flags": [], + "global": true, + "name": "monoEnabled", + "name[zh_CN]": "单声道开关", + "description": "audio channel mono enabled set", + "permissions": "readwrite", + "visibility": "private" } } }