rework settings dialog to be aware of different player types
This commit is contained in:
+12
-12
@@ -37,7 +37,7 @@ type App struct {
|
|||||||
ServerManager *ServerManager
|
ServerManager *ServerManager
|
||||||
ImageManager *ImageManager
|
ImageManager *ImageManager
|
||||||
PlaybackManager *PlaybackManager
|
PlaybackManager *PlaybackManager
|
||||||
Player *mpv.Player
|
LocalPlayer *mpv.Player
|
||||||
UpdateChecker UpdateChecker
|
UpdateChecker UpdateChecker
|
||||||
MPRISHandler *MPRISHandler
|
MPRISHandler *MPRISHandler
|
||||||
|
|
||||||
@@ -108,7 +108,7 @@ func StartupApp(appName, displayAppName, appVersionTag, configFile, latestReleas
|
|||||||
}
|
}
|
||||||
|
|
||||||
a.ServerManager = NewServerManager(appName, a.Config)
|
a.ServerManager = NewServerManager(appName, a.Config)
|
||||||
a.PlaybackManager = NewPlaybackManager(a.bgrndCtx, a.ServerManager, a.Player, &a.Config.Scrobbling, &a.Config.Transcoding)
|
a.PlaybackManager = NewPlaybackManager(a.bgrndCtx, a.ServerManager, a.LocalPlayer, &a.Config.Scrobbling, &a.Config.Transcoding)
|
||||||
a.ImageManager = NewImageManager(a.bgrndCtx, a.ServerManager, configdir.LocalCache(a.appName))
|
a.ImageManager = NewImageManager(a.bgrndCtx, a.ServerManager, configdir.LocalCache(a.appName))
|
||||||
a.Config.Application.MaxImageCacheSizeMB = clamp(a.Config.Application.MaxImageCacheSizeMB, 1, 500)
|
a.Config.Application.MaxImageCacheSizeMB = clamp(a.Config.Application.MaxImageCacheSizeMB, 1, 500)
|
||||||
a.ImageManager.SetMaxOnDiskCacheSizeBytes(int64(a.Config.Application.MaxImageCacheSizeMB) * 1_048_576)
|
a.ImageManager.SetMaxOnDiskCacheSizeBytes(int64(a.Config.Application.MaxImageCacheSizeMB) * 1_048_576)
|
||||||
@@ -201,15 +201,15 @@ func (a *App) initMPV() error {
|
|||||||
if err := p.Init(c.InMemoryCacheSizeMB); err != nil {
|
if err := p.Init(c.InMemoryCacheSizeMB); err != nil {
|
||||||
return fmt.Errorf("failed to initialize mpv player: %s", err.Error())
|
return fmt.Errorf("failed to initialize mpv player: %s", err.Error())
|
||||||
}
|
}
|
||||||
a.Player = p
|
a.LocalPlayer = p
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) setupMPV() error {
|
func (a *App) setupMPV() error {
|
||||||
a.Config.LocalPlayback.Volume = clamp(a.Config.LocalPlayback.Volume, 0, 100)
|
a.Config.LocalPlayback.Volume = clamp(a.Config.LocalPlayback.Volume, 0, 100)
|
||||||
a.Player.SetVolume(a.Config.LocalPlayback.Volume)
|
a.LocalPlayer.SetVolume(a.Config.LocalPlayback.Volume)
|
||||||
|
|
||||||
devs, err := a.Player.ListAudioDevices()
|
devs, err := a.LocalPlayer.ListAudioDevices()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -229,7 +229,7 @@ func (a *App) setupMPV() error {
|
|||||||
// (e.g. a USB audio device that is currently unplugged)
|
// (e.g. a USB audio device that is currently unplugged)
|
||||||
desiredDevice = "auto"
|
desiredDevice = "auto"
|
||||||
}
|
}
|
||||||
a.Player.SetAudioDevice(desiredDevice)
|
a.LocalPlayer.SetAudioDevice(desiredDevice)
|
||||||
|
|
||||||
rgainOpts := []string{ReplayGainNone, ReplayGainAlbum, ReplayGainTrack, ReplayGainAuto}
|
rgainOpts := []string{ReplayGainNone, ReplayGainAlbum, ReplayGainTrack, ReplayGainAuto}
|
||||||
if !sharedutil.SliceContains(rgainOpts, a.Config.ReplayGain.Mode) {
|
if !sharedutil.SliceContains(rgainOpts, a.Config.ReplayGain.Mode) {
|
||||||
@@ -245,19 +245,19 @@ func (a *App) setupMPV() error {
|
|||||||
mode = player.ReplayGainTrack
|
mode = player.ReplayGainTrack
|
||||||
}
|
}
|
||||||
|
|
||||||
a.Player.SetReplayGainOptions(player.ReplayGainOptions{
|
a.LocalPlayer.SetReplayGainOptions(player.ReplayGainOptions{
|
||||||
Mode: mode,
|
Mode: mode,
|
||||||
PreventClipping: a.Config.ReplayGain.PreventClipping,
|
PreventClipping: a.Config.ReplayGain.PreventClipping,
|
||||||
PreampGain: a.Config.ReplayGain.PreampGainDB,
|
PreampGain: a.Config.ReplayGain.PreampGainDB,
|
||||||
})
|
})
|
||||||
a.Player.SetAudioExclusive(a.Config.LocalPlayback.AudioExclusive)
|
a.LocalPlayer.SetAudioExclusive(a.Config.LocalPlayback.AudioExclusive)
|
||||||
|
|
||||||
eq := &mpv.ISO15BandEqualizer{
|
eq := &mpv.ISO15BandEqualizer{
|
||||||
EQPreamp: a.Config.LocalPlayback.EqualizerPreamp,
|
EQPreamp: a.Config.LocalPlayback.EqualizerPreamp,
|
||||||
Disabled: !a.Config.LocalPlayback.EqualizerEnabled,
|
Disabled: !a.Config.LocalPlayback.EqualizerEnabled,
|
||||||
}
|
}
|
||||||
copy(eq.BandGains[:], a.Config.LocalPlayback.GraphicEqualizerBands)
|
copy(eq.BandGains[:], a.Config.LocalPlayback.GraphicEqualizerBands)
|
||||||
a.Player.SetEqualizer(eq)
|
a.LocalPlayer.SetEqualizer(eq)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -300,10 +300,10 @@ func (a *App) DeleteServerCacheDir(serverID uuid.UUID) error {
|
|||||||
func (a *App) Shutdown() {
|
func (a *App) Shutdown() {
|
||||||
a.MPRISHandler.Shutdown()
|
a.MPRISHandler.Shutdown()
|
||||||
a.PlaybackManager.DisableCallbacks()
|
a.PlaybackManager.DisableCallbacks()
|
||||||
a.Player.Stop() // will trigger scrobble check
|
a.PlaybackManager.Stop() // will trigger scrobble check
|
||||||
a.Config.LocalPlayback.Volume = a.Player.GetVolume()
|
a.Config.LocalPlayback.Volume = a.LocalPlayer.GetVolume()
|
||||||
a.cancel()
|
a.cancel()
|
||||||
a.Player.Destroy()
|
a.LocalPlayer.Destroy()
|
||||||
a.Config.WriteConfigFile(a.configPath())
|
a.Config.WriteConfigFile(a.configPath())
|
||||||
os.RemoveAll(configdir.LocalConfig(a.appName, sessionDir))
|
os.RemoveAll(configdir.LocalConfig(a.appName, sessionDir))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -472,31 +472,39 @@ func (c *Controller) ShowAboutDialog() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *Controller) ShowSettingsDialog(themeUpdateCallbk func(), themeFiles map[string]string) {
|
func (c *Controller) ShowSettingsDialog(themeUpdateCallbk func(), themeFiles map[string]string) {
|
||||||
devs, err := c.App.Player.ListAudioDevices()
|
devs, err := c.App.LocalPlayer.ListAudioDevices()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("error listing audio devices: %v", err)
|
log.Printf("error listing audio devices: %v", err)
|
||||||
devs = []mpv.AudioDevice{{Name: "auto", Description: "Autoselect device"}}
|
devs = []mpv.AudioDevice{{Name: "auto", Description: "Autoselect device"}}
|
||||||
}
|
}
|
||||||
|
|
||||||
bands := c.App.Player.Equalizer().BandFrequencies()
|
curPlayer := c.App.PlaybackManager.CurrentPlayer()
|
||||||
dlg := dialogs.NewSettingsDialog(c.App.Config, devs, themeFiles, bands, c.App.ServerManager.Server.ClientDecidesScrobble(), c.MainWindow)
|
_, isReplayGainPlayer := curPlayer.(player.ReplayGainPlayer)
|
||||||
|
_, isEqualizerPlayer := curPlayer.(*mpv.Player)
|
||||||
|
isLocalPlayer := isEqualizerPlayer
|
||||||
|
bands := c.App.LocalPlayer.Equalizer().BandFrequencies()
|
||||||
|
dlg := dialogs.NewSettingsDialog(c.App.Config,
|
||||||
|
devs, themeFiles, bands,
|
||||||
|
c.App.ServerManager.Server.ClientDecidesScrobble(),
|
||||||
|
isLocalPlayer, isReplayGainPlayer, isEqualizerPlayer,
|
||||||
|
c.MainWindow)
|
||||||
dlg.OnReplayGainSettingsChanged = func() {
|
dlg.OnReplayGainSettingsChanged = func() {
|
||||||
c.App.PlaybackManager.SetReplayGainOptions(c.App.Config.ReplayGain)
|
c.App.PlaybackManager.SetReplayGainOptions(c.App.Config.ReplayGain)
|
||||||
}
|
}
|
||||||
dlg.OnAudioExclusiveSettingChanged = func() {
|
dlg.OnAudioExclusiveSettingChanged = func() {
|
||||||
c.App.Player.SetAudioExclusive(c.App.Config.LocalPlayback.AudioExclusive)
|
c.App.LocalPlayer.SetAudioExclusive(c.App.Config.LocalPlayback.AudioExclusive)
|
||||||
}
|
}
|
||||||
dlg.OnAudioDeviceSettingChanged = func() {
|
dlg.OnAudioDeviceSettingChanged = func() {
|
||||||
c.App.Player.SetAudioDevice(c.App.Config.LocalPlayback.AudioDeviceName)
|
c.App.LocalPlayer.SetAudioDevice(c.App.Config.LocalPlayback.AudioDeviceName)
|
||||||
}
|
}
|
||||||
dlg.OnThemeSettingChanged = themeUpdateCallbk
|
dlg.OnThemeSettingChanged = themeUpdateCallbk
|
||||||
dlg.OnEqualizerSettingsChanged = func() {
|
dlg.OnEqualizerSettingsChanged = func() {
|
||||||
// currently we only have one equalizer type
|
// currently we only have one equalizer type
|
||||||
eq := c.App.Player.Equalizer().(*mpv.ISO15BandEqualizer)
|
eq := c.App.LocalPlayer.Equalizer().(*mpv.ISO15BandEqualizer)
|
||||||
eq.Disabled = !c.App.Config.LocalPlayback.EqualizerEnabled
|
eq.Disabled = !c.App.Config.LocalPlayback.EqualizerEnabled
|
||||||
eq.EQPreamp = c.App.Config.LocalPlayback.EqualizerPreamp
|
eq.EQPreamp = c.App.Config.LocalPlayback.EqualizerPreamp
|
||||||
copy(eq.BandGains[:], c.App.Config.LocalPlayback.GraphicEqualizerBands)
|
copy(eq.BandGains[:], c.App.Config.LocalPlayback.GraphicEqualizerBands)
|
||||||
c.App.Player.SetEqualizer(eq)
|
c.App.LocalPlayer.SetEqualizer(eq)
|
||||||
}
|
}
|
||||||
pop := widget.NewModalPopUp(dlg, c.MainWindow.Canvas())
|
pop := widget.NewModalPopUp(dlg, c.MainWindow.Canvas())
|
||||||
dlg.OnDismiss = func() {
|
dlg.OnDismiss = func() {
|
||||||
|
|||||||
@@ -46,24 +46,39 @@ type SettingsDialog struct {
|
|||||||
content fyne.CanvasObject
|
content fyne.CanvasObject
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: having this depend on the player package for the AudioDevice type is kinda gross. Refactor.
|
// TODO: having this depend on the mpv package for the AudioDevice type is kinda gross. Refactor.
|
||||||
func NewSettingsDialog(
|
func NewSettingsDialog(
|
||||||
config *backend.Config,
|
config *backend.Config,
|
||||||
audioDeviceList []mpv.AudioDevice,
|
audioDeviceList []mpv.AudioDevice,
|
||||||
themeFileList map[string]string,
|
themeFileList map[string]string,
|
||||||
equalizerBands []string,
|
equalizerBands []string,
|
||||||
clientDecidesScrobble bool,
|
clientDecidesScrobble bool,
|
||||||
|
isLocalPlayer bool,
|
||||||
|
isReplayGainPlayer bool,
|
||||||
|
isEqualizerPlayer bool,
|
||||||
window fyne.Window,
|
window fyne.Window,
|
||||||
) *SettingsDialog {
|
) *SettingsDialog {
|
||||||
s := &SettingsDialog{config: config, audioDevices: audioDeviceList, themeFiles: themeFileList, clientDecidesScrobble: clientDecidesScrobble}
|
s := &SettingsDialog{config: config, audioDevices: audioDeviceList, themeFiles: themeFileList, clientDecidesScrobble: clientDecidesScrobble}
|
||||||
s.ExtendBaseWidget(s)
|
s.ExtendBaseWidget(s)
|
||||||
|
|
||||||
tabs := container.NewAppTabs(
|
// TODO: Once Fyne supports disableable sliders, it's probably a nicer UX
|
||||||
s.createGeneralTab(),
|
// to create the equalizer tab but disable it if we are not using an equalizer player
|
||||||
s.createPlaybackTab(),
|
var tabs *container.AppTabs
|
||||||
s.createEqualizerTab(equalizerBands),
|
if isEqualizerPlayer {
|
||||||
s.createExperimentalTab(window),
|
tabs = container.NewAppTabs(
|
||||||
)
|
s.createGeneralTab(),
|
||||||
|
s.createPlaybackTab(isLocalPlayer, isReplayGainPlayer),
|
||||||
|
s.createEqualizerTab(equalizerBands),
|
||||||
|
s.createExperimentalTab(window),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
tabs = container.NewAppTabs(
|
||||||
|
s.createGeneralTab(),
|
||||||
|
s.createPlaybackTab(isLocalPlayer, isReplayGainPlayer),
|
||||||
|
s.createExperimentalTab(window),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
tabs.SelectIndex(s.getActiveTabNumFromConfig())
|
tabs.SelectIndex(s.getActiveTabNumFromConfig())
|
||||||
// workaround issue where inactivated tabs don't fully update when theme setting is changed
|
// workaround issue where inactivated tabs don't fully update when theme setting is changed
|
||||||
tabs.OnSelected = func(ti *container.TabItem) {
|
tabs.OnSelected = func(ti *container.TabItem) {
|
||||||
@@ -249,7 +264,7 @@ func (s *SettingsDialog) createGeneralTab() *container.TabItem {
|
|||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SettingsDialog) createPlaybackTab() *container.TabItem {
|
func (s *SettingsDialog) createPlaybackTab(isLocalPlayer, isReplayGainPlayer bool) *container.TabItem {
|
||||||
disableTranscode := widget.NewCheckWithData("Disable server transcoding", binding.BindBool(&s.config.Transcoding.ForceRawFile))
|
disableTranscode := widget.NewCheckWithData("Disable server transcoding", binding.BindBool(&s.config.Transcoding.ForceRawFile))
|
||||||
deviceList := make([]string, len(s.audioDevices))
|
deviceList := make([]string, len(s.audioDevices))
|
||||||
var selIndex int
|
var selIndex int
|
||||||
@@ -328,6 +343,16 @@ func (s *SettingsDialog) createPlaybackTab() *container.TabItem {
|
|||||||
})
|
})
|
||||||
audioExclusive.Checked = s.config.LocalPlayback.AudioExclusive
|
audioExclusive.Checked = s.config.LocalPlayback.AudioExclusive
|
||||||
|
|
||||||
|
if !isLocalPlayer {
|
||||||
|
deviceSelect.Disable()
|
||||||
|
audioExclusive.Disable()
|
||||||
|
}
|
||||||
|
if !isReplayGainPlayer {
|
||||||
|
replayGainSelect.Disable()
|
||||||
|
preventClipping.Disable()
|
||||||
|
preampGain.Disable()
|
||||||
|
}
|
||||||
|
|
||||||
return container.NewTabItem("Playback", container.NewVBox(
|
return container.NewTabItem("Playback", container.NewVBox(
|
||||||
container.NewHBox(disableTranscode),
|
container.NewHBox(disableTranscode),
|
||||||
container.New(&layouts.MaxPadLayout{PadTop: 5},
|
container.New(&layouts.MaxPadLayout{PadTop: 5},
|
||||||
|
|||||||
Reference in New Issue
Block a user