> From: Joel Gustafson <[email protected]>
> Date: Thu, 11 May 2017 08:27:52 +0000
> 
> [...]
> Specifically, there's a struct OutStream that has a member
> write_callback that I need to set.

If you are not also trying to set userdata, you are forgetting the
most important part, the ID that Scheme uses to find the Scheme
callback procedure.

> struct OutStream {
> ...
> void *userdata;
> void (*write_callback)(struct OutStream *, int min, int max);
> ...
> }
> 
> In the libsoundio examples it's done directly with
> outstream->write_callback = write_callback;
> How can I declare and set a Scheme callback in a struct like this?

void
register_write_callback (struct OutStream *out, void *userdata)
{
  out->userdata = userdata;
  out->write_callback = write_callback_helper;
}

static void*
write_callback_helper (struct OutStream *out, int min, int max)
{
  Scm_write_callback (out, min, max, out->userdata);
}

(callback (* void) write_callback
          (out (* (struct OutStream)))
          (min int)
          (max int)
          (ID (* void)))

(extern void register_write_callback
        (out (* (struct OutStream)))
        (ID (* void)))

(define (init-outstream out)
  ...
  (C-call "register_write_callback" out (C-callback write-callback))
  ...)

(define (write-callback out min max)
  ...)

De-registering write-callback is left as an exercise...

_______________________________________________
MIT-Scheme-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/mit-scheme-devel

Reply via email to