Byłem przy tym projekcie po pewnym czasie (aby pomóc mojemu przyjacielowi w przygotowaniu papieru do ukończenia studiów) i stwierdziłem, że projekt online działa dobrze (chociaż przetwarzanie pi dźwięku jest opóźnione w stosunku do pi, a spadek napięcia powoduje, że zamarza jako jedyny sposób aby ponownie uruchomić komputer, należy odłączyć kabel zasilający).
To jest krok, nad którym pracowałem i działa na Raspberry Pi 3.
1. Pobierz wymagany pakiet
Ten projekt zależy od pulseaudio, więc weź go i zainstaluj, wpisując:
sudo apt-get update && sudo apt-get install bluez pulseaudio-module-bluetooth python-gobject python-gobject-2 bluez-tools udev
wolę najpierw zaktualizować oprogramowanie układowe malin przed ich instalacją, ponieważ mam problem z rpi-bluetooth
pakietem, więc:
sudo rpi-update
i zainstaluj i przejdź do następnego kroku.
2. Edytuj konfigurację i zastosuj ją
Najpierw dodaj nazwę użytkownika pi do grupy pulseaudio za pomocą
sudo usermod -a -G lp pi
utwórz nową konfigurację w /etc/bluetooth/audio.conf za pomocą edytora tekstu i dodaj następujący wiersz
[General]:
Enable=Source,Sink,Media,Socket
edytuj plik /etc/bluetooth/main.conf
za pomocą preferowanego edytora tekstu (używam nano).
Ustaw klasę Bluetooth, zmień następujący wiersz na:
Class = 0x00041C
0x000041C
oznacza, że rpi bluetooth obsługuje protokół A2DP.
zmień /etc/pulse/daemon.conf
dodaj / zmodyfikuj (nie zapomnij dokładnie sprawdzić kodu przed ich dodaniem) i zmień
resample-method = trivial
możesz użyć dowolnej metody, którą osobiście używam w speex-float-3
celach informacyjnych, możesz zobaczyć ten link
uruchom usługę pulseaudio za pomocą:
pulseaudio -D
użyjemy skryptu ragusa87 do zautomatyzowania źródła bluetooth do zlewu audio. Najpierw dodaj nową konfigurację do udev init.d, edytując plik /etc/udev/rules.d/99-input.rules
i dodaj go do pliku
SUBSYSTEM="input", GROUP="input", MODE="0660"
KERNEL=="input[0-9]*", RUN+="/usr/lib/udev/bluetooth"
Dodaj folder udev
, aby /usr/lib
za pomocą mkdir
sudo mkdir /usr/lib/udev && cd /usr/lib/udev
i dodaj to do pliku bluetooth (kredyty ragusa87)
#!/bin/bash
# This script is called by udev when you link a bluetooth device with your computer
# It's called to add or remove the device from pulseaudio
#
#
# Output to this file
LOGFILE="/var/log/bluetooth_dev"
# Name of the local sink in this computer
# You can get it by calling : pactl list short sinks
# AUDIOSINK="alsa_output.platform-bcm2835_AUD0.0.analog-stereo"
AUDIOSINK="alsa_output.0.analog-stereo.monitor"
# User used to execute pulseaudio, an active session must be open to avoid errors
USER="pi"
# Audio Output for raspberry-pi
# 0=auto, 1=headphones, 2=hdmi.
AUDIO_OUTPUT=1
# If on, this computer is not discovearable when an audio device is connected
# 0=off, 1=on
ENABLE_BT_DISCOVER=1
echo "For output see $LOGFILE"
## This function add the pulseaudio loopback interface from source to sink
## The source is set by the bluetooth mac address using XX_XX_XX_XX_XX_XX format.
## param: XX_XX_XX_XX_XX_XX
## return 0 on success
add_from_mac(){
if [ -z "$1" ] # zero params
then
echo "Mac not found" >> $LOGFILE
else
mac=$1 # Mac is parameter-1
# Setting source name
bluez_dev=bluez_source.$mac
echo "bluez source: $mac" >> $LOGFILE
# This script is called early, we just wait to be sure that pulseaudio discovered the device
sleep 1
# Very that the source is present
CONFIRM=`sudo -u pi pactl list short | grep $bluez_dev`
if [ ! -z "$CONFIRM" ]
then
echo "Adding the loopback interface: $bluez_dev" >> $LOGFILE
echo "sudo -u $USER pactl load-module module-loopback source=$bluez_dev sink=$AUDIOSINK rate=44100 adjust_time=0" >> $LOGFILE
# This command route audio from bluetooth source to the local sink..
# it's the main goal of this script
sudo -u $USER pactl load-module module-loopback source=$bluez_dev sink=$AUDIOSINK rate=44100 adjust_time=0 >> $LOGFILE
return $?
else
echo "Unable to find a bluetooth device compatible with pulsaudio using the following device: $bluez_dev" >> $LOGFILE
return -1
fi
fi
}
## This function set volume to maximum and choose the right output
## return 0 on success
volume_max(){
# Set the audio OUTPUT on raspberry pi
# amixer cset numid=3 <n>
# where n is 0=auto, 1=headphones, 2=hdmi.
amixer cset numid=3 $AUDIO_OUTPUT >> $LOGFILE
# Set volume level to 100 percent
amixer set Master 100% >> $LOGFILE
pacmd set-sink-volume 0 65537 >> $LOGFILE
return $?
}
## This function will detect the bluetooth mac address from input device and configure it.
## Lots of devices are seen as input devices. But Mac OS X is not detected as input
## return 0 on success
detect_mac_from_input(){
ERRORCODE=-1
echo "Detecting mac from input devices" >> $LOGFILE
for dev in $(find /sys/devices/virtual/input/ -name input*)
do
if [ -f "$dev/name" ]
then
mac=$(cat "$dev/name" | sed 's/:/_/g')
add_from_mac $mac
# Endfor if the command is successfull
ERRORCODE=$?
if [ $ERRORCODE -eq 0]; then
return 0
fi
fi
done
# Error
return $ERRORCODE
}
## This function will detect the bt mac address from dev-path and configure it.
## Devpath is set by udev on device link
## return 0 on success
detect_mac_from_devpath(){
ERRORCODE=-1
if [ ! -z "$DEVPATH" ]; then
echo "Detecting mac from DEVPATH" >> $LOGFILE
for dev in $(find /sys$DEVPATH -name address)
do
mac=$(cat "$dev" | sed 's/:/_/g')
add_from_mac $mac
# Endfor if the command is successfull
ERRORCODE=$?
if [ $ERRORCODE -eq 0]; then
return 0
fi
done
return $ERRORCODE;
else
echo "DEVPATH not set, wrong bluetooth device? " >> $LOGFILE
return -2
fi
return $ERRORCODE
}
## Detecting if an action is set
if [ -z "$ACTION" ]; then
echo "The script must be called from udev." >> $LOGFILE
exit -1;
fi
## Getting the action
ACTION=$(expr "$ACTION" : "\([a-zA-Z]\+\).*")
# Switch case
case "$ACTION" in
"add")
# Turn off bluetooth discovery before connecting existing BT device to audio
if [ $ENABLE_BT_DISCOVER -eq 1]; then
echo "Stet computer as hidden" >> $LOGFILE
hciconfig hci0 noscan
fi
# Turn volume to max
volume_max
# Detect BT Mac Address from input devices
detect_mac_from_input
OK=$?
# Detect BT Mac address from device path on a bluetooth event
if [ $OK != 0 ]; then
if [ "$SUBSYSTEM" == "bluetooth" ]; then
detect_mac_from_devpath
OK=$?
fi
fi
# Check if the add was successfull, otherwise display all available sources
if [ $OK != 0 ]; then
echo "Your bluetooth device is not detected !" >> $LOGFILE
echo "Available sources are:" >> $LOGFILE
sudo -u $USER pactl list short sources >> $LOGFILE
else
echo "Device successfully added " >> $LOGFILE
fi
;;
"remove")
# Turn on bluetooth discovery if device disconnects
if [ $ENABLE_BT_DISCOVER -eq 1]; then
echo "Set computer as visible" >> $LOGFILE
sudo hciconfig hci0 piscan
fi
echo "Removed" >> $LOGFILE
;;
#
*)
echo "Unsuported action $action" >> $LOGFILE
;;
esac
echo "--" >> $LOGFILE
UWAGA: twój AUDIOSINK może różnić się od mojego, sprawdź go przed użyciem pactl list short sinks
uczynić skrypt wykonywalnym przez wprowadzenie tego kodu
chmod 777 bluetooth
podłącz zestaw słuchawkowy, aby sprawdzić, czy gniazdo audio działa i przetestuj
aplay /usr/share/sounds/alsa/Front_Center.wav
lub możesz ustawić domyślne kierowanie audio za pomocą
sudo amixer cset numid = 3 n
gdzie n może być: 0 = auto 1 = jack 2 = hdmi
3. Sparuj i połącz audio
przejdź do terminala i wpisz bluetoothctl
. Najpierw aktywuj bluetooth za pomocą, power on
a następnie agent on
ustaw domyślnego agenta, który wcześniej edytowałeś default-agent
, a następnie włącz tryb wykrywalności i tryb parowania za pomocą discoverable on; pairable on
. Powinieneś zobaczyć raspberrypi bluetooth na telefonie lub laptopie i możesz sparować go na telefonie, klikając go i dotknij paruj. Na terminalu wpisz y. Po powrocie do terminala łączysz się z telefonem według typu, connect xx:xx:xx:xx:xx:xx
gdzie xx:xx:xx:xx:xx:x
x to adres MAC bluetooth. i nie zapomnij zaufać, używając trust xx:xx:xx:xx:xx:xx
where xx:xx:xx:xx:xx:xx
telefonu Mac adres bluetooth. I voila, masz wzmacniacz bluetooth (lub jak tam się nazywa), używając malin.
4. Wniosek
po próbach i eksperymentach odkryłem, że jakość dźwięku jest niska i raczej nie używam go, ponieważ malina będzie zamrożona, jeśli użyjesz jej z piosenką przesyłaną strumieniowo do maliny. Radzę korzystać z projektu głośników UPNP za pomocą gmediarenderer. Dźwięk jest znakomity i nie ma opóźnień ani rozproszenia dźwięku i może odtwarzać bezstratny plik audio (flac, wav, dll). Oto szczegółowy sposób konfiguracji
odniesienie:
samouczek Jobpassion ;
scenariusz ragusa ;
powiązana praca ;