# Configuration file syntax

# Include a new configuration file
<filename>

# Simple assign
name [=] value [,|;]

# Compound assign (first style)
name [=] {
	name1 [=] value [,|;]
	...
}

# Compound assign (second style)
name.name1 [=] value [,|;]

# Array assign (first style)
name [
	value0 [,|;]
	value1 [,|;]
	...
]

# Array assign (second style)
name.0 [=] value0 [,|;]
name.1 [=] value1 [,|;]

# ******************************************************************************

# Server definition
server.NAME {
  host STR		# host where the server is located (if map to local address 
			# server is local, and then it may be started automatically)
  [socket STR]		# PF_LOCAL socket name to listen/connect
  [port INT]		# PF_INET port number to listen/connect
}

# PCM type definition
pcm_type.NAME {
  [lib STR]		# Library file (default libasound.so)
  [open	STR]		# Open function (default _snd_pcm_NAME_open)
  [redirect {		# Redirect this PCM to an another
     [filename STR]	# Configuration file specification
     name STR		# PCM name specification
  }]
}

# PCM scope type definition
pcm_scope_type.NAME {
  [lib STR]		# Library file (default libasound.so)
  [open STR]		# Open function (default _snd_pcm_scope_NAME_open)
}

# PCM scope definition
pcm_scope.NAME {
  type STR		# Scope type
  ...
}

# Slave PCM definition
pcm_slave.NAME {
  pcm STR		# PCM name
  # or
  pcm { }		# PCM definition
  format STR		# Format
  channels INT		# Channels
  rate INT		# Rate
  period_time INT	# Period time
  buffer_time INT	# Buffer time
  etc.
}

# Hook arguments definition
hook_args.NAME {
  ...			# Arbitrary arguments
}

# PCM hook type
pcm_hook_type.NAME {
  [lib STR]		# Library file (default libasound.so)
  [install STR]		# Install function (default _snd_pcm_hook_NAME_install)
}

# PCM hook definition
pcm_hook.NAME {
  type STR		# PCM Hook type (see pcm_hook_type)
  [args STR]		# Arguments for install function (see hook_args)
  # or
  [args { }]		# Arguments for install function
}

