func oggplayer() { pipeline := C.gst_pipeline_new(toGStr("audio-player")) source, err := NewElement("filesrc", "file-source") if err != nil { log.Fatal(err) } demuxer, err := NewElement("oggdemux", "ogg-demuxer") if err != nil { log.Fatal(err) } decoder, err := NewElement("vorbisdec", "vorbis-decoder") if err != nil { log.Fatal(err) } conv, err := NewElement("audioconvert", "converter") if err != nil { log.Fatal(err) } sink, err := NewElement("autoaudiosink", "audio-output") if err != nil { log.Fatal(err) } ObjSet(asGObj(source), "location", os.Args[1]) messages := PipelineWatchBus(asGstPipeline(pipeline)) BinAdd(pipeline, source, demuxer, decoder, conv, sink) ElementLink(source, demuxer) ElementLink(decoder, conv, sink) ObjConnect(asGObj(demuxer), "pad-added", func(elem *C.GstElement, pad *C.GstPad) { sink := C.gst_element_get_static_pad(decoder, toGStr("sink")) C.gst_pad_link(pad, sink) C.gst_object_unref(asGPtr(sink)) }) C.gst_element_set_state(pipeline, C.GST_STATE_PLAYING) go func() { for msg := range messages { MessageDump(msg) } }() go func() { var pos, length C.gint64 for _ = range time.NewTicker(time.Second * 1).C { C.gst_element_query_position(pipeline, C.GST_FORMAT_TIME, &pos) C.gst_element_query_duration(pipeline, C.GST_FORMAT_TIME, &length) p("%v / %v\n", time.Duration(pos), time.Duration(length)) if time.Duration(pos) > time.Second*5 { C.gst_element_seek(pipeline, 1.0, C.GST_FORMAT_TIME, C.GST_SEEK_FLAG_FLUSH, C.GST_SEEK_TYPE_SET, 10, C.GST_SEEK_TYPE_NONE, C.GST_CLOCK_TIME_NONE) } } }() loop := C.g_main_loop_new(nil, False()) C.g_main_loop_run(loop) }
// Seek() is a wrapper around gst_element_seek(). func (v *Element) Seek(rate float64, format Format, flags SeekFlags, startType SeekType, start int64, stopType SeekType, stop int64) bool { c := C.gst_element_seek(v.native(), C.gdouble(rate), C.GstFormat(format), C.GstSeekFlags(flags), C.GstSeekType(startType), C.gint64(start), C.GstSeekType(stopType), C.gint64(stop)) return gobool(c) }