func (e *Element) LinkPads(pad_name string, dst *Element, dst_pad_name string) bool { src_pname := (*C.gchar)(C.CString(pad_name)) defer C.free(unsafe.Pointer(src_pname)) dst_pname := (*C.gchar)(C.CString(dst_pad_name)) defer C.free(unsafe.Pointer(dst_pname)) return C.gst_element_link_pads(e.g(), src_pname, dst.g(), dst_pname) != 0 }
func play2() { pipeline := C.gst_pipeline_new(toGStr("pipeline")) source, err := NewElement("filesrc", "source") if err != nil { log.Fatal(err) } ObjSet(asGObj(source), "location", os.Args[1]) demux, err := NewElement("oggdemux", "demuxer") if err != nil { log.Fatal(err) } BinAdd(pipeline, source, demux) C.gst_element_link_pads(source, toGStr("src"), demux, toGStr("sink")) ObjConnect(asGObj(demux), "pad-added", func(demuxer *C.GstElement, pad *C.GstPad) { p("pad added %T %v\n", pad, pad) }) // bus messages := PipelineWatchBus(asGstPipeline(pipeline)) C.gst_element_set_state(pipeline, C.GST_STATE_PLAYING) loop := C.g_main_loop_new(nil, 0) go func() { loop: for msg := range messages { runtime.GC() p("=> %s: %s\n", fromGStr(C.gst_object_get_name(asGstObj(msg.src))), fromGStr(C.gst_message_type_get_name(msg._type))) switch msg._type { case C.GST_MESSAGE_ERROR: var err *C.GError var debug *C.gchar C.gst_message_parse_error(msg, &err, &debug) p("Error: %s\n%s\n", fromGStr(err.message), fromGStr(debug)) C.g_error_free(err) C.g_free(asGPtr(debug)) C.g_main_loop_quit(loop) break loop case C.GST_MESSAGE_WARNING: case C.GST_MESSAGE_INFO: case C.GST_MESSAGE_EOS: C.g_main_loop_quit(loop) break loop case C.GST_MESSAGE_TAG: var tags *C.GstTagList C.gst_message_parse_tag(msg, &tags) //TagListForeach(tags, ) TODO C.gst_tag_list_unref(tags) case C.GST_MESSAGE_STATE_CHANGED: var newState, oldState C.GstState C.gst_message_parse_state_changed(msg, &oldState, &newState, nil) p("%s -> %s\n", fromGStr(C.gst_element_state_get_name(oldState)), fromGStr(C.gst_element_state_get_name(newState))) } C.gst_message_unref(msg) } p("loop break.\n") }() runtime.LockOSThread() C.g_main_loop_run(loop) p("quit.\n") }