# PCM definition
pcm.NAME {
  type STR		# Type
  [comment ANY]		# Saved comments


# PCM types:
  type hw 		# Kernel PCM
  card INT/STR		# Card name or number
  [device] INT		# Device number (default 0)	
  [subdevice] INT	# Subdevice number, -1 first available (default -1)
  mmap_emulation BOOL	# enable mmap emulation for ro/wo devices


  type hooks 		# PCM with hooks
  slave STR		# Slave name (see pcm_slave)
  # or
  slave {		# Slave definition
    pcm STR		# Slave PCM name
    # or
    pcm { }		# Slave PCM definition
  }
  hooks {
    ID STR		# Hook name (see pcm_hook)
    # or
    ID { }		# Hook definition (see pcm_hook)
  }

  type plug		# Format adjusted PCM
  slave STR		# Slave name (see pcm_slave)
  # or
  slave {		# Slave definition
    pcm STR		# Slave PCM name
    # or
    pcm { }		# Slave PCM definition
    [format STR]	# Slave format (default nearest) or "unchanged"
    [channels INT]	# Slave channels (default nearest) or "unchanged"
    [rate INT]		# Slave rate (default nearest) or "unchanged"
  }
  route_policy STR	# route policy for automatic ttable generation
			# STR can be 'default', 'average', 'copy', 'duplicate'
			# average: result is average of input channels
			# copy: only first channels are copied to destination
			# duplicate: duplicate first set of channels
			# default: copy policy, except for mono capture - sum
  ttable {	 	# Transfer table (bidimensional compound of 
	        	# cchannels * schannels numbers)
    CCHANNEL {
      SCHANNEL REAL	# route value (0.0 ... 1.0)
    }
  }


  type copy		# Copy conversion PCM
  slave STR		# Slave name (see pcm_slave)
  # or
  slave {		# Slave definition
    pcm STR		# Slave PCM name
    # or
    pcm { }		# Slave PCM definition
  }


  type linear		# Linear format conversion PCM
  type adpcm		# IMA-ADPCM format conversion PCM
  type alaw		# A-Law format conversion PCM
  type mulaw		# Mu-Law format conversion PCM
  slave STR		# Slave name (see pcm_slave)
  # or
  slave {		# Slave definition
    pcm STR		# Slave PCM name
    # or
    pcm { }		# Slave PCM definition
    format STR		# Slave format
  }


  type rate		# Rate conversion PCM
  slave STR		# Slave name (see pcm_slave)
  # or
  slave {		# Slave definition
    pcm STR		# Slave PCM name
    # or
    pcm { }		# Slave PCM definition
    [format STR]	# Slave format (default client format)
    rate INT		# Slave rate
  }


  type route		# Attenuated static route PCM
  slave STR		# Slave name (see pcm_slave)
  # or
  slave {		# Slave definition
    pcm STR		# Slave PCM name
    # or
    pcm { }		# Slave PCM definition
    [format STR]	# Slave format (default client format)
    [channels INT]	# Slave channels (default client channels)
  }
  ttable {	 	# Transfer table (bidimensional compound of 
	        	# cchannels * schannels numbers)
    CCHANNEL {
      SCHANNEL REAL	# route value (0.0 ... 1.0)
    }
  }


  type multi		# Linked PCMs (exclusive access to selected channels)
  slaves {		# Slaves definitions
    ID STR		# Slave name for slave N (see pcm_slave)
    # or
    ID {		# Slave definition for slave N
      pcm STR		# Slave PCM name
    # or
      pcm { }		# Slave PCM definition
      channels INT	# Slave channels
    }
  }
  bindings {		# Bindings table
    N {			# Binding for client channel N
      slave STR		# Slave key
      channel INT	# Slave channel
    }
  }
  [master INT]		# Define the master slave


  type file		# File plugin
  slave STR		# Slave name (see pcm_slave)
  # or
  slave {		# Slave definition
    pcm STR		# Slave PCM name
    # or
    pcm { }		# Slave PCM definition
  }
  file STR		# File name
  # or
  file INT		# File descriptor
  [format STR]		# File format (NYI)
  [perm INT]		# File permission (default 0600)

  type meter		# Meter PCM
  slave STR		# Slave name (see pcm_slave)
  # or
  slave {		# Slave definition or name
    pcm STR		# Slave PCM name
    # or
    pcm { }		# Slave PCM definition
  }
  [frequency INT]	# Updates per second
  scopes {		# Scopes
    ID STR		# Scope name (see pcm_scope)
  # or
    ID { }		# Scope definition (see pcm_scope)
  }


  type droute		# Attenuated dynamic route PCM (NYI)
  slave STR		# Slave name (see pcm_slave)
  # or
  slave {		# Slave definition
    pcm STR		# Slave PCM name
    # or
    pcm { }		# Slave PCM definition
    [format STR]	# Slave format (default client format)
    [channels INT]	# Slave channels (default client channels)
  }
  ctl STR		# Ctl name
  bindings {		# Bindings table
    ID {		# Binding entry
      cchannels {	# Client channels
        C INT		# Client channel
      }
      schannel {	# Slave channels
        S INT		# Slave channel
      }
      control STR	# Control name of C * S (or C values: only if C == S)
    }
  }


  type null		# Null endpoint plugin
  [time INT]		# Time related or not (NYI)


  type shm		# Shared memory client PCM
  server STR		# Server name
  pcm STR		# PCM name on server


  type share		# Share PCM
  slave STR		# Slave name (see pcm_slave)
  bindings {		# Bindings table
    N INT		# Slave channel for client channel N
  }


  type mix		# Mix PCM
  slave STR		# Slave name (see pcm_slave)
  bindings {		# Bindings table
    N INT		# Slave channel for client channel N
  }


  type ladspa		# LADSPA plugin PCM
  slave STR		# Slave name (see pcm_slave)
  path STR		# Path or paths (delimited with ':')
  plugins | playback_plugins | capture_plugins {
    N {			# Configuration for LADSPA plugin N
      id #		# LADSPA plugin ID (for example 1043)
      label STR		# LADSPA plugin label (for example 'delay_5s')
      filename STR	# Full filename of .so library with LADPA plugin code
      policy STR	# Policy can be 'none' or 'duplicate'
      input | output {
        bindings {
          C INT or STR  # C - channel, INT - audio port index, STR - audio port name
        }
        controls {
          I INT or REAL # I - control port index, INT or REAL - control value
        }
      }
    }
  }

  type dmix		# Direct mixing plugin
  slave STR		# Slave name (see pcm_slave)
  ipc_key INT		# Unique ipc key
  ipc_perm INT		# ipc permissions (default 0600)
  ipc_gid INT		# ipc gid (default -1 = disable)
  ipc_key_add_uid BOOL  # Add current uid to ipc_key
  bindings {		# Bindings table
    N INT		# Slave channel for client channel N
  }

  type dsnoop		# Direct snoop (split one capture stream to more)
  slave STR		# Slave name (see pcm_slave)
  ipc_key INT		# Unique ipc key
  ipc_perm INT		# ipc permissions (default 0600)
  ipc_gid INT		# ipc gid (default -1 = disable)
  ipc_key_add_uid BOOL  # Add current uid to ipc_key
  bindings {		# Bindings table
    N INT		# Slave channel for client channel N
  }

  type dshare		# Share channels from one stream
  slave STR		# Slave name (see pcm_slave)
  ipc_key INT		# Unique ipc key
  ipc_perm INT		# ipc permissions (default 0600)
  ipc_gid INT		# ipc gid (default -1 = disable)
  ipc_key_add_uid BOOL  # Add current uid to ipc_key
  bindings {		# Bindings table
    N INT		# Slave channel for client channel N
  }
}

