From f8f8a3a5cb901a73ff95d39f58af6ed59b5127da Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Tue, 19 Dec 2023 08:41:07 -0800 Subject: [PATCH] rework settings dialog to be aware of different player types --- backend/app.go | 24 ++++++++++----------- ui/controller/controller.go | 22 +++++++++++++------ ui/dialogs/settingsdialog.go | 41 +++++++++++++++++++++++++++++------- 3 files changed, 60 insertions(+), 27 deletions(-) diff --git a/backend/app.go b/backend/app.go index 216a418..e795188 100644 --- a/backend/app.go +++ b/backend/app.go @@ -37,7 +37,7 @@ type App struct { ServerManager *ServerManager ImageManager *ImageManager PlaybackManager *PlaybackManager - Player *mpv.Player + LocalPlayer *mpv.Player UpdateChecker UpdateChecker MPRISHandler *MPRISHandler @@ -108,7 +108,7 @@ func StartupApp(appName, displayAppName, appVersionTag, configFile, latestReleas } 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.Config.Application.MaxImageCacheSizeMB = clamp(a.Config.Application.MaxImageCacheSizeMB, 1, 500) 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 { return fmt.Errorf("failed to initialize mpv player: %s", err.Error()) } - a.Player = p + a.LocalPlayer = p return nil } func (a *App) setupMPV() error { 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 { return err } @@ -229,7 +229,7 @@ func (a *App) setupMPV() error { // (e.g. a USB audio device that is currently unplugged) desiredDevice = "auto" } - a.Player.SetAudioDevice(desiredDevice) + a.LocalPlayer.SetAudioDevice(desiredDevice) rgainOpts := []string{ReplayGainNone, ReplayGainAlbum, ReplayGainTrack, ReplayGainAuto} if !sharedutil.SliceContains(rgainOpts, a.Config.ReplayGain.Mode) { @@ -245,19 +245,19 @@ func (a *App) setupMPV() error { mode = player.ReplayGainTrack } - a.Player.SetReplayGainOptions(player.ReplayGainOptions{ + a.LocalPlayer.SetReplayGainOptions(player.ReplayGainOptions{ Mode: mode, PreventClipping: a.Config.ReplayGain.PreventClipping, PreampGain: a.Config.ReplayGain.PreampGainDB, }) - a.Player.SetAudioExclusive(a.Config.LocalPlayback.AudioExclusive) + a.LocalPlayer.SetAudioExclusive(a.Config.LocalPlayback.AudioExclusive) eq := &mpv.ISO15BandEqualizer{ EQPreamp: a.Config.LocalPlayback.EqualizerPreamp, Disabled: !a.Config.LocalPlayback.EqualizerEnabled, } copy(eq.BandGains[:], a.Config.LocalPlayback.GraphicEqualizerBands) - a.Player.SetEqualizer(eq) + a.LocalPlayer.SetEqualizer(eq) return nil } @@ -300,10 +300,10 @@ func (a *App) DeleteServerCacheDir(serverID uuid.UUID) error { func (a *App) Shutdown() { a.MPRISHandler.Shutdown() a.PlaybackManager.DisableCallbacks() - a.Player.Stop() // will trigger scrobble check - a.Config.LocalPlayback.Volume = a.Player.GetVolume() + a.PlaybackManager.Stop() // will trigger scrobble check + a.Config.LocalPlayback.Volume = a.LocalPlayer.GetVolume() a.cancel() - a.Player.Destroy() + a.LocalPlayer.Destroy() a.Config.WriteConfigFile(a.configPath()) os.RemoveAll(configdir.LocalConfig(a.appName, sessionDir)) } diff --git a/ui/controller/controller.go b/ui/controller/controller.go index a7ba092..10e45a7 100644 --- a/ui/controller/controller.go +++ b/ui/controller/controller.go @@ -472,31 +472,39 @@ func (c *Controller) ShowAboutDialog() { } 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 { log.Printf("error listing audio devices: %v", err) devs = []mpv.AudioDevice{{Name: "auto", Description: "Autoselect device"}} } - bands := c.App.Player.Equalizer().BandFrequencies() - dlg := dialogs.NewSettingsDialog(c.App.Config, devs, themeFiles, bands, c.App.ServerManager.Server.ClientDecidesScrobble(), c.MainWindow) + curPlayer := c.App.PlaybackManager.CurrentPlayer() + _, 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() { c.App.PlaybackManager.SetReplayGainOptions(c.App.Config.ReplayGain) } dlg.OnAudioExclusiveSettingChanged = func() { - c.App.Player.SetAudioExclusive(c.App.Config.LocalPlayback.AudioExclusive) + c.App.LocalPlayer.SetAudioExclusive(c.App.Config.LocalPlayback.AudioExclusive) } 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.OnEqualizerSettingsChanged = func() { // 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.EQPreamp = c.App.Config.LocalPlayback.EqualizerPreamp 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()) dlg.OnDismiss = func() { diff --git a/ui/dialogs/settingsdialog.go b/ui/dialogs/settingsdialog.go index d8a9c09..1c2a302 100644 --- a/ui/dialogs/settingsdialog.go +++ b/ui/dialogs/settingsdialog.go @@ -46,24 +46,39 @@ type SettingsDialog struct { 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( config *backend.Config, audioDeviceList []mpv.AudioDevice, themeFileList map[string]string, equalizerBands []string, clientDecidesScrobble bool, + isLocalPlayer bool, + isReplayGainPlayer bool, + isEqualizerPlayer bool, window fyne.Window, ) *SettingsDialog { s := &SettingsDialog{config: config, audioDevices: audioDeviceList, themeFiles: themeFileList, clientDecidesScrobble: clientDecidesScrobble} s.ExtendBaseWidget(s) - tabs := container.NewAppTabs( - s.createGeneralTab(), - s.createPlaybackTab(), - s.createEqualizerTab(equalizerBands), - s.createExperimentalTab(window), - ) + // TODO: Once Fyne supports disableable sliders, it's probably a nicer UX + // to create the equalizer tab but disable it if we are not using an equalizer player + var tabs *container.AppTabs + if isEqualizerPlayer { + 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()) // workaround issue where inactivated tabs don't fully update when theme setting is changed 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)) deviceList := make([]string, len(s.audioDevices)) var selIndex int @@ -328,6 +343,16 @@ func (s *SettingsDialog) createPlaybackTab() *container.TabItem { }) 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( container.NewHBox(disableTranscode), container.New(&layouts.MaxPadLayout{PadTop: 5},