diff --git a/conduit-audio-sndfile.cabal b/conduit-audio-sndfile.cabal
--- a/conduit-audio-sndfile.cabal
+++ b/conduit-audio-sndfile.cabal
@@ -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
diff --git a/src/Data/Conduit/Audio/Sndfile.hs b/src/Data/Conduit/Audio/Sndfile.hs
--- a/src/Data/Conduit/Audio/Sndfile.hs
+++ b/src/Data/Conduit/Audio/Sndfile.hs
@@ -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
