module Sound.File (
module Sound.Base,
decodeSoundFileBS,
decodeSoundFileHinted,
getType,
getTypeFromName,
WF.toWaveFile
) where
import Char (toUpper)
import qualified System.FilePath as FP
import qualified Data.ByteString.Lazy as L
import Data.ByteString.Lazy (ByteString)
import Data.Binary (decode)
import qualified Control.Monad.Error as Err
import Sound.Base
import Sound.Codecs.WaveFile (isWaveFile, WaveFile)
import qualified Sound.Codecs.WaveFile as WF
decodeSoundFileBS :: Monad m => ByteString -> AudioMonad m SoundFile
decodeSoundFileBS bs = do
t <- getType bs
case t of
WavePCM -> fromSndFileCls (decode bs :: WaveFile)
_ -> Err.throwError UnknownFileTypeError
decodeSoundFileHinted :: Monad m => SndFileType -> ByteString -> AudioMonad m SoundFile
decodeSoundFileHinted hintSf bs = case hintSf of
WavePCM -> fromSndFileCls (decode bs :: WaveFile)
_ -> decodeSoundFileBS bs
getType :: Monad m => ByteString -> AudioMonad m SndFileType
getType bs = case (theNum) of
1 -> return WavePCM
_ -> Err.throwError UnknownFileTypeError
where
wave :: (Integer, Bool)
wave = (1, isWaveFile bs)
matchList = filter (\(_,y) -> y) $ [wave]
(theNum, _) = head matchList
getTypeFromName :: (Monad m) => FP.FilePath -> AudioMonad m SndFileType
getTypeFromName fName = case (map toUpper (FP.takeExtension fName)) of
"WAV" -> return WavePCM
"WAVE" -> return WavePCM
"AIF" -> return AIFF
"AIFF" -> return AIFF
_ -> Err.throwError UnknownFileTypeError