summaryrefslogtreecommitdiff
path: root/src/rhlibrary/player_widget.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/rhlibrary/player_widget.go')
-rw-r--r--src/rhlibrary/player_widget.go43
1 files changed, 39 insertions, 4 deletions
diff --git a/src/rhlibrary/player_widget.go b/src/rhlibrary/player_widget.go
index 7581b45..7da5a44 100644
--- a/src/rhlibrary/player_widget.go
+++ b/src/rhlibrary/player_widget.go
@@ -25,10 +25,18 @@
package main
import (
+ "time"
+
"code.helsinki.at/rhrd-go/player"
+ "github.com/gotk3/gotk3/glib"
"github.com/gotk3/gotk3/gtk"
)
+const (
+ meterDBFloor float64 = 72 // -72 db is the lowest VU value
+ meterSegments float64 = 30 // meter has 30 elements
+)
+
func addPlayButton(grid *gtk.Grid, p *player.PlayerChan) (err error) {
var btn *gtk.Button
if btn, err = gtk.ButtonNewFromIconName("media-playback-start", gtk.ICON_SIZE_DIALOG); err != nil {
@@ -71,6 +79,16 @@ func addStopButton(grid *gtk.Grid, p *player.PlayerChan) (err error) {
return
}
+func calcMeterLevel(valdb float64) (val float64) {
+ val = valdb + meterDBFloor
+ if val < 0 {
+ val = 0
+ } else {
+ val = (val / meterDBFloor) * meterSegments
+ }
+ return
+}
+
func addMeter(grid *gtk.Grid, p *player.PlayerChan) (err error) {
var mgrid *gtk.Grid
if mgrid, err = gtk.GridNew(); err != nil {
@@ -80,16 +98,33 @@ func addMeter(grid *gtk.Grid, p *player.PlayerChan) (err error) {
mgrid.SetColumnSpacing(3)
var left, right *gtk.LevelBar
- if left, err = gtk.LevelBarNewForInterval(0, 30); err != nil {
+ if left, err = gtk.LevelBarNewForInterval(0, meterSegments); err != nil {
return
}
- if right, err = gtk.LevelBarNewForInterval(0, 30); err != nil {
+ if right, err = gtk.LevelBarNewForInterval(0, meterSegments); err != nil {
return
}
left.SetMode(gtk.LEVEL_BAR_MODE_DISCRETE)
right.SetMode(gtk.LEVEL_BAR_MODE_DISCRETE)
- left.SetValue(8)
- right.SetValue(17)
+
+ p.AddUpdateHandler(func(length time.Duration, pos time.Duration, meter player.Meter, userdata interface{}) bool {
+ glib.IdleAdd(func() {
+ ch := len(meter)
+ lval := float64(0)
+ rval := float64(0)
+ if ch >= 2 {
+ lval = calcMeterLevel(meter[0].Peak)
+ rval = calcMeterLevel(meter[1].Peak)
+ } else if ch == 1 {
+ lval = calcMeterLevel(meter[0].Peak)
+ rval = lval
+ }
+ left.SetValue(lval)
+ right.SetValue(rval)
+ })
+ return true
+ }, nil)
+
mgrid.Add(left)
mgrid.Add(right)