Ceci n'est pas une pipe the quick'n'dirty way added by C-Keen Magritte on Sat May 5 20:33:30 2012
#> int callback_fd = -1; static void channel_finished (int channel){ if (callback_fd >= 0) { char chan[3]; snprintf(chan, 3, "%d\n", channel); write(callback_fd, chan, 2); } } <# (define-external callback_fd int -1) (define mix-channel-finished-scheme-cb #f) (define (make-waiter-thread handler) (let-values (((in out) (create-pipe))) (set! callback_fd in) (let ((p (open-input-file* out))) (let loop () (thread-wait-for-i/o! out #:input) (let ((v (read p))) (unless (eof-object? v) (handler v) (loop)) (close-input-port p)))))) (define (set-mix-channel-finished-cb handler) (when (eq? handler mix-channel-finished-scheme-cb) (foreign-code "close(callback_fd);")) (set! mix-channel-finished-scheme-cb handler) (foreign-code "Mix_ChannelFinished(channel_finished);") (thread-start! (make-thread (cut make-waiter-thread handler))))