{-# LANGUAGE CPP #-}
module Media.Win32
( module Media.Win32
) where
import Control.Monad ( unless )
import Prelude hiding ( ioError, userError )
import System.IO.Error ( ioError, userError )
import System.Win32.Encoding ( encodeMultiByte, getCurrentCodePage )
import System.Win32.Types
import System.Win32.String ( withTStringBufferLen )
type MCIERROR = DWORD
#include "windows_cconv.h"
mciSendString :: String -> IO ()
mciSendString cmd
= withTString cmd $ \sendCmd -> do
err <- c_mciSendString sendCmd nullPtr 0 nullPtr
unless (err == 0)
$ mciGetErrorString err
foreign import WINDOWS_CCONV safe "windows.h mciSendStringW"
c_mciSendString :: LPCTSTR -> LPTSTR -> UINT -> HANDLE -> IO MCIERROR
mciGetErrorString :: MCIERROR -> IO ()
mciGetErrorString err
= withTStringBufferLen 256 $ \(cstr, len) -> do
failIfFalse_ (unwords ["mciGetErrorString", show err]) $
c_mciGetErrorString err cstr $ fromIntegral len
msg <- peekTString cstr
cp <- getCurrentCodePage
ioError $ userError $ encodeMultiByte cp msg
foreign import WINDOWS_CCONV unsafe "windows.h mciGetErrorStringW"
c_mciGetErrorString :: MCIERROR -> LPTSTR -> UINT -> IO BOOL