module Graphics.UI.SDL.Mixer.Music
( freeMusic
, tryLoadMUS
, loadMUS
, tryPlayMusic
, playMusic
, tryFadeInMusic
, fadeInMusic
, tryFadeInMusicPos
, fadeInMusicPos
, setMusicVolume
, getMusicVolume
, modifyMusicVolume
, pauseMusic
, resumeMusic
, rewindMusic
, trySetMusicPosition
, setMusicPosition
, trySetMusicCmd
, setMusicCmd
, disableMusicCmd
, haltMusic
, tryFadeOutMusic
, fadeOutMusic
, getMusicType
, playingMusic
, pausedMusic
, fadingMusic
) where
import Foreign(Ptr, FunPtr, nullPtr, toBool, withForeignPtr, newForeignPtr)
import Foreign.C(withCString, CString)
import Graphics.UI.SDL.Mixer.Types(Fading, MusicType, Music, MusicStruct)
import Graphics.UI.SDL.General(unwrapMaybe, unwrapBool)
foreign import ccall unsafe "&Mix_FreeMusic" mixFreeMusicFinal :: FunPtr (Ptr MusicStruct -> IO ())
mkFinalizedMusic :: Ptr MusicStruct -> IO Music
mkFinalizedMusic = newForeignPtr mixFreeMusicFinal
foreign import ccall unsafe "Mix_FreeMusic" mixFreeMusic :: Ptr MusicStruct -> IO ()
freeMusic :: Music -> IO ()
freeMusic music = withForeignPtr music mixFreeMusic
foreign import ccall unsafe "Mix_LoadMUS" mixLoadMUS :: CString -> IO (Ptr MusicStruct)
tryLoadMUS :: FilePath -> IO (Maybe Music)
tryLoadMUS path
= withCString path $ \cPath ->
do music <- mixLoadMUS cPath
if music == nullPtr
then return Nothing
else fmap Just (mkFinalizedMusic music)
loadMUS :: FilePath -> IO Music
loadMUS = unwrapMaybe "Mix_LoadMUS" . tryLoadMUS
foreign import ccall unsafe "Mix_PlayMusic" mixPlayMusic :: Ptr MusicStruct -> Int -> IO Int
tryPlayMusic :: Music -> Int -> IO Bool
tryPlayMusic music loops
= withForeignPtr music $ \musicPtr ->
fmap (==0) (mixPlayMusic musicPtr loops)
playMusic :: Music -> Int -> IO ()
playMusic music loops = unwrapBool "Mix_PlayMusic" (tryPlayMusic music loops)
tryFadeInMusic :: Music -> Int -> Int -> IO Bool
tryFadeInMusic music loops ms
= tryFadeInMusicPos music loops ms 0
fadeInMusic :: Music -> Int -> Int -> IO ()
fadeInMusic music loops ms
= fadeInMusicPos music loops ms 0
foreign import ccall unsafe "Mix_FadeInMusicPos" mixFadeInMusicPos
:: Ptr MusicStruct -> Int -> Int -> Double -> IO Int
tryFadeInMusicPos :: Music -> Int -> Int -> Double -> IO Bool
tryFadeInMusicPos music loops ms pos
= withForeignPtr music $ \musicPtr ->
fmap (==0) (mixFadeInMusicPos musicPtr loops ms pos)
fadeInMusicPos :: Music -> Int -> Int -> Double -> IO ()
fadeInMusicPos music loops ms pos
= unwrapBool "Mix_FadeInMusic" (tryFadeInMusicPos music loops ms pos)
foreign import ccall unsafe "Mix_VolumeMusic" mixVolumeMusic :: Int -> IO Int
setMusicVolume :: Int -> IO ()
setMusicVolume volume = mixVolumeMusic volume >> return ()
getMusicVolume :: IO Int
getMusicVolume = mixVolumeMusic (-1)
modifyMusicVolume :: (Int -> Int) -> IO ()
modifyMusicVolume fn = getMusicVolume >>= setMusicVolume . fn
foreign import ccall unsafe "Mix_PauseMusic" pauseMusic :: IO ()
foreign import ccall unsafe "Mix_ResumeMusic" resumeMusic :: IO ()
foreign import ccall unsafe "Mix_RewindMusic" rewindMusic :: IO ()
foreign import ccall unsafe "Mix_SetMusicPosition" mixSetMusicPosition :: Double -> IO Int
trySetMusicPosition :: Double -> IO Bool
trySetMusicPosition = fmap (==0) . mixSetMusicPosition
setMusicPosition :: Double -> IO ()
setMusicPosition = unwrapBool "Mix_SetMusicPosition" . trySetMusicPosition
foreign import ccall unsafe "Mix_SetMusicCMD" mixSetMusicCmd :: CString -> IO Int
trySetMusicCmd :: String -> IO Bool
trySetMusicCmd cmd
= withCString cmd $ \cString ->
fmap (==0) (mixSetMusicCmd cString)
setMusicCmd :: String -> IO ()
setMusicCmd cmd = unwrapBool "Mix_SetMusicCMD" (trySetMusicCmd cmd)
disableMusicCmd :: IO ()
disableMusicCmd = mixSetMusicCmd nullPtr >> return ()
foreign import ccall unsafe "Mix_HaltMusic" mixHaltMusic :: IO Int
haltMusic :: IO ()
haltMusic = mixHaltMusic >> return ()
foreign import ccall unsafe "Mix_FadeOutMusic" mixFadeOutMusic :: Int -> IO Int
tryFadeOutMusic :: Int -> IO Bool
tryFadeOutMusic ms = fmap (==1) (mixFadeOutMusic ms)
fadeOutMusic :: Int -> IO ()
fadeOutMusic ms = unwrapBool "Mix_FadeOutMusic" (tryFadeOutMusic ms)
foreign import ccall unsafe "Mix_GetMusicType" mixGetMusicType :: Ptr MusicStruct -> IO Int
getMusicType :: Maybe Music -> IO MusicType
getMusicType mbMusic
= withMusic mbMusic $ \musicPtr ->
fmap toEnum (mixGetMusicType musicPtr)
where withMusic Nothing action = action nullPtr
withMusic (Just music) action = withForeignPtr music action
foreign import ccall unsafe "Mix_PlayingMusic" mixPlayingMusic :: IO Int
playingMusic :: IO Bool
playingMusic = fmap toBool mixPlayingMusic
foreign import ccall unsafe "Mix_PausedMusic" mixPausedMusic :: IO Int
pausedMusic :: IO Bool
pausedMusic = fmap toBool mixPausedMusic
foreign import ccall unsafe "Mix_FadingMusic" mixFadingMusic :: IO Int
fadingMusic :: IO Fading
fadingMusic = fmap toEnum mixFadingMusic