Есть ли у вас apparmor (или selinux )? В Apparmor есть инструмент, который покажет вам, вызывает ли он отказ в разрешении.
Наконец-то я разобрался с загадкой мультирум-аудио 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:
Сторона передачи -установить пакеты:
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
Сторона передачи -Добавить пользователя в аудиогруппу:
sudo usermod -a -G audio your_username
Сторона передачи -активировать модуль кольцевой проверки alsa:
modprobe snd-aloop
echo "snd-aloop" | sudo tee -a /etc/modules
Сторона передачи -настроить устройства 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"
}
Сторона передачи -настройка соединений 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
Сторона передачи -создать сценарий инициализации 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
Сторона передачи -запустить отправителя tx:
chmod +x ~/run_tx.sh
sudo ~/run_tx.sh
Принимающая сторона -устанавливает пакеты (просто запускает 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
Принимающая сторона -Создать сценарий инициализации 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
Принимающая сторона -запустить прослушиватель rx:
chmod +x ~/run_rx.sh
sudo ~/run_rx.sh
Воспроизведите что-нибудь на стороне 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 &