func toGValue(v interface{}) *C.GValue { value := C.gvalue_new() switch reflect.TypeOf(v).Kind() { case reflect.String: C.g_value_init(value, C.G_TYPE_STRING) cStr := C.CString(v.(string)) defer C.free(unsafe.Pointer(cStr)) C.g_value_set_string(value, (*C.gchar)(unsafe.Pointer(cStr))) case reflect.Int: C.g_value_init(value, C.G_TYPE_INT) C.g_value_set_int(value, C.gint(v.(int))) case reflect.Struct: switch rv := v.(type) { case Fraction: C.g_value_init(value, C.gst_fraction_get_type()) C.gst_value_set_fraction(value, C.gint(rv.N), C.gint(rv.D)) default: p("unknown struct type %v\n", v) panic("fixme") //TODO } case reflect.Ptr: switch reflect.TypeOf(v) { case gstCapsType: C.g_value_init(value, C.gst_caps_get_type()) C.gst_value_set_caps(value, v.(*C.GstCaps)) default: panic(fmt.Sprintf("unknown type %v", v)) //TODO } default: panic(fmt.Sprintf("unknown type %v", v)) //TODO } return value }
func init() { alen := C.int(len(os.Args)) argv := make([]*C.char, alen) for i, s := range os.Args { argv[i] = C.CString(s) } ret := C._gst_init(&alen, &argv[0]) argv = (*[1 << 16]*C.char)(unsafe.Pointer(ret))[:alen] os.Args = make([]string, alen) for i, s := range argv { os.Args[i] = C.GoString(s) } TYPE_INT_RANGE = glib.Type(C.gst_int_range_get_type()) TYPE_FRACTION = glib.Type(C.gst_fraction_get_type()) }