rework settings dialog to be aware of different player types

This commit is contained in:
Drew Weymouth
2023-12-19 08:41:07 -08:00
parent bcf95ba26c
commit f8f8a3a5cb
3 changed files with 60 additions and 27 deletions
+12 -12
View File
@@ -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))
} }
+15 -7
View File
@@ -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() {
+33 -8
View File
@@ -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},