-- GENERATED by C->Haskell Compiler, version 0.16.0 Crystal Seed, 24 Jan 2009 (Haskell)
-- Edit the ORIGNAL .chs file instead!


{-# LINE 1 "src/Sound/Jack/RawBindings.chs" #-}-- Haskell bindings to the JACK Audio Connection Kit 
--
-- Copyright (c) 2010 Philipp Balzarek (p.balzarek@googlemail.com)
--
-- License: MIT; See LICENSE file
--
-- Description
--
-- Language : Haskell 98
--
-- This module provides low level language bindings to the 
-- Jack Audio Connection Kit (http://jackaudio.org ). 
-- It is intended to be a faithfull representation of the C include files.
-- Parameters are converted only where the meaning is obvious. 

{-# LANGUAGE ForeignFunctionInterface #-}




module Sound.Jack.RawBindings 
  ( clientOpenWithDefaultServer
  , clientOpenWithServerName
  , clientClose
  , clientNameSize
  , getClientName
  , internalClientNew
  , internalClientClose
  , activate
  , deactivate
  , clientThreadId
  , isRealtime
  , cycleWait
  , cycleSignal
  , setProcessThread
  , setThreadInitCallback
  , setProcessCallback
  , setFreewheelCallback
  , setBufferSizeCallback
  , setSampleRateCallback
  , setClientRegistrationCallback
  , setPortRegistrationCallback
  , setPortConnectCallback
  , setGraphOrderCallback
  , setXrunCallback
  , setFreewheel
  , setBufferSize
  , getSampleRate
  , getBufferSize
  , engineTakeoverTimebase
  , cpuLoad
  , portRegister
  , portUnregister
  , portGetBuffer
  , portName
  , portShortName
  , portFlags
  , portType
  , portIsMine
  , portConnected
  , portGetConnections
  , portGetAllConnections
  , jackPortGetLatency
  , jackPortGetTotalLatency
  , portSetLatency
  , recomputeTotalLatencies
  , portSetName
  , portSetAlias
  , portUnsetAlias
  , portRequestMonitor
  , portRequestMonitorByName
  , portEnsureMonitor
  , portMonitoringInput
  , connect
  , disconnect
  , portDisconnect
  , portNameSize
  , portTypeSize
  , getPorts
  , portByName
  , portById
  , framesSinceCycleStart
  , frameTime
  , framesToTime
  , timeToFrames
  , getTime

  , Port
  , PortFlags(..)
  , AudioSample
  , BufferSizeCallbackPtr
  , ClientRegistrationCallbackPtr
  , FreewheelCallbackPtr
  , GraphOrderCallbackPtr
  , PortConnectCallbackPtr
  , PortRegistrationCallbackPtr
  , ProcessCallbackPtr
  , SampleRateCallbackPtr
  , ThreadCallbackPtr
  , ThreadInitCallbackPtr
  , XRunCallbackPtr
  , Options(..)
  , Client                   -- opaque
  , Status(..)
  , PortID                   -- opaque
  , defaultAudioType
  , defaultMidiType
  , fromPThread
  , NFrames
  , PThread
  , Time
  ) where

import C2HS
import Control.Monad


{-# LINE 119 "src/Sound/Jack/RawBindings.chs" #-}

defaultAudioType :: String
defaultAudioType = "32 bit float mono audio"

defaultMidiType :: String
defaultMidiType = "8 bit raw midi"

-- | Opaque.
newtype Client = Client { fromClient :: (Ptr ()) } 

-- deprecated:
-- client_new 

type AudioSample = (CFloat)
{-# LINE 133 "src/Sound/Jack/RawBindings.chs" #-}

data Options = NullOption
             | NoStartServer
             | UseExactName
             | ServerName
             | LoadName
             | LoadInit
             deriving (Eq,Read,Show)
instance Enum Options where
  fromEnum NullOption = 0
  fromEnum NoStartServer = 1
  fromEnum UseExactName = 2
  fromEnum ServerName = 4
  fromEnum LoadName = 8
  fromEnum LoadInit = 16

  toEnum 0 = NullOption
  toEnum 1 = NoStartServer
  toEnum 2 = UseExactName
  toEnum 4 = ServerName
  toEnum 8 = LoadName
  toEnum 16 = LoadInit
  toEnum unmatched = error ("Options.toEnum: Cannot match " ++ show unmatched)

{-# LINE 135 "src/Sound/Jack/RawBindings.chs" #-}
data Status = Failure
            | InvalidOption
            | NameNotUnique
            | ServerStarted
            | ServerFailed
            | ServerError
            | NoSuchClient
            | LoadFailure
            | InitFailure
            | ShmFailure
            | VersionError
            | BackendError
            | ClientZombie
            deriving (Eq,Read,Show)
instance Enum Status where
  fromEnum Failure = 1
  fromEnum InvalidOption = 2
  fromEnum NameNotUnique = 4
  fromEnum ServerStarted = 8
  fromEnum ServerFailed = 16
  fromEnum ServerError = 32
  fromEnum NoSuchClient = 64
  fromEnum LoadFailure = 128
  fromEnum InitFailure = 256
  fromEnum ShmFailure = 512
  fromEnum VersionError = 1024
  fromEnum BackendError = 2048
  fromEnum ClientZombie = 4096

  toEnum 1 = Failure
  toEnum 2 = InvalidOption
  toEnum 4 = NameNotUnique
  toEnum 8 = ServerStarted
  toEnum 16 = ServerFailed
  toEnum 32 = ServerError
  toEnum 64 = NoSuchClient
  toEnum 128 = LoadFailure
  toEnum 256 = InitFailure
  toEnum 512 = ShmFailure
  toEnum 1024 = VersionError
  toEnum 2048 = BackendError
  toEnum 4096 = ClientZombie
  toEnum unmatched = error ("Status.toEnum: Cannot match " ++ show unmatched)

{-# LINE 136 "src/Sound/Jack/RawBindings.chs" #-}

statusList :: [Status]
statusList = [ Failure, InvalidOption, NameNotUnique, ServerStarted
              , ServerFailed, ServerError, NoSuchClient, LoadFailure
              , InitFailure, ShmFailure, VersionError]

extractStatusMasks :: (Bits a, Storable a) => Ptr a -> IO [Status]
extractStatusMasks = peek >=> \bits ->
  return [bm | bm <- statusList, bits `containsBitMask` bm]

-------------------------

-- #c
-- // Wrapper for jack_client_open which uses varargs aka "The horror from below"
-- // Someone should tell those chaps that cool kids don't use vararg 
-- jack_client_t *jack_client_open_with_defaultserver(const char *client_name, 
--   jack_options_t options, jack_status_t *status) {
--    jack_client_open(client_name, options, status);
--   }
-- #endc 

-- | open an external client with the defailt server
clientOpenWithDefaultServer :: String -> [Options] -> IO (Client, [Status])
clientOpenWithDefaultServer a1 a2 =
  withCString a1 $ \a1' -> 
  let {a2' = combineBitMasks a2} in 
  alloca $ \a3' -> 
  clientOpenWithDefaultServer'_ a1' a2' a3' >>= \res ->
  extractStatusMasks a3'>>= \a3'' -> 
  let {res' = Client res} in
  return (res', a3'')
{-# LINE 161 "src/Sound/Jack/RawBindings.chs" #-}

------------------------


-- #c
-- // Let's just hope no one ever needs more than one server... 
-- jack_client_t *jack_client_open_with_server_name(const char *client_name, 
--   jack_options_t options, jack_status_t *status, const char* server) {
--    jack_client_open(client_name, options, status, server);
--   }
-- #endc 


-- | open an external client with the specified server
clientOpenWithServerName :: String -> [Options] -> String -> IO (Client, [Status])
clientOpenWithServerName a1 a2 a4 =
  withCString a1 $ \a1' -> 
  let {a2' = combineBitMasks a2} in 
  alloca $ \a3' -> 
  withCString a4 $ \a4' -> 
  clientOpenWithServerName'_ a1' a2' a3' a4' >>= \res ->
  extractStatusMasks a3'>>= \a3'' -> 
  let {res' = Client res} in
  return (res', a3'')
{-# LINE 180 "src/Sound/Jack/RawBindings.chs" #-}

-------------------------

clientClose :: Client -> IO ()
clientClose a1 =
  let {a1' = fromClient a1} in 
  clientClose'_ a1' >>= \res ->
  return ()
{-# LINE 185 "src/Sound/Jack/RawBindings.chs" #-}

clientNameSize :: IO (Int)
clientNameSize =
  clientNameSize'_ >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 188 "src/Sound/Jack/RawBindings.chs" #-}

getClientName :: Client -> IO (String)
getClientName a1 =
  let {a1' = fromClient a1} in 
  getClientName'_ a1' >>= \res ->
  peekCString res >>= \res' ->
  return (res')
{-# LINE 191 "src/Sound/Jack/RawBindings.chs" #-}

-- | DEPRECATED. Use internalClientOpen
internalClientNew :: String -> String -> String -> IO (Int)
internalClientNew a1 a2 a3 =
  withCString a1 $ \a1' -> 
  withCString a2 $ \a2' -> 
  withCString a3 $ \a3' -> 
  internalClientNew'_ a1' a2' a3' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 195 "src/Sound/Jack/RawBindings.chs" #-}

-- | DEPRECATED. use internalClientLoad
internalClientClose :: String -> IO ()
internalClientClose a1 =
  withCString a1 $ \a1' -> 
  internalClientClose'_ a1' >>= \res ->
  return ()
{-# LINE 199 "src/Sound/Jack/RawBindings.chs" #-}

activate :: Client -> IO (Int)
activate a1 =
  let {a1' = fromClient a1} in 
  activate'_ a1' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 202 "src/Sound/Jack/RawBindings.chs" #-}

deactivate :: Client -> IO (Int)
deactivate a1 =
  let {a1' = fromClient a1} in 
  deactivate'_ a1' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 205 "src/Sound/Jack/RawBindings.chs" #-}

newtype PThread = PThread { fromPThread :: (CULong) }

clientThreadId :: Client -> IO (PThread)
clientThreadId a1 =
  let {a1' = fromClient a1} in 
  clientThreadId'_ a1' >>= \res ->
  let {res' = PThread res} in
  return (res')
{-# LINE 210 "src/Sound/Jack/RawBindings.chs" #-}

isRealtime :: Client -> IO (Bool)
isRealtime a1 =
  let {a1' = fromClient a1} in 
  isRealtime'_ a1' >>= \res ->
  let {res' = cToBool res} in
  return (res')
{-# LINE 213 "src/Sound/Jack/RawBindings.chs" #-}

-- deprecated:
-- thread_wait 

type NFrames =  (CUInt) 

cycleWait :: Client -> IO (Word32)
cycleWait a1 =
  let {a1' = fromClient a1} in 
  cycleWait'_ a1' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 221 "src/Sound/Jack/RawBindings.chs" #-}

cycleSignal :: Client -> Int -> IO ()
cycleSignal a1 a2 =
  let {a1' = fromClient a1} in 
  let {a2' = cIntConv a2} in 
  cycleSignal'_ a1' a2' >>= \res ->
  return ()
{-# LINE 224 "src/Sound/Jack/RawBindings.chs" #-}

type ThreadCallbackPtr = ((FunPtr ((Ptr ()) -> (IO (Ptr ())))))
{-# LINE 226 "src/Sound/Jack/RawBindings.chs" #-}
setProcessThread :: Client -> ThreadCallbackPtr -> Ptr () -> IO (Int)
setProcessThread a1 a2 a3 =
  let {a1' = fromClient a1} in 
  let {a2' = id a2} in 
  let {a3' = id a3} in 
  setProcessThread'_ a1' a2' a3' >>= \res ->
  let {res' = cIntConv res} in
  return (res') 

type ThreadInitCallbackPtr =  ((FunPtr ((Ptr ()) -> (IO ())))) 

setThreadInitCallback :: Client -> ThreadInitCallbackPtr -> Ptr () -> IO (Int)
setThreadInitCallback a1 a2 a3 =
  let {a1' = fromClient a1} in 
  let {a2' = id a2} in 
  let {a3' = id a3} in 
  setThreadInitCallback'_ a1' a2' a3' >>= \res ->
  let {res' = cIntConv res} in
  return (res') 

-- TODO:
-- thread_on_shutdown

type ProcessCallbackPtr = ((FunPtr (CUInt -> ((Ptr ()) -> (IO CInt)))))
{-# LINE 245 "src/Sound/Jack/RawBindings.chs" #-}

setProcessCallback :: Client -> ProcessCallbackPtr -> Ptr () -> IO (Int)
setProcessCallback a1 a2 a3 =
  let {a1' = fromClient a1} in 
  let {a2' = id a2} in 
  let {a3' = id a3} in 
  setProcessCallback'_ a1' a2' a3' >>= \res ->
  let {res' = cIntConv res} in
  return (res') 


type FreewheelCallbackPtr = ((FunPtr (CInt -> ((Ptr ()) -> (IO ()))))) 

setFreewheelCallback :: Client -> FreewheelCallbackPtr -> (Ptr ()) -> IO (Int)
setFreewheelCallback a1 a2 a3 =
  let {a1' = fromClient a1} in 
  let {a2' = id a2} in 
  let {a3' = id a3} in 
  setFreewheelCallback'_ a1' a2' a3' >>= \res ->
  let {res' = cIntConv res} in
  return (res') 

type BufferSizeCallbackPtr = ((FunPtr (CUInt -> ((Ptr ()) -> (IO CInt))))) 

setBufferSizeCallback :: Client -> BufferSizeCallbackPtr -> (Ptr ()) -> IO (Int)
setBufferSizeCallback a1 a2 a3 =
  let {a1' = fromClient a1} in 
  let {a2' = id a2} in 
  let {a3' = id a3} in 
  setBufferSizeCallback'_ a1' a2' a3' >>= \res ->
  let {res' = cIntConv res} in
  return (res') 


type SampleRateCallbackPtr = ((FunPtr (CUInt -> ((Ptr ()) -> (IO CInt))))) 

setSampleRateCallback :: Client -> SampleRateCallbackPtr -> (Ptr ()) -> IO (Int)
setSampleRateCallback a1 a2 a3 =
  let {a1' = fromClient a1} in 
  let {a2' = id a2} in 
  let {a3' = id a3} in 
  setSampleRateCallback'_ a1' a2' a3' >>= \res ->
  let {res' = cIntConv res} in
  return (res') 


type ClientRegistrationCallbackPtr = ((FunPtr ((Ptr CChar) -> (CInt -> ((Ptr ()) -> (IO ())))))) 

setClientRegistrationCallback :: Client -> ClientRegistrationCallbackPtr -> (Ptr ()) -> IO (Int)
setClientRegistrationCallback a1 a2 a3 =
  let {a1' = fromClient a1} in 
  let {a2' = id a2} in 
  let {a3' = id a3} in 
  setClientRegistrationCallback'_ a1' a2' a3' >>= \res ->
  let {res' = cIntConv res} in
  return (res') 

type PortRegistrationCallbackPtr = ((FunPtr (CUInt -> (CInt -> ((Ptr ()) -> (IO ())))))) 

setPortRegistrationCallback :: Client -> PortRegistrationCallbackPtr -> (Ptr ()) -> IO (Int)
setPortRegistrationCallback a1 a2 a3 =
  let {a1' = fromClient a1} in 
  let {a2' = id a2} in 
  let {a3' = id a3} in 
  setPortRegistrationCallback'_ a1' a2' a3' >>= \res ->
  let {res' = cIntConv res} in
  return (res') 

type PortConnectCallbackPtr = ((FunPtr (CUInt -> (CUInt -> (CInt -> ((Ptr ()) -> (IO ())))))))
{-# LINE 296 "src/Sound/Jack/RawBindings.chs" #-}

setPortConnectCallback :: Client -> PortConnectCallbackPtr -> (Ptr ()) -> IO (Int)
setPortConnectCallback a1 a2 a3 =
  let {a1' = fromClient a1} in 
  let {a2' = id a2} in 
  let {a3' = id a3} in 
  setPortConnectCallback'_ a1' a2' a3' >>= \res ->
  let {res' = cIntConv res} in
  return (res') 

type GraphOrderCallbackPtr = ((FunPtr ((Ptr ()) -> (IO CInt)))) 

setGraphOrderCallback :: Client -> GraphOrderCallbackPtr -> (Ptr ()) -> IO (Int)
setGraphOrderCallback a1 a2 a3 =
  let {a1' = fromClient a1} in 
  let {a2' = id a2} in 
  let {a3' = id a3} in 
  setGraphOrderCallback'_ a1' a2' a3' >>= \res ->
  let {res' = cIntConv res} in
  return (res') 


type XRunCallbackPtr = ((FunPtr ((Ptr ()) -> (IO CInt)))) 

setXrunCallback :: Client -> XRunCallbackPtr -> (Ptr ()) -> IO (Int)
setXrunCallback a1 a2 a3 =
  let {a1' = fromClient a1} in 
  let {a2' = id a2} in 
  let {a3' = id a3} in 
  setXrunCallback'_ a1' a2' a3' >>= \res ->
  let {res' = cIntConv res} in
  return (res') 

setFreewheel :: Client -> Bool -> IO (Int)
setFreewheel a1 a2 =
  let {a1' = fromClient a1} in 
  let {a2' = cFromBool a2} in 
  setFreewheel'_ a1' a2' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 322 "src/Sound/Jack/RawBindings.chs" #-}

setBufferSize :: Client -> Word32 -> IO (Int)
setBufferSize a1 a2 =
  let {a1' = fromClient a1} in 
  let {a2' = cIntConv a2} in 
  setBufferSize'_ a1' a2' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 325 "src/Sound/Jack/RawBindings.chs" #-}

getSampleRate :: Client -> IO (CUInt)
getSampleRate a1 =
  let {a1' = fromClient a1} in 
  getSampleRate'_ a1' >>= \res ->
  let {res' = fromIntegral res} in
  return (res')
{-# LINE 328 "src/Sound/Jack/RawBindings.chs" #-}

getBufferSize :: Client -> IO (Word32)
getBufferSize a1 =
  let {a1' = fromClient a1} in 
  getBufferSize'_ a1' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 331 "src/Sound/Jack/RawBindings.chs" #-}

engineTakeoverTimebase :: Client -> IO (Int)
engineTakeoverTimebase a1 =
  let {a1' = fromClient a1} in 
  engineTakeoverTimebase'_ a1' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 334 "src/Sound/Jack/RawBindings.chs" #-}

cpuLoad :: Client -> IO (Float)
cpuLoad a1 =
  let {a1' = fromClient a1} in 
  cpuLoad'_ a1' >>= \res ->
  let {res' = cFloatConv res} in
  return (res')
{-# LINE 337 "src/Sound/Jack/RawBindings.chs" #-}

-- | Opaque.
newtype Port = Port { fromPort :: Ptr () }

data PortFlags = PortIsInput
               | PortIsOutput
               | PortIsPhysical
               | PortCanMonitor
               | PortIsTerminal
               deriving (Eq,Read,Show)
instance Enum PortFlags where
  fromEnum PortIsInput = 1
  fromEnum PortIsOutput = 2
  fromEnum PortIsPhysical = 4
  fromEnum PortCanMonitor = 8
  fromEnum PortIsTerminal = 16

  toEnum 1 = PortIsInput
  toEnum 2 = PortIsOutput
  toEnum 4 = PortIsPhysical
  toEnum 8 = PortCanMonitor
  toEnum 16 = PortIsTerminal
  toEnum unmatched = error ("PortFlags.toEnum: Cannot match " ++ show unmatched)

{-# LINE 342 "src/Sound/Jack/RawBindings.chs" #-}

-- We need to walk all the constructors to extract a list of flags from a bitmask
-- Let's hope those don't change any time soon ;)
portFlagList :: [PortFlags]
portFlagList = [PortIsInput , PortIsOutput , PortIsPhysical , PortCanMonitor , PortIsTerminal]

portRegister :: Client -> String -> String -> [PortFlags] -> Int -> IO (Port)
portRegister a1 a2 a3 a4 a5 =
  let {a1' = fromClient a1} in 
  withCString a2 $ \a2' -> 
  withCString a3 $ \a3' -> 
  let {a4' = combineBitMasks a4} in 
  let {a5' = cIntConv a5} in 
  portRegister'_ a1' a2' a3' a4' a5' >>= \res ->
  let {res' = Port res} in
  return (res')
{-# LINE 351 "src/Sound/Jack/RawBindings.chs" #-}

portUnregister :: Client -> Port -> IO (Int)
portUnregister a1 a2 =
  let {a1' = fromClient a1} in 
  let {a2' = fromPort a2} in 
  portUnregister'_ a1' a2' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 354 "src/Sound/Jack/RawBindings.chs" #-}

portGetBuffer :: Port -> Word32 -> IO (Ptr AudioSample)
portGetBuffer a1 a2 =
  let {a1' = fromPort a1} in 
  let {a2' = cIntConv a2} in 
  portGetBuffer'_ a1' a2' >>= \res ->
  let {res' = castPtr res} in
  return (res')
{-# LINE 357 "src/Sound/Jack/RawBindings.chs" #-}

portName :: Port -> IO (String)
portName a1 =
  let {a1' = fromPort a1} in 
  portName'_ a1' >>= \res ->
  peekCString res >>= \res' ->
  return (res')
{-# LINE 360 "src/Sound/Jack/RawBindings.chs" #-}

portShortName :: Port -> IO (String)
portShortName a1 =
  let {a1' = fromPort a1} in 
  portShortName'_ a1' >>= \res ->
  peekCString res >>= \res' ->
  return (res')
{-# LINE 363 "src/Sound/Jack/RawBindings.chs" #-}

extractPortFlagMasks :: Bits a => a -> [PortFlags]
extractPortFlagMasks bits =
  [bm | bm <- portFlagList, bits `containsBitMask` bm]

portFlags :: Port -> IO ([PortFlags])
portFlags a1 =
  let {a1' = fromPort a1} in 
  portFlags'_ a1' >>= \res ->
  let {res' = extractPortFlagMasks res} in
  return (res')
{-# LINE 370 "src/Sound/Jack/RawBindings.chs" #-}

portType :: Port -> IO (String)
portType a1 =
  let {a1' = fromPort a1} in 
  portType'_ a1' >>= \res ->
  peekCString res >>= \res' ->
  return (res')
{-# LINE 373 "src/Sound/Jack/RawBindings.chs" #-}

portIsMine :: Client -> Port -> IO (Bool)
portIsMine a1 a2 =
  let {a1' = fromClient a1} in 
  let {a2' = fromPort a2} in 
  portIsMine'_ a1' a2' >>= \res ->
  let {res' = cToBool res} in
  return (res')
{-# LINE 376 "src/Sound/Jack/RawBindings.chs" #-}

portConnected :: Port -> IO (Int)
portConnected a1 =
  let {a1' = fromPort a1} in 
  portConnected'_ a1' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 379 "src/Sound/Jack/RawBindings.chs" #-}

peekCStringArray0 :: (Ptr CString) -> IO [String]
peekCStringArray0 p = do 
  ptrs <- peekArray0 nullPtr p
  mapM peekCString ptrs

portGetConnections :: Port -> IO ([String])
portGetConnections a1 =
  let {a1' = fromPort a1} in 
  portGetConnections'_ a1' >>= \res ->
  peekCStringArray0 res >>= \res' ->
  return (res')
{-# LINE 387 "src/Sound/Jack/RawBindings.chs" #-}

portGetAllConnections :: Client -> Port -> IO ([String])
portGetAllConnections a1 a2 =
  let {a1' = fromClient a1} in 
  let {a2' = fromPort a2} in 
  portGetAllConnections'_ a1' a2' >>= \res ->
  peekCStringArray0 res >>= \res' ->
  return (res')
{-# LINE 390 "src/Sound/Jack/RawBindings.chs" #-}

-- deprecated:
-- port_tie

-- deprecated:
-- port_untie

jackPortGetLatency :: Port -> IO (Word32)
jackPortGetLatency a1 =
  let {a1' = fromPort a1} in 
  jackPortGetLatency'_ a1' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 399 "src/Sound/Jack/RawBindings.chs" #-}


jackPortGetTotalLatency :: Client -> Port -> IO (Word32)
jackPortGetTotalLatency a1 a2 =
  let {a1' = fromClient a1} in 
  let {a2' = fromPort a2} in 
  jackPortGetTotalLatency'_ a1' a2' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 403 "src/Sound/Jack/RawBindings.chs" #-}

portSetLatency :: Port -> Word32 -> IO ()
portSetLatency a1 a2 =
  let {a1' = fromPort a1} in 
  let {a2' = cIntConv a2} in 
  portSetLatency'_ a1' a2' >>= \res ->
  return ()
{-# LINE 406 "src/Sound/Jack/RawBindings.chs" #-}

recomputeTotalLatencies :: Client -> IO (Int)
recomputeTotalLatencies a1 =
  let {a1' = fromClient a1} in 
  recomputeTotalLatencies'_ a1' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 409 "src/Sound/Jack/RawBindings.chs" #-}

portSetName :: Port -> String -> IO (Int)
portSetName a1 a2 =
  let {a1' = fromPort a1} in 
  withCString a2 $ \a2' -> 
  portSetName'_ a1' a2' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 412 "src/Sound/Jack/RawBindings.chs" #-}

portSetAlias :: Port -> String -> IO (Int)
portSetAlias a1 a2 =
  let {a1' = fromPort a1} in 
  withCString a2 $ \a2' -> 
  portSetAlias'_ a1' a2' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 415 "src/Sound/Jack/RawBindings.chs" #-}

portUnsetAlias :: Port -> String -> IO (Int)
portUnsetAlias a1 a2 =
  let {a1' = fromPort a1} in 
  withCString a2 $ \a2' -> 
  portUnsetAlias'_ a1' a2' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 418 "src/Sound/Jack/RawBindings.chs" #-}

-- TODO:
-- port_get_aliases 

portRequestMonitor :: Port -> Bool -> IO (Int)
portRequestMonitor a1 a2 =
  let {a1' = fromPort a1} in 
  let {a2' = cFromBool a2} in 
  portRequestMonitor'_ a1' a2' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 424 "src/Sound/Jack/RawBindings.chs" #-}

portRequestMonitorByName :: Client -> String -> Bool -> IO (Int)
portRequestMonitorByName a1 a2 a3 =
  let {a1' = fromClient a1} in 
  withCString a2 $ \a2' -> 
  let {a3' = cFromBool a3} in 
  portRequestMonitorByName'_ a1' a2' a3' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 427 "src/Sound/Jack/RawBindings.chs" #-}

portEnsureMonitor :: Port -> Bool -> IO (Int)
portEnsureMonitor a1 a2 =
  let {a1' = fromPort a1} in 
  let {a2' = cFromBool a2} in 
  portEnsureMonitor'_ a1' a2' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 430 "src/Sound/Jack/RawBindings.chs" #-}

portMonitoringInput :: Port -> IO (Int)
portMonitoringInput a1 =
  let {a1' = fromPort a1} in 
  portMonitoringInput'_ a1' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 433 "src/Sound/Jack/RawBindings.chs" #-}

connect :: Client -> String -> String -> IO (Int)
connect a1 a2 a3 =
  let {a1' = fromClient a1} in 
  withCString a2 $ \a2' -> 
  withCString a3 $ \a3' -> 
  connect'_ a1' a2' a3' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 436 "src/Sound/Jack/RawBindings.chs" #-}

disconnect :: Client -> String -> String -> IO (Int)
disconnect a1 a2 a3 =
  let {a1' = fromClient a1} in 
  withCString a2 $ \a2' -> 
  withCString a3 $ \a3' -> 
  disconnect'_ a1' a2' a3' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 439 "src/Sound/Jack/RawBindings.chs" #-}

portDisconnect :: Client -> Port -> IO (Int)
portDisconnect a1 a2 =
  let {a1' = fromClient a1} in 
  let {a2' = fromPort a2} in 
  portDisconnect'_ a1' a2' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 442 "src/Sound/Jack/RawBindings.chs" #-}

portNameSize :: IO (Int)
portNameSize =
  portNameSize'_ >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 445 "src/Sound/Jack/RawBindings.chs" #-}

portTypeSize :: IO (Int)
portTypeSize =
  portTypeSize'_ >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 448 "src/Sound/Jack/RawBindings.chs" #-}

getPorts :: Client -> String -> String -> [PortFlags] -> IO ([String])
getPorts a1 a2 a3 a4 =
  let {a1' = fromClient a1} in 
  withCString a2 $ \a2' -> 
  withCString a3 $ \a3' -> 
  let {a4' = combineBitMasks a4} in 
  getPorts'_ a1' a2' a3' a4' >>= \res ->
  peekCStringArray0 res >>= \res' ->
  return (res')
{-# LINE 452 "src/Sound/Jack/RawBindings.chs" #-}

portByName :: Client -> String -> IO (Port)
portByName a1 a2 =
  let {a1' = fromClient a1} in 
  withCString a2 $ \a2' -> 
  portByName'_ a1' a2' >>= \res ->
  let {res' = Port res} in
  return (res')
{-# LINE 455 "src/Sound/Jack/RawBindings.chs" #-}

-- | Opaque.
newtype PortID = PortID { fromPortID :: (CUInt) }

portById :: Client -> PortID -> IO (Port)
portById a1 a2 =
  let {a1' = fromClient a1} in 
  let {a2' = fromPortID a2} in 
  portById'_ a1' a2' >>= \res ->
  let {res' = Port res} in
  return (res')
{-# LINE 461 "src/Sound/Jack/RawBindings.chs" #-}

framesSinceCycleStart :: Client -> IO (Word32)
framesSinceCycleStart a1 =
  let {a1' = fromClient a1} in 
  framesSinceCycleStart'_ a1' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 464 "src/Sound/Jack/RawBindings.chs" #-}

frameTime :: Client -> IO (Word32)
frameTime a1 =
  let {a1' = fromClient a1} in 
  frameTime'_ a1' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 467 "src/Sound/Jack/RawBindings.chs" #-}

type Time = (CULLong)
{-# LINE 469 "src/Sound/Jack/RawBindings.chs" #-}

framesToTime :: Client -> Word32 -> IO (Time)
framesToTime a1 a2 =
  let {a1' = fromClient a1} in 
  let {a2' = cIntConv a2} in 
  framesToTime'_ a1' a2' >>= \res ->
  let {res' = id res} in
  return (res')
{-# LINE 472 "src/Sound/Jack/RawBindings.chs" #-}

timeToFrames :: Client -> Time -> IO (Word32)
timeToFrames a1 a2 =
  let {a1' = fromClient a1} in 
  let {a2' = id a2} in 
  timeToFrames'_ a1' a2' >>= \res ->
  let {res' = cIntConv res} in
  return (res')
{-# LINE 475 "src/Sound/Jack/RawBindings.chs" #-}

getTime :: IO (Time)
getTime =
  getTime'_ >>= \res ->
  let {res' = id res} in
  return (res')
{-# LINE 478 "src/Sound/Jack/RawBindings.chs" #-}

-- TODO:
-- add ErrorOutput

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_client_open_with_default_server"
  clientOpenWithDefaultServer'_ :: ((Ptr CChar) -> (CInt -> ((Ptr CInt) -> (IO (Ptr ())))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_client_open_with_server_name"
  clientOpenWithServerName'_ :: ((Ptr CChar) -> (CInt -> ((Ptr CInt) -> ((Ptr CChar) -> (IO (Ptr ()))))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_client_close"
  clientClose'_ :: ((Ptr ()) -> (IO CInt))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_client_name_size"
  clientNameSize'_ :: (IO CInt)

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_get_client_name"
  getClientName'_ :: ((Ptr ()) -> (IO (Ptr CChar)))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_internal_client_new"
  internalClientNew'_ :: ((Ptr CChar) -> ((Ptr CChar) -> ((Ptr CChar) -> (IO CInt))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_internal_client_close"
  internalClientClose'_ :: ((Ptr CChar) -> (IO ()))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_activate"
  activate'_ :: ((Ptr ()) -> (IO CInt))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_deactivate"
  deactivate'_ :: ((Ptr ()) -> (IO CInt))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_client_thread_id"
  clientThreadId'_ :: ((Ptr ()) -> (IO CULong))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_is_realtime"
  isRealtime'_ :: ((Ptr ()) -> (IO CInt))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_cycle_wait"
  cycleWait'_ :: ((Ptr ()) -> (IO CUInt))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_cycle_signal"
  cycleSignal'_ :: ((Ptr ()) -> (CInt -> (IO ())))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_set_process_thread"
  setProcessThread'_ :: ((Ptr ()) -> ((FunPtr ((Ptr ()) -> (IO (Ptr ())))) -> ((Ptr ()) -> (IO CInt))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_set_thread_init_callback"
  setThreadInitCallback'_ :: ((Ptr ()) -> ((FunPtr ((Ptr ()) -> (IO ()))) -> ((Ptr ()) -> (IO CInt))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_set_process_callback"
  setProcessCallback'_ :: ((Ptr ()) -> ((FunPtr (CUInt -> ((Ptr ()) -> (IO CInt)))) -> ((Ptr ()) -> (IO CInt))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_set_freewheel_callback"
  setFreewheelCallback'_ :: ((Ptr ()) -> ((FunPtr (CInt -> ((Ptr ()) -> (IO ())))) -> ((Ptr ()) -> (IO CInt))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_set_buffer_size_callback"
  setBufferSizeCallback'_ :: ((Ptr ()) -> ((FunPtr (CUInt -> ((Ptr ()) -> (IO CInt)))) -> ((Ptr ()) -> (IO CInt))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_set_sample_rate_callback"
  setSampleRateCallback'_ :: ((Ptr ()) -> ((FunPtr (CUInt -> ((Ptr ()) -> (IO CInt)))) -> ((Ptr ()) -> (IO CInt))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_set_client_registration_callback"
  setClientRegistrationCallback'_ :: ((Ptr ()) -> ((FunPtr ((Ptr CChar) -> (CInt -> ((Ptr ()) -> (IO ()))))) -> ((Ptr ()) -> (IO CInt))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_set_port_registration_callback"
  setPortRegistrationCallback'_ :: ((Ptr ()) -> ((FunPtr (CUInt -> (CInt -> ((Ptr ()) -> (IO ()))))) -> ((Ptr ()) -> (IO CInt))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_set_port_connect_callback"
  setPortConnectCallback'_ :: ((Ptr ()) -> ((FunPtr (CUInt -> (CUInt -> (CInt -> ((Ptr ()) -> (IO ())))))) -> ((Ptr ()) -> (IO CInt))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_set_graph_order_callback"
  setGraphOrderCallback'_ :: ((Ptr ()) -> ((FunPtr ((Ptr ()) -> (IO CInt))) -> ((Ptr ()) -> (IO CInt))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_set_xrun_callback"
  setXrunCallback'_ :: ((Ptr ()) -> ((FunPtr ((Ptr ()) -> (IO CInt))) -> ((Ptr ()) -> (IO CInt))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_set_freewheel"
  setFreewheel'_ :: ((Ptr ()) -> (CInt -> (IO CInt)))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_set_buffer_size"
  setBufferSize'_ :: ((Ptr ()) -> (CUInt -> (IO CInt)))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_get_sample_rate"
  getSampleRate'_ :: ((Ptr ()) -> (IO CUInt))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_get_buffer_size"
  getBufferSize'_ :: ((Ptr ()) -> (IO CUInt))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_engine_takeover_timebase"
  engineTakeoverTimebase'_ :: ((Ptr ()) -> (IO CInt))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_cpu_load"
  cpuLoad'_ :: ((Ptr ()) -> (IO CFloat))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_register"
  portRegister'_ :: ((Ptr ()) -> ((Ptr CChar) -> ((Ptr CChar) -> (CULong -> (CULong -> (IO (Ptr ())))))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_unregister"
  portUnregister'_ :: ((Ptr ()) -> ((Ptr ()) -> (IO CInt)))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_get_buffer"
  portGetBuffer'_ :: ((Ptr ()) -> (CUInt -> (IO (Ptr ()))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_name"
  portName'_ :: ((Ptr ()) -> (IO (Ptr CChar)))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_short_name"
  portShortName'_ :: ((Ptr ()) -> (IO (Ptr CChar)))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_flags"
  portFlags'_ :: ((Ptr ()) -> (IO CInt))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_type"
  portType'_ :: ((Ptr ()) -> (IO (Ptr CChar)))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_is_mine"
  portIsMine'_ :: ((Ptr ()) -> ((Ptr ()) -> (IO CInt)))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_connected"
  portConnected'_ :: ((Ptr ()) -> (IO CInt))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_get_connections"
  portGetConnections'_ :: ((Ptr ()) -> (IO (Ptr (Ptr CChar))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_get_all_connections"
  portGetAllConnections'_ :: ((Ptr ()) -> ((Ptr ()) -> (IO (Ptr (Ptr CChar)))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_get_latency"
  jackPortGetLatency'_ :: ((Ptr ()) -> (IO CUInt))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_get_total_latency"
  jackPortGetTotalLatency'_ :: ((Ptr ()) -> ((Ptr ()) -> (IO CUInt)))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_set_latency"
  portSetLatency'_ :: ((Ptr ()) -> (CUInt -> (IO ())))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_recompute_total_latencies"
  recomputeTotalLatencies'_ :: ((Ptr ()) -> (IO CInt))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_set_name"
  portSetName'_ :: ((Ptr ()) -> ((Ptr CChar) -> (IO CInt)))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_set_alias"
  portSetAlias'_ :: ((Ptr ()) -> ((Ptr CChar) -> (IO CInt)))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_unset_alias"
  portUnsetAlias'_ :: ((Ptr ()) -> ((Ptr CChar) -> (IO CInt)))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_request_monitor"
  portRequestMonitor'_ :: ((Ptr ()) -> (CInt -> (IO CInt)))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_request_monitor_by_name"
  portRequestMonitorByName'_ :: ((Ptr ()) -> ((Ptr CChar) -> (CInt -> (IO CInt))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_ensure_monitor"
  portEnsureMonitor'_ :: ((Ptr ()) -> (CInt -> (IO CInt)))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_monitoring_input"
  portMonitoringInput'_ :: ((Ptr ()) -> (IO CInt))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_connect"
  connect'_ :: ((Ptr ()) -> ((Ptr CChar) -> ((Ptr CChar) -> (IO CInt))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_disconnect"
  disconnect'_ :: ((Ptr ()) -> ((Ptr CChar) -> ((Ptr CChar) -> (IO CInt))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_disconnect"
  portDisconnect'_ :: ((Ptr ()) -> ((Ptr ()) -> (IO CInt)))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_name_size"
  portNameSize'_ :: (IO CInt)

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_type_size"
  portTypeSize'_ :: (IO CInt)

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_get_ports"
  getPorts'_ :: ((Ptr ()) -> ((Ptr CChar) -> ((Ptr CChar) -> (CULong -> (IO (Ptr (Ptr CChar)))))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_by_name"
  portByName'_ :: ((Ptr ()) -> ((Ptr CChar) -> (IO (Ptr ()))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_port_by_id"
  portById'_ :: ((Ptr ()) -> (CUInt -> (IO (Ptr ()))))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_frames_since_cycle_start"
  framesSinceCycleStart'_ :: ((Ptr ()) -> (IO CUInt))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_frame_time"
  frameTime'_ :: ((Ptr ()) -> (IO CUInt))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_frames_to_time"
  framesToTime'_ :: ((Ptr ()) -> (CUInt -> (IO CULLong)))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_time_to_frames"
  timeToFrames'_ :: ((Ptr ()) -> (CULLong -> (IO CUInt)))

foreign import ccall safe "Sound/Jack/RawBindings.chs.h jack_get_time"
  getTime'_ :: (IO CULLong)