Hallo zusammen,
ich hoffe, dass das hier die richtige Kategorie ist.
Folgendes Problem:
Ich habe ein Python(3.9) Script, das Audiodateien mit VLC über die HifiBerry DAC+ Karte abspielen soll, die in dem RPi 4 mit Bullseye Raspi OS 64 steckt, der headless betriben werden soll. Die Dateien werden abgespielt, aber es kommt kein Ton.
Was ich weiß ist:
Der VLC versucht immer über Pulseaudio die Dateien abzuspielen und Pulseaudio kennt die Karte aber im Usermodus nicht. Mit sudo aufgerufen wird die Karte mit meinem TestScript angezeigt, aber im sudo Modus ist der Pulseaudio Server nicht konnektierbar. Abgesehen davon, dass man Pulseaudio nicht im Systemmod laufen lassen soll, bekomme ich da auch einen Access denied.
Hier das Testscript:
import vlc
import time
print(0)
Instance = vlc.Instance()
print(1)
player = Instance.media_player_new()
print(2)
devices = []
print(3)
mods = player.audio_output_device_enum()
print(4)
if mods:
mod = mods
while mod:
mod = mod.contents
devices.append(mod.device)
print(mod.device)
mod = mod.next
vlc.libvlc_audio_output_device_list_release(mods)
# this is the part I change on each run of the code.
player.audio_output_device_set(None, devices[0])
media = vlc.Media("/mnt/usb/musik/18 Con Chiglia.wma")
player.set_media(media)
player.play()
time.sleep(5)
Display More
und hier die Ergebnisse
...als User:
$ python3 /mnt/smb/Audio/AudioTest.py
0
1
2
3
4
b'alsa_output.platform-bcm2835_audio.analog-stereo'
b'alsa_output.platform-soc_sound.stereo-fallback'
... sudo Aufruf:
$ sudo python3 /mnt/smb/Audio/AudioTest.py
0
[0000000029aa5060] vlcpulse audio output error: PulseAudio server connection failure: Connection refused
1
[0000000029be9370] vlcpulse audio output error: PulseAudio server connection failure: Connection refused
2
3
4
b'null'
b'lavrate'
b'samplerate'
b'speexrate'
b'jack'
b'oss'
b'pulse'
b'upmix'
b'vdownmix'
b'hw:CARD=Headphones,DEV=0'
b'plughw:CARD=Headphones,DEV=0'
b'default:CARD=Headphones'
b'sysdefault:CARD=Headphones'
b'dmix:CARD=Headphones,DEV=0'
b'usbstream:CARD=Headphones'
b'hw:CARD=vc4hdmi0,DEV=0'
b'plughw:CARD=vc4hdmi0,DEV=0'
b'default:CARD=vc4hdmi0'
b'sysdefault:CARD=vc4hdmi0'
b'hdmi:CARD=vc4hdmi0,DEV=0'
b'dmix:CARD=vc4hdmi0,DEV=0'
b'usbstream:CARD=vc4hdmi0'
b'hw:CARD=vc4hdmi1,DEV=0'
b'plughw:CARD=vc4hdmi1,DEV=0'
b'default:CARD=vc4hdmi1'
b'sysdefault:CARD=vc4hdmi1'
b'hdmi:CARD=vc4hdmi1,DEV=0'
b'dmix:CARD=vc4hdmi1,DEV=0'
b'usbstream:CARD=vc4hdmi1'
b'hw:CARD=IQaudIODAC,DEV=0'
b'plughw:CARD=IQaudIODAC,DEV=0'
b'default:CARD=IQaudIODAC'
b'sysdefault:CARD=IQaudIODAC'
b'dmix:CARD=IQaudIODAC,DEV=0'
b'usbstream:CARD=IQaudIODAC'
b'default'
[0000000029b9d700] vlcpulse audio output error: PulseAudio server connection failure: Connection refused
Display More
Darüber hinaus noch die folgenden Ergebnisse:
lsmod | grep -i snd
$ lsmod | grep -i snd
snd_soc_pcm512x_i2c 16384 1
snd_soc_pcm512x 36864 1 snd_soc_pcm512x_i2c
regmap_i2c 16384 1 snd_soc_pcm512x_i2c
snd_soc_hdmi_codec 20480 2
snd_soc_bcm2835_i2s 20480 2
snd_soc_iqaudio_dac 16384 1
snd_soc_core 274432 5 snd_soc_pcm512x,snd_soc_bcm2835_i2s,vc4,snd_soc_hdmi_codec,snd_soc_iqaudio_dac
snd_bcm2835 28672 1
snd_compress 20480 1 snd_soc_core
snd_pcm_dmaengine 20480 1 snd_soc_core
snd_pcm 139264 7 snd_soc_pcm512x,snd_soc_bcm2835_i2s,snd_bcm2835,snd_soc_hdmi_codec,snd_compress,snd_soc_core,snd_pcm_dmaengine
snd_timer 36864 1 snd_pcm
snd 106496 11 snd_soc_pcm512x,snd_bcm2835,snd_soc_hdmi_codec,snd_timer,snd_compress,snd_soc_core,snd_pcm
Display More
pactl list cards
$ pactl list cards
Card #0
Name: alsa_card.platform-bcm2835_audio
Driver: module-alsa-card.c
Owner Module: 6
Properties:
alsa.card = "0"
alsa.card_name = "bcm2835 Headphones"
alsa.long_card_name = "bcm2835 Headphones"
alsa.driver_name = "snd_bcm2835"
device.bus_path = "platform-bcm2835_audio"
sysfs.path = "/devices/platform/soc/fe00b840.mailbox/bcm2835_audio/sound/card0"
device.form_factor = "internal"
device.string = "0"
device.description = "Built-in Audio"
module-udev-detect.discovered = "1"
device.icon_name = "audio-card"
Profiles:
output:analog-stereo: Analog Stereo Output (sinks: 1, sources: 0, priority: 5100, available: yes)
off: Off (sinks: 0, sources: 0, priority: 0, available: yes)
Active Profile: output:analog-stereo
Ports:
analog-output: Analog Output (type: Analog, priority: 9900, latency offset: 0 usec, availability unknown)
Part of profile(s): output:analog-stereo
Card #1
Name: alsa_card.platform-soc_sound
Driver: module-alsa-card.c
Owner Module: 9
Properties:
alsa.card = "3"
alsa.card_name = "IQaudIODAC"
alsa.long_card_name = "IQaudIODAC"
alsa.driver_name = "snd_soc_iqaudio_dac"
device.bus_path = "platform-soc:sound"
sysfs.path = "/devices/platform/soc/soc:sound/sound/card3"
device.form_factor = "internal"
device.string = "3"
device.description = "Built-in Audio"
module-udev-detect.discovered = "1"
device.icon_name = "audio-card"
Profiles:
output:stereo-fallback: Stereo Output (sinks: 1, sources: 0, priority: 5100, available: yes)
output:multichannel-output: Multichannel Output (sinks: 1, sources: 0, priority: 100, available: yes)
off: Off (sinks: 0, sources: 0, priority: 0, available: yes)
Active Profile: output:stereo-fallback
Ports:
analog-output: Analog Output (type: Analog, priority: 9900, latency offset: 0 usec, availability unknown)
Part of profile(s): output:stereo-fallback
Display More
Ich habe auch schon den snd_bcm2835 "geblacklistet". Es hat leider nichts geholfen, außer dass in allen o.g. Abfragen der bcm2835 Headphones fehlen. sonst leider kein Erfolg.
Die Soundkarte funktioniert aber, denn mit AUDIODEV=hw:3 play -v 1 -q "/mnt/usb/musik/18 Con Chiglia.mp3" bekomme ich Musik zu hören (play basiert auf sox). Leider ist es keine Alternative, da ich dort nicht die Lautstärke wärend des abspielens regeln kann.
Auch andere Alternativen zu python-vlc habe ich mir angeschaut aber es waren keine Alternativen, nach dem was ich recherchiert habe.
- pygame geht leider immer auf die onboard soundcard.
- soundplayer (basierend auf sox s.o.) kann nicht wärend des abspielens die Lautstärke regeln und kann keine .wma Dateien.
- alsaaudio ist (für mich) sehr komplex und muss auf jede Audiodatei passend eingestellt werden (kann mit dem mir vorliegenden Script nur Wave).
- und einige mehr.
- und pulseaudio bekomme ich nicht dazu den Sound über die DAC+ Karte abzuspielen (abgesehen davon rät HifiBerry auch von Pulseaudio ab, wegen geringfügig schlechterer Qualität, das wäre dann für mich ein Luxusproblem).
Warum VLC, HifiBerry und Python:
HifiBerry, weil es kompakt sein soll. Es ist für meine Mutter und da soll kein HDMI Extractor Kabel dran hängen, außerdem kommen da ein paar Buttons und LEDs dran über GPIO, deshalb Python, da kann ich das ;). Und VLC habe ich gewählt, weil es alle gängigen Audioformate kann und zur laufzeit auch die Lautstärke regeln kann. Ich kann und möchte meiner Mutter nicht sagen und zumuten: Wenn Du das Stück hören möchtest musst Du es erst in mp3 oder wave konvertieren...
Wenn jemand weiß, wie ich VLC dazu bewegen kann die Soundkarte zu benutzen oder auch Pulseaudio, wäre das super? Gibt es bei VLC eine Conf wo ich das HifiBerry Board als Standard setzen kann? Oder hat jemand noch eine andere Idee? Achja in der raspi-config habe ich das Board schon als Output gesetzt und seit dem der bcm2835 geblacklistet ist, ist die Soundkarte auch der einzige Output, den man wählen kann.
Vielen Dank für die Unterstützung.
Heiko
PS: Den Artikel:
HiFiBerry DAC+ ADC funktioniert nach python script nicht mehr
hab ich auch schon gelesen.