Add mute toggle and volume state tracking
This commit is contained in:
parent
35612dcc91
commit
e054a39c97
60
main.go
60
main.go
|
|
@ -126,6 +126,8 @@ type appState struct {
|
||||||
player player.Controller
|
player player.Controller
|
||||||
playerReady bool
|
playerReady bool
|
||||||
playerVolume float64
|
playerVolume float64
|
||||||
|
playerMuted bool
|
||||||
|
lastVolume float64
|
||||||
playerPaused bool
|
playerPaused bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -264,6 +266,8 @@ func runGUI() {
|
||||||
},
|
},
|
||||||
player: player.New(),
|
player: player.New(),
|
||||||
playerVolume: 100,
|
playerVolume: 100,
|
||||||
|
lastVolume: 100,
|
||||||
|
playerMuted: false,
|
||||||
}
|
}
|
||||||
defer state.shutdown()
|
defer state.shutdown()
|
||||||
w.SetOnDropped(func(pos fyne.Position, items []fyne.URI) {
|
w.SetOnDropped(func(pos fyne.Position, items []fyne.URI) {
|
||||||
|
|
@ -874,7 +878,22 @@ func buildVideoPane(state *appState, min fyne.Size, src *videoSource, onCover fu
|
||||||
|
|
||||||
var controls fyne.CanvasObject
|
var controls fyne.CanvasObject
|
||||||
if usePlayer {
|
if usePlayer {
|
||||||
slider := widget.NewSlider(0, math.Max(1, src.Duration))
|
var updatingVolume bool
|
||||||
|
var slider *widget.Slider
|
||||||
|
var volIcon *widget.Button
|
||||||
|
|
||||||
|
updateVolIcon := func() {
|
||||||
|
if volIcon == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if state.playerMuted || state.playerVolume <= 0 {
|
||||||
|
volIcon.SetText("🔇")
|
||||||
|
} else {
|
||||||
|
volIcon.SetText("🔊")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
slider = widget.NewSlider(0, math.Max(1, src.Duration))
|
||||||
slider.Step = 0.5
|
slider.Step = 0.5
|
||||||
slider.OnChanged = func(val float64) {
|
slider.OnChanged = func(val float64) {
|
||||||
currentTime.SetText(formatClock(val))
|
currentTime.SetText(formatClock(val))
|
||||||
|
|
@ -884,17 +903,54 @@ func buildVideoPane(state *appState, min fyne.Size, src *videoSource, onCover fu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
volIcon = makeIconButton("🔊", "Mute/Unmute", func() {
|
||||||
|
if state.player == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if state.playerMuted {
|
||||||
|
target := state.lastVolume
|
||||||
|
if target <= 0 {
|
||||||
|
target = 50
|
||||||
|
}
|
||||||
|
state.playerVolume = target
|
||||||
|
state.playerMuted = false
|
||||||
|
updatingVolume = true
|
||||||
|
slider.SetValue(target)
|
||||||
|
updatingVolume = false
|
||||||
|
_ = state.player.SetVolume(target)
|
||||||
|
} else {
|
||||||
|
state.lastVolume = state.playerVolume
|
||||||
|
state.playerVolume = 0
|
||||||
|
state.playerMuted = true
|
||||||
|
updatingVolume = true
|
||||||
|
slider.SetValue(0)
|
||||||
|
updatingVolume = false
|
||||||
|
_ = state.player.SetVolume(0)
|
||||||
|
}
|
||||||
|
updateVolIcon()
|
||||||
|
})
|
||||||
volSlider := widget.NewSlider(0, 100)
|
volSlider := widget.NewSlider(0, 100)
|
||||||
volSlider.Step = 1
|
volSlider.Step = 1
|
||||||
volSlider.Value = state.playerVolume
|
volSlider.Value = state.playerVolume
|
||||||
volSlider.OnChanged = func(val float64) {
|
volSlider.OnChanged = func(val float64) {
|
||||||
|
if updatingVolume {
|
||||||
|
return
|
||||||
|
}
|
||||||
state.playerVolume = val
|
state.playerVolume = val
|
||||||
|
if val > 0 {
|
||||||
|
state.lastVolume = val
|
||||||
|
state.playerMuted = false
|
||||||
|
} else {
|
||||||
|
state.playerMuted = true
|
||||||
|
}
|
||||||
if state.player != nil && state.playerReady {
|
if state.player != nil && state.playerReady {
|
||||||
if err := state.player.SetVolume(val); err != nil {
|
if err := state.player.SetVolume(val); err != nil {
|
||||||
debugLog(logCatFFMPEG, "player volume failed: %v", err)
|
debugLog(logCatFFMPEG, "player volume failed: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
updateVolIcon()
|
||||||
}
|
}
|
||||||
|
updateVolIcon()
|
||||||
volSlider.Refresh()
|
volSlider.Refresh()
|
||||||
playBtn := makeIconButton("▶/⏸", "Play/Pause", func() {
|
playBtn := makeIconButton("▶/⏸", "Play/Pause", func() {
|
||||||
if state.player == nil {
|
if state.player == nil {
|
||||||
|
|
@ -921,7 +977,7 @@ func buildVideoPane(state *appState, min fyne.Size, src *videoSource, onCover fu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
volBox := container.NewHBox(widget.NewLabel("🔊"), container.NewMax(volSlider))
|
volBox := container.NewHBox(volIcon, container.NewMax(volSlider))
|
||||||
progress := container.NewBorder(nil, nil, currentTime, totalTime, container.NewMax(slider))
|
progress := container.NewBorder(nil, nil, currentTime, totalTime, container.NewMax(slider))
|
||||||
controls = container.NewVBox(
|
controls = container.NewVBox(
|
||||||
container.NewHBox(playBtn, fullBtn, coverBtn, importBtn, layout.NewSpacer(), volBox),
|
container.NewHBox(playBtn, fullBtn, coverBtn, importBtn, layout.NewSpacer(), volBox),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user