summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/rhlibrary/vumeter_widget.go50
1 files changed, 31 insertions, 19 deletions
diff --git a/src/rhlibrary/vumeter_widget.go b/src/rhlibrary/vumeter_widget.go
index 323e826..35586fa 100644
--- a/src/rhlibrary/vumeter_widget.go
+++ b/src/rhlibrary/vumeter_widget.go
@@ -41,13 +41,17 @@ const (
)
var (
- meterBarCSS *gtk.CssProvider
+ meterBarCSS *gtk.CssProvider = nil
)
-func init() {
+func getMeterBarCSS() (*gtk.CssProvider, error) {
+ if meterBarCSS != nil {
+ return meterBarCSS, nil
+ }
+
var err error
if meterBarCSS, err = gtk.CssProviderNew(); err != nil {
- panic(err.Error())
+ return nil, err
}
err = meterBarCSS.LoadFromData(`
.level-bar {
@@ -73,8 +77,9 @@ func init() {
background-image: linear-gradient(to bottom, #FF3636, #AE0000);
}`)
if err != nil {
- panic(err.Error())
+ return nil, err
}
+ return meterBarCSS, nil
}
type vuMeterLevel struct {
@@ -121,7 +126,12 @@ func createMeterBar(segments float64) (bar *gtk.LevelBar, err error) {
if sc, err = bar.GetStyleContext(); err != nil {
return
}
- sc.AddProvider(meterBarCSS, 600) // TOOD: hardcoded value
+
+ var cp *gtk.CssProvider
+ if cp, err = getMeterBarCSS(); err != nil {
+ return
+ }
+ sc.AddProvider(cp, 600) // TOOD: hardcoded value
return
}
@@ -150,6 +160,21 @@ func (m *vuMeter) SetValue(lvl *vuMeterLevel) {
m.red.SetValue(lvl.red)
}
+func updateVUMeterLevels(left, right *vuMeter, data player.Meter) {
+ ch := len(data)
+ lval := &vuMeterLevel{0, 0, 0}
+ rval := &vuMeterLevel{0, 0, 0}
+ if ch >= 2 {
+ lval.setLevel(data[0].Peak)
+ rval.setLevel(data[1].Peak)
+ } else if ch == 1 {
+ lval.setLevel(data[0].Peak)
+ rval = lval
+ }
+ left.SetValue(lval)
+ right.SetValue(rval)
+}
+
func addVUMeterGrid(frame *gtk.Frame, p *player.PlayerChan) (err error) {
var grid *gtk.Grid
if grid, err = gtk.GridNew(); err != nil {
@@ -166,20 +191,7 @@ func addVUMeterGrid(frame *gtk.Frame, p *player.PlayerChan) (err error) {
}
p.AddUpdateHandler(func(length time.Duration, pos time.Duration, meter player.Meter, userdata interface{}) bool {
- glib.IdleAdd(func() {
- ch := len(meter)
- lval := &vuMeterLevel{0, 0, 0}
- rval := &vuMeterLevel{0, 0, 0}
- if ch >= 2 {
- lval.setLevel(meter[0].Peak)
- rval.setLevel(meter[1].Peak)
- } else if ch == 1 {
- lval.setLevel(meter[0].Peak)
- rval = lval
- }
- left.SetValue(lval)
- right.SetValue(rval)
- })
+ glib.IdleAdd(func() { updateVUMeterLevels(left, right, meter) })
return true
}, nil)