Сменить звуковую карту на pyalsaaudio

Мне нужно изменить аудиоустройство, используемое в сценарии Python. Я использую alsaaudio, и в соответствии с этим http://pyalsaaudio.sourceforge.net/libalsaaudio.html это достигается простым вводом имени карты при создании устройства PCM. Когда я печатаю на Python

import alsaaudio
alsaaudio.cards()

я получил

[u'Intel', u'Q9000']

но создание объекта PCM как

alsaaudio.PCM(aa.PCM_CAPTURE, aa.PCM_NORMAL, 'Q9000')

он возвращается

Unknown PCM default:CARD=Q9000

Я попытался изменить .asoundrc, чтобы иметь конфигурацию, которую я хочу по умолчанию, но, хотя он работает с aplay и arecord на Python, аудиоустройство по умолчанию остается прежним.

На ~/.asoundrc я положил

pcm.quicktimeWebCam
{
    type hw
    card Q9000
}

pcm.internal
{
    type hw
    card Intel
}

pcm.!default
{
    type asym
    playback.pcm
    {
        type plug
        slave.pcm "internal"
    }
    capture.pcm
    {
        type plug
        slave.pcm "quicktimeWebCam"
    }
}

person cagnarrogna    schedule 16.07.2013    source источник
comment
А что ты делал в своем .asoundrc?   -  person CL.    schedule 16.07.2013
comment
Я избежал этой проблемы, изменив настройки звука по умолчанию в диспетчере звука... но в основном в .asoundrc я сделал то же самое, что и здесь... atgn.tumblr.com/post/54588497569/ (который отлично работал на моем Raspberry Pi с Debian )   -  person cagnarrogna    schedule 18.07.2013
comment
Я добавил контент в .asoundrc, у меня такая же проблема в Fedora18.   -  person cagnarrogna    schedule 28.08.2013
comment
Мне было бы интересно, если бы вы тем временем пришли к решению.   -  person Explicat    schedule 09.11.2013


Ответы (3)


Устройства ALSA представлены как «hw:x,y», где x — это устройство, а y — подустройство (если оно есть). Ожидается, что карта будет указана в форме «hw:x,y», а не в виде удобочитаемого имени.

card_info = {}
for device_number, card_name in enumerate(alsaaudio.cards()):
    card_info[card_name] = "hw:%s,0" % device_number

device = alsaaudio.PCM(card=card_info["Q9000"])
person Ella Rose    schedule 14.11.2014
comment
card kwarg устарел в пользу device, поэтому последняя строка должна читаться как `device = alsaaudio.PCM(device=card_info[Q9000]) для более новых версий python-alsaaudio. - person Franey; 10.02.2016

Имена устройств для alsaaudio имеют некоторые недокументированные особенности; когда вы используете обычный идентификатор карты (который возвращается cards()), ожидается, что у вас есть устройство default, которое принимает параметр карты. (По умолчанию default поддерживает этот параметр.)

Чтобы использовать конкретное устройство, используйте plug:internal или plug:quicktimeWebCam.

person CL.    schedule 28.08.2013
comment
спасибо за ваш ответ, CL, я пытался поставить alsaaudio.PCM(aa.PCM_CAPTURE, aa.PCM_NORMAL, 'plug:internal вместо alsaaudio.PCM(aa.PCM_CAPTURE, aa.PCM_NORMAL, 'Q9000'), но все равно получаю ошибку invalid value for card - person cagnarrogna; 28.08.2013

Похоже, это распространенная проблема, о которой сообщается ошибка. Путаница заключается в том, что объект PCM alsaaudio ожидает от аргумента карты. Поскольку упомянутая вики хотела бы, чтобы вы поверили, что это имя желаемой карты (технически ALSA называет это идентификатором). Это верно, если вы определили имя карты в качестве элемента управления для профиля устройства по умолчанию в .asoundrc, который вы используете.

С другой стороны, аргумент карты может принимать весь дескриптор PCM, как указано выше в CL. Как видно из упомянутой ошибки, представлен патч, который добавит эту функцию идентификации дескриптора PCM. До тех пор, пока это не будет добавлено в модуль, хороший способ определить правильный дескриптор для передачи объектам PCM — просмотреть вывод arecord -L (или, возможно, aplay -L, если вы ищете имя устройства воспроизведения).

person MrAlias    schedule 08.05.2014