Problem im Zusammenspiel von ALSA - PulseAudio - und einer Anwendung

  • Hallo,

    seit Tagen flatter ich wie ein blindes Huhn herum, ohne ein Korn zu finden.


    Es geht um den Bau eine Türsprechstelle. Es gibt dazu ein Projekt Namens "DoorPi". Das Problem ist ein Echo bei der Sprachverbindung, d. h., ich höre mich am Fritzfon selber mit einer Verzögerung von 1 ... 2 s. Dies soll mit der echo-cancellation von pulseaudio elemenierbar sein.


    Anleitung von User-phx zur echo cancellation in DoorPi

    Ein anderer User hat dies in diesem Forum bereist thematisiert, ich sehe dabei aber am Ende keine Lösung, bzw. habe ich eine andere Audio-Karte und eine Fritzbox.

    Thema bereits hier im Forum behandelt, Ende offen


    Ich habe jetzt unzählige Seiten im Internet gelesen und auch die eine oder andere Offenbahrung erhalten - jedoch bleibt das Echo. Ich habe das Gefühl, dass die Anwendung DoorPi in Verbindung mit ALSA gar nicht auf die echo-cancellation von pulseaudio zugreift sondern direkt an die Soundkarte ausgibt.


    Die Anwendung DoorPi greift auf "ALSA: default device" zu. Nach meinem Verständnis ist dort pulseaudio hinterlegt. Innerhalb von pulseaudio geht das Signal an das Modul "module-echo-cancel". Dieses bereinigt das Signal und stellt es mit "set-default-sink doorpisink" und "set-default-source doorpisource" ALSA wieder zur Verfügung. Ich habe keinen blassen Schimmer, auf welchen Weg das Signal zur AudioCard gelangt.


    Hier ein paar Angaben:

    Hardware:

    Raspberry Pi 4, IQaudIO Codec Zero mit externem Mic und Visaton Lautsprecher (Mono)

    WLAN-Anbindung, Fritzbox und FritzFon C5

    Software:

    pi@DoorPiSv:~ $ lsb_release -a

    No LSB modules are available.

    Distributor ID: Raspbian

    Description: Raspbian GNU/Linux 11 (bullseye)

    Release: 11

    Hostname DoorPiSv

    Codename: bullseye

    pi@DoorPiSv:~ $ uname -a

    Linux DoorPiSv 5.15.32-v7+ #1538 SMP Thu Mar 31 19:38:48 BST 2022 armv7l GNU/Linux

    pi@DoorPiSv:~ $ dpkg -l | grep pulseaudio

    ii pulseaudio 14.2-2+rpi1 armhf PulseAudio sound server

    ii pulseaudio-utils 14.2-2+rpi1 armhf Command line tools for the PulseAudio sound server

    pi@DoorPiSv:~ $ doorpi_cli --version

    VoIP Door-Intercomstation with Raspberry Pi 2.5.1


    Als sinks und sources werden mir im Terminal angezeigt:

    pi@DoorPiSv:~ $ sudo pactl list short sinks

    0 alsa_output.platform-soc_sound.stereo-fallback module-alsa-card.c s16le 2ch 16000Hz SUSPENDED

    1 doorpisink module-echo-cancel.c float32le 2ch 16000Hz SUSPENDED


    pi@DoorPiSv:~ $ sudo pactl list short sources

    0 alsa_output.platform-soc_sound.stereo-fallback.monitor module-alsa-card.c s16le 2ch 16000Hz SUSPENDED

    1 alsa_input.platform-soc_sound.stereo-fallback module-alsa-card.c s16le 2ch 16000Hz SUSPENDED

    2 doorpisource module-echo-cancel.c float32le 2ch 16000Hz SUSPENDED

    3 doorpisink.monitor module-echo-cancel.c float32le 2ch 16000Hz SUSPENDED


    pi@DoorPiSv:~ $ sudo pactl list short modules

    0 module-device-restore

    1 module-stream-restore

    2 module-card-restore

    3 module-udev-detect

    4 module-alsa-card device_id="0" name="platform-soc_sound" card_name="alsa_card.platform-soc_sound" namereg_fail=false tsched=yes fixed_latency_range=no ignore_dB=no deferred_volume=yes use_ucm=yes avoid_resampling=no card_properties="module-udev-detect.discovered=1"

    5 module-native-protocol-unix

    6 module-default-device-restore

    7 module-always-sink

    8 module-suspend-on-idle

    9 module-position-event-sounds

    10 module-echo-cancel sink_master=alsa_output.platform-soc_sound.stereo-fallback source_master=alsa_input.platform-soc_sound.stereo-fallback aec_method=webrtc sink_name=doorpisink source_name=doorpisource use_master_format=true aec_args="analog_gain_control=false digital_gain_control=false noise_suppression=false high_pass_filter=false mobile=true routing_mode=loud-speakerphone comfort_noise=false"


    In der Datei system.pa sind dementsprechend folgende Befehle eingetragen

    Code: /etc/pulse/system.pa
    ### echo cancellation
    load-module module-echo-cancel sink_master=alsa_output.platform-soc_sound.stereo-fallback source_master=alsa_input.platform-soc_sound.stereo-fallback aec_method=webrtc sink_name=doorpisink source_name=doorpisource use_master_format=true aec_args="analog_gain_control=false digital_gain_control=false noise_suppression=false high_pass_filter=false mobile=true routing_mode=loud-speakerphone comfort_noise=false"
    
    set-default-sink doorpisink
    set-default-source doorpisource


    Gemäß aplay -L ist PulseAudio als default eingetragen

    pi@DoorPiSv:~ $ aplay -L

    null

    Discard all samples (playback) or generate zero samples (capture)

    default

    Playback/recording through the PulseAudio sound server

    lavrate

    Rate Converter Plugin Using Libav/FFmpeg Library

    samplerate

    Rate Converter Plugin Using Samplerate Library

    speexrate

    Rate Converter Plugin Using Speex Resampler

    jack

    JACK Audio Connection Kit

    oss

    Open Sound System

    pulse

    PulseAudio Sound Server

    upmix

    Plugin for channel upmix (4,6,8)

    vdownmix

    Plugin for channel downmix (stereo) with a simple spacialization

    hw:CARD=IQaudIOCODEC,DEV=0

    IQaudIOCODEC, IQaudIO CODEC HiFi v1.2 da7213-hifi-0

    Direct hardware device without any conversions

    plughw:CARD=IQaudIOCODEC,DEV=0

    IQaudIOCODEC, IQaudIO CODEC HiFi v1.2 da7213-hifi-0

    Hardware device with all software conversions

    sysdefault:CARD=IQaudIOCODEC

    IQaudIOCODEC, IQaudIO CODEC HiFi v1.2 da7213-hifi-0

    Default Audio Device

    dmix:CARD=IQaudIOCODEC,DEV=0

    IQaudIOCODEC, IQaudIO CODEC HiFi v1.2 da7213-hifi-0

    Direct sample mixing device

    usbstream:CARD=IQaudIOCODEC

    IQaudIOCODEC

    USB Stream Output


    pi@DoorPiSv:~ $ aplay -l

    **** Liste der Hardware-Geräte (PLAYBACK) ****

    Karte 0: IQaudIOCODEC [IQaudIOCODEC], Gerät 0: IQaudIO CODEC HiFi v1.2 da7213-hifi-0 [IQaudIO CODEC HiFi v1.2 da7213-hifi-0]

    Sub-Geräte: 1/1

    Sub-Gerät #0: subdevice #0


    pi@DoorPiSv:~ $ sudo amixer info

    Card default 'pulse'/'PulseAudio'

    Mixer name : 'PulseAudio'

    Components : ''

    Controls : 4

    Simple ctrls : 2


    Was mache ich falsch? Ist ein default falsch eingetragen?

    Vielen Dank im Voraus

    Schorsch

  • Hi,

    ich habe mein Problem selber lösen können. Hier mein Lösungsweg mit ein paar Erläuterungen:

    • Ich habe mich an die Anleitung von phx vom 02. September 2018 gehalten (Link oben im Beitrag).
    • Die Datei /etc/asound.conf enthält systemweite Angaben für ALSA, also unabhängig vom User. Oftmals wird im Internet auch auf Einstellungen in der Datei ~/.asoundrc verwiesen. Die dort getätigten Einstellungen sind nur für den jeweiligen Benutzer. Für meine Installation muss die Datei ~/.asoundrc gelöscht werden (war auch nicht vorhanden). Die Datei asound.conf war ebenfals nicht vorhanden, diese muss jedoch angelegt werden.
    • pulseaudio wird in der Regel auf User-Ebene genutzt. Jeder User kann dann seine eigenen Einstellungen abspeichern. Dies erfolgt in der Datei /etc/pulse/default.pa . In diesem Fall wird pulseaudio als systemweite Installation genutzt. Die Einstellungen müssen daher in der Datei /etc/pulse/system.pa vorgenommen werden.
    • Als sink wird bei den folgenden Befehlen auch eine Ausgabe "..... .monitor" ausgegeben. Dabei handelt es sich um einen Kanal zur Aufnahme des gerade ausgegeben Musikstücks. Dies ist für die weitere Betrachtung nicht relevant und habe ich daher nicht weiter berücksichtigt.
    • Soundcard IQaudIO Codec gemäß Anleitung installiert.

    Für ALSA habe ich Pulseaudio als default eingetragen, in dem ich die Datei asound.conf mit folgendem Inhalt erstellt habe.

    Code: /etc/asound.conf

    Alles anzeigen

    In vielen Beiträgen wird die Schreibweise pcm.!default verwendet. Auf den Seiten von freedesktop.org wird für das perfekte Setup von pulseaudio jedoch die vorgenannte Schreibweise empfohlen [1].


    Mit dem Befehl aplay -l (kleines L) erhält man die Liste der eingesetzten Hardware.

    Bei mir ist es Karte 0 und Gerät 0. Diese Angaben sind auch in der folgenden Datei bereits gesetzt. Ansonsten müst ihr diese anpassen:

    Code: /usr/share/alsa/alsa.conf

    Code
    ...
    defaults.ctl.card 0
    defaults.pcm.card 0
    defaults.pcm.device 0
    ....


    Abweichend von phx sieht meine Datei system.pa wie folgt aus:

    Code: /etc/pulse/system.pa

    Alles anzeigen

    • Mit den Modulen module-alsa-sink bzw. module-alsa-source habe ich die Karte mit den beiden Zahlen für Karte und Gerät fest vorgegeben.
    • mit sudo pactl list erhält man eine Liste der geladenen Module, Quellen und Ziele. Mit sudo pactl list wird die Ausgabe gekürzt dargestellt.
    • Das Modul zur Echo-Cancellation:
      • sink_master bzw. der source_master ist jeweils die unbearbeitete Version.
      • source_name bzw. sink_name sind die bearbeitete Version
      • für die feste Vorgabe von Karte und Gerät verwendet das Modul leider eine andere Syntax, daher die Unterstriche.
      • Die Zeile muss ohne Umbrüche, Zeilenvorschub oder dergleichen geschrieben werden!
      • Ich habe die Werte "true" und "false" verwendet. Es müsste auch mit "0" bzw. "1" gehen.
    • die automatische Erkennung der Hardware durch pulseaudio habe ich abgeschaltet.

    Mein Aufruf von sudo pactl info sieht dann wie folgt aus:

    Das Echo ist damit bei mir eleminiert. Die Lautstärke kann ich über sudo alsamixer einstellen.


    Wie bereits in meinem vorhergehenden Beitrag beschrieben, habe ich lange gesucht. Ob alles so wirklich richtig ist - mir egal, es läuft. Wenn mir jemand noch etwas erklärt oder eine Korrektur hat - gerne, man wird nicht dümmer.


    Gruß

  • Hallo Schorsch,


    vorbildliche Fehlerbeschreibung, super Problemlösung.


    Meiner Meinung nach sollte der Thread direkt in die Tutorials verschoben werden.


    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.