Как смешать несколько потоков PCM с помощью ALSA - PullRequest
5 голосов
/ 10 августа 2011

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

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

Спасибо!

Ответы [ 2 ]

3 голосов
/ 19 января 2012

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

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потоки.

Приветствия,

1 голос
/ 27 ноября 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

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

...