packages feed

SDL-mixer (empty) → 0.4.0

raw patch · 10 files changed

+582/−0 lines, 10 filesdep +SDLdep +basebuild-type:Customsetup-changed

Dependencies added: SDL, base

Files

+ Graphics/UI/SDL/Mixer.hs view
@@ -0,0 +1,15 @@+module Graphics.UI.SDL.Mixer+    ( module Graphics.UI.SDL.Mixer.Channels+    , module Graphics.UI.SDL.Mixer.Music+    , module Graphics.UI.SDL.Mixer.Types+    , module Graphics.UI.SDL.Mixer.General+    , module Graphics.UI.SDL.Mixer.Samples+    , module Graphics.UI.SDL.Mixer.Version+    ) where++import Graphics.UI.SDL.Mixer.Channels+import Graphics.UI.SDL.Mixer.Music+import Graphics.UI.SDL.Mixer.Types+import Graphics.UI.SDL.Mixer.General+import Graphics.UI.SDL.Mixer.Samples+import Graphics.UI.SDL.Mixer.Version
+ Graphics/UI/SDL/Mixer/Channels.hs view
@@ -0,0 +1,131 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Graphics.UI.SDL.Mixer.Channels+-- Copyright   :  (c) David Himmelstrup 2005+-- License     :  BSD-like+--+-- Maintainer  :  lemmih@gmail.com+-- Stability   :  provisional+-- Portability :  portable+--+-----------------------------------------------------------------------------+module Graphics.UI.SDL.Mixer.Channels+    ( allocateChannels+    , volume+    , tryPlayChannel+    , playChannel+    , tryFadeInChannel+    , fadeInChannel+    , tryFadeInChannelTimed+    , fadeInChannelTimed+    , pause+    , resume+    , haltChannel+    , expireChannel+    , fadeOutChannel+    , isChannelPlaying+    , numChannelsPlaying+    , isChannelPaused+    , numChannelsPaused+    , fadingChannel+    , getChunk+    ) where++import Foreign(Ptr, newForeignPtr_, toBool, withForeignPtr)++import Graphics.UI.SDL.Mixer.Types(Fading, Channel, Chunk, ChunkStruct)+import Graphics.UI.SDL.General(unwrapInt)++-- int Mix_AllocateChannels(int numchans)+foreign import ccall unsafe "Mix_AllocateChannels" allocateChannels :: Int -> IO Int++-- int Mix_Volume(int channel, int volume)+foreign import ccall unsafe "Mix_Volume" volume :: Int -> Int -> IO Int++tryPlayChannel :: Channel -> Chunk -> Int -> IO Int+tryPlayChannel channel chunk loops+    = tryPlayChannelTimed channel chunk loops (-1)++playChannel :: Channel -> Chunk -> Int -> IO Int+playChannel channel chunk loops+    = playChannelTimed channel chunk loops (-1)++-- int Mix_PlayChannelTimed(int channel, Mix_Chunk *chunk, int loops, int ticks)+foreign import ccall unsafe "Mix_PlayChannelTimed" mixPlayChannelTimed+    :: Int -> Ptr ChunkStruct -> Int -> Int -> IO Int+tryPlayChannelTimed :: Channel -> Chunk -> Int -> Int -> IO Int+tryPlayChannelTimed channel chunk loops ticks+    = withForeignPtr chunk $ \chunkPtr ->+      mixPlayChannelTimed channel chunkPtr loops ticks++playChannelTimed :: Channel -> Chunk -> Int -> Int -> IO Int+playChannelTimed channel chunk loops ticks+    = unwrapInt (/=(-1)) "Mix_PlayChannelTimed"+                (tryPlayChannelTimed channel chunk loops ticks)++tryFadeInChannel :: Channel -> Chunk -> Int -> Int -> IO Int+tryFadeInChannel channel chunk loops ms+    = tryFadeInChannelTimed channel chunk loops ms (-1)++fadeInChannel :: Channel -> Chunk -> Int -> Int -> IO Int+fadeInChannel channel chunk loops ms+    = fadeInChannelTimed channel chunk loops ms (-1)++-- int Mix_FadeInChannelTimed(int channel, Mix_Chunk *chunk, int loops, int ms, int ticks)+foreign import ccall unsafe "Mix_FadeInChannelTimed" mixFadeInChannelTimed+    :: Int -> Ptr ChunkStruct -> Int -> Int -> Int -> IO Int+tryFadeInChannelTimed :: Channel -> Chunk -> Int -> Int -> Int -> IO Int+tryFadeInChannelTimed channel chunk loops ms ticks+    = withForeignPtr chunk $ \chunkPtr ->+      mixFadeInChannelTimed channel chunkPtr loops ms ticks++fadeInChannelTimed :: Channel -> Chunk -> Int -> Int -> Int -> IO Int+fadeInChannelTimed channel chunk loops ms ticks+    = unwrapInt (/=(-1)) "Mix_FadeInChannelTimed"+                (tryFadeInChannelTimed channel chunk loops ms ticks)+++-- void Mix_Pause(int channel)+foreign import ccall unsafe "Mix_Pause" pause :: Channel -> IO ()++-- void Mix_Resume(int channel)+foreign import ccall unsafe "Mix_Resume" resume :: Channel -> IO ()++-- int Mix_HaltChannel(int channel)+foreign import ccall unsafe "Mix_HaltChannel" mixHaltChannel :: Int -> IO Int+haltChannel :: Channel -> IO ()+haltChannel channel = mixHaltChannel channel >> return ()++-- int Mix_ExpireChannel(int channel, int ticks)+foreign import ccall unsafe "Mix_ExpireChannel" expireChannel :: Channel -> Int -> IO Int++-- int Mix_FadeOutChannel(int channel, int ms)+foreign import ccall unsafe "Mix_FadeOutChannel" fadeOutChannel :: Channel -> Int -> IO Int++-- int Mix_Playing(int channel)+foreign import ccall unsafe "Mix_Playing" mixPlaying :: Int -> IO Int++isChannelPlaying :: Channel -> IO Bool+isChannelPlaying = fmap toBool . mixPlaying++numChannelsPlaying :: IO Int+numChannelsPlaying = mixPlaying (-1)++-- int Mix_Paused(int channel)+foreign import ccall unsafe "Mix_Paused" mixPaused :: Int -> IO Int++isChannelPaused :: Channel -> IO Bool+isChannelPaused = fmap toBool . mixPaused++numChannelsPaused :: IO Int+numChannelsPaused = mixPaused (-1)++-- Mix_Fading Mix_FadingChannel(int which)+foreign import ccall unsafe "Mix_FadingChannel" mixFadingChannel :: Int -> IO Int+fadingChannel :: Channel -> IO Fading+fadingChannel = fmap toEnum . mixFadingChannel++-- Mix_Chunk *Mix_GetChunk(int channel)+foreign import ccall unsafe "Mix_GetChunk" mixGetChunk :: Int -> IO (Ptr ChunkStruct)+getChunk :: Channel -> IO Chunk+getChunk ch = newForeignPtr_ =<< mixGetChunk ch
+ Graphics/UI/SDL/Mixer/General.hsc view
@@ -0,0 +1,60 @@+#include <SDL_mixer.h>+-----------------------------------------------------------------------------+-- |+-- Module      :  Graphics.UI.SDL.Mixer.General+-- Copyright   :  (c) David Himmelstrup 2005+-- License     :  BSD-like+--+-- Maintainer  :  lemmih@gmail.com+-- Stability   :  provisional+-- Portability :  portable+--+-----------------------------------------------------------------------------+module Graphics.UI.SDL.Mixer.General+    ( AudioFormat (..)+    , tryOpenAudio+    , openAudio+    , closeAudio+    , tryQuerySpec+    , querySpec+    , defaultFrequency+    ) where++import Graphics.UI.SDL.General(unwrapMaybe, unwrapBool)+import Graphics.UI.SDL.Audio(AudioFormat(..), fromAudioFormat, toAudioFormat)++import Data.Word(Word16)+import Foreign(Ptr, Storable(peek), alloca)++defaultFrequency :: Int+defaultFrequency = 22050++-- int Mix_OpenAudio(int frequency, Uint16 format, int channels, int chunksize)+foreign import ccall unsafe "Mix_OpenAudio" mixOpenAudio :: Int -> Word16 -> Int -> Int -> IO Int+tryOpenAudio :: Int -> AudioFormat -> Int -> Int -> IO Bool+tryOpenAudio frequency format channels chunksize+    = fmap (0==) (mixOpenAudio frequency (fromAudioFormat format) channels chunksize)++openAudio :: Int -> AudioFormat -> Int -> Int -> IO ()+openAudio frequency format channels chunksize+    = unwrapBool "Mix_OpenAudio" (tryOpenAudio frequency format channels chunksize)++-- void Mix_CloseAudio()+foreign import ccall unsafe "Mix_CloseAudio" closeAudio :: IO ()++-- int Mix_QuerySpec(int *frequency, Uint16 *format, int *channels)+foreign import ccall unsafe "Mix_QuerySpec" mixQuerySpec :: Ptr Int -> Ptr Word16 -> Ptr Int -> IO Int+tryQuerySpec :: IO (Maybe (Int,AudioFormat,Int))+tryQuerySpec+    = alloca $ \freq ->+      alloca $ \format ->+      alloca $ \channels ->+      do ret <- mixQuerySpec freq format channels+         case ret of+           0 -> return Nothing+           _ -> do [f,c] <- mapM peek [freq,channels]+                   fm <- peek format+                   return (Just (f,toAudioFormat fm,c))++querySpec :: IO (Int,AudioFormat,Int)+querySpec = unwrapMaybe "Mix_QuerySpec" tryQuerySpec
+ Graphics/UI/SDL/Mixer/Music.hs view
@@ -0,0 +1,187 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Graphics.UI.SDL.Mixer.Music+-- Copyright   :  (c) David Himmelstrup 2005+-- License     :  BSD-like+--+-- Maintainer  :  lemmih@gmail.com+-- Stability   :  provisional+-- Portability :  portable+--+-----------------------------------------------------------------------------+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)++-- void Mix_FreeMusic(Mix_Music *music)+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++-- Mix_Music *Mix_LoadMUS(const char *file)+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++-- int Mix_PlayMusic(Mix_Music *music, int loops)+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++-- int Mix_FadeInMusicPos(Mix_Music *music, int loops, int ms, double position)+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)++-- int Mix_VolumeMusic(int volume)+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++-- void Mix_PauseMusic()+foreign import ccall unsafe "Mix_PauseMusic" pauseMusic :: IO ()++-- void Mix_ResumeMusic()+foreign import ccall unsafe "Mix_ResumeMusic" resumeMusic :: IO ()++-- void Mix_RewindMusic()+foreign import ccall unsafe "Mix_RewindMusic" rewindMusic :: IO ()++-- int Mix_SetMusicPosition(double position)+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++-- int Mix_SetMusicCMD(const char *command)+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 ()++-- int Mix_HaltMusic()+foreign import ccall unsafe "Mix_HaltMusic" mixHaltMusic :: IO Int+haltMusic :: IO ()+haltMusic = mixHaltMusic >> return ()++-- int Mix_FadeOutMusic(int ms)+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)++-- Mix_MusicType Mix_GetMusicType(const Mix_Music *music)+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++-- int Mix_PlayingMusic()+foreign import ccall unsafe "Mix_PlayingMusic" mixPlayingMusic :: IO Int++playingMusic :: IO Bool+playingMusic = fmap toBool mixPlayingMusic++-- int Mix_PausedMusic()+foreign import ccall unsafe "Mix_PausedMusic" mixPausedMusic :: IO Int++pausedMusic :: IO Bool+pausedMusic = fmap toBool mixPausedMusic++-- Mix_Fading Mix_FadingMusic()+foreign import ccall unsafe "Mix_FadingMusic" mixFadingMusic :: IO Int++fadingMusic :: IO Fading+fadingMusic = fmap toEnum mixFadingMusic++
+ Graphics/UI/SDL/Mixer/Samples.hs view
@@ -0,0 +1,51 @@+-----------------------------------------------------------------------------+-- |+-- 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)+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)+
+ Graphics/UI/SDL/Mixer/Types.hs view
@@ -0,0 +1,46 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Graphics.UI.SDL.Mixer.Types+-- Copyright   :  (c) David Himmelstrup 2005+-- License     :  BSD-like+--+-- Maintainer  :  lemmih@gmail.com+-- Stability   :  provisional+-- Portability :  portable+--+-----------------------------------------------------------------------------+module Graphics.UI.SDL.Mixer.Types+    ( ChunkStruct+    , Chunk+    , MusicStruct+    , Music+    , Channel+    , MusicType (..)+    , Fading (..)+    ) where++import Foreign(ForeignPtr)++data ChunkStruct+type Chunk = ForeignPtr ChunkStruct++data MusicStruct+type Music = ForeignPtr MusicStruct++type Channel = Int++data MusicType+    = MusicNone+    | MusicCmd+    | MusicWav+    | MusicMod+    | MusicMid+    | MusicOgg+    | MusicMp3+      deriving (Show,Eq,Ord,Enum,Bounded)++data Fading+    = NoFading+    | FadingOut+    | FadingIn+      deriving (Show,Eq,Ord,Enum,Bounded)
+ Graphics/UI/SDL/Mixer/Version.hsc view
@@ -0,0 +1,32 @@+#include "SDL_mixer.h"+module Graphics.UI.SDL.Mixer.Version+    ( compiledFor+    , linkedWith+    ) where++import Data.Version (Version(Version))++import Foreign (Word8, Ptr, Storable(sizeOf, alignment, peekByteOff, peek))++data SDLVersion+    = SDLVersion Word8 Word8 Word8++instance Storable SDLVersion where+    sizeOf _ = #{size SDL_version}+    alignment _ = 1+    peek ptr = do major <- #{peek SDL_version, major} ptr+                  minor <- #{peek SDL_version, minor} ptr+                  patch <- #{peek SDL_version, patch} ptr+                  return (SDLVersion major minor patch)++compiledFor :: Version+compiledFor = Version [ #{const SDL_MIXER_MAJOR_VERSION}+                      , #{const SDL_MIXER_MINOR_VERSION}+                      , #{const SDL_MIXER_PATCHLEVEL}+                      ] []++foreign import ccall unsafe "Mix_Linked_Version" sdlLinkedVersion :: IO (Ptr SDLVersion)+linkedWith :: IO Version+linkedWith = do versionPtr <- sdlLinkedVersion+                SDLVersion major minor patch <- peek versionPtr+                return (Version (map fromIntegral [major,minor,patch]) [])
+ LICENSE view
@@ -0,0 +1,35 @@+Copyright (c) 2004-2006, David Himmelstrup+All rights reserved.++Redistribution and use in source and binary forms,+with or without modification, are permitted provided+that the following conditions are met:++    * Redistributions of source code must retain+      the above copyright notice, this list of+      conditions and the following disclaimer.+    * Redistributions in binary form must reproduce+      the above copyright notice, this list of+      conditions and the following disclaimer in the+      documentation and/or other materials provided+      with the distribution.+    * Neither the name of David Himmelstrup nor the+      names of other contributors may be used to+      endorse or promote products derived from this+      software without specific prior written permission.+++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND+CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE+USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY+OF SUCH DAMAGE.
+ SDL-mixer.cabal view
@@ -0,0 +1,20 @@+Name: SDL-mixer+Version: 0.4.0+Maintainer: Lemmih (lemmih@gmail.com)+Author: Lemmih (lemmih@gmail.com)+Copyright: 2004-2005, Lemmih+License-File: LICENSE+Build-Depends: base, SDL+Category: Foreign binding+Synopsis: Binding to libSDL_mixer+Extensions: ForeignFunctionInterface+Exposed-Modules:+  Graphics.UI.SDL.Mixer.General,+  Graphics.UI.SDL.Mixer.Samples,+  Graphics.UI.SDL.Mixer.Channels,+  Graphics.UI.SDL.Mixer.Music,+  Graphics.UI.SDL.Mixer.Types,+  Graphics.UI.SDL.Mixer.Version,+  Graphics.UI.SDL.Mixer+Includes: SDL.h SDL_mixer.h+GHC-Options: -fglasgow-exts -O2 -fvia-c -Wall -Werror
+ Setup.lhs view
@@ -0,0 +1,5 @@+#!/usr/bin/env runhaskell+> module Main where+> import Distribution.Simple+> main :: IO ()+> main = defaultMainWithHooks defaultUserHooks