summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--player/player.go41
1 files changed, 19 insertions, 22 deletions
diff --git a/player/player.go b/player/player.go
index 5fe631c..eb0887a 100644
--- a/player/player.go
+++ b/player/player.go
@@ -26,12 +26,12 @@ package player
import (
"fmt"
- "github.com/gotk3/gotk3/glib"
"github.com/spreadspace/go-gstreamer"
"io/ioutil"
"log"
"os"
"path"
+ "time"
)
func init() {
@@ -86,13 +86,13 @@ type MeterChannel struct {
peak float64
decay float64
}
-type Meter map[int]MeterChannel
+type Meter []MeterChannel
type updateData struct {
- len int64
- pos int64
+ len time.Duration
+ pos time.Duration
meter Meter
}
-type UpdateCB func(len int64, pos int64, meter Meter, userdata interface{}) bool
+type UpdateCB func(len time.Duration, pos time.Duration, meter Meter, userdata interface{}) bool
type State int
@@ -111,6 +111,7 @@ type Player struct {
stdlog *log.Logger
dbglog *log.Logger
state State
+ len time.Duration
loadChan chan loadRequest
playChan chan playRequest
pauseChan chan pauseRequest
@@ -124,19 +125,23 @@ func (p *Player) onMessage(bus *gst.Bus, msg *gst.Message) {
case gst.MESSAGE_EOS:
p.pipe.SetState(gst.STATE_NULL)
p.state = IDLE
- p.updateChan <- updateData{}
+ p.len = 0
+ p.updateChan <- updateData{len: p.len}
case gst.MESSAGE_WARNING:
warn, _ := msg.ParseWarning()
p.stdlog.Printf("GStreamer Pipeline Warning: %s", warn)
case gst.MESSAGE_ERROR:
p.pipe.SetState(gst.STATE_NULL)
p.state = IDLE
+ p.len = 0
+ p.updateChan <- updateData{len: p.len}
err, _ := msg.ParseError()
p.stdlog.Printf("GStreamer Pipeline Error: %s", err)
case gst.MESSAGE_ASYNC_DONE:
len, ok := p.pipe.QueryDuration(gst.FORMAT_TIME)
if ok {
- p.updateChan <- updateData{len: len}
+ p.len = time.Duration(len)
+ p.updateChan <- updateData{len: p.len}
} else {
p.stdlog.Printf("GStreamer Pipeline Error: unable to query duration of file")
}
@@ -145,21 +150,12 @@ func (p *Player) onMessage(bus *gst.Bus, msg *gst.Message) {
peak := s.Data["peak"].(gst.GValueArray)
decay := s.Data["decay"].(gst.GValueArray)
- meter := make(map[int]MeterChannel, len(peak))
+ meter := make([]MeterChannel, len(peak))
for i := 0; i < len(peak); i++ {
meter[i] = MeterChannel{peak: peak[i].(float64), decay: decay[i].(float64)}
}
-
- len, ok := p.pipe.QueryDuration(gst.FORMAT_TIME)
- if !ok {
- p.stdlog.Printf("GStreamer Pipeline Error: unable to query duration of file")
- }
- pos, ok := p.pipe.QueryPosition(gst.FORMAT_TIME)
- if !ok {
- p.stdlog.Printf("GStreamer Pipeline Error: unable to query duration of file")
- }
-
- p.updateChan <- updateData{len: len, pos: pos, meter: meter}
+ pos := time.Duration(s.Data["stream-time"].(uint64))
+ p.updateChan <- updateData{len: p.len, pos: pos, meter: meter}
case gst.MESSAGE_STATE_CHANGED:
default:
p.dbglog.Printf("GStreamer Message: unknown type '%s'", msg.GetTypeName())
@@ -235,8 +231,8 @@ func (p *Player) addUpdateHandler(callback UpdateCB, userdata interface{}) (resp
return
}
-func (p *Player) sendUpdate(len int64, pos int64, meter Meter) {
- p.dbglog.Printf("player update: len: %d, pos: %d, meter: %+v", len, pos, meter)
+func (p *Player) sendUpdate(len time.Duration, pos time.Duration, meter Meter) {
+ p.dbglog.Printf("player update: len: %s, pos: %s, meter: %+v", len.String(), pos.String(), meter)
// TODO: send this to all subscribed handler
return
}
@@ -298,7 +294,7 @@ func (p *Player) createPipeline() (err error) {
if err != nil {
return fmt.Errorf("player error getting sink pad from conv1: %s", err)
}
- p.src.Connect("pad-added", func(_ *glib.Object, srcpad *gst.Pad) {
+ p.src.Connect("pad-added", func(_ interface{}, srcpad *gst.Pad) {
if ret := srcpad.Link(sinkpad); ret != gst.PAD_LINK_OK {
p.stdlog.Println("player error linking src with conv1 (code: %v)", ret)
}
@@ -407,6 +403,7 @@ func (p *Player) GetInterface() *PlayerChan {
func NewPlayer(basepath string, stdlog *log.Logger, dbglog *log.Logger) (p *Player, err error) {
p = &Player{}
p.basepath = path.Clean(basepath)
+ p.len = 0
if stdlog != nil {
p.stdlog = stdlog
} else {