{- 2009 Daniel van den Eijkel -} module Sound.Hommage.DSPlayer.AudioSample ( SamplePool , loadAudioSample , getAudioSample , AudioSample (..) , openWavSample ) where --import Sound.Hommage.WavFile import Sound.Hommage.Signal import Sound.Hommage.Sample import Control.Monad import Data.Array.Storable import Data.Array.IO import GHC.IOBase -- | A list of AudioSamples. The list can be extended at runtime. type SamplePool = IORef [AudioSample] -- | Load a Sample into the SamplePool loadAudioSample :: SamplePool -> FilePath -> IO Int loadAudioSample ref fp = do a <- openWavSample fp let s = either MonoSample StereoSample a aus <- readIORef ref writeIORef ref (aus ++ [s]) return $! length aus -- | Get the nth AudioSample. Nothing if not defined. getAudioSample :: SamplePool -> Int -> IO (Maybe AudioSample) getAudioSample ref i = do aus <- readIORef ref if i < 0 || i >= length aus then return Nothing else return (Just (aus !! i)) --------------------------------------------------------------------------------------------------- -- Sample Mono | Sample Stereo data AudioSample = MonoSample { theMonoSample :: Sample Mono } | StereoSample { theStereoSample :: Sample Stereo } ---------------------------------------------------------------------------------------------------