# CTL type definition
ctl_type.NAME {
  [lib STR]		# Library file (default libasound.so)
  [open STR]		# Open function (default _snd_ctl_NAME_open)
}

# CTL definition
ctl.NAME {
  type STR		# Type
  [comment ANY]		# Saved comments

# CTL types
  type hw
  card STR/INT		# Card name or number


  type shm		# Shared memory client CTL
  server STR		# Server name
  ctl STR		# CTL name on server


}


# RAWMIDI type definition
rawmidi_type.NAME {
  [lib STR]		# Library file (default libasound.so)
  [open STR]		# Open function (default _snd_rawmidi_NAME_open)
}

# RAWMIDI definition
rawmidi.NAME {
  type STR		# Type
  [comment ANY]		# Saved comments

# RAWMIDI types:
  type hw 		# Kernel RAWMIDI
  card INT/STR		# Card name or number
  [device] INT		# Device number (default 0)	
  [subdevice] INT	# Subdevice number, -1 first available (default -1)


}

# SEQ type definition
seq_type.NAME {
  [lib STR]		# Library file (default libasound.so)
  [open STR]		# Open function (default _snd_seq_NAME_open)
}

# SEQ definition
seq.NAME {
  type STR		# Type
  [comment ANY]		# Saved comments

# SEQ types:
  type hw 		# Kernel SEQ


}

# Aliases
DEF.NAME1 NAME2		# DEF.NAME1 is an alias for DEF.NAME2

Some examples:

pcm.trident {
	type hw
	card 0
	device 0
}

pcm.ice1712 {
	type hw
	card 1
	device 0
}

pcm.ice1712_spdif {
	type plug
	ttable.0.8 1
	ttable.1.9 1
	slave.pcm ice1712
}

pcm_slave.rs {
	pcm trident
	rate 44100
}

pcm.r {
	type rate
	slave rs
}

pcm.m {
	type meter
	slave.pcm plug:trident
	frequency 50
	scopes [
		{
			type level
		}
	]
}

pcm_scope_type.level {
	lib /home/abramo/scopes/scope-level.so
} 

# an example command is 'aplay -D plug:ladspa <filename>'
# otherwise, the ladspa plugin expects FLOAT type which
# is very rare
pcm.ladspa {
        type ladspa
        slave.pcm "plughw:0,0";
        path "/home/perex/src/ladspa_sdk/plugins";
        plugins [
                {
                        label delay_5s
                        input {
                                controls [ 0.8 0.2 ]
                        }
                }
        ]
}

# an example command for dmix plugin to force 44100Hz mixing rate:
# aplay -D"plug:'dmix:RATE=44100'" <filename>
# an example command for dmix plugin to force 44100Hz and hw:1,0 output device
# aplay -Dplug:\'dmix:SLAVE=\"hw:1,0\",RATE=44100\' <filename>
# an example command for dmix plugin to force 32-bit signed little endian format
# aplay -D"plug:'dmix:FORMAT=S32_LE'" <filename>
