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