Ошибка ALSA: счетчик каналов (2) недоступен для воспроизведения: недопустимый аргумент

У меня есть две очень разные части этого ответа. Я начну с немного более технической части, а затем с личных размышлений (ладно, разглагольствований).


Оболочка bash поставляется со скриптом cshtobash, спрятанным в каталоге examples/misc исходного дистрибутива.

Это не позволит взять csh скрипт и преобразовать его в bash, но это может быть полезно для кого-то в качестве первого шага в создании прототипа sh-стиля ~/.profile файла из уже существующего csh-стиля ~/.login файла.

Вход: Стандартный файл инициализации OpenBSD csh.

# $OpenBSD: dot.login,v 1.6 2015/12/15 16:37:58 deraadt Exp $
#
# csh login file

if ( ! $?TERMCAP ) then
        if ( $?XTERM_VERSION ) then
                tset -IQ '-munknown:?vt220' $TERM
        else
                tset -Q '-munknown:?vt220' $TERM
        endif
endif

stty    newcrt crterase

set     savehist=100
set     ignoreeof

setenv  EXINIT          'set ai sm noeb'

if (-x /usr/games/fortune) /usr/games/fortune

Выход: bash - не совсем то же самое... но хоть что-то.

# csh aliases


# csh environment variables

export USER='me'
export HOME='/home/me'
export PATH='/usr/bin:/bin:/usr/ucb:.'
export TERM='rxvt'
export SHELL='/bin/bash'
export EXINIT='set ai sm noeb'

# csh variables

set -o ignoreeof # ignoreeof
PS1='% '
prompt2='? '
HISTFILESIZE='100'

# special csh variables converted to bash equivalents

Да, программирование на C-shell "считается вредным". Это не значит, что вы не можете писать сценарии оболочки C-shell, которые не вредны или не надежны. Это также не означает, что каждый скрипт C-shell должен быть преобразован в bash. И это определенно не означает, что такое преобразование должно выполняться автоматическим инструментом! Это просто означает, что это неудобный язык, который имеет некоторые действительно странные причуды, особенно если вы больше привыкли к sh.

Как и в случае с любыми двумя языками программирования, когда один выходит из моды в пользу другого, это не означает, что существующие программы должны быть переписаны. Это также не означает, что знатоки вышедшего из моды языка должны перестать на нем говорить. Это просто означает, что это может быть не тот язык, который стоит брать, если вы ищете современный язык для написания сценариев оболочки.

С другой стороны, если перед вами стоит задача расширить или как-то иначе модифицировать csh скрипт, тогда может быть причина

  1. прочитать код
  2. понять его
  3. реализовать на другом языке

... особенно если вы не сильны в csh программировании.

Что касается автоматического перевода: Зачем?

Если скрипт работает и у вас в системе есть интерпретатор для него, нет необходимости переводить код. Автоматический перевод кода вряд ли создаст "лучший" код, и очень вероятно, что он не создаст сопровождаемый код, и в любом случае вам придется потратить время на проверку того, что переведенный скрипт ведет себя так же, как и оригинальный.

1
21.04.2017, 00:00
1 ответ

Да, потому что, если вы записываете напрямую с аппаратного устройства, вы можете записывать только те форматы, количество каналов, битрейт и т. д., которые напрямую поддерживаются аппаратным обеспечением. Итак, когда вы делаете что-то вроде

arecord -D hw:0,0 out.wav

, вы столкнетесь с этой проблемой; вам нужно либо добавить правильные параметры, как в

arecord -D hw:0,0 -c 1 -f S16_BE -f44100 out.wav

(конечно, с параметрами для вашего устройства, а не эти), либо вы можете использовать плагин преобразования, который ALSA автоматически делает доступным для каждого устройства, как в

arecord -D plughw:0,0 ... out.wav

и затем он будет преобразован в любой формат, который вы укажете.

То же самое относится к любому другому приложению, которое пытается записывать через ALSA. Вы также можете настроить свой собственный ~/.asoundrc с разумными значениями по умолчанию, если хотите.

Используйте arecord -L, чтобы получить список устройств/плагинов, с которых вы можете записывать.Возможно, вы захотите использовать автоматически предоставляемый плагин dsnoop, но вы не сказали нам, для чего вам нужна запись и что именно вы делали, когда пытались записать.

Правка:

Хорошо, недостающая информация:

Вы используете программу под названием Mathworks. В этой программе есть блок аудиозахвата, в котором есть параметр Имя устройства. Параметр по умолчанию равен hw:1,0.

Пока для этого параметра установлено любое значение hw:... , вы можете записывать всякое в ваш ~/.asoundrc до посинения, и это ничего не изменит, потому что hw:... означает "использовать оборудование напрямую, не говоря уже обо всех других плагинах, указанных в ~/.asoundrc".

Первым шагом является определение правильного устройства: выполните arecord -l, и вы увидите что-то вроде

card X: NAME_OF_CARD, device Y: NAME_OF_DEVICE
  ...

Теперь измените значение вышеуказанного параметра на plughw:X, Y, например plughw:1,0, удалите файл ~/.asoundrc, чтобы удалить возможный дополнительный источник ошибок, и повторите попытку. plughw:... поместит plug плагин непосредственно перед данным аппаратным устройством в качестве ведомого.

Если он по-прежнему не работает, есть две возможные причины, и сообщение об ошибке, которое вы получите, подскажет, что это может быть:

(1) Блок Mathworks написан таким образом, что он работает только напрямую с аппаратными устройствами, а не с плагинами, и у него нет возможности изменить количество каналов (может быть, есть лишний параметр, о котором забыли упомянуть в документации). В этом случае вы мало что можете сделать. Вы можете попробовать использовать dsp.audiofilereader на именованном канале с arecord на другом конце, но я не уверен, насколько хорошо это сработает, и это временная мера.

(2) Плагин plughw должен автоматически преобразовывать каналы IIRC, но, возможно, это не так. Тогда вам придется явно прописать плагин в вашем ~/.asoundrc, но давайте сделаем это только в случае необходимости.

3
27.01.2020, 23:34

Теги

Похожие вопросы