import Sound.Alsa (SoundFmt(SoundFmt), copySound, sampleFreq, fileSoundSink, fileSoundSource, alsaSoundSink, alsaSoundSource, ) import Control.Concurrent (forkOS, threadDelay, ) import System.Environment (getArgs, ) import System.Exit (exitFailure, ) import System.IO (hPutStrLn, stderr, ) import Data.Int (Int16, ) bufSize :: Int bufSize = 4096 soundFormat :: SoundFmt Int16 soundFormat = SoundFmt { sampleFreq = 8000 } main :: IO () main = do args <- getArgs case args of [infile,outfile] -> duplex infile outfile _ -> do hPutStrLn stderr "Usage: duplex " exitFailure duplex :: FilePath -> FilePath -> IO () duplex infile outfile = do forkOS (play infile) forkOS (record outfile) threadDelay 5000000 return () play :: FilePath -> IO () play file = do let source = fileSoundSource file soundFormat sink = alsaSoundSink "plughw:0,0" soundFormat copySound source sink bufSize record :: FilePath -> IO () record file = do let source = alsaSoundSource "plughw:0,0" soundFormat sink = fileSoundSink file soundFormat copySound source sink bufSize