module Sox.Play where
import qualified BinarySample as BinSmp
import qualified Sox as Sox
import System.IO(IO)
import qualified System.IO as IO
import qualified System.Process as Proc
import Control.Exception(bracket)
import qualified System.Posix.Signals as Signals
import qualified Algebra.RealField as RealField
import PreludeBase
import NumericPrelude
autoR :: (RealField.C a, BinSmp.C v) => a -> (a -> [v]) -> IO ()
autoR sampleRate renderer =
auto sampleRate (renderer sampleRate)
monoR :: (RealField.C a) => a -> (a -> [a]) -> IO ()
monoR sampleRate renderer =
mono sampleRate (renderer sampleRate)
stereoR :: (RealField.C a) => a -> (a -> [(a,a)]) -> IO ()
stereoR sampleRate renderer =
stereo sampleRate (renderer sampleRate)
auto :: (RealField.C a, BinSmp.C v) => a -> [v] -> IO ()
auto sampleRate signal =
raw [] sampleRate (BinSmp.numChannels (head signal))
(BinSmp.signalToBinary signal)
mono :: (RealField.C a) => a -> [a] -> IO ()
mono sampleRate signal =
raw [] sampleRate 1 (BinSmp.signalToBinaryMono signal)
stereo :: (RealField.C a) => a -> [(a,a)] -> IO ()
stereo sampleRate signal =
raw [] sampleRate 2 (BinSmp.signalToBinaryStereo signal)
catchCtrlC :: IO Signals.Handler
catchCtrlC =
Signals.installHandler Signals.sigPIPE
Signals.Ignore Nothing
raw :: (RealField.C a) => [String] -> a -> Int -> [Int] -> IO ()
raw args sampleRate numChannels stream =
bracket
(Proc.runInteractiveProcess "play"
(Sox.channelOption numChannels ++
Sox.sampleRateOption sampleRate ++
["-t","sw","-"] ++ args)
Nothing Nothing)
(\(input,output,err,proc) -> do
mapM IO.hClose [input, output, err]
Proc.waitForProcess proc)
(\(input,_,_,_) ->
catchCtrlC >>
BinSmp.putInt16Stream input stream)
example :: IO ()
example = auto (11025::Double) (map sin [0::Double,0.1..])