diff --git a/conduit-audio-lame.cabal b/conduit-audio-lame.cabal
--- a/conduit-audio-lame.cabal
+++ b/conduit-audio-lame.cabal
@@ -1,5 +1,5 @@
 name:                 conduit-audio-lame
-version:              0.1.0.1
+version:              0.1.1
 author:               Michael Tolly
 maintainer:           miketolly@gmail.com
 license:              LGPL
diff --git a/src/Data/Conduit/Audio/LAME.hs b/src/Data/Conduit/Audio/LAME.hs
--- a/src/Data/Conduit/Audio/LAME.hs
+++ b/src/Data/Conduit/Audio/LAME.hs
@@ -14,19 +14,26 @@
 import qualified Data.ByteString as B
 import Foreign
 import qualified System.IO as IO
+import Control.Monad.Trans.Class (lift)
 
--- | Saves an audio stream to an MP3 file.
+-- | Saves an audio stream to an MP3 file. Uses the default VBR mode.
 sinkMP3 :: (MonadResource m) => FilePath -> A.AudioSource m Float -> m ()
-sinkMP3 fp (A.AudioSource s r c _) = (C.$$) s
+sinkMP3 fp = sinkMP3WithHandle fp $ \lame -> liftIO $ L.check $ L.setVBR lame L.VbrDefault
+
+-- | Lets you perform arbitrary setup on the `lame` handle before encoding.
+-- You must select a quality somewhere in the setup action,
+-- such as with 'L.setVBR'.
+sinkMP3WithHandle :: (MonadResource m) => FilePath -> (L.LAME -> m ()) -> A.AudioSource m Float -> m ()
+sinkMP3WithHandle fp setup (A.AudioSource s r c _) = (C.$$) s
   $ C.bracketP L.init (L.check . L.close)
   $ \lame -> C.bracketP (IO.openBinaryFile fp IO.WriteMode) IO.hClose
     $ \fout -> do
       let o = liftIO . L.check
       o $ L.setInSamplerate lame $ round r
-      unless (c `elem ` [1, 2]) $ error $
-        "sinkMP3: only 1 or 2 channels are supported (" ++ show c ++ " given)"
+      unless (c `elem ` [1, 2]) $ err $
+        "only 1 or 2 channels are supported (" ++ show c ++ " given)"
       o $ L.setNumChannels lame c
-      o $ L.setVBR lame L.VbrDefault
+      lift $ setup lame
       o $ L.initParams lame
       fix $ \loop -> C.await >>= \mx -> case mx of
         Nothing -> liftIO $ do
@@ -37,7 +44,7 @@
           IO.hSeek fout IO.AbsoluteSeek 0
           tags <- allocaArray 100000 $ \buf -> do
             len <- L.getLametagFrame lame (castPtr buf) 100000
-            when (len < 0) $ error "sinkMP3: couldn't get lame tag frame (buffer too small)"
+            when (len < 0) $ err "couldn't get lame tag frame (buffer too small)"
             B.packCStringLen (buf, fromIntegral len)
           B.hPutStr fout tags
         Just v -> do
@@ -48,8 +55,8 @@
               len <- case c of
                 1 -> L.encodeBufferIeeeFloat lame (castPtr p) nullPtr nsamples (castPtr buf) mp3bufsize
                 _ -> L.encodeBufferInterleavedIeeeFloat lame (castPtr p) nsamples (castPtr buf) mp3bufsize
-              when (len < 0) $ error $
-                "sinkMP3: encode function returned " ++ show len ++ "; " ++ case len of
+              when (len < 0) $ err $
+                "encode function returned " ++ show len ++ "; " ++ case len of
                   -1 -> "mp3buf was too small"
                   -2 -> "malloc() problem"
                   -3 -> "lame_init_params() not called"
@@ -58,3 +65,4 @@
               B.packCStringLen (buf, len)
             B.hPutStr fout bs
           loop
+  where err = error . ("Conduit.Audio.LAME.sinkMP3WithHandle: " ++)
