> Hi, [Freenect C init sample ]
> Trying to implement that in Vala, I took the approach below. > It seems however, that the init_async does not work. Looking at the > generated C-Code it looks like the g_async_initable_init_finish method > is called right after init_async an not with in the callback as expected. > As a result the code is crashing in the underlying libusb due to > incorrect initialization. > > What am I missing here? Any idea how to solve the issue. > > thanks and sorry for the lengthy post, > > --tomw > > --------------------------------------------------------- > > using GLib; > using GFreenect; > > public class Main : Object > { > > public GFreenect.Device device; > public Cancellable cancellable; > > public Main () { > Cancellable cancellable = new Cancellable (); > > } > > public async void run (out Device dev) { > debug ("Starting"); > Device device = (Device) GLib.Object.@new ( > typeof (Device), > "index", 0, > "subdevices", Subdevice.CAMERA > ); > debug ("Device created"); > Idle.add (run.callback); ^^ No need for this since you're using yield in the function. Might actually be harmful, causing a race between the init_async you call and the one Vala calls implicitly. > try { > debug ("Trying to run init_async"); > bool re = yield device.init_async (Priority.DEFAULT, > cancellable); ^^ this yield returns to main loop and once init_async calls its call-back will call init_finish for you. So after this line the device is initialized. > if (re) { > debug ("Result = OK"); > } else { > debug ("Result = FAILED"); > } > } catch (Error e) { > debug ("Error initalizing device : %s", e.message); > } > } > > public void callback (Main? source, GLib.AsyncResult? res, void* > user_data) { > debug ("Entering Callback"); > Device dev; > if (res != null) { > source.run.end (res, out dev); > debug ("Callback called - Device created"); > try { > Device kinect = new dev.finish(res); ^^ And here you're basically trying to create another device. > } catch (Error e) { > debug ("Error finalizing device : %s", e.message); > } > } else { > debug ("No result delivered"); > } > } I would do it like this: using GLib; using GFreenect; public class Main : Object { public GFreenect.Device device; public Cancellable cancellable; public Main () { Cancellable cancellable = new Cancellable (); } public async void run () { debug ("Starting"); Device device = (Device) GLib.Object.@new ( typeof (Device), "index", 0, "subdevices", Subdevice.CAMERA ); debug ("Device created"); try { debug ("Trying to run init_async"); bool re = yield device.init_async (Priority.DEFAULT, cancellable); // start using the device } catch (Error e) { // re will always be true in the try block if you always get an error // when it's false, because you end up here anyway. debug ("Error initalizing device : %s", e.message); } } static int main (string[] args) { var loop = new MainLoop (); var app = new Main (); app.run.begin (); loop.run (); return 0; } _______________________________________________ vala-list mailing list vala-list@gnome.org http://mail.gnome.org/mailman/listinfo/vala-list