114 lines
2.7 KiB
Go
114 lines
2.7 KiB
Go
package model
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
const speedSaveDebounce = time.Second
|
|
|
|
// SetEQPreset sets the preset by name. If it matches a built-in preset,
|
|
// those bands are applied. Otherwise the name is used as a custom label.
|
|
// If bands is non-nil, they are applied regardless of whether the name matches.
|
|
func (m *Model) SetEQPreset(name string, bands *[10]float64) {
|
|
m.eqCustomLabel = ""
|
|
|
|
// Check built-in presets first.
|
|
for i, p := range eqPresets {
|
|
if strings.EqualFold(p.Name, name) {
|
|
m.eqPresetIdx = i
|
|
if bands != nil {
|
|
for j, gain := range bands {
|
|
m.player.SetEQBand(j, gain)
|
|
}
|
|
} else {
|
|
m.applyEQPreset()
|
|
}
|
|
return
|
|
}
|
|
}
|
|
|
|
// Custom label — set bands if provided, otherwise keep current.
|
|
m.eqPresetIdx = -1
|
|
m.eqCustomLabel = name
|
|
if bands != nil {
|
|
for i, gain := range bands {
|
|
m.player.SetEQBand(i, gain)
|
|
}
|
|
}
|
|
}
|
|
|
|
// EQPresetName returns the current preset name, or "Custom".
|
|
func (m Model) EQPresetName() string {
|
|
if m.eqPresetIdx >= 0 && m.eqPresetIdx < len(eqPresets) {
|
|
return eqPresets[m.eqPresetIdx].Name
|
|
}
|
|
if m.eqCustomLabel != "" {
|
|
return m.eqCustomLabel
|
|
}
|
|
return "Custom"
|
|
}
|
|
|
|
// applyEQPreset writes the current preset's bands to the player.
|
|
func (m *Model) applyEQPreset() {
|
|
if m.eqPresetIdx < 0 || m.eqPresetIdx >= len(eqPresets) {
|
|
return
|
|
}
|
|
bands := eqPresets[m.eqPresetIdx].Bands
|
|
for i, gain := range bands {
|
|
m.player.SetEQBand(i, gain)
|
|
}
|
|
}
|
|
|
|
// saveEQ persists the current EQ state (preset name and band values) to config.
|
|
func (m *Model) saveEQ() {
|
|
name := m.EQPresetName()
|
|
if err := m.configSaver.Save("eq_preset", fmt.Sprintf("%q", name)); err != nil {
|
|
m.status.Showf(statusTTLDefault, "Config save failed: %s", err)
|
|
}
|
|
bands := m.player.EQBands()
|
|
parts := make([]string, len(bands))
|
|
for i, g := range bands {
|
|
parts[i] = strconv.FormatFloat(g, 'f', -1, 64)
|
|
}
|
|
eqVal := "[" + strings.Join(parts, ", ") + "]"
|
|
if err := m.configSaver.Save("eq", eqVal); err != nil {
|
|
m.status.Showf(statusTTLDefault, "Config save failed: %s", err)
|
|
}
|
|
}
|
|
|
|
// saveSpeed persists the current playback speed to the config file.
|
|
func (m *Model) saveSpeed() {
|
|
speed := m.player.Speed()
|
|
if err := m.configSaver.Save("speed", fmt.Sprintf("%.2f", speed)); err != nil {
|
|
m.status.Showf(statusTTLDefault, "Config save failed: %s", err)
|
|
}
|
|
}
|
|
|
|
func (m *Model) changeSpeed(delta float64) {
|
|
m.player.SetSpeed(m.player.Speed() + delta)
|
|
m.speedSaveAfter = speedSaveDebounce
|
|
}
|
|
|
|
func (m *Model) tickPendingSpeedSave(dt time.Duration) {
|
|
if m.speedSaveAfter <= 0 {
|
|
return
|
|
}
|
|
m.speedSaveAfter -= dt
|
|
if m.speedSaveAfter > 0 {
|
|
return
|
|
}
|
|
m.speedSaveAfter = 0
|
|
m.saveSpeed()
|
|
}
|
|
|
|
func (m *Model) flushPendingSpeedSave() {
|
|
if m.speedSaveAfter <= 0 {
|
|
return
|
|
}
|
|
m.speedSaveAfter = 0
|
|
m.saveSpeed()
|
|
}
|