----------------------------------------------------------------------------- -- | -- Module : Graphics.UI.SDL.Mixer.Samples -- Copyright : (c) David Himmelstrup 2005 -- License : BSD-like -- -- Maintainer : lemmih@gmail.com -- Stability : provisional -- Portability : portable -- ----------------------------------------------------------------------------- module Graphics.UI.SDL.Mixer.Samples ( mkFinalizedChunk , maxVolume , tryLoadWAV , loadWAV , volumeChunk ) where import Foreign(Ptr, FunPtr, nullPtr, withForeignPtr, newForeignPtr) import Foreign.C(withCString, CString) import Graphics.UI.SDL.Mixer.Types(Chunk, ChunkStruct) import Graphics.UI.SDL.General(unwrapMaybe) maxVolume :: Int maxVolume = 128 -- void Mix_FreeChunk(Mix_Chunk *chunk) foreign import ccall unsafe "&Mix_FreeChunk" mixFreeChunkFinal :: FunPtr (Ptr ChunkStruct -> IO ()) mkFinalizedChunk :: Ptr ChunkStruct -> IO Chunk mkFinalizedChunk = newForeignPtr mixFreeChunkFinal -- Mix_Chunk *Mix_LoadWAV(char *file) -- foreign import ccall unsafe "Mix_LoadWAV" mixLoadWAV :: CString -> IO (Ptr ChunkStruct) foreign import ccall unsafe "macros.h HS_Mix_LoadWAV" mixLoadWAV :: CString -> IO (Ptr ChunkStruct) tryLoadWAV :: FilePath -> IO (Maybe Chunk) tryLoadWAV string = withCString string $ \cString -> do chunk <- mixLoadWAV cString if chunk == nullPtr then return Nothing else fmap Just (mkFinalizedChunk chunk) loadWAV :: FilePath -> IO Chunk loadWAV path = unwrapMaybe "Mix_LoadWAV" (tryLoadWAV path) -- int Mix_VolumeChunk(Mix_Chunk *chunk, int volume) foreign import ccall unsafe "Mix_VolumeChunk" mixVolumeChunk :: Ptr ChunkStruct -> Int -> IO Int volumeChunk :: Chunk -> Int -> IO Int volumeChunk chunk volume = withForeignPtr chunk (\ptr -> mixVolumeChunk ptr volume)