-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Bindings for the JACK Audio Connection Kit
--
-- Bindings for the JACK Audio Connection Kit
-- http://jackaudio.org/. It has support both for PCM audio and
-- MIDI handling.
--
-- In order to adapt to your system, you may have to disable pkgConfig or
-- jackFree cabal flags.
--
-- You must compile your clients with -threaded otherwise you
-- will encounter segfaults.
@package jack
@version 0.7.2
module Sound.JACK.Exception
class ToString e
toString :: ToString e => e -> String
toStringWithHead :: All -> String
type All = Status (PortRegister (PortMismatch Errno))
class ThrowsStatus e
status :: ThrowsStatus e => StatusSet -> e
data Status e
Status :: StatusSet -> Status e
NoStatus :: e -> Status e
class ThrowsPortRegister e
portRegister :: ThrowsPortRegister e => e
data PortRegister e
PortRegister :: PortRegister e
NoPortRegister :: e -> PortRegister e
class ThrowsPortMismatch e
portMismatch :: ThrowsPortMismatch e => PortMismatchKind -> e
data PortMismatch e
PortMismatch :: PortMismatchKind -> PortMismatch e
NoPortMismatch :: e -> PortMismatch e
data PortMismatchKind
TypeMismatch :: PortMismatchKind
DirectionMismatch :: PortMismatchKind
class ThrowsErrno e
errno :: ThrowsErrno e => Errno -> e
data Errno e
Errno :: Errno -> Errno e
NoErrno :: e -> Errno e
instance Sound.JACK.Exception.ToString e => Sound.JACK.Exception.ToString (Sound.JACK.Exception.Errno e)
instance Sound.JACK.Exception.ThrowsStatus e => Sound.JACK.Exception.ThrowsStatus (Sound.JACK.Exception.Errno e)
instance Sound.JACK.Exception.ThrowsPortRegister e => Sound.JACK.Exception.ThrowsPortRegister (Sound.JACK.Exception.Errno e)
instance Sound.JACK.Exception.ThrowsPortMismatch e => Sound.JACK.Exception.ThrowsPortMismatch (Sound.JACK.Exception.Errno e)
instance Sound.JACK.Exception.ThrowsErrno (Sound.JACK.Exception.Errno e)
instance Sound.JACK.Exception.ThrowsErrno e => Sound.JACK.Exception.ThrowsErrno (Sound.JACK.Exception.Status e)
instance Sound.JACK.Exception.ThrowsErrno e => Sound.JACK.Exception.ThrowsErrno (Sound.JACK.Exception.PortRegister e)
instance Sound.JACK.Exception.ThrowsErrno e => Sound.JACK.Exception.ThrowsErrno (Sound.JACK.Exception.PortMismatch e)
instance Sound.JACK.Exception.ThrowsErrno Foreign.C.Error.Errno
instance Sound.JACK.Exception.ThrowsPortMismatch e => Sound.JACK.Exception.ThrowsPortMismatch (Sound.JACK.Exception.Status e)
instance Sound.JACK.Exception.ThrowsPortMismatch e => Sound.JACK.Exception.ThrowsPortMismatch (Sound.JACK.Exception.PortRegister e)
instance Sound.JACK.Exception.ThrowsPortMismatch (Sound.JACK.Exception.PortMismatch e)
instance Sound.JACK.Exception.ToString e => Sound.JACK.Exception.ToString (Sound.JACK.Exception.PortMismatch e)
instance Sound.JACK.Exception.ThrowsStatus e => Sound.JACK.Exception.ThrowsStatus (Sound.JACK.Exception.PortMismatch e)
instance Sound.JACK.Exception.ThrowsPortRegister e => Sound.JACK.Exception.ThrowsPortRegister (Sound.JACK.Exception.PortMismatch e)
instance Sound.JACK.Exception.ToString e => Sound.JACK.Exception.ToString (Sound.JACK.Exception.PortRegister e)
instance Sound.JACK.Exception.ThrowsStatus e => Sound.JACK.Exception.ThrowsStatus (Sound.JACK.Exception.PortRegister e)
instance Sound.JACK.Exception.ThrowsPortRegister (Sound.JACK.Exception.PortRegister e)
instance Sound.JACK.Exception.ThrowsPortRegister e => Sound.JACK.Exception.ThrowsPortRegister (Sound.JACK.Exception.Status e)
instance Sound.JACK.Exception.ToString e => Sound.JACK.Exception.ToString (Sound.JACK.Exception.Status e)
instance Sound.JACK.Exception.ThrowsStatus (Sound.JACK.Exception.Status e)
instance (Data.Bits.Bits w, GHC.Enum.Enum a, GHC.Show.Show a) => Sound.JACK.Exception.ToString (Data.EnumBitSet.T w a)
instance Sound.JACK.Exception.ToString Foreign.C.Error.Errno
-- | The Jack module defines types and functions that allows you to use the
-- JACK Audio Connection Kit.
module Sound.JACK
-- | Handles of Jack clients
newtype Client
Client :: Ptr Client -> Client
-- | Constructs a new Jack client.
newClient :: ThrowsStatus e => String -> String -> ExceptionalT e IO Client
-- | Creates a new JACK client with the default server
newClientDefault :: ThrowsStatus e => String -> ExceptionalT e IO Client
disposeClient :: ThrowsErrno e => Client -> ExceptionalT e IO ()
-- | Run a block of code with a newly allocated client. Do not use the
-- client outside the block.
withClient :: ThrowsStatus e => String -> String -> (Client -> ExceptionalT e IO a) -> ExceptionalT e IO a
withClientDefault :: ThrowsStatus e => String -> (Client -> ExceptionalT e IO a) -> ExceptionalT e IO a
-- | closes the given Jack client without causing any trouble (hopefully)
clientClose :: ThrowsErrno e => Client -> PortSet -> ExceptionalT e IO ()
-- | activates the given Jack client
activate :: ThrowsErrno e => Client -> ExceptionalT e IO ()
deactivate :: ThrowsErrno e => Client -> ExceptionalT e IO ()
withActivation :: ThrowsErrno e => Client -> ExceptionalT e IO () -> ExceptionalT e IO ()
-- | Jack Port Type
class PortType typ
class Direction dir
-- | Type argument for Jack input ports
data Input
-- | Type argument for Jack output ports
data Output
-- | Type argument for Jack ports where the type of samples transported by
-- the port is unknown.
data UnknownType
-- | Type argument for Jack ports where we do not know whether it is an
-- input or an output port.
data UnknownDirection
newtype Port typ dir
Port :: Ptr (Port typ) -> Port typ dir
-- | Better use withPort that also handles freeing the port.
newPort :: (PortType typ, Direction dir, ThrowsPortRegister e) => Client -> String -> ExceptionalT e IO (Port typ dir)
disposePort :: (PortType typ, Direction dir, ThrowsErrno e) => Client -> Port typ dir -> ExceptionalT e IO ()
-- | Creates a new port for the given client and delete it after usage. The
-- port manages audio or MIDI data in input or output direction depending
-- on the Port type. Usually the required port type can be inferred from
-- following actions that use that port.
--
-- Do not use the port outside the enclosed block.
withPort :: (PortType typ, Direction dir, ThrowsPortRegister e, ThrowsErrno e) => Client -> String -> (Port typ dir -> ExceptionalT e IO a) -> ExceptionalT e IO a
-- | A collection of mixed types of ports. It is mainly needed for freeing
-- all allocated ports.
data PortSet
setOfPort :: (PortType typ, Direction dir) => Port typ dir -> PortSet
setOfPorts :: (PortType typ, Direction dir) => [Port typ dir] -> PortSet
type Process arg = NFrames -> Ptr arg -> IO Errno
connect :: ThrowsErrno e => Client -> String -> String -> ExceptionalT e IO ()
disconnect :: ThrowsErrno e => Client -> String -> String -> ExceptionalT e IO ()
makeProcess :: Process arg -> IO (FunPtr (Process arg))
setProcess :: ThrowsErrno e => Client -> FunPtr (Process arg) -> Ptr arg -> ExceptionalT e IO ()
-- | The callback function must respond in real-time, i.e. in a bounded
-- amout of time. That is, strictly spoken it must not wait for anything,
-- e.g. it must not wait for locks and it must not allocate memory. In
-- Haskell this is practically impossible because even simplest
-- operations allocate memory. If the callback needs to much time, JACK
-- will shut down your client. The best you can do is to hope that
-- nothing evil happens.
withProcess :: ThrowsErrno e => Client -> (NFrames -> ExceptionalT Errno IO ()) -> ExceptionalT e IO a -> ExceptionalT e IO a
type Freewheel arg = CInt -> Ptr arg -> IO ()
makeFreewheel :: Freewheel arg -> IO (FunPtr (Freewheel arg))
setFreewheel :: ThrowsErrno e => Client -> FunPtr (Freewheel arg) -> Ptr arg -> ExceptionalT e IO ()
withFreewheel :: ThrowsErrno e => Client -> (Bool -> IO ()) -> ExceptionalT e IO a -> ExceptionalT e IO a
type BufferSize arg = NFrames -> Ptr arg -> IO Errno
makeBufferSize :: BufferSize arg -> IO (FunPtr (BufferSize arg))
setBufferSize :: ThrowsErrno e => Client -> FunPtr (BufferSize arg) -> Ptr arg -> ExceptionalT e IO ()
withBufferSize :: ThrowsErrno e => Client -> (NFrames -> ExceptionalT Errno IO ()) -> ExceptionalT e IO a -> ExceptionalT e IO a
type SampleRate arg = NFrames -> Ptr arg -> IO Errno
makeSampleRate :: SampleRate arg -> IO (FunPtr (SampleRate arg))
setSampleRate :: ThrowsErrno e => Client -> FunPtr (SampleRate arg) -> Ptr arg -> ExceptionalT e IO ()
withSampleRate :: ThrowsErrno e => Client -> (NFrames -> ExceptionalT Errno IO ()) -> ExceptionalT e IO a -> ExceptionalT e IO a
type PortRename arg = PortId -> PortName -> PortName -> Ptr arg -> IO ()
makePortRename :: PortRename arg -> IO (FunPtr (PortRename arg))
setPortRename :: ThrowsErrno e => Client -> FunPtr (PortRename arg) -> Ptr arg -> ExceptionalT e IO ()
withPortRename :: ThrowsErrno e => Client -> (PortId -> String -> String -> IO ()) -> ExceptionalT e IO a -> ExceptionalT e IO a
type GraphOrder arg = Ptr arg -> IO Errno
makeGraphOrder :: GraphOrder arg -> IO (FunPtr (GraphOrder arg))
setGraphOrder :: ThrowsErrno e => Client -> FunPtr (GraphOrder arg) -> Ptr arg -> ExceptionalT e IO ()
withGraphOrder :: ThrowsErrno e => Client -> ExceptionalT Errno IO () -> ExceptionalT e IO a -> ExceptionalT e IO a
type XRun arg = Ptr arg -> IO Errno
makeXRun :: XRun arg -> IO (FunPtr (XRun arg))
setXRun :: ThrowsErrno e => Client -> FunPtr (XRun arg) -> Ptr arg -> ExceptionalT e IO ()
withXRun :: ThrowsErrno e => Client -> ExceptionalT Errno IO () -> ExceptionalT e IO a -> ExceptionalT e IO a
type Latency arg = LatencyCallbackMode -> Ptr arg -> IO ()
data LatencyCallbackMode
makeLatency :: Latency arg -> IO (FunPtr (Latency arg))
setLatency :: ThrowsErrno e => Client -> FunPtr (Latency arg) -> Ptr arg -> ExceptionalT e IO ()
withLatency :: ThrowsErrno e => Client -> (LatencyCallbackMode -> IO ()) -> ExceptionalT e IO a -> ExceptionalT e IO a
jackCaptureLatency :: LatencyCallbackMode
jackPlaybackLatency :: LatencyCallbackMode
data LatencyRange
LatencyRange :: NFrames -> NFrames -> LatencyRange
getLatencyRange :: Port typ dir -> LatencyCallbackMode -> IO LatencyRange
setLatencyRange :: Port typ dir -> LatencyCallbackMode -> LatencyRange -> IO ()
recomputeTotalLatencies :: ThrowsErrno e => Client -> ExceptionalT e IO ()
getBufferSize :: Client -> IO Int
getSampleRate :: Client -> IO Int
lastFrameTime :: Client -> IO NFrames
type ClientRegistration arg = CString -> CInt -> Ptr arg -> IO ()
-- | Create a client registration callback FunPtr.
makeClientRegistration :: ClientRegistration arg -> IO (FunPtr (ClientRegistration arg))
-- | Set the client registration callback.
setClientRegistration :: ThrowsErrno e => Client -> FunPtr (ClientRegistration arg) -> Ptr arg -> ExceptionalT e IO ()
withClientRegistration :: ThrowsErrno e => Client -> (String -> Bool -> IO ()) -> ExceptionalT e IO a -> ExceptionalT e IO a
data PortId
-- | Create a port registration callback FunPtr.
makePortRegistration :: PortRegistration arg -> IO (FunPtr (PortRegistration arg))
-- | Set the port registration callback.
setPortRegistration :: ThrowsErrno e => Client -> FunPtr (PortRegistration arg) -> Ptr arg -> ExceptionalT e IO ()
withPortRegistration :: ThrowsErrno e => Client -> (PortId -> Bool -> IO ()) -> ExceptionalT e IO a -> ExceptionalT e IO a
type PortConnect arg = PortId -> PortId -> CInt -> Ptr arg -> IO ()
-- | Create a port connect callback FunPtr.
makePortConnect :: PortConnect arg -> IO (FunPtr (PortConnect arg))
-- | Set the port connect callback.
setPortConnect :: ThrowsErrno e => Client -> FunPtr (PortConnect arg) -> Ptr arg -> ExceptionalT e IO ()
withPortConnect :: ThrowsErrno e => Client -> (PortId -> PortId -> Bool -> IO ()) -> ExceptionalT e IO a -> ExceptionalT e IO a
portById :: Client -> PortId -> IO (Port UnknownType UnknownDirection)
portByName :: Client -> String -> IO (Port UnknownType UnknownDirection)
-- | Return the full port name, including the client_name: prefix.
portName :: Port typ dir -> IO String
-- | Return the short port name, not including the client_name:
-- prefix.
portShortName :: Port typ dir -> IO String
-- | Return the port aliases, including the client_name: prefixes.
--
-- This is especially useful for external midi devices, as the alias
-- names are usually more descriptive than
-- system:midi_capture_1.
portAliases :: Port typ dir -> IO [String]
-- | Returns the names of all existing ports.
getPorts :: Client -> IO [String]
-- | Return all the port names a given port is connected to.
--
-- This function must not be called from a JACK event callback.
portGetAllConnections :: Client -> Port typ dir -> IO [String]
narrowPort :: (PortType typ, Direction dir, ThrowsPortMismatch e) => Port UnknownType UnknownDirection -> ExceptionalT e IO (Port typ dir)
narrowPortType :: (PortType typ, ThrowsPortMismatch e) => Port UnknownType dir -> ExceptionalT e IO (Port typ dir)
narrowPortDirection :: (Direction dir, ThrowsPortMismatch e) => Port typ UnknownDirection -> ExceptionalT e IO (Port typ dir)
switchUnknownTypePort :: ThrowsPortMismatch e => Port UnknownType dir -> (Port CFloat dir -> ExceptionalT e IO a) -> (Port EventBuffer dir -> ExceptionalT e IO a) -> ExceptionalT e IO a
switchUnknownDirectionPort :: ThrowsPortMismatch e => Port typ UnknownDirection -> (Port typ Input -> ExceptionalT e IO a) -> (Port typ Output -> ExceptionalT e IO a) -> ExceptionalT e IO a
-- | represents absolute frame time
newtype NFrames
NFrames :: Word32 -> NFrames
nframesIndices :: NFrames -> [NFrames]
nframesBounds :: NFrames -> (NFrames, NFrames)
-- | Deprecated: Write your own function instead.
quit :: MVar () -> Client -> PortSet -> IO ()
-- | Deprecated: Write your own function instead.
waitForBreakAndClose :: Client -> PortSet -> IO ()
waitForBreak :: IO ()
handleExceptions :: ExceptionalT All IO () -> IO ()
instance GHC.Base.Semigroup Sound.JACK.PortSet
instance GHC.Base.Monoid Sound.JACK.PortSet
instance Sound.JACK.Direction Sound.JACK.FFI.Input
instance Sound.JACK.Direction Sound.JACK.FFI.Output
module Sound.JACK.MIDI
-- | Represents a raw JACK MIDI event
data RawEvent
-- | Smart constructor for a raw MIDI event.
rawEvent :: NFrames -> ByteString -> RawEvent
rawEventTime :: RawEvent -> NFrames
rawEventBuffer :: RawEvent -> ByteString
-- | Converts high level MIDI Event transformation functions into raw MIDI
-- Event transformation functions
toRawEventFunction :: (NFrames -> (NFrames, T) -> IO (NFrames, T)) -> NFrames -> RawEvent -> IO RawEvent
type Port = Port EventBuffer
withPort :: (Direction dir, ThrowsPortRegister e, ThrowsErrno e) => Client -> String -> (Port dir -> ExceptionalT e IO a) -> ExceptionalT e IO a
-- | sets the process loop of the JACK Client
withProcess :: ThrowsErrno e => Client -> Port Input -> (NFrames -> RawEvent -> IO RawEvent) -> Port Output -> ExceptionalT e IO a -> ExceptionalT e IO a
data Buffer dir
getBuffer :: Direction dir => Port dir -> NFrames -> IO (Buffer dir)
clearBuffer :: Buffer Output -> IO ()
-- | reads all available MIDI Events on the given PortBuffer
readRawEvents :: ThrowsErrno e => Buffer Input -> ExceptionalT e IO [RawEvent]
-- | writes a MIDI event to the PortBuffer of a MIDI output or throws
-- eNOBUFS if JackMIDI.buffer is full
writeRawEvent :: ThrowsErrno e => Buffer Output -> RawEvent -> ExceptionalT e IO ()
readRawEventsFromPort :: ThrowsErrno e => Port Input -> NFrames -> ExceptionalT e IO [RawEvent]
-- | Clears an output buffer and writes a sequence of events to it. That
-- is, you must only call this function once per callback.
writeRawEventsToPort :: ThrowsErrno e => Port Output -> NFrames -> [RawEvent] -> ExceptionalT e IO ()
writeEvent :: ThrowsErrno e => Buffer Output -> NFrames -> T -> ExceptionalT e IO ()
-- | Reads midi events from an input buffer and converts them to a
-- high-level representation. Messages are simply ignored if they cannot
-- be parsed.
readEventsFromPort :: ThrowsErrno e => Port Input -> NFrames -> ExceptionalT e IO (T NFrames T)
-- | Clears an output buffer and writes a sequence of events to it. That
-- is, you must only call this function once per callback.
writeEventsToPort :: ThrowsErrno e => Port Output -> NFrames -> T NFrames T -> ExceptionalT e IO ()
-- | Creates an input and an output, and transforms all input events into
-- output events using the given function
main :: (NFrames -> (NFrames, T) -> IO (NFrames, T)) -> IO ()
-- | Creates an input and an output, and transforms all raw input events
-- into raw output events using the given function
mainRaw :: (NFrames -> RawEvent -> IO RawEvent) -> IO ()
module Sound.JACK.Audio
type Sample = CFloat
type Port = Port Sample
withPort :: (Direction dir, ThrowsPortRegister e, ThrowsErrno e) => Client -> String -> (Port dir -> ExceptionalT e IO a) -> ExceptionalT e IO a
withProcessMono :: ThrowsErrno e => Client -> Port Input -> (Sample -> IO Sample) -> Port Output -> ExceptionalT e IO a -> ExceptionalT e IO a
withProcessStereo :: ThrowsErrno e => Client -> Port Input -> Port Input -> ((Sample, Sample) -> IO (Sample, Sample)) -> Port Output -> Port Output -> ExceptionalT e IO a -> ExceptionalT e IO a
getBufferPtr :: Direction dir => Port dir -> NFrames -> IO (Ptr Sample)
getBufferArray :: Direction dir => Port dir -> NFrames -> IO (StorableArray NFrames Sample)
mainMono :: (Sample -> IO Sample) -> IO ()
mainStereo :: ((Sample, Sample) -> IO (Sample, Sample)) -> IO ()