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))))