packages feed

conduit-audio-sndfile 0.1.2.1 → 0.1.2.2

raw patch · 2 files changed

+25/−18 lines, 2 files

Files

conduit-audio-sndfile.cabal view
@@ -1,5 +1,5 @@ name:                 conduit-audio-sndfile-version:              0.1.2.1+version:              0.1.2.2 author:               Michael Tolly maintainer:           miketolly@gmail.com license:              BSD3@@ -22,7 +22,7 @@   exposed-modules:     Data.Conduit.Audio.Sndfile   build-depends:-    base >= 4.6 && < 4.11+    base >= 4.6 && < 5     , conduit     , conduit-audio >= 0.1 && < 0.3     , hsndfile
src/Data/Conduit/Audio/Sndfile.hs view
@@ -3,23 +3,24 @@ , sinkSnd, sinkSndWithHandle ) where -import Data.Conduit.Audio-import qualified Data.Conduit as C-import qualified Data.Conduit.List as CL-import qualified Sound.File.Sndfile as Snd+import           Control.Monad                    (void)+import           Control.Monad.Fix                (fix)+import           Control.Monad.IO.Class+import           Control.Monad.Trans.Class        (lift)+import           Control.Monad.Trans.Resource     (MonadResource)+import           Data.Conduit                     ((.|))+import qualified Data.Conduit                     as C+import           Data.Conduit.Audio+import qualified Data.Conduit.List                as CL+import qualified Sound.File.Sndfile               as Snd import qualified Sound.File.Sndfile.Buffer.Vector as SndBuf-import Control.Monad.IO.Class-import Control.Monad.Trans.Class (lift)-import Control.Monad (void)-import Control.Monad.Fix (fix)-import Control.Monad.Trans.Resource (MonadResource)  -- | Uses @libsndfile@ to load an audio file as a stream. sourceSnd   :: (MonadResource m, Snd.Sample a)   => FilePath   -> IO (AudioSource m a)-sourceSnd = sourceSndFrom $ Frames 0+sourceSnd fp = sourceSndWithHandle fp $ \_ -> return ()  -- | Lets you specify a position to start from in the file. sourceSndFrom@@ -28,12 +29,18 @@   -- ^ Initial position to seek to in the file (more efficient than using 'dropStart')   -> FilePath   -> IO (AudioSource m a)-sourceSndFrom (Seconds secs) fp = do+sourceSndFrom pos fp = do   info <- Snd.getFileInfo fp-  sourceSndFrom (Frames $ secondsToFrames secs $ fromIntegral $ Snd.samplerate info) fp-sourceSndFrom (Frames fms) fp = do-  src <- sourceSndWithHandle fp $ \h -> liftIO $ void $ Snd.hSeek h Snd.AbsoluteSeek fms-  return src{ frames = frames src - fms }+  let fms = case pos of+        Seconds secs -> secondsToFrames secs $ fromIntegral $ Snd.samplerate info+        Frames  fms' -> fms'+  if Snd.frames info <= fms+    then do+      src <- sourceSndWithHandle fp $ \_ -> return ()+      return src{ frames = 0, source = return () `asTypeOf` source src }+    else do+      src <- sourceSndWithHandle fp $ \h -> liftIO $ void $ Snd.hSeek h Snd.AbsoluteSeek fms+      return src{ frames = frames src - fms }  -- | Lets you perform arbitrary setup on the @libsndfile@ handle before decoding. sourceSndWithHandle@@ -71,7 +78,7 @@   -> (Snd.Handle -> m ())   -> AudioSource m a   -> m ()-sinkSndWithHandle fp fmt setup (AudioSource s r c _) = s C.$$ do+sinkSndWithHandle fp fmt setup (AudioSource s r c _) = C.runConduit $ (s .|) $ do   C.bracketP     (Snd.openFile fp Snd.WriteMode $ Snd.defaultInfo       { Snd.format     = fmt