[alsa-devel] handling of dmix and non-dmix in the same configuration file
on the Blackfin processor, we have an "almost-but-not-quite" AC97 interface (called a "SPORT"). the trouble is that we can hook up AC97 codecs, but in order to properly communicate with codecs, we need to repacketize the communication between the higher alsa layers and the actual SPORT. great ... but now we want to support dmix/dsnoop. the overhead for dmix vs non-dmix is such that we make it optional. if the user does not need software mixing, they can disable this overhead. this leads to two (incompatible) alsa config files (in this case, for the AD1980 codec). we're wondering if it's possible to have the right settings selected on the fly some how during runtime rather than having to select one file or the other.
the dmix config: AD1980.pcm.default { @args [ CARD ] @args.CARD { type string } type asym playback.pcm { type plug slave.pcm { @func concat strings [ "dmix:CARD=" $CARD ] } } capture.pcm { type plug slave.pcm { @func concat strings [ "dsnoop:CARD=" $CARD ] } } }
the non-dmix config: AD1980.pcm.default { type plug slave { pcm { type mmap_emul slave { pcm { type hw card 0 format S16_LE rate 48000 channels 2 sync_ptr_ioctl 1 } } } } } -mike
Mike Frysinger wrote:
[...] but now we want to support dmix/dsnoop. the overhead for dmix vs non-dmix is such that we make it optional. if the user does not need software mixing, they can disable this overhead. this leads to two (incompatible) alsa config files (in this case, for the AD1980 codec). we're wondering if it's possible to have the right settings selected on the fly some how during runtime rather than having to select one file or the other.
Let's assume we have the following definitions:
AD1980.pcm.default_dmix_yes { ... } AD1980.pcm.default_dmix_no { ... }
Then we can select one of them based on a setting in some configuration file:
AD1980.pcm.default { @args [ CARD ] @args.CARD { type string } @func refer name { @func concat strings [ "cards.AD1980.pcm.default_dmix_" { @func refer name defaults.use_AD1980_dmix default yes } ":CARD=" $CARD ] } }
To disable dmix, put the line defaults.use_AD1980_dmix no into /etc/asound.conf or the user's ~/.asoundrc.
It is also possible to use the value of an environment variable:
AD1980.pcm.default { @args [ CARD ] @args.CARD { type string } @func refer name { @func concat strings [ "cards.AD1980.pcm.default_dmix_" { @func getenv vars [ USE_AD1980_DMIX ] default yes } ":CARD=" $CARD ] } }
This environment variable must be set to "no" before starting the respective application.
It is also possible to use the value of an environment variable but to fall back to some configuration setting if the env var does not exist:
AD1980.pcm.default { @args [ CARD ] @args.CARD { type string } @func refer name { @func concat strings [ "cards.AD1980.pcm.default_dmix_" { @func getenv vars [ USE_AD1980_DMIX ] default { @func refer name defaults.use_AD1980_dmix default yes } } ":CARD=" $CARD ] } }
HTH Clemens
participants (2)
-
Clemens Ladisch
-
Mike Frysinger