ALSA и PulseAudio
Pulseaudio хорош, мне все в нем нравится. Одна беда - некоторые приложения постарше не всегда корректно с ним работают. Сегодня я захотел вдруг вспомнить старые времена и поиграть в neverwinter nights. Нашел у себя дистрибутив, запустил, все было бы хорошо, если бы не прерывистый звук. Я точно помнил, что на alsa он работал. Поскольку отказываться от pulseaudio из-за одной игрушки мне не хотелось, я пришел к нижеизложенному решению.
Основная идея такая – нужна возможность задавать устройство по умолчанию через переменные окружения. Решение оказалось простым до безобразия. Всего-навсего надо вставить простенькую подпрограмку в asound.conf, которая будет обращатся к переменной окружения.
Итак, листинг /etc/asound.conf
.pulse {
pcm
type pulse}
.pulse {
ctl
type pulse}
.!default {
pcm@func refer
{ @func concat
name [ "pcm."
strings { @func getenv
[ ALSA_DEFAULT_PCM ]
vars default "pulse"
}
]
}
}
.!default {
ctl@func refer
{ @func concat
name [ "ctl."
strings { @func getenv
[ ALSA_DEFAULT_CTL
vars
ALSA_DEFAULT_PCM]
default "pulse"
}
]
}
}
Соответственно чтобы звук нужной программы не направлялся на pulseaudio, достаточно установить переменную окружения:
$ export ALSA_DEFAULT_PCM=hw
Если эта переменная окружения не задана, то любая программа, написанная с использованием alsalib будет работать через pulseaudio.
Чтобы запускать какие-то конкретные приложения, проще всего написать shell-скрипты, например:
#!/bin/bash
export ALSA_DEFAULT_PCM=hw
./nwn
И запускать при помощи nwn-alsa.
Как известно, переменные окружения хранятся только внутри текущей и дочерних сессий оболочки, поэтому при использовании такого скрипта видеть нашу переменную будет только ./nwn
Реализация (за несущественными поправками) найдена здесь: http://alsa.opensrc.org/index.php/Default_device_from_environment_variable
P.S. Да, есть минус, который обнаружился только впоследствии. ALSA блокирует звуковуху, так что в процессе работы программы через ALSA, звук через другие звуковые серверы выводиться не будет, увы. Придумаю как обойти - расскажу