# # Split multichannel PCM stream to channel groups # # # Helper macros # DefineMacro.SplitPCM_chnpos { Define._varrefpos "__HWChannelPos${var:__Index}" Define._pos "$${var:$_varrefpos}" If.a { Condition { Type String Empty "${var:_pos}" } False.LibraryConfig.0.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:_pos}" ] } } } DefineMacro.SplitPCM_chn.If.a { Condition { Type RegexMatch Regex "${var:__ChRegex}" String "${var:__Channels}" } True.LibraryConfig.0.SubstiConfig.pcm."${var:__Name}" { @args."${eval:$__ChIndex+2}" "CHN${var:__ChIndex}" @args { "CHN${var:__ChIndex}".type integer } bindings."${var:__ChIndex}" "$CHN${var:__ChIndex}" } } DefineMacro.SplitPCMDevice_chnpos { Define._varrefchn "__Channel${var:__Index}" Define._chn "$${var:$_varrefchn}" If.a { Condition { Type String Empty "${var:-_chn}" } False { Define._varrefpos "__ChannelPos${var:__Index}" Define._pos "$${var:$_varrefpos}" Value { "${var:__Direction}Channel${var:__Index}" "${var:_chn}" "${var:__Direction}ChannelPos${var:__Index}" "${var:_pos}" } } } } DefineMacro.SplitPCMDevice_addchn { Define._varrefchn "__Channel${var:__Index}" Define._chn "$${var:$_varrefchn}" If.a { Condition { Type String Empty "${var:_chn}" } False.Define.__pcmdev "${var:__pcmdev},${var:_chn}" } } # # Macro SplitPCM # # Application variable: # @SplitPCM - defined, return channel description using UCM values # # Arguments: # Name - PCM name (alsa-lib) # Direction - "Playback" or "Capture" # [Format] - sample format like S16_LE or S32_LE # Channels - application channels # HWChannels - hardware channels # HWChannelPos0 - channel position (MONO FR FL etc. - see alsa-lib's strings) # [HWChannelPos1] - channel position (MONO FR FL etc. - see alsa-lib's strings) # DefineMacro.SplitPCM.If.a { Condition { Type String Empty "${var:@SplitPCM}" } True { If.period_time { Condition { Type String Empty "${var:-SplitPCMPeriodTime}" } True.Define.__period_time 20000 False.Define.__period_time "${var:SplitPCMPeriodTime}" } If.buffer_time { Condition { Type String Empty "${var:-SplitPCMBufferTime}" } True.Define.__buffer_time 500000 False.Define.__buffer_time "${var:SplitPCMBufferTime}" } If.format { Condition { Type String Empty "${var:-__Format}" } True.Define.__Format S16_LE } LibraryConfig.pcm.SubstiConfig.pcm."${var:__Name}" { @args [ CARD DEV CHN0 ] @args { CARD.type string DEV.type integer CHN0.type integer } ipc_key 6678293 type dshare slave { pcm { type hw card $CARD device $DEV } format "${var:__Format}" channels "${evali:$__HWChannels}" period_time "${evali:$__period_time}" buffer_time "${evali:$__buffer_time}" } bindings.0 $CHN0 } Macro.pos00.SplitPCM_chnpos "Index=0" Macro.pos01.SplitPCM_chnpos "Index=1" Macro.pos02.SplitPCM_chnpos "Index=2" Macro.pos03.SplitPCM_chnpos "Index=3" Macro.pos04.SplitPCM_chnpos "Index=4" Macro.pos05.SplitPCM_chnpos "Index=5" Macro.pos06.SplitPCM_chnpos "Index=6" Macro.pos07.SplitPCM_chnpos "Index=7" Macro.pos08.SplitPCM_chnpos "Index=8" Macro.pos09.SplitPCM_chnpos "Index=9" Macro.pos10.SplitPCM_chnpos "Index=10" Macro.pos11.SplitPCM_chnpos "Index=11" Macro.pos12.SplitPCM_chnpos "Index=12" Macro.pos13.SplitPCM_chnpos "Index=13" Macro.pos14.SplitPCM_chnpos "Index=14" Macro.pos15.SplitPCM_chnpos "Index=15" Macro.pos16.SplitPCM_chnpos "Index=16" Macro.pos17.SplitPCM_chnpos "Index=17" Macro.pos18.SplitPCM_chnpos "Index=18" Macro.pos19.SplitPCM_chnpos "Index=19" Macro.pos20.SplitPCM_chnpos "Index=20" Macro.pos21.SplitPCM_chnpos "Index=21" Macro.pos22.SplitPCM_chnpos "Index=22" Macro.pos23.SplitPCM_chnpos "Index=23" Macro.pos24.SplitPCM_chnpos "Index=24" Macro.pos25.SplitPCM_chnpos "Index=25" Macro.pos26.SplitPCM_chnpos "Index=26" Macro.pos27.SplitPCM_chnpos "Index=27" Macro.pos28.SplitPCM_chnpos "Index=28" Macro.pos29.SplitPCM_chnpos "Index=29" Macro.pos30.SplitPCM_chnpos "Index=30" Macro.pos31.SplitPCM_chnpos "Index=31" Macro.ch1.SplitPCM_chn "ChIndex=1 ChRegex='^([2-9]|[1-9][0-9])$'" Macro.ch2.SplitPCM_chn "ChIndex=2 ChRegex='^([3-9]|[1-9][0-9])$'" Macro.ch3.SplitPCM_chn "ChIndex=3 ChRegex='^([4-9]|[1-9][0-9])$'" Macro.ch4.SplitPCM_chn "ChIndex=4 ChRegex='^([5-9]|[1-9][0-9])$'" Macro.ch5.SplitPCM_chn "ChIndex=5 ChRegex='^([6-9]|[1-9][0-9])$'" Macro.ch6.SplitPCM_chn "ChIndex=6 ChRegex='^([7-9]|[1-9][0-9])$'" Macro.ch7.SplitPCM_chn "ChIndex=7 ChRegex='^([8-9]|[1-9][0-9])$'" If.dir { Condition { Type String String1 "${var:__Direction}" String2 "Capture" } True.LibraryConfig.dir.Config.pcm."${var:__Name}".type dsnoop } } } # # Macro SplitPCMDevice # # Application variable: # @SplitPCM - defined, return channel description using UCM values # # Arguments: # Name - PCM name (alsa-lib) # Direction - "Playback" or "Capture" # Device - hardware PCM device number (optional - default 0) # Channels - count of application channels # HWChannels - total channels (in hardware) # Channel0 - channel index in stream for the destination channel 0 # [Channel1] - channel index in stream for the destination channel 1 (optional) # ChannelPos0 - channel position (MONO FR FL etc. - see alsa-lib's strings # [ChannelPos1] - channel position (MONO FR FL etc. - see alsa-lib's strings) # DefineMacro.SplitPCMDevice { If.a { Condition { Type String Empty "${var:-__Device}" } True.Define.__Device "0" } If.b { Condition { Type String Empty "${var:@SplitPCM}" } False { Value { "${var:__Direction}Channels" "${var:__HWChannels}" "${var:__Direction}PCM" "hw:${CardId},${var:__Device}" } Macro.chn0.SplitPCMDevice_chnpos "Index=0" Macro.chn1.SplitPCMDevice_chnpos "Index=1" Macro.chn2.SplitPCMDevice_chnpos "Index=2" Macro.chn3.SplitPCMDevice_chnpos "Index=3" Macro.chn4.SplitPCMDevice_chnpos "Index=4" Macro.chn5.SplitPCMDevice_chnpos "Index=5" Macro.chn6.SplitPCMDevice_chnpos "Index=6" Macro.chn7.SplitPCMDevice_chnpos "Index=7" } True { Define.__pcmdev "${var:__Name}:${CardId},${var:__Device}" Macro.ch0.SplitPCMDevice_addchn "Index=0" Macro.ch1.SplitPCMDevice_addchn "Index=1" Macro.ch2.SplitPCMDevice_addchn "Index=2" Macro.ch3.SplitPCMDevice_addchn "Index=3" Macro.ch4.SplitPCMDevice_addchn "Index=4" Macro.ch5.SplitPCMDevice_addchn "Index=5" Macro.ch6.SplitPCMDevice_addchn "Index=6" Macro.ch7.SplitPCMDevice_addchn "Index=7" Value { "${var:__Direction}Channels" "${var:__Channels}" "${var:__Direction}PCM" "${var:__pcmdev}" } } } }