alsa-pcm-0.6: src/Sound/ALSA/PCM/Parameters/Hardware.hs
module Sound.ALSA.PCM.Parameters.Hardware (
-- * Types
T, SampleFreq, Time, Size,
Interleaved, Noninterleaved,
{-
HwParams.Access,
HwParams.accessMmapInterleaved,
HwParams.accessMmapNoninterleaved,
HwParams.accessMmapComplex,
HwParams.accessRwInterleaved,
HwParams.accessRwNoninterleaved,
HwParams.Format,
HwParams.formatUnknown,
HwParams.formatS8,
HwParams.formatU8,
HwParams.formatS16Le,
HwParams.formatS16Be,
HwParams.formatU16Le,
HwParams.formatU16Be,
HwParams.formatS24Le,
HwParams.formatS24Be,
HwParams.formatU24Le,
HwParams.formatU24Be,
HwParams.formatS32Le,
HwParams.formatS32Be,
HwParams.formatU32Le,
HwParams.formatU32Be,
HwParams.formatFloatLe,
HwParams.formatFloatBe,
HwParams.formatFloat64Le,
HwParams.formatFloat64Be,
HwParams.formatIec958SubframeLe,
HwParams.formatIec958SubframeBe,
HwParams.formatMuLaw,
HwParams.formatALaw,
HwParams.formatImaAdpcm,
HwParams.formatMpeg,
HwParams.formatGsm,
HwParams.formatSpecial,
HwParams.formatS243le,
HwParams.formatS243be,
HwParams.formatU243le,
HwParams.formatU243be,
HwParams.formatS203le,
HwParams.formatS203be,
HwParams.formatU203le,
HwParams.formatU203be,
HwParams.formatS183le,
HwParams.formatS183be,
HwParams.formatU183le,
HwParams.formatU183be,
HwParams.formatS16,
HwParams.formatU16,
HwParams.formatS24,
HwParams.formatU24,
HwParams.formatS32,
HwParams.formatU32,
HwParams.formatFloat,
HwParams.formatFloat64,
HwParams.formatIec958Subframe,
HwParams.Subformat,
-}
-- * Primitive accessors to hardware parameters
HwParams.canMmapSampleResolution,
HwParams.isDouble,
HwParams.isBatch,
HwParams.isBlockTransfer,
HwParams.canOverrange,
HwParams.canPause,
HwParams.canResume,
HwParams.isHalfDuplex,
HwParams.isJointDuplex,
HwParams.canSyncStart,
HwParams.getRateNumden,
HwParams.getSbits,
HwParams.getFifoSize,
{- integrated in 'with'
HwParams.getAccess,
HwParams.testAccess,
HwParams.setAccess,
HwParams.setAccessFirst,
HwParams.setAccessLast,
HwParams.getFormat,
HwParams.testFormat,
HwParams.setFormat,
HwParams.setFormatFirst,
HwParams.setFormatLast,
-}
{- don't know how to use this reasonably
HwParams.getSubformat,
HwParams.testSubformat,
HwParams.setSubformat,
HwParams.setSubformatFirst,
HwParams.setSubformatLast,
-}
HwParams.getChannels,
HwParams.getChannelsMin,
HwParams.getChannelsMax,
HwParams.testChannels,
setChannels,
setChannelsMin,
setChannelsMax,
setChannelsMinmax,
setChannelsNear,
setChannelsFirst,
setChannelsLast,
HwParams.getRate,
HwParams.getRateMin,
HwParams.getRateMax,
HwParams.testRate,
HwParams.setRate,
HwParams.setRateMin,
HwParams.setRateMax,
HwParams.setRateMinmax,
HwParams.setRateNear,
HwParams.setRateFirst,
HwParams.setRateLast,
HwParams.setRateResample,
HwParams.getRateResample,
HwParams.setExportBuffer,
HwParams.getExportBuffer,
HwParams.getPeriodTime,
HwParams.getPeriodTimeMin,
HwParams.getPeriodTimeMax,
HwParams.testPeriodTime,
HwParams.setPeriodTime,
HwParams.setPeriodTimeMin,
HwParams.setPeriodTimeMax,
HwParams.setPeriodTimeMinmax,
HwParams.setPeriodTimeNear,
HwParams.setPeriodTimeFirst,
HwParams.setPeriodTimeLast,
HwParams.getPeriodSize,
HwParams.getPeriodSizeMin,
HwParams.getPeriodSizeMax,
HwParams.testPeriodSize,
HwParams.setPeriodSize,
HwParams.setPeriodSizeMin,
HwParams.setPeriodSizeMax,
HwParams.setPeriodSizeMinmax,
HwParams.setPeriodSizeNear,
HwParams.setPeriodSizeFirst,
HwParams.setPeriodSizeLast,
HwParams.setPeriodSizeInteger,
HwParams.getPeriods,
HwParams.getPeriodsMin,
HwParams.getPeriodsMax,
HwParams.testPeriods,
HwParams.setPeriods,
HwParams.setPeriodsMin,
HwParams.setPeriodsMax,
HwParams.setPeriodsMinmax,
HwParams.setPeriodsNear,
HwParams.setPeriodsFirst,
HwParams.setPeriodsLast,
HwParams.setPeriodsInteger,
HwParams.getBufferTime,
HwParams.getBufferTimeMin,
HwParams.getBufferTimeMax,
HwParams.testBufferTime,
HwParams.setBufferTime,
HwParams.setBufferTimeMin,
HwParams.setBufferTimeMax,
HwParams.setBufferTimeMinmax,
HwParams.setBufferTimeNear,
HwParams.setBufferTimeFirst,
HwParams.setBufferTimeLast,
HwParams.getBufferSize,
HwParams.getBufferSizeMin,
HwParams.getBufferSizeMax,
HwParams.testBufferSize,
HwParams.setBufferSize,
HwParams.setBufferSizeMin,
HwParams.setBufferSizeMax,
HwParams.setBufferSizeMinmax,
HwParams.setBufferSizeNear,
HwParams.setBufferSizeFirst,
HwParams.setBufferSizeLast,
HwParams.getTickTime,
HwParams.getTickTimeMin,
HwParams.getTickTimeMax,
HwParams.testTickTime,
HwParams.setTickTime,
HwParams.setTickTimeMin,
HwParams.setTickTimeMax,
HwParams.setTickTimeMinmax,
HwParams.setTickTimeNear,
HwParams.setTickTimeFirst,
HwParams.setTickTimeLast,
HwParams.getMinAlign,
-- * Complex hardware parameter configuration
setRateBufferTime,
) where
import qualified Sound.ALSA.PCM.Core.HwParams as HwParams
import Sound.ALSA.PCM.Core.HwParams (T, )
import Sound.ALSA.PCM.Core.Handle
(SampleFreq, Time, Size, Interleaved, Noninterleaved, )
import Data.Word (Word, )
{-
Our approach cannot assert, that setChannels is called.
Is this necessary, at all?
If yes, setChannel accessors could return a secret value,
that must be passed to 'writen' in order to prove,
that setChannel was called.
-}
{- |
For non-interleaved access the number of channels must be set manually.
It can be chosen at runtime,
but the compiler cannot check whether the number of allocated channels
matches the one in 'readn' and 'writen'.
In interleaved access the number of channels is derived from the type
and must not be set manually.
The number is static
but the compiler checks consistency with 'readi' and 'writei'.
-}
setChannels :: Word -> T Noninterleaved y ()
setChannels = HwParams.setChannels
setChannelsMin :: Word -> T Noninterleaved y Word
setChannelsMin = HwParams.setChannelsMin
setChannelsMax :: Word -> T Noninterleaved y Word
setChannelsMax = HwParams.setChannelsMax
setChannelsMinmax :: Word -> Word -> T Noninterleaved y (Word, Word)
setChannelsMinmax = HwParams.setChannelsMinmax
setChannelsNear :: Word -> T Noninterleaved y Word
setChannelsNear = HwParams.setChannelsNear
setChannelsFirst :: Word -> T Noninterleaved y Word
setChannelsFirst = HwParams.setChannelsFirst
setChannelsLast :: Word -> T Noninterleaved y Word
setChannelsLast = HwParams.setChannelsLast
setRateBufferTime ::
SampleFreq -- ^ sample frequency
-> Time -- ^ buffer time
-> Time -- ^ period time
-> T Interleaved y (Size,Size)
-- ^ (bufferSize,periodSize)
setRateBufferTime rate bufferTime periodTime = do
HwParams.setRate rate EQ
_ <- HwParams.setBufferTimeNear bufferTime EQ
bufferSize <- HwParams.getBufferSize
_ <- HwParams.setPeriodTimeNear periodTime EQ
(periodSize,_) <- HwParams.getPeriodSize
return (bufferSize,periodSize)