> 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

Reply via email to