Paul Brannan
11/5/2007 7:12:00 PM
On Tue, Nov 06, 2007 at 02:25:29AM +0900, Edwin Van leeuwen wrote:
> static void
> callback( pa_context *c, void *klass )
> {
> VALUE obj;
> obj = * (VALUE *) klass;
> rb_funcall( obj, rb_intern( "status=" ), 1, INT2NUM(2) );
> }
>
> static VALUE
> cContext_connect( VALUE klass )
> {
> pa_context_set_state_callback( DATA_PTR( klass ), callback, &klass );
klass is a temporary variable; you probably don't want to take its
address. Instead you can cast klass to a pointer:
pa_context_set_state_callback( DATA_PTR( klass ), callback, (void *)klass );
then in your callback function, write:
VALUE obj = (VALUE *) klass;
> pa_context_connect(DATA_PTR( klass ), NULL, 0, NULL);
> return klass;
> }
>
> but then I got the following error:
> NoMethodError: undefined method `status=' for
> PulseAudio::Mainloop:0xb79ac9ac>
> (I have no clue where this mainloop object comes from, except that it is
> ofcourse the mainloop that will call the callback function)
>
> Also I have the feeling this could introduce problems with the GC
> cleaning up my context object, because officialy it's not referenced
> anymore (but I'm reasonably clueless about memory management and
> pointers etc).
If I understand your question, when the context object is destroyed, you
need to unregister the callback. That will ensure that the library
doesn't keep a reference to the freed object. You can do this by
passing a `free' function to Data_Wrap_Struct.
> Does anyone have any pointers for me :) ?
Other than the pointers to object you've already created? :)
Paul