
On Wed, 15 Dec 2004 06:04:37 -0500, David Roundy
On Wed, Dec 15, 2004 at 04:09:04AM +0100, Sebastian Sylvan wrote:
FMUSIC_MODULE * F_API FMUSIC_LoadSong( const char *name );
By doing this in Haskell:
data MusicModule = MusicModule
foreign import ccall "fmod.h FMUSIC_LoadSong" fmusic_LoadSong :: CString -> IO ForeignPtr MusicModule)
I assume that this is how the ForeignPtr is meant to be used (with a dummy data type).
No, a ForeignPtr is a purely haskell object. The C function returns a Ptr. You could create a ForeignPtr from the Ptr if you want it to be automatically freed (calling somesort of FreeSong, presumably) when it gets garbage collected.
Ah. Thanks. Another problem! When a handle is not being referenced I don't want it to be garbage collected if the isPlaying function returns True (in other words I want the song to finish playing even if it's not being referenced anymore). The current plan of attack is to have the finalizer fork off a thread which does nothing but check the status of the song every 500ms or so and when it's finished, releases it. But since I really only need to check it every time the garbage collector wants to release it maybe there's a better way? So I want to annotate the ForeignPtr with a function which can defer it's release based on the status of the handle. Is there a way to do this? Sadly the C library doesn't seem to provide a callback for when the song has finished playing which would be ideal. /S -- Sebastian Sylvan +46(0)736-818655 UIN: 44640862