[Haskell-beginners] gtk2hs, inputAdd and forked process

Johann Giwer johanngiwer at web.de
Thu Jan 15 17:26:25 EST 2009

Some times ago I wrote a frontend for mpg123 using python and gtk2. Now
I'm trying to do the same in haskell, but my attempt failed in a very
early stage. 

I like to start a subprocess and read its output via 'inputAdd'. The
(simplified) code looks like this:

module Main (Main.main) where
import System.IO.UTF8 hiding (putStr, putStrLn, print)
import qualified Control.Exception as E
import System.Glib.MainLoop
import System.Environment
import System.Posix.Process
import System.Posix.IO
import System.Posix.Types
import Graphics.UI.Gtk

main :: IO ()
main = do
    name <- getProgName
    argv <- getArgs
    case argv of
        [file] -> play file
        _      -> putStrLn $ "Usage: " ++ name ++ " MP3 FILE"

play :: FilePath -> IO ()
play file = do
    (r0,w0) <- createPipe
    (r1,w1) <- createPipe
    pid <- forkProcess $ do
        closeFd w0
        closeFd r1
        dupTo r0 stdInput
        dupTo w1 stdOutput
        executeFile "mpg123" True ["--output", "alsa", "--remote"] Nothing
    closeFd w1
    closeFd r0

    window <- windowNew
    onDestroy window mainQuit
    button <- buttonNew
    set button [ buttonLabel := "Play" ]
    onClicked button $ do
        w <- fdToHandle w0
        E.handle ( \e -> print e ) $ do
            hPutStrLn w ( "L " ++ file )
        return ()
    set window [ containerChild := button ]
    widgetShowAll window

    inputAdd (fromIntegral r1) [ IOIn,IOPri ] priorityHigh ( readData r1 ) 


readData :: Fd -> IO Bool
readData h = do
    E.handle ( \e ->  print e >> return True ) $ do
        (s,_) <- fdRead h 1
        putStr s 
        return False

When loading the file in ghci, I get half a second of sound and a couple of
status message lines. Compiled with ghc, this program gives absolute no output
(So threading seams to be the problem?). 

In a next step, I wrapped every IO action in the main process in a call
of 'forkIO' and used MVars for the file name and descriptors, but that
doesn't help. 

Does anybody have experience with 'inputAdd' and forked processes?

Thanks in advance


More information about the Beginners mailing list