packages feed

soxlib-0.0.1.2: demo/Demo.hs

module Main where

import qualified Sound.SoxLib as SoxLib

import qualified Data.StorableVector as SV
import Foreign.Storable (peek, )


writerInfo :: Int -> SoxLib.WriterInfo
writerInfo numChans =
   SoxLib.defaultWriterInfo {
      SoxLib.writerSignalInfo = Just $
         SoxLib.defaultSignalInfo {
            SoxLib.rate = Just 44100,
            SoxLib.channels = Just numChans,
            SoxLib.precision = Just 16
         }
   }

writeMono :: FilePath -> IO ()
writeMono filename =
   SoxLib.withWrite (writerInfo 1) filename $ \fmt ->
      let chunk = SV.iterateN 256 (128*256*256+) 0
      in  do SoxLib.writeStorableVector fmt chunk
             SoxLib.writeStorableVector fmt (SV.reverse chunk)

writeStereo :: FilePath -> IO ()
writeStereo filename =
   SoxLib.withWrite (writerInfo 2) filename $ \fmt ->
      let chunk = SV.iterateN 256 (128*256*256+) 0
      in  SoxLib.writeStorableVector fmt $
          SV.interleave [chunk, SV.reverse chunk]

readInfo :: FilePath -> IO ()
readInfo filename =
   SoxLib.withRead SoxLib.defaultReaderInfo filename $ \fmtPtr -> do
      fmt <- peek fmtPtr
      print $ SoxLib.encodingInfo fmt
      let si = SoxLib.signalInfo fmt
      print si
      case SoxLib.length si of
         Nothing -> putStrLn "unknown length"
         Just n ->
            print . SV.map (flip div (256*256*256)) =<<
               SoxLib.readStorableVector fmtPtr n

main :: IO ()
main = SoxLib.formatWith $ do
   let monoName = "mono.wav"
   let stereoName = "stereo.wav"
   writeMono monoName
   writeStereo stereoName
   readInfo monoName
   readInfo stereoName