Дублирование звука в чистом ALSA для воспроизведения на локальном устройстве и потоковой передачи через trx

Есть ли у вас apparmor (или selinux )? В Apparmor есть инструмент, который покажет вам, вызывает ли он отказ в разрешении.

0
17.01.2021, 23:36
1 ответ

Наконец-то я разобрался с загадкой мультирум-аудио Raspberry Pi!

Решением стало использование PulseAudio. ALSA не может сделать это в одиночку из-за ограничений драйвера ALSA bcm2835 Raspberry Pi. Драйвер не может копировать данные из одного потока в другой с помощью mmap по не совсем понятным мне причинам. Это имеет место, даже если mmap специально включен и используется эмуляция mmap (mmap _emul)-см.:https://blog.dowhile0.org/2013/04/27/mmap-support-for-raspberry-pi-bcm2835-alsa-driver/.

Полное решение для локального дублирования аудиопотока Raspberry Pi и через trx:

  1. Сторона передачи -установить пакеты:

     sudo su
     sudo apt install alsa-utils opus-tools lame vlc cmake libasound2-dev libortp-dev libopus-dev pulseaudio
     mkdir ~/Installers
     cd ~/Installers
     git clone http://www.pogo.org.uk/~mark/trx.git
     make
     sudo make install
    
  2. Сторона передачи -Добавить пользователя в аудиогруппу:

     sudo usermod -a -G audio your_username
    
  3. Сторона передачи -активировать модуль кольцевой проверки alsa:

     modprobe snd-aloop
     echo "snd-aloop" | sudo tee -a /etc/modules
    
  4. Сторона передачи -настроить устройства ALSA для поддержки trx:

    Вам следует отредактировать ~/.asoundrc, если вы хотите сделать это только для одного пользователя, или /etc/asound.conf, чтобы сделать это для всех пользователей.

     # nano /etc/asound.conf 
    

    ИЛИ

     # nano ~/asoundrc:
    

    Содержимое файла:

     # /etc/asound.conf OR ~/asoundrc:
    
     # tx_dmix ensures audio sent to tx gets resampled properly
     pcm.tx_dmix {
             type dmix
             ipc_key 2867
             ipc_perm 0666 # allow other users
             slave {
                 pcm "hw:Loopback,0,0"
                 rate 48000
                 format S16_LE
                 channels 2
                 period_size 256
                 buffer_size 8192
             }
     }
    
     # tx is the entry point for anything that wants to play down the TX link
     pcm.tx {
             type plug
             slave.pcm "tx_dmix"
             hint.description "Audio input for TX transmission."
     }
    
     # Hubcap is used by TX to resample audio into Opus-friendly sample rate
     pcm.hubcap {
             type plug
             slave {
                     pcm "hw:Loopback,1,0"
                     rate 48000
                     format S16_LE
             }
             hint.description "Internal loopback capture and resampler for TX. Only TX should use."
     }
    
     # Headphones (3.5mm jack) playback
     pcm.headphones_hw {
         type hw
         card Headphones
         sync_ptr_ioctl 1
     }
    
     pcm.headphones {
         type plug
         slave.pcm "headphones_hw"
     }
    
     pcm.!default {
         type plug
         slave.pcm "headphones"
     }
    
  5. Сторона передачи -настройка соединений PulseAudio

     # nano /etc/pulse/default.pa
    

    ИЛИ

     # nano ~/.pulse/default.pa:
    

    Содержимое файла:

     # PulseAudio config - duplicates audio for local playback and network playback
    
    .include /etc/pulse/default.pa
    
     # Set up Pulse sinks to connect to our ALSA devices we configured in.asoundrc
     load-module module-alsa-sink device="tx" sink_name=tx
     load-module module-alsa-sink device="headphones" sink_name=headphones
    
     # Create stream duplicator
     load-module module-null-sink sink_name=localandtx
     load-module module-loopback source=localandtx.monitor sink=tx
     load-module module-loopback source=localandtx.monitor sink=headphones
     set-default-sink localandtx
    

    Перезапустите импульс после создания этого файла

     pulseaudio -k
    
  6. Сторона передачи -создать сценарий инициализации tx:

     nano ~/run_tx.sh
    

    Содержимое файла

     #!/bin/bash
     # Fires up the TX transmission 
     # Usage:
     #     sudo run_tx.sh [ip] [latency in ms]
     #     sudo run_tx.sh 239.0.0.99 64
    
     # Defaults
     DEFAULT_TX_IP="239.0.0.99"
     DEFAULT_LATENCY_BUFFER_MS="64"
    
     # Resolve from args
     CHOSEN_TX_IP=${$1:-$DEFAULT_TX_IP}
     CHOSEN_LATENCY_BUFFER_MS=${$2:-$DEFAULT_LATENCY_BUFFER_MS}
    
     echo "Launching TX on ${CHOSEN_TX_IP} with ${CHOSEN_LATENCY_BUFFER_MS} ms buffer."
    
     # Start TX, using hubcap ALSA device
     tx -d hubcap -m $(($CHOSEN_LATENCY_BUFFER_MS)) -h $CHOSEN_TX_IP &
    
     # Boost priority of all TX threads (necessary to prevent buffer underruns)
     TX_PIDS=$(ps -L -C tx -o lwp=)
     for TX_PID in TX_PIDS
     do
       sudo renice -10 $(($TX_PID))
     done
    
  7. Сторона передачи -запустить отправителя tx:

     chmod +x ~/run_tx.sh        
     sudo ~/run_tx.sh 
    
  8. Принимающая сторона -устанавливает пакеты (просто запускает ALSA,нет необходимости в PulseAudio):

     sudo su
     sudo apt install alsa-utils opus-tools lame vlc cmake libasound2-dev libortp-dev libopus-dev
     mkdir ~/Installers
     cd ~/Installers
     git clone http://www.pogo.org.uk/~mark/trx.git
     make
     sudo make install
    
  9. Принимающая сторона -Создать сценарий инициализации rx:

     nano ~/run_rx.sh
    

    Содержимое файла

     #!/bin/bash
     # Fires up the RX Reception side
     # Usage:
     #     sudo run_rx.sh [ip] [latency in ms]
     #     sudo run_rx.sh 239.0.0.99 64
    
     # Defaults
     DEFAULT_RX_IP="239.0.0.99"
     DEFAULT_LATENCY_BUFFER_MS="64"
    
     # Resolve from args
     CHOSEN_RX_IP=${$1:-$DEFAULT_RX_IP}
     CHOSEN_LATENCY_BUFFER_MS=${$2:-$DEFAULT_LATENCY_BUFFER_MS}
    
     echo "Launching RX receiver, listening on ${CHOSEN_RX_IP} with ${CHOSEN_LATENCY_BUFFER_MS} ms buffer."
    
     # Start RX, using default ALSA device
     rx -m $(($CHOSEN_LATENCY_BUFFER_MS)) -h $CHOSEN_RX_IP &
    
     # Boost priority of all RX threads (necessary to prevent buffer underruns)
     RX_PIDS=$(ps -L -C rx -o lwp=)
     for RX_PID in RX_PIDS
     do
       sudo renice -10 $(($RX_PID))
     done
    
  10. Принимающая сторона -запустить прослушиватель rx:

    chmod +x ~/run_rx.sh        
    sudo ~/run_rx.sh 
    
  11. Воспроизведите что-нибудь на стороне tx в приемник PulseAudio по умолчанию (localandtx ). Он будет воспроизводиться со стороны rx через аудиовыход rx-устройства по умолчанию.

Чтобы указать другое аудиоустройство для воспроизведения в rx, добавьте параметр -d "alsa_device_name"в строку rx -m $(($CHOSEN_LATENCY_BUFFER_MS)) -h $CHOSEN_RX_IP &, например.rx -m $(($CHOSEN_LATENCY_BUFFER_MS)) -h $CHOSEN_RX_IP -d Headphones &

0
18.03.2021, 22:36

Теги

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