Hi, I'm working on a simple SDL2 test, creating bindings with the help of Cigloo (and posterior manual adjustments). One use case I'm interested in is generating audio procedurally, which involves providing a callback function that will be invoked periodically by SDL2, where a buffer of a given size is meant to be filled with the desired audio samples. Currently I'm having trouble finding the right directives for the callback function and a structure that is passed as a parameter to the function that is used to register it.
The callback function is of the form: *void audio_callback(void *userdata, Uint8 *stream, int len);* The function used to register this callback is SDL_OpenAudioDevice, which receives a SDL_AudioSpec* (among other parameters). This structure's "callback" field is used set the callback up. The definitions generated by Cigloo are: *(type Uint8 uint8_t "Uint8")* *(type Uint8* (pointer Uint8) "Uint8 *")* *(type SDL_AudioCallback *void*,Uint8*,int->void "SDL_AudioCallback")* *(type SDL_AudioSpec (struct ... (callback::SDL_AudioCallback "callback") ...) **"struct SDL_AudioSpec"**)* On my program I tried the following definitions: *(module audio* * (include "sdl.scm")* * (export (audio-callback::void ::*void* ::Uint8* ::int))* * (extern (export audio-callback "scheme_audio_callback")))* The problem I have in that case is that I have not found a way of "returning" void from the function (since all Scheme functions implicitly return some value). Returning any value gives a compilation error of the form "Type error: 'void' expected, 'x' provided". I tried using pragma with a return type of void, but the following example gives this compilation error: "Type error -- "obj" expected, "void" provided". This is the function and the way I set the structure's callback field (req is an instance of SDL_AudioSpec*). *(define (audio-callback userdata stream len)* * (pragma::void "return;"))* *(SDL_AudioSpec*-callback-set! req audio-callback) * The other option I tried is using the type defined by Cigloo: *(module audio* * (include "sdl.scm")** (export (audio-callback::SDL_AudioCallback))* * (extern (export audio-callback "scheme_audio_callback")))* But this one fails with the following error (which is logical, after all): *ERROR:audio-callback:Prototype and definition don't match (arity differs)* *(audio-callback::SDL_AudioCallback) -- (define (audio-callback userdata stream len)* Is it possible to "return" void from a function? What is the proper way for defining these types/functions? Thank you! Regards, Francisco
