summaryrefslogtreecommitdiff
path: root/src/rhlibrary/player_widget.go
diff options
context:
space:
mode:
authorChristian Pointner <equinox@helsinki.at>2016-01-21 15:22:27 (GMT)
committerChristian Pointner <equinox@helsinki.at>2016-01-21 15:22:27 (GMT)
commitdcd973603f916c8f47f908c2fb628e4219c42cb2 (patch)
tree78806a7bbc6c0c8149b5b9770d133aeeb5ff433d /src/rhlibrary/player_widget.go
parent17778eeb680e7f140bdbe26a2355f0475d1d3bb9 (diff)
meter levels works now
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)