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

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

  • Перемешайте мои обычные стереоисточники 2.0 до 2.1 (где .1 - подканал)
  • Отфильтруйте подканал, чтобы сабвуфер обрабатывал только низкие частоты (т.е. создавал перекрестный фильтр)

У ALSA есть плагины upmix и ladspa . Один обрабатывает каналы микширования, в то время как другой может применять различные фильтры цифровой обработки сигналов. Я пытался и пытался, но ALSA продолжал очень усердно интерпретировать ошибки на меня. У меня были отдельные работы по микшированию и фильтрации, но их объединение никогда не шло хорошо.

1 ответ1

2

Приведенная ниже конфигурация хорошо справляется с моей ситуацией и основана на этом посте, который описывает нечто очень похожее. Я буду комментировать различные разделы , чтобы передать биты , которые я понимаю. Некоторые из них я не совсем понимаю, но я согласен, что они необходимы для того, чтобы все заработало. Пожалуйста, добавьте объяснения, если вы можете уточнить это:

Конфигурации ALSA представляют собой цепочку блоков, которые ссылаются друг на друга. Один блок передает набор аудиоканалов для обработки другим, ссылаясь на следующий блок в соответствии с меткой slave . Первый тег в моей конфигурации указывает устройство по умолчанию, т.е. приложения аудиоустройства используют, если ничего не указано

pcm.!default "plug:upmix21"

Плагин upmix смешивать входные каналы с разным количеством каналов. Здесь мы переходим с 2.0 на 5.1, поскольку плагин upmix обрабатывает только n каналов, где n% 2 = 0, и потому что он позволяет мне избежать использования плагина route который мне никогда не удавалось заставить работать

pcm.upmix21 {
  type upmix
  slave.pcm "lowpass_51to51_plug"
  delay 0
  channels 6
}

pcm.lowpass_51to51_plug является синтаксической необходимостью, потому что кажется, что блок upmix21 принимает блоки типа plug только как подчиненные .

pcm.lowpass_51to51_plug { 
  type plug 
  slave.pcm "lowpass_51to51" 
} 

Этот бит обрабатывает вызов фильтров LADSPA. Их довольно много. На Ubuntu, Raspian и т.д. Они поставляются с cmt и swh-plugins . Они могут быть использованы для всех видов вещей - ALSA только одна. При установке вы должны проверить, что path указывает, где бы фильтры ladspa в вашей системе.

В этой конфигурации я использую два плагина, на которые ссылаются их идентификаторы. 1098 - это сквозной фильтр, который просто копирует вход на выход, но без него каналы, не упомянутые специально, не получат звук. Синтаксис немного странный, потому что, хотя вы указываете только входной и выходной канал 0, все каналы копируются. Видимо, так оно и есть. Фильтр 1051 - это фильтр нижних частот, который принимает частоту кроссовера - в моем случае 120 Гц. Я применяю это к каналу 5, то есть к каналу LFE или сабвуфера в микшированном стереофоническом сигнале.

pcm.lowpass_51to51 { 
   type ladspa 
   slave.pcm "upmix_51to51_float" 
   path "/usr/lib/ladspa" 
   channels 6
   plugins { 
      0 { 
         id 1098  # Identity (Audio) (1098/identity_audio) 
         policy duplicate 
         input.bindings.0 "Input"; 
         output.bindings.0 "Output"; 
      } 

      1 { 
         id 1051  # Low-pass filter. 
         policy none 
         input.bindings.5 "Input"; 
         output.bindings.5 "Output"; 
         input { 
            controls [ 120 ] # No higher than 120 Hz - nothing good.
         } 
      } 
   } 
} 

Этот следующий бит я не совсем понимаю, но это необходимо - в противном случае ALSA скажет что-то о несовместимости форматов. По сути, мы устанавливаем аудиоформат на S16_LE (стерео 16-битный low-endian?). Я думаю, что это уже установлено, но я согласен, что мне это нужно - пожалуйста, добавьте объяснение здесь, если можете.

pcm.upmix_51to51_float { 
  type lfloat 
  slave.pcm "21route" 
  slave.format "S16_LE" 
} 

Во время тестирования я фактически использовал настройку 5.1, чтобы выяснить, что работает, а что нет. Этот блок позволяет мне отключить каналы, которые я не хочу. Таблица ttable содержит отображения в форме <input channel>.<output channel> <volume> . На самом деле это последний блок, так как он подчинен - surround51 - устройство pcm, которое поставляется с моей звуковой картой ASUS Xonar U7. Проверьте aplay -l и aplay -L чтобы увидеть, как называются ваши устройства.

pcm.21route {
  type route
  slave.pcm "surround51"
  ttable {
        0.0     1       # left channel
        1.1     1       # right channel
        2.2 0           # mute
        3.3 0           # mute
        4.4 0           # mute
        5.5 1           # sub channel
  }
}

Вот и все. Я не знаю, сколько времени я потратил на это всего. Это был включенный и выключенный проект в течение длительного времени, но сейчас он действительно работает. Надеюсь, это поможет кому-то тратить на это меньше времени, чем я.

Как примечание, у меня есть mpd и upmpdcli работающие поверх этого на RasPi 2. Используя BubbleUPNP на Android и SWYH на Windows, это позволяет мне транслировать Google Music, мои собственные медиафайлы и почти все остальное в мою супер шикарную установку. Ура!

РЕДАКТИРОВАТЬ: То, что мне еще нужно сделать:

  • У меня на самом деле нет регулятора громкости, который работает с BubbleUPNP еще. Мне нужно правильное определение ALSA ctl . На самом деле это не большая проблема - я просто использую alsamixer чтобы увеличить громкость до 100% по умолчанию, а затем вручную (да, шокирующе) отрегулирую громкость на моем усилителе.
  • Я хочу иметь возможность перенаправлять все аудио с моих устройств Android, но я могу сделать это только с помощью корневых устройств и платформы Xposed . Это работает очень хорошо, но я хочу быть в состоянии сделать это горе. корень вещи.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .