From c9320b802144f74d9f866c7adf03723a177fccbc Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Mon, 30 Oct 2023 17:32:27 -0700 Subject: [PATCH] Add setting to disable server transcoding --- backend/app.go | 2 +- backend/config.go | 8 ++++++++ backend/mediaprovider/mediaprovider.go | 2 +- .../mediaprovider/subsonic/subsonicmediaprovider.go | 8 ++++++-- backend/playbackmanager.go | 13 ++++++++----- ui/dialogs/settingsdialog.go | 2 ++ 6 files changed, 26 insertions(+), 9 deletions(-) diff --git a/backend/app.go b/backend/app.go index 390a5cd..d4c53a0 100644 --- a/backend/app.go +++ b/backend/app.go @@ -101,7 +101,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.PlaybackManager = NewPlaybackManager(a.bgrndCtx, a.ServerManager, a.Player, &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) diff --git a/backend/config.go b/backend/config.go index a745580..5c7e02c 100644 --- a/backend/config.go +++ b/backend/config.go @@ -98,6 +98,10 @@ type ThemeConfig struct { Appearance string } +type TranscodingConfig struct { + ForceRawFile bool +} + type Config struct { Application AppConfig Servers []*ServerConfig @@ -112,6 +116,7 @@ type Config struct { LocalPlayback LocalPlaybackConfig Scrobbling ScrobbleConfig ReplayGain ReplayGainConfig + Transcoding TranscodingConfig Theme ThemeConfig } @@ -176,6 +181,9 @@ func DefaultConfig(appVersionTag string) *Config { PreampGainDB: 0.0, PreventClipping: true, }, + Transcoding: TranscodingConfig{ + ForceRawFile: false, + }, Theme: ThemeConfig{ Appearance: "Dark", }, diff --git a/backend/mediaprovider/mediaprovider.go b/backend/mediaprovider/mediaprovider.go index 8d59c05..6529074 100644 --- a/backend/mediaprovider/mediaprovider.go +++ b/backend/mediaprovider/mediaprovider.go @@ -67,7 +67,7 @@ type MediaProvider interface { GetFavorites() (Favorites, error) - GetStreamURL(trackID string) (string, error) + GetStreamURL(trackID string, forceRaw bool) (string, error) GetTopTracks(artist Artist, count int) ([]*Track, error) diff --git a/backend/mediaprovider/subsonic/subsonicmediaprovider.go b/backend/mediaprovider/subsonic/subsonicmediaprovider.go index e31c545..989d159 100644 --- a/backend/mediaprovider/subsonic/subsonicmediaprovider.go +++ b/backend/mediaprovider/subsonic/subsonicmediaprovider.go @@ -192,8 +192,12 @@ func (s *subsonicMediaProvider) GetSimilarTracks(artistID string, count int) ([] return sharedutil.MapSlice(tr, toTrack), nil } -func (s *subsonicMediaProvider) GetStreamURL(trackID string) (string, error) { - u, err := s.client.GetStreamURL(trackID, map[string]string{}) +func (s *subsonicMediaProvider) GetStreamURL(trackID string, forceRaw bool) (string, error) { + m := make(map[string]string) + if forceRaw { + m["format"] = "raw" + } + u, err := s.client.GetStreamURL(trackID, m) if err != nil { return "", err } diff --git a/backend/playbackmanager.go b/backend/playbackmanager.go index 97de5af..c616c83 100644 --- a/backend/playbackmanager.go +++ b/backend/playbackmanager.go @@ -45,6 +45,7 @@ type PlaybackManager struct { // to pass to onSongChange listeners; clear once listeners have been called lastScrobbled *mediaprovider.Track scrobbleCfg *ScrobbleConfig + transcodeCfg *TranscodingConfig onSongChange []func(nowPlaying, justScrobbledIfAny *mediaprovider.Track) onPlayTimeUpdate []func(float64, float64) @@ -57,14 +58,16 @@ func NewPlaybackManager( s *ServerManager, p *player.Player, scrobbleCfg *ScrobbleConfig, + transcodeCfg *TranscodingConfig, ) *PlaybackManager { // clamp to 99% to avoid any possible rounding issues scrobbleCfg.ThresholdPercent = clamp(scrobbleCfg.ThresholdPercent, 0, 99) pm := &PlaybackManager{ - ctx: ctx, - sm: s, - player: p, - scrobbleCfg: scrobbleCfg, + ctx: ctx, + sm: s, + player: p, + scrobbleCfg: scrobbleCfg, + transcodeCfg: transcodeCfg, } p.OnTrackChange(func(tracknum int64) { if tracknum >= int64(len(pm.playQueue)) { @@ -177,7 +180,7 @@ func (p *PlaybackManager) LoadTracks(tracks []*mediaprovider.Track, appendToQueu util.ShuffleSlice(nums) } for _, i := range nums { - url, err := p.sm.Server.GetStreamURL(tracks[i].ID) + url, err := p.sm.Server.GetStreamURL(tracks[i].ID, p.transcodeCfg.ForceRawFile) if err != nil { return err } diff --git a/ui/dialogs/settingsdialog.go b/ui/dialogs/settingsdialog.go index 0376eb7..6d02860 100644 --- a/ui/dialogs/settingsdialog.go +++ b/ui/dialogs/settingsdialog.go @@ -241,6 +241,7 @@ func (s *SettingsDialog) createGeneralTab() *container.TabItem { } func (s *SettingsDialog) createPlaybackTab() *container.TabItem { + disableTranscode := widget.NewCheckWithData("Disable server transcoding", binding.BindBool(&s.config.Transcoding.ForceRawFile)) deviceList := make([]string, len(s.audioDevices)) var selIndex int for i, dev := range s.audioDevices { @@ -315,6 +316,7 @@ func (s *SettingsDialog) createPlaybackTab() *container.TabItem { audioExclusive.Checked = s.config.LocalPlayback.AudioExclusive return container.NewTabItem("Playback", container.NewVBox( + container.NewHBox(disableTranscode), container.New(&layouts.MaxPadLayout{PadTop: 5}, container.New(layout.NewFormLayout(), widget.NewLabel("Audio device"), container.NewBorder(nil, nil, nil, util.NewHSpace(70), deviceSelect),