{-# 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