{-# LANGUAGE CPP #-}
{- |

   Module      :  Media.Win32

   Copyright   :  2012 shelarcy

   License     :  BSD-style



   Maintainer  :  shelarcy@gmail.com

   Stability   :  Provisional

   Portability :  Non-portable (Win32 API)



   Multimedia API. TODO: provide more functions ...

-}

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