Merge branch 'main' into feature/shuffle

This commit is contained in:
Siiiiinth
2026-01-17 19:12:18 +01:00
7 changed files with 54 additions and 21 deletions
+2 -2
View File
@@ -21,7 +21,7 @@
], ],
"postStartCommand": "sudo setfacl -m u:vscode:rw /dev/snd/*", "postStartCommand": "sudo setfacl -m u:vscode:rw /dev/snd/*",
// Use 'forwardPorts' to make a list of ports inside the container available locally. // Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [], "forwardPorts": [5901, 6080],
// Use 'postCreateCommand' to run commands after the container is created. // Use 'postCreateCommand' to run commands after the container is created.
"onCreateCommand": { "onCreateCommand": {
"log": "echo 'Starting post-create script...'", "log": "echo 'Starting post-create script...'",
@@ -29,4 +29,4 @@
"config": "bash -c 'mkdir -p ~/.config/supersonic && (cp .devcontainer/custom-config.toml ~/.config/supersonic/config.toml 2> /dev/null || cp .devcontainer/default-config.toml ~/.config/supersonic/config.toml)'", "config": "bash -c 'mkdir -p ~/.config/supersonic && (cp .devcontainer/custom-config.toml ~/.config/supersonic/config.toml 2> /dev/null || cp .devcontainer/default-config.toml ~/.config/supersonic/config.toml)'",
"keyring": "bash -c '.devcontainer/init-keychain.sh'", "keyring": "bash -c '.devcontainer/init-keychain.sh'",
}, },
} }
+1
View File
@@ -384,6 +384,7 @@ func (a *App) setupMPV() error {
PreampGain: a.Config.ReplayGain.PreampGainDB, PreampGain: a.Config.ReplayGain.PreampGainDB,
}) })
a.LocalPlayer.SetAudioExclusive(a.Config.LocalPlayback.AudioExclusive) a.LocalPlayer.SetAudioExclusive(a.Config.LocalPlayback.AudioExclusive)
a.LocalPlayer.SetPauseFade(a.Config.LocalPlayback.PauseFade)
eq := &mpv.ISO15BandEqualizer{ eq := &mpv.ISO15BandEqualizer{
EQPreamp: a.Config.LocalPlayback.EqualizerPreamp, EQPreamp: a.Config.LocalPlayback.EqualizerPreamp,
+2
View File
@@ -136,6 +136,7 @@ type LocalPlaybackConfig struct {
EqualizerEnabled bool EqualizerEnabled bool
EqualizerPreamp float64 EqualizerPreamp float64
GraphicEqualizerBands []float64 GraphicEqualizerBands []float64
PauseFade bool
} }
type ScrobbleConfig struct { type ScrobbleConfig struct {
@@ -270,6 +271,7 @@ func DefaultConfig(appVersionTag string) *Config {
EqualizerEnabled: false, EqualizerEnabled: false,
EqualizerPreamp: 0, EqualizerPreamp: 0,
GraphicEqualizerBands: make([]float64, 15), GraphicEqualizerBands: make([]float64, 15),
PauseFade: true,
}, },
Scrobbling: ScrobbleConfig{ Scrobbling: ScrobbleConfig{
Enabled: true, Enabled: true,
+33 -18
View File
@@ -69,6 +69,7 @@ type Player struct {
clientName string clientName string
equalizer Equalizer equalizer Equalizer
peaksEnabled bool peaksEnabled bool
pauseFade bool
fileLoadedLock sync.Mutex fileLoadedLock sync.Mutex
fileLoadedSig *sync.Cond fileLoadedSig *sync.Cond
@@ -283,6 +284,10 @@ func (p *Player) SetAudioExclusive(tf bool) {
} }
} }
func (p *Player) SetPauseFade(pauseFade bool) {
p.pauseFade = pauseFade
}
// Gets the current volume of the player. // Gets the current volume of the player.
func (p *Player) GetVolume() int { func (p *Player) GetVolume() int {
return p.vol return p.vol
@@ -308,27 +313,37 @@ func (p *Player) Pause() error {
if p.status.State != player.Playing { if p.status.State != player.Playing {
return nil return nil
} }
p.prePausedState = p.status.State
p.setState(player.Paused)
v := p.vol if p.pauseFade {
ctx, cancel := context.WithCancel(context.Background()) p.prePausedState = p.status.State
p.fadePauseCancel = cancel p.setState(player.Paused)
go func() {
t := time.NewTicker(2 * time.Millisecond) v := p.vol
for c := 0; c < 100; c++ { ctx, cancel := context.WithCancel(context.Background())
select { p.fadePauseCancel = cancel
case <-ctx.Done(): go func() {
return t := time.NewTicker(2 * time.Millisecond)
case <-t.C: for c := 0; c < 100; c++ {
p.mpv.SetProperty("volume", mpv.FORMAT_INT64, int64(v*(100-c)/100)) select {
case <-ctx.Done():
return
case <-t.C:
p.mpv.SetProperty("volume", mpv.FORMAT_INT64, int64(v*(100-c)/100))
}
} }
t.Stop()
p.SetVolume(p.vol)
p.setPaused(true)
}()
return nil
} else {
err := p.setPaused(true)
if err == nil {
p.prePausedState = p.status.State
p.setState(player.Paused)
} }
t.Stop() return err
p.SetVolume(p.vol) }
p.setPaused(true)
}()
return nil
} }
// Continue playback and update the player state // Continue playback and update the player state
+2 -1
View File
@@ -94,6 +94,7 @@
"Error": "Error", "Error": "Error",
"Error creating playlist": "Error creating playlist", "Error creating playlist": "Error creating playlist",
"Exclusive mode": "Exclusive mode", "Exclusive mode": "Exclusive mode",
"Fade out on pause": "Fade out on pause",
"Favorites": "Favorites", "Favorites": "Favorites",
"Field Recording": "Field Recording", "Field Recording": "Field Recording",
"File path": "File path", "File path": "File path",
@@ -331,4 +332,4 @@
"one": "{{.albumsCount}} album", "one": "{{.albumsCount}} album",
"other": "{{.albumsCount}} albums" "other": "{{.albumsCount}} albums"
} }
} }
+3
View File
@@ -334,6 +334,9 @@ func (c *Controller) ShowSettingsDialog(themeUpdateCallbk func(), themeFiles map
dlg.OnAudioExclusiveSettingChanged = func() { dlg.OnAudioExclusiveSettingChanged = func() {
c.App.LocalPlayer.SetAudioExclusive(c.App.Config.LocalPlayback.AudioExclusive) c.App.LocalPlayer.SetAudioExclusive(c.App.Config.LocalPlayback.AudioExclusive)
} }
dlg.OnPauseFadeSettingsChanged = func() {
c.App.LocalPlayer.SetPauseFade(c.App.Config.LocalPlayback.PauseFade)
}
dlg.OnAudioDeviceSettingChanged = func() { dlg.OnAudioDeviceSettingChanged = func() {
c.App.LocalPlayer.SetAudioDevice(c.App.Config.LocalPlayback.AudioDeviceName) c.App.LocalPlayer.SetAudioDevice(c.App.Config.LocalPlayback.AudioDeviceName)
} }
+11
View File
@@ -33,6 +33,7 @@ type SettingsDialog struct {
OnReplayGainSettingsChanged func() OnReplayGainSettingsChanged func()
OnAudioExclusiveSettingChanged func() OnAudioExclusiveSettingChanged func()
OnPauseFadeSettingsChanged func()
OnAudioDeviceSettingChanged func() OnAudioDeviceSettingChanged func()
OnThemeSettingChanged func() OnThemeSettingChanged func()
OnDismiss func() OnDismiss func()
@@ -407,9 +408,18 @@ func (s *SettingsDialog) createPlaybackTab(isLocalPlayer, isReplayGainPlayer boo
}) })
audioExclusive.Checked = s.config.LocalPlayback.AudioExclusive audioExclusive.Checked = s.config.LocalPlayback.AudioExclusive
pauseFade := widget.NewCheck(lang.L("Fade out on pause"), func(checked bool) {
s.config.LocalPlayback.PauseFade = checked
if s.OnPauseFadeSettingsChanged != nil {
s.OnPauseFadeSettingsChanged()
}
})
pauseFade.Checked = s.config.LocalPlayback.PauseFade
if !isLocalPlayer { if !isLocalPlayer {
deviceSelect.Disable() deviceSelect.Disable()
audioExclusive.Disable() audioExclusive.Disable()
pauseFade.Disable()
} }
if !isReplayGainPlayer { if !isReplayGainPlayer {
replayGainSelect.Disable() replayGainSelect.Disable()
@@ -424,6 +434,7 @@ func (s *SettingsDialog) createPlaybackTab(isLocalPlayer, isReplayGainPlayer boo
widget.NewLabel(lang.L("Audio device")), container.NewBorder(nil, nil, nil, util.NewHSpace(70), deviceSelect), widget.NewLabel(lang.L("Audio device")), container.NewBorder(nil, nil, nil, util.NewHSpace(70), deviceSelect),
layout.NewSpacer(), audioExclusive, layout.NewSpacer(), audioExclusive,
)), )),
pauseFade,
s.newSectionSeparator(), s.newSectionSeparator(),
disableTranscode, disableTranscode,
container.NewHBox(transcode, transcodeCodec, transcodeBitRate), container.NewHBox(transcode, transcodeCodec, transcodeBitRate),