packages feed

alsa-0.2: Sound/Alsa/Core.chs

{-# OPTIONS_GHC -fglasgow-exts #-}
module Sound.Alsa.Core where

import Sound.Alsa.C2HS
import Sound.Alsa.Error



-- HACK for 32-bit machines.
-- This is only used to be able to parse alsa/pcm.h,
-- since snd_pcm_format_silence_64 use u_int64_t which is not
-- defined on 32-bit machines, AFAICT
#if __WORDSIZE == 32
typedef unsigned long long int u_int64_t;
#endif

#include <alsa/asoundlib.h>

{#context prefix = "snd_"#}

{#pointer *snd_pcm_t as Pcm newtype #}

instance Storable Pcm where
    sizeOf (Pcm r) = sizeOf r
    alignment (Pcm r) = alignment r
    peek p = fmap Pcm (peek (castPtr p))
    poke p (Pcm r) = poke (castPtr p) r

{#pointer *snd_pcm_hw_params_t as PcmHwParams newtype #}

instance Storable PcmHwParams where
    sizeOf (PcmHwParams r) = sizeOf r
    alignment (PcmHwParams r) = alignment r
    peek p = fmap PcmHwParams (peek (castPtr p))
    poke p (PcmHwParams r) = poke (castPtr p) r

{#pointer *snd_pcm_sw_params_t as PcmSwParams newtype #}

instance Storable PcmSwParams where
    sizeOf (PcmSwParams r) = sizeOf r
    alignment (PcmSwParams r) = alignment r
    peek p = fmap PcmSwParams (peek (castPtr p))
    poke p (PcmSwParams r) = poke (castPtr p) r

{#enum _snd_pcm_stream as PcmStream {underscoreToCase} deriving (Eq,Show)#}

{#enum _snd_pcm_access as PcmAccess {underscoreToCase} deriving (Eq,Show)#}

{#enum _snd_pcm_format as PcmFormat {underscoreToCase} deriving (Eq,Show)#}

{#fun pcm_open
  { alloca- `Pcm' peek*,
    withCString* `String',
    cFromEnum `PcmStream',
    `Int'}
 -> `()' result*- #}
  where result = checkResult_ "pcm_open"

{#fun pcm_close
  { id `Pcm' }
 -> `()' result*- #}
  where result = checkResult_ "pcm_close"

{#fun pcm_prepare
  { id `Pcm' }
 -> `()' result*- #}
  where result = checkResult_ "pcm_prepare"

{#fun pcm_start
  { id `Pcm' }
 -> `()' result*- #}
  where result = checkResult_ "pcm_start"

{#fun pcm_drop
  { id `Pcm' }
 -> `()' result*- #}
  where result = checkResult_ "pcm_drop"

{#fun pcm_drain
  { id `Pcm' }
 -> `()' result*- #}
  where result = checkResult_ "pcm_drain"

{-
-- Only available in 1.0.11rc3 and later
{#fun pcm_set_params
  { id `Pcm',
    cFromEnum `PcmFormat',
    cFromEnum `PcmAccess',
    `Int',
    `Int',
    `Bool',
    `Int' }
 -> `()' result*- #}
  where result = checkResult_ "pcm_set_params"
-}

{#fun pcm_hw_params
  { id `Pcm',
    id `PcmHwParams' }
 -> `()' result*- #}
  where result = checkResult_ "pcm_hw_params"

{#fun pcm_hw_params_any
  { id `Pcm',
    id `PcmHwParams' }
 -> `()' result*- #}
  where result = checkResult_ "pcm_hw_params_any"

{#fun pcm_hw_params_set_access
  { id `Pcm',
    id `PcmHwParams',
    cFromEnum `PcmAccess'
 }
 -> `()' result*- #}
  where result = checkResult_ "pcm_hw_params_set_access"

{#fun pcm_hw_params_set_format
  { id `Pcm',
    id `PcmHwParams',
    cFromEnum `PcmFormat'
 }
 -> `()' result*- #}
  where result = checkResult_ "pcm_hw_params_set_format"

{#fun pcm_hw_params_set_rate
  { id `Pcm',
    id `PcmHwParams',
    `Int',
    orderingToInt `Ordering'
 }
 -> `()' result*- #}
  where result = checkResult_ "pcm_hw_params_set_rate"

{-
-- Available in 1.0.9rc2 and later
{#fun pcm_hw_params_set_rate_resample
  { id `Pcm',
    id `PcmHwParams',
    `Bool'
 }
 -> `()' result*- #}
  where result = checkResult_ "pcm_hw_params_set_rate_resample"
-}

{#fun pcm_hw_params_set_channels
  { id `Pcm',
    id `PcmHwParams',
    `Int'
 }
 -> `()' result*- #}
  where result = checkResult_ "pcm_hw_params_set_channels"

{#fun pcm_hw_params_set_buffer_size
  { id `Pcm',
    id `PcmHwParams',
    `Int'
 }
 -> `()' result*- #}
  where result = checkResult_ "pcm_hw_params_set_buffer_size"

{#fun pcm_hw_params_get_buffer_size
  { id `PcmHwParams',
    alloca- `Int' peekIntConv*
 }
 -> `()' result*- #}
  where result = checkResult_ "pcm_hw_params_get_buffer_size"

{#fun pcm_hw_params_get_period_size
  { id `PcmHwParams',
    alloca- `Int' peekIntConv*,
    alloca- `Ordering' peekOrdering*
 }
 -> `()' result*- #}
  where result = checkResult_ "pcm_hw_params_get_period_size"

{#fun pcm_hw_params_set_period_time_near
  { id `Pcm',
    id `PcmHwParams',
    withIntConv* `Int' peekIntConv*,
    withOrdering* `Ordering' peekOrdering*
 }
 -> `()' result*- #}
  where result = checkResult_ "pcm_hw_params_set_period_time_near"

{#fun pcm_hw_params_set_periods
  { id `Pcm',
    id `PcmHwParams',
    `Int',
    orderingToInt `Ordering'
 }
 -> `()' result*- #}
  where result = checkResult_ "pcm_hw_params_set_periods"

{#fun pcm_hw_params_set_buffer_time_near
  { id `Pcm',
    id `PcmHwParams',
    withIntConv* `Int' peekIntConv*,
    withOrdering* `Ordering' peekOrdering*
 }
 -> `()' result*- #}
  where result = checkResult_ "pcm_hw_params_set_buffer_time_near"

{#fun pcm_hw_params_get_buffer_time
  { id `PcmHwParams',
    alloca- `Int' peekIntConv*,
    alloca- `Ordering' peekOrdering*
 }
 -> `()' result*- #}
  where result = checkResult_ "pcm_hw_params_get_buffer_time"

{#fun pcm_sw_params_set_start_threshold
  { id `Pcm',
    id `PcmSwParams',
    `Int'
 }
 -> `()' result*- #}
  where result = checkResult_ "pcm_sw_params_set_start_threshold"

{#fun pcm_sw_params_set_avail_min
  { id `Pcm',
    id `PcmSwParams',
    `Int'
 }
 -> `()' result*- #}
  where result = checkResult_ "pcm_sw_params_set_avail_min"

{#fun pcm_sw_params_set_xfer_align
  { id `Pcm',
    id `PcmSwParams',
    `Int' }
 -> `()' result*- #}
  where result = checkResult_ "pcm_sw_params_set_xfer_align"

{#fun pcm_sw_params_set_silence_threshold
  { id `Pcm',
    id `PcmSwParams',
    `Int' }
 -> `()' result*- #}
  where result = checkResult_ "pcm_sw_params_set_silence_threshold"

{#fun pcm_sw_params_set_silence_size
  { id `Pcm',
    id `PcmSwParams',
    `Int' }
 -> `()' result*- #}
  where result = checkResult_ "pcm_sw_params_set_silence_size"

{#fun pcm_readi
  { id `Pcm',
    castPtr `Ptr a',
    `Int'
 }
 -> `Int' result* #}
  where result = fmap fromIntegral . checkResult "pcm_readi"

{#fun pcm_writei
  { id `Pcm',
    castPtr `Ptr a',
    `Int'
 }
 -> `Int' result* #}
  where result = fmap fromIntegral . checkResult "pcm_writei"

{#fun pcm_hw_params_malloc
  { alloca- `PcmHwParams' peek* }
 -> `()' result*- #}
  where result = checkResult_ "pcm_hw_params_malloc"

{#fun pcm_hw_params_free
  { id `PcmHwParams' }
 -> `()' #}

{#fun pcm_sw_params_malloc
  { alloca- `PcmSwParams' peek* }
 -> `()' result*- #}
  where result = checkResult_ "pcm_sw_params_malloc"

{#fun pcm_sw_params_free
  { id `PcmSwParams' }
 -> `()' #}

{#fun pcm_sw_params
  { id `Pcm',
    id `PcmSwParams' }
 -> `()' result*- #}
  where result = checkResult_ "pcm_sw_params"

{#fun pcm_sw_params_current
  { id `Pcm',
    id `PcmSwParams' }
 -> `()' result*- #}
  where result = checkResult_ "pcm_sw_params_current"

--
-- * Marshalling utilities
--

orderingToInt :: Ordering -> CInt
orderingToInt o = fromIntegral (fromEnum o - 1)

intToOrdering :: CInt -> Ordering
intToOrdering i = toEnum (fromIntegral i + 1)

peekOrdering :: Ptr CInt -> IO Ordering
peekOrdering = fmap intToOrdering . peek

withOrdering :: Ordering -> (Ptr CInt -> IO a) -> IO a
withOrdering o = with (orderingToInt o)