packages feed

alsa-seq-0.5: src/Sound/ALSA/Sequencer/Marshal/Port.hsc

--------------------------------------------------------------------------------
-- |
-- Module    : Sound.ALSA.Sequencer.Marshal
-- Copyright : (c) Henning Thielemann, 2010
--             (c) Iavor S. Diatchki, 2007
-- License   : BSD3
--
-- Maintainer: Henning Thielemann
-- Stability : provisional
--
-- PRIVATE MODULE.
--
-- Here we have the various types used by the library,
-- and how they are imported\/exported to C.
--
-- NOTE: In the translations bellow we make the following assumptions
-- about the sizes of C types.
-- CChar  = 8 bits
-- CShort = 16 bit
-- CInt   = 32 bits
--------------------------------------------------------------------------------

module Sound.ALSA.Sequencer.Marshal.Port where

#include <alsa/asoundlib.h>
import qualified Sound.ALSA.Sequencer.Utility as U
import Foreign.C.Types (CInt, CUInt, )
import Foreign.Storable (Storable, )
import Data.Bits ((.|.), )
import Data.Word (Word8, )



-- The type of client ports.
newtype T = Cons Word8 deriving (Eq, Ord, Storable)

instance Show T where
   showsPrec prec (Cons x) =
      U.showsRecord prec "Port" [U.showsField x]


exp :: T -> CInt
exp (Cons p) = fromIntegral p

imp :: CInt -> T
imp p = Cons (fromIntegral p)


-- | Port capabilities.
newtype Cap = Cap { unCap :: CUInt } deriving (Eq,Ord)

-- | Port types.
newtype Type = Type { unType :: CUInt } deriving (Eq,Ord)

#{enum T, Cons
 , systemTimer    = SND_SEQ_PORT_SYSTEM_TIMER
 , systemAnnounce = SND_SEQ_PORT_SYSTEM_ANNOUNCE
 , unknown        = SND_SEQ_ADDRESS_UNKNOWN
 }

#{enum Cap, Cap
 , capRead      = SND_SEQ_PORT_CAP_READ
 , capWrite     = SND_SEQ_PORT_CAP_WRITE
 , capSyncRead  = SND_SEQ_PORT_CAP_SYNC_READ
 , capSyncWrite = SND_SEQ_PORT_CAP_SYNC_WRITE
 , capDuplex    = SND_SEQ_PORT_CAP_DUPLEX
 , capSubsRead  = SND_SEQ_PORT_CAP_SUBS_READ
 , capSubsWrite = SND_SEQ_PORT_CAP_SUBS_WRITE
 , capNoExport  = SND_SEQ_PORT_CAP_NO_EXPORT
 }

caps :: [Cap] -> Cap
caps cs = Cap (foldl (.|.) 0 (map unCap cs))

#{enum Type, Type
 , typeSpecific     = SND_SEQ_PORT_TYPE_SPECIFIC
 , typeMidiGeneric  = SND_SEQ_PORT_TYPE_MIDI_GENERIC
 , typeMidiGM       = SND_SEQ_PORT_TYPE_MIDI_GM
 , typeMidiGS       = SND_SEQ_PORT_TYPE_MIDI_GS
 , typeMidiXG       = SND_SEQ_PORT_TYPE_MIDI_XG
 , typeMidiMT32     = SND_SEQ_PORT_TYPE_MIDI_MT32
 , typeMidiGM2      = SND_SEQ_PORT_TYPE_MIDI_GM2

 , typeSynth        = SND_SEQ_PORT_TYPE_SYNTH
 , typeDirectSample = SND_SEQ_PORT_TYPE_DIRECT_SAMPLE
 , typeSample       = SND_SEQ_PORT_TYPE_SAMPLE

 , typeHardware     = SND_SEQ_PORT_TYPE_HARDWARE
 , typeSoftware     = SND_SEQ_PORT_TYPE_SOFTWARE
 , typeSynthesizer  = SND_SEQ_PORT_TYPE_SYNTHESIZER
 , typePort         = SND_SEQ_PORT_TYPE_PORT
 , typeApplication  = SND_SEQ_PORT_TYPE_APPLICATION
 }

types :: [Type] -> Type
types cs = Type (foldl (.|.) 0 (map unType cs))