Как микшировать несколько потоков PCM с помощью ALSA

У меня есть два разных потока образцов PCM. Можно ли их как-то смешать и поиграть с ALSA на одном устройстве вывода?

Я читал, что это возможно с помощью микшера, но мне трудно понять это из-за отсутствия документации. Может ли кто-нибудь предоставить дополнительную информацию о том, как это может быть реализовано (если это действительно так)?

Спасибо!


person Luca Carlon    schedule 09.08.2011    source источник


Ответы (2)


Для этого проверьте, есть ли в вашей системе файл .asoundrc. Если его там нет, создайте его и поместите в папку /home. Обновите его с этими настройками:

pcm.!default {
              type plug
              slave.pcm "dmixer"
}
pcm.dmixer  {
            type dmix
        ipc_key 1024
        slave {
          pcm "hw:1,0"
          period_time 0
              period_size 1024
          buffer_size 4096
          rate 44100
        }
        bindings {
          0 0
          1 1
        }
}
ctl.dmixer {
       type hw
       card 0
}

Используйте $aplay -l, чтобы получить список устройств в вашей системе. hw:X,Y исходит из этого сопоставления вашего оборудования, где X — номер карты, а Y — номер устройства.

Теперь откройте терминал и воспроизведите свой первый поток PCM с помощью: $aplay -f cd pcm_sound1.wav И на другой вкладке воспроизведите второй поток PCM: $aplay -f cd -D default pcm_sound2.wav

Он будет смешивать ваши два потока данных PCM.

Ваше здоровье,

person HSC    schedule 19.01.2012
comment
Этот ответ очень полезен, но я немного запутался и был бы признателен за дополнительные объяснения. Почему во второй команде aplay есть -D default, а в первой нет? Что означает раздел bindings и для чего нужен ctl.dmixer? Можно ли смешивать более двух потоков, например. если я запускаю три команды aplay одновременно? Почему устройство по умолчанию типа plug указывает на dmixer, можем ли мы просто переименовать pcm.dmixer в pcm.!default и избежать косвенного обращения? - person Metamorphic; 22.10.2016

Я не уверен, что это заслуживает отдельного ответа. Я использовал ответ HSC и примеры из "ALSA Wiki - The Dmix Howto". Документация Dmix действительно немного разочаровывает.

Вот пример ~/.asoundrc, который работает для меня. Раздел «привязки» не нужен, но в HOWTO сказано, что он помогает «многоканальным чипам работать быстрее» (не уверен, что меня это волнует?). Если я связываю "0 1 1 0", то он переключает правый/левый каналы. Если привязать "0 1 1 1" то фигня в правое ухо... Видимо ipc_key обязательный параметр; Я просто выбрал случайное целое число.

# example 1
pcm.hw3mix {
    type dmix
    ipc_key 1939 # must be unique
    slave {
        pcm "hw:3"
        period_time 0
        period_size 1024 # must be power of 2
        buffer_size 4096
        rate 44100
    }
    bindings {
        0 0
        1 1
    }
}

pcm.!default hw3mix

Последняя строка делает мой новый hw3mix устройством по умолчанию.

Я упростил вышеизложенное до:

# example 2
pcm.hw3mix {
    type dmix
    ipc_key 1939 # must be unique
    slave { pcm "hw:3" }
}

pcm.!default hw3mix

и, кажется, работает просто отлично.

Как было предложено по ссылке ALSA Wiki выше, я могу упростить ее до:

# example 3
pcm.dsp0 {
    type plug
    slave.pcm "dmix"
}

pcm.!default dsp0

и это может быть дополнительно упрощено до:

# example 4
pcm.!default {
    type plug
    slave.pcm "dmix"
}

или даже:

# example 5
pcm.!default plug:dmix

Однако последние три примера не позволяют мне указать параметры для плагина Dmix. Я хотел создать устройство, которое смешивает несколько потоков в "hw:3". Я думаю, что это должно быть указано как параметр для Dmix, так как это не устройство по умолчанию, поэтому я пошел со своим вторым примером выше. В моем реальном ~/.asoundrc также есть блок для "hw:0,0" под названием "hw0mix", поэтому, изменив комментарии в следующих строках, я могу переключать вывод (вновь созданных) потоков между наушниками и динамиками:

#pcm.!default hw0mix
pcm.!default hw3mix

NB: Вышеупомянутое относится к таким устройствам, как «hw: 0,0» и «hw: 3» ... было немного сложно выяснить, как обеспечить стабильные номера устройств для моих различных звуковых USB-устройств, я нашел инструкции здесь в разделе "Заказ нескольких карт одного типа". Конфигурация состоит из одной строки в файле /etc/modprobe.d/. Вот как я получаю числа, такие как 0 и 3, для обозначения одних и тех же устройств при перезагрузке.

person Metamorphic    schedule 26.11.2016