soxlib 0.0 → 0.0.1
raw patch · 2 files changed
+48/−22 lines, 2 filesdep ~containers
Dependency ranges changed: containers
Files
- soxlib.cabal +3/−3
- src/Sound/SoxLib.hs +45/−19
soxlib.cabal view
@@ -1,5 +1,5 @@ Name: soxlib-Version: 0.0+Version: 0.0.1 License: BSD3 License-File: LICENSE Author: Henning Thielemann <haskell@henning-thielemann.de>@@ -22,7 +22,7 @@ src/Sound/SoxLib/Template.h Source-Repository this- Tag: 0.0+ Tag: 0.0.1 Type: darcs Location: http://code.haskell.org/~thielema/soxlib/ @@ -38,7 +38,7 @@ -- that's the way to get compatibility between GHC 6.10 and 6.12 extensible-exceptions >=0.1.1 && <0.2, transformers >=0.2 && <0.4,- containers >=0.1 && <0.5,+ containers >=0.1 && <0.6, utility-ht >=0.0.5 && <0.1, base >=4 && <5
src/Sound/SoxLib.hs view
@@ -1,8 +1,8 @@ module Sound.SoxLib ( with, formatWith,- withRead, readStorableVector, readStorableVectorLazy,- withWrite, writeStorableVector, writeStorableVectorLazy,- seek,+ openRead, withRead, readStorableVector, readStorableVectorLazy,+ openWrite, withWrite, writeStorableVector, writeStorableVectorLazy,+ close, seek, FFI.Mode(..), FFI.ReadMode, FFI.WriteMode, ReaderInfo(..), defaultReaderInfo, WriterInfo(..), defaultWriterInfo,@@ -30,6 +30,8 @@ import qualified Data.StorableVector as SV import qualified Control.Monad.Trans.Cont as MC+import qualified Control.Monad.Trans.Class as MT+import Control.Functor.HT (void, ) import Control.Monad (when, ) import System.IO.Unsafe (unsafeInterleaveIO, )@@ -66,19 +68,25 @@ ReaderInfo -> FilePath -> (Ptr (FFI.Format FFI.ReadMode) -> IO a) -> IO a withRead info path =- MC.runContT $ do+ bracket (openRead info path) close++{- |+This function will never return a 'nullPtr'.+Instead it throws a user exception if the file cannot be opened.+-}+openRead ::+ ReaderInfo -> FilePath ->+ IO (Ptr (FFI.Format FFI.ReadMode))+openRead info path =+ flip MC.runContT return $ do si <- withMaybe U.with $ readerSignalInfo info enc <- withMaybe U.with $ readerEncodingInfo info cft <- withMaybe CStr.withCString $ fmap FFI.unFileType $ readerFileType info cpath <- MC.ContT $ CStr.withCString path- MC.ContT $- bracket- (do fmt <- FFI.openRead cpath si enc cft- if fmt==nullPtr- then throwDoesNotExist "SoxLib.withRead" path- else return fmt)- FFI.close+ MT.lift $+ checkHandle "SoxLib.openRead" path =<<+ FFI.openRead cpath si enc cft data WriterInfo =@@ -95,26 +103,44 @@ WriterInfo -> FilePath -> (Ptr (FFI.Format FFI.WriteMode) -> IO a) -> IO a withWrite info path =- MC.runContT $ do+ bracket (openWrite info path) close++{- |+This function will never return a 'nullPtr'.+Instead it throws a user exception if the file cannot be opened.+-}+openWrite ::+ WriterInfo -> FilePath ->+ IO (Ptr (FFI.Format FFI.WriteMode))+openWrite info path =+ flip MC.runContT return $ do si <- withMaybe U.with $ writerSignalInfo info enc <- withMaybe U.with $ writerEncodingInfo info cft <- withMaybe CStr.withCString $ fmap FFI.unFileType $ writerFileType info cpath <- MC.ContT $ CStr.withCString path- MC.ContT $- bracket- (do fmt <- FFI.openWrite cpath si enc cft nullPtr nullFunPtr- if fmt==nullPtr- then throwDoesNotExist "SoxLib.withWrite" path- else return fmt)- FFI.close+ MT.lift $+ checkHandle "SoxLib.openWrite" path =<<+ FFI.openWrite cpath si enc cft nullPtr nullFunPtr +checkHandle :: String -> FilePath -> Ptr a -> IO (Ptr a)+checkHandle name path fmt =+ if fmt==nullPtr+ then throwDoesNotExist name path+ else return fmt+ throwDoesNotExist :: String -> FilePath -> IO a throwDoesNotExist name path = ioError $ mkIOError doesNotExistErrorType name Nothing (Just path)++++close :: FFI.Mode mode => Ptr (FFI.Format mode) -> IO ()+close = void . FFI.close+ {- | Multi-channel data is interleaved.