module Sound.Player.AudioPlay (
play,
pause,
resume,
stop
) where
import System.Process (ProcessHandle, StdStream(CreatePipe),
CreateProcess(std_err), createProcess, proc, terminateProcess)
import System.Posix (ProcessID)
import System.Posix.Signals (signalProcess)
import System.Process.Internals (ProcessHandle__(OpenHandle, ClosedHandle),
withProcessHandle)
play :: FilePath -> IO ProcessHandle
play path = do
(_, _, _, processHandle) <-
createProcess (proc "afplay" [path]) {
std_err = CreatePipe
}
return processHandle
pause :: ProcessHandle -> IO ()
pause ph =
maybe (return ()) (signalProcess 17) =<< getPid ph
resume :: ProcessHandle -> IO ()
resume ph =
maybe (return ()) (signalProcess 19) =<< getPid ph
stop :: ProcessHandle -> IO ()
stop = terminateProcess
getPid :: ProcessHandle -> IO (Maybe ProcessID)
getPid ph = withProcessHandle ph (return . go)
where
go (OpenHandle pid) = Just pid
go (ClosedHandle _) = Nothing