module Sound.MikMod.Sample where
import Foreign.Ptr
import Foreign.Storable
import Foreign.C.Types
import Foreign.C.String
import Data.Functor
import Control.Applicative
import Sound.MikMod.Synonyms
import Sound.MikMod.Types
import Sound.MikMod.Flags
panLeft :: Pan
panLeft = Pan $ fromIntegral (0)
panRight :: Pan
panRight = Pan $ fromIntegral (255)
packPan :: Pan -> SWORD
packPan (Pan n) = fromIntegral n
packPan PanSurround = (512)
unpackPan :: SWORD -> Pan
unpackPan n | n == (512) = PanSurround
| n >= 0 && n <= 255 = Pan (fromIntegral n)
| otherwise = error ("unpackPan " ++ show n)
getSampleInfo :: SampleHandle -> IO SampleInfo
getSampleInfo ptr = SampleInfo <$>
(unpackPan <$> ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr) <*>
(fromIntegral <$> (((\hsc_ptr -> peekByteOff hsc_ptr 4)) ptr :: IO ULONG)) <*>
(fromIntegral <$> (((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr :: IO UBYTE)) <*>
(unpackFlags <$> ((\hsc_ptr -> peekByteOff hsc_ptr 12)) ptr) <*>
(unpackFlags <$> ((\hsc_ptr -> peekByteOff hsc_ptr 10)) ptr) <*>
(fromIntegral <$> (((\hsc_ptr -> peekByteOff hsc_ptr 16)) ptr :: IO ULONG)) <*>
(fromIntegral <$> (((\hsc_ptr -> peekByteOff hsc_ptr 20)) ptr :: IO ULONG)) <*>
(fromIntegral <$> (((\hsc_ptr -> peekByteOff hsc_ptr 24)) ptr :: IO ULONG))
setSamplePanning :: SampleHandle -> Pan -> IO ()
setSamplePanning samp pan = ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) samp (packPan pan)
getSamplePanning :: SampleHandle -> IO Pan
getSamplePanning samp = unpackPan <$> ((\hsc_ptr -> peekByteOff hsc_ptr 0)) samp
setSampleSpeed :: SampleHandle -> Int -> IO ()
setSampleSpeed samp speed = ((\hsc_ptr -> pokeByteOff hsc_ptr 4)) samp (fromIntegral speed :: ULONG)
getSampleSpeed :: SampleHandle -> IO Int
getSampleSpeed samp = fromIntegral <$> (((\hsc_ptr -> peekByteOff hsc_ptr 4)) samp :: IO ULONG)
setSampleVolume :: SampleHandle -> Int -> IO ()
setSampleVolume samp vol = ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) samp (fromIntegral vol :: UBYTE)
getSampleVolume :: SampleHandle -> IO Int
getSampleVolume samp = fromIntegral <$> (((\hsc_ptr -> peekByteOff hsc_ptr 8)) samp :: IO UBYTE)
modifySampleFlags :: SampleHandle -> ([SampleFlag] -> [SampleFlag]) -> IO ()
modifySampleFlags samp f = do
flags <- getSampleInFlags samp
setSampleFlags samp (f flags)
setSampleFlags :: SampleHandle -> [SampleFlag] -> IO ()
setSampleFlags samp flags = ((\hsc_ptr -> pokeByteOff hsc_ptr 12)) samp (packFlags flags)
getSampleFlags :: SampleHandle -> IO [SampleFlag]
getSampleFlags samp = unpackFlags <$> ((\hsc_ptr -> peekByteOff hsc_ptr 12)) samp
getSampleInFlags :: SampleHandle -> IO [SampleFlag]
getSampleInFlags samp = unpackFlags <$> ((\hsc_ptr -> peekByteOff hsc_ptr 10)) samp
getSampleLength :: SampleHandle -> IO Int
getSampleLength samp = fromIntegral <$> (((\hsc_ptr -> peekByteOff hsc_ptr 16)) samp :: IO ULONG)
setSampleLoopStart :: SampleHandle -> Int -> IO ()
setSampleLoopStart samp start = ((\hsc_ptr -> pokeByteOff hsc_ptr 20)) samp (fromIntegral start :: ULONG)
getSampleLoopStart :: SampleHandle -> IO Int
getSampleLoopStart samp = fromIntegral <$> (((\hsc_ptr -> peekByteOff hsc_ptr 20)) samp :: IO ULONG)
setSampleLoopEnd :: SampleHandle -> Int -> IO ()
setSampleLoopEnd samp end = ((\hsc_ptr -> pokeByteOff hsc_ptr 24)) samp (fromIntegral end :: ULONG)
getSampleLoopEnd :: SampleHandle -> IO Int
getSampleLoopEnd samp = fromIntegral <$> (((\hsc_ptr -> peekByteOff hsc_ptr 24)) samp :: IO ULONG)