ALSA и PulseAudio

Опубликовано 4 Июля, 2008 под тегами PulseAudio, Cheats, Звук

Pulseaudio хорош, мне все в нем нравится. Одна беда - некоторые приложения постарше не всегда корректно с ним работают. Сегодня я захотел вдруг вспомнить старые времена и поиграть в neverwinter nights. Нашел у себя дистрибутив, запустил, все было бы хорошо, если бы не прерывистый звук. Я точно помнил, что на alsa он работал. Поскольку отказываться от pulseaudio из-за одной игрушки мне не хотелось, я пришел к нижеизложенному решению.

Основная идея такая – нужна возможность задавать устройство по умолчанию через переменные окружения. Решение оказалось простым до безобразия. Всего-навсего надо вставить простенькую подпрограмку в asound.conf, которая будет обращатся к переменной окружения.

Итак, листинг /etc/asound.conf

pcm.pulse {
    type pulse
}

ctl.pulse {
    type pulse
}

pcm.!default {
    @func refer
    name { @func concat 
           strings [ "pcm."
                     { @func getenv
                       vars [ ALSA_DEFAULT_PCM ]
                       default "pulse"
                     }
           ]
         }
}

ctl.!default {
    @func refer
    name { @func concat 
           strings [ "ctl."
                     { @func getenv
                       vars [ ALSA_DEFAULT_CTL
                              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, звук через другие звуковые серверы выводиться не будет, увы. Придумаю как обойти - расскажу