// // rhrdlibrary // // The Radio Helsinki Rivendell Library // // // Copyright (C) 2016 Christian Pointner // // This file is part of rhrdlibrary. // // rhrdlibrary is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // any later version. // // rhrdlibrary is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with rhrdlibrary. If not, see . // package main import ( "fmt" "github.com/ziutek/glib" "github.com/ziutek/gst" "path" ) type Player struct { pipe *gst.Element bus *gst.Bus basepath string } func (p *Player) onMessage(bus *gst.Bus, msg *gst.Message) { switch msg.GetType() { case gst.MESSAGE_EOS: rhdl.Printf("EOS reached!") p.pipe.SetState(gst.STATE_NULL) case gst.MESSAGE_ERROR: rhdl.Printf("Error: received gst error message") p.pipe.SetState(gst.STATE_NULL) // TODO: this crashes the program // err, debug := msg.ParseError() // rhdl.Printf("Error: %s (debug: %s)\n", err, debug) } } func (p *Player) Play(cart, cut uint) (err error) { filename := path.Join(p.basepath, fmt.Sprintf("%06d_%03d.wav", cart, cut)) rhdl.Printf("trying to play file: %s", filename) p.pipe.SetProperty("uri", "file://"+filename) p.pipe.SetState(gst.STATE_PLAYING) glib.NewMainLoop(nil).Run() return } func NewPlayer(basepath string) (p *Player, err error) { p = &Player{} p.basepath = path.Clean(basepath) p.pipe = gst.ElementFactoryMake("playbin", "autoplay") p.bus = p.pipe.GetBus() p.bus.AddSignalWatch() p.bus.Connect("message", (*Player).onMessage, p) return }