{-# LANGUAGE RankNTypes, FlexibleContexts #-} {- | Generic functions and iteratees to support writing files. -} module Sound.Iteratee.Writer ( -- * Audio writing functions fileDriverAudio, runAudioMonad ) where import Sound.Iteratee.Base import Sound.Iteratee.Codecs import Data.MutableIter import Foreign.Storable (Storable) runAudioMonad :: AudioMonad a -> IO a runAudioMonad am = do (a, s) <- runStateT am NoState case s of NoState -> return a WaveState{} -> runWaveAM (put s >> return a) fileDriverAudio :: (Storable el) => (forall r. MIteratee (IOBuffer r el) AudioMonad a) -> FilePath -> IO a fileDriverAudio i fp = runAM (fileDriverRandom defaultChunkLength i fp) where runAM = runAudioMonad