# # Split multichannel PCM stream to channel groups # Slightly modified from upstream # # # 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.0 { 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 chmap [ "${var:__HWChannelPos0}" ] } format "${var:__Format}" channels "${evali:$__HWChannels}" period_time "${evali:$__period_time}" buffer_time "${evali:$__buffer_time}" } bindings.0 $CHN0 } If.pos1 { Condition { Type String Empty "${var:__HWChannelPos1}" } False.LibraryConfig.pos1.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:__HWChannelPos1}" ] } } If.pos2 { Condition { Type String Empty "${var:-__HWChannelPos2}" } False.LibraryConfig.pos2.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos2}" ] } } If.pos3 { Condition { Type String Empty "${var:-__HWChannelPos3}" } False.LibraryConfig.pos3.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos3}" ] } } If.pos4 { Condition { Type String Empty "${var:-__HWChannelPos4}" } False.LibraryConfig.pos4.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos4}" ] } } If.pos5 { Condition { Type String Empty "${var:-__HWChannelPos5}" } False.LibraryConfig.pos4.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos5}" ] } } If.pos6 { Condition { Type String Empty "${var:-__HWChannelPos6}" } False.LibraryConfig.pos6.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos6}" ] } } If.pos7 { Condition { Type String Empty "${var:-__HWChannelPos7}" } False.LibraryConfig.pos7.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos7}" ] } } If.pos8 { Condition { Type String Empty "${var:-__HWChannelPos8}" } False.LibraryConfig.pos8.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos8}" ] } } If.pos9 { Condition { Type String Empty "${var:-__HWChannelPos9}" } False.LibraryConfig.pos9.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos9}" ] } } If.pos10 { Condition { Type String Empty "${var:-__HWChannelPos10}" } False.LibraryConfig.pos10.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos10}" ] } } If.pos11 { Condition { Type String Empty "${var:-__HWChannelPos11}" } False.LibraryConfig.pos11.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos11}" ] } } If.pos12 { Condition { Type String Empty "${var:-__HWChannelPos12}" } False.LibraryConfig.pos12.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos12}" ] } } If.pos13 { Condition { Type String Empty "${var:-__HWChannelPos13}" } False.LibraryConfig.pos13.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos13}" ] } } If.pos14 { Condition { Type String Empty "${var:-__HWChannelPos14}" } False.LibraryConfig.pos14.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos14}" ] } } If.pos15 { Condition { Type String Empty "${var:-__HWChannelPos15}" } False.LibraryConfig.pos15.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos15}" ] } } If.pos16 { Condition { Type String Empty "${var:-__HWChannelPos16}" } False.LibraryConfig.pos16.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos16}" ] } } If.pos17 { Condition { Type String Empty "${var:-__HWChannelPos17}" } False.LibraryConfig.pos17.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos17}" ] } } If.pos18 { Condition { Type String Empty "${var:-__HWChannelPos18}" } False.LibraryConfig.pos18.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos18}" ] } } If.pos19 { Condition { Type String Empty "${var:-__HWChannelPos19}" } False.LibraryConfig.pos19.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos19}" ] } } If.pos20 { Condition { Type String Empty "${var:-__HWChannelPos20}" } False.LibraryConfig.pos20.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos20}" ] } } If.pos21 { Condition { Type String Empty "${var:-__HWChannelPos21}" } False.LibraryConfig.pos21.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos21}" ] } } If.pos22 { Condition { Type String Empty "${var:-__HWChannelPos22}" } False.LibraryConfig.pos22.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos22}" ] } } If.pos23 { Condition { Type String Empty "${var:-__HWChannelPos23}" } False.LibraryConfig.pos23.SubstiConfig.pcm."${var:__Name}" { slave.pcm.chmap [ "${var:-__HWChannelPos23}" ] } } If.ch1 { Condition { Type RegexMatch Regex "^([2-9]|[1-9][0-9])$" String "${var:__Channels}" } True.LibraryConfig.ch1.SubstiConfig.pcm."${var:__Name}" { @args.3 CHN1 @args { CHN1.type integer } bindings.1 $CHN1 } } 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.0 { Condition { Type String Empty "${var:__Device}" } True.Define.__Device "0" } If.1 { Condition { Type String Empty "${var:@SplitPCM}" } False { Value { "${var:__Direction}Channels" "${var:__HWChannels}" "${var:__Direction}PCM" "hw:${CardId},${var:__Device}" "${var:__Direction}Channel0" "${var:__Channel0}" "${var:__Direction}ChannelPos0" "${var:__ChannelPos0}" } If.ch1 { Condition { Type String Empty "${var:-__Channel1}" } False.Value { "${var:__Direction}Channel1" "${var:__Channel1}" "${var:__Direction}ChannelPos1" "${var:__ChannelPos1}" } } } True { Define.__pcmdev "${var:__Name}:${CardId},${var:__Device},${var:__Channel0}" If.ch1 { Condition { Type String Empty "${var:-__Channel1}" } False.Define.__pcmdev "${var:__pcmdev},${var:__Channel1}" } Value { "${var:__Direction}Channels" "${var:__Channels}" "${var:__Direction}PCM" "${var:__pcmdev}" } } } }