USB Mikrofon und USB Soundkarte jeweils als Standardgerät

  • Hallo.

    Da mir das jetzt ein bisschen zu kompliziert ist, wollte ich mal Fragen ob jemand eine Lösung hat.
    Ich habe bis jetzt eine USB Soundkarte am Pi, an der Lautsprecher und Mikrofon sind. Läuft soweit top. Jetzt habe ich ein besseres USB Mikrofon bekommen. Das heißt ich müsste jetzt das USB Mikrofon als Standardmikrofon haben. Die Anleitungen die ich gefunden habe, waren immer das gleich alles auf das neue Gerät gepolt wird. Und Fragen nach Ausgang auf USB Soundkarte und Eingang auf anderem Gerät blieben unbeantwortet.

    Kann hier jemand die entsprechende Einstellung sagen?

  • Ok, ich habe es jetzt hinbekommen. Aber nur um sicherzugehen das es so auch richtig ist (nicht das es 'zufällig' funktioniert.


    Aplay -l

    arecord -l


    Code
    pi@RPI2:~ $ arecord -l
    **** Liste der Hardware-Geräte (CAPTURE) ****
    Karte 0: DeviceEEPROM [USB PnP Audio Device(EEPROM)], Gerät 0: USB Audio [USB Audio]
    Sub-Geräte: 1/1
    Sub-Gerät #0: subdevice #0
    Karte 1: Device [USB Audio Device], Gerät 0: USB Audio [USB Audio]
    Sub-Geräte: 1/1
    Sub-Gerät #0: subdevice #0


    .asoundrc

    Code
    #defaults.ctl.card 0
    #defaults.pcm.card 0
    pcm.!default {
    type asym
    playback.pcm "plughw:2"
    capture.pcm "plughw:0"
    }


    Es gibt also das USB Mikrofon, die USB Soundkarte und die interne Soundkarte. Das Mikrofon ist für Input (Mikrofon der Soundkarte brauche ich nicht), die Ausgabe erfolgt über USB Soundkarte und eigentlich hätte ich gern das Espeak über die interne Soundausgabe spricht. Aber das ist jetzt nicht sooo wichtig. Bin erst einmal glücklich das es mit der Ein- bzw Ausgabe über getrennte Geräte funktioniert.

    Ist die .asoundrc so korrekt?

  • Wenn es funktioniert stimmt es auch ☺

    Nur passt es nicht ganz zu deinem Eingangspost. Zur Wiedergabe hast du nun den Onboardsound (hw:2) auserkoren, obwohl dort die Rede von der USB-Soundkarte (hw:1) als Wiedergabegerät war.



    Außerdem ist es meiner Erfahrung nach auf lange Sicht verlässlicher bzw. pflegeleichter die Namen statt der Nummern zu verwenden, weil die Nummern – ganz besonders bei USB-Geräten – ohne jeden Anlass nach einem Neustart anders sein können. Du könntest die Angaben folgendermaßen ändern:

    • onboard: plughw:2 → plughw:ALSA
    • usbmikrofon: plughw:0 → plughw:DeviceEEPROM
    • usb-soundkarte: plughw:1 → plughw:Device



    Das andere ist, das du nun die Wiedergabe/Aufnahme ohne weitere Plugins über plughw:X läuft. Es kann also nur eine Anwendung gleichzeitig auf eine Soundkarte zugreifen, ob dich das stört oder ob es gar gewünscht ist, weiß ich natürlich nicht.


    […]Das Mikrofon ist für Input (Mikrofon der Soundkarte brauche ich nicht), die Ausgabe erfolgt über USB Soundkarte und eigentlich hätte ich gern das Espeak über die interne Soundausgabe spricht. […]

    Das ist eigentlich kein Problem.

    Du musst ja nirgends den besonderen Namen default verwenden. Du kannst den Absatz mit "pcm.meineSoundkarte { ..." beginnen und dann in der Anwendung "meineSoundkarte" als Alsagerät einstellen/angeben.

    Genauso kannst du in einer Anwendung direkt, zum Beispiel bei der Aufnahme "plughw:DeviceEEPROM" einstellen und so komplett auf einen Eintrag in der .asoundrc oder asound.conf verzichten. Nur wenn eine Anwendung keine einfache Möglichkeit bietet die Alsageräte auszuwählen, dann hat man es mit (pcm.)default einfacher. (Bei mehreren Anwendungen zur Aufnahme und Wiedergabe ist es aber unwahrscheinlich, dass man dieses Pech für alle Anwendungen hat.)

  • Hallo Smutbert.

    So, zurück zu dieser Baustelle. Du hast recht, die IDs haben sich nach dem Neustart schon geändert. Damit gehen die Probleme weiter.
    In der .asoundrc kann - und habe - ich die Device Namen verwenden. Das funktioniert soweit gut.
    Nur nutze ich in Python die Bibliothek alsaaudio. Dort habe ich noch nicht rausgefunden wie ich den Namen statt der ID eingeben kann. Ich glaube das funktioniert da nicht. Auch beim amixer kann ich nur über die ID angeben... oder habe die Einstellung für den Namen noch nicht gefunden. z.B. sudo amixer -c0 -- sset Speaker 50%


    Auch hast du recht das nur ein Programm gleichzeitig auf den Speaker zugreifen kann. Spiele ich jetzt Musik ab und möchte gleichzeitig mit ESpeak etwas 'sagen' lassen, dann geht es nicht. Das ist natürlich wiederum doof. Wie kriege ich es hin das mehrere Programme gleichzeitig die Ausgabe benutzen dürfen. (Eingabe kann bei einem bleiben, da gibt es nur Jasper der am Mikro lauscht)

  • Moin HeAdLeSs,


    doch das geht.

    Quote

    pi@bernd-test:~ $ amixer

    Simple mixer control 'Mini',0

    Hier habe ich den Namen des Mixer's

    Und mit dem Befehl habe ich die Lautstärke verändert.


    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"

    Vielleicht trifft man sich in der RPi-Plauderecke.

  • amixer kennt auch die Namen und auch wenn ich nicht weiß wie, bin ich mir ziemlich sicher, dass auch in python geht

    Code
    amixer -D hw:Device -- sset Speaker 73%

    zur Wiedergabe mit mehreren Anwendungen musst du in den Weg, den die Audiodaten bei der Wiedergabe gehen das dmix-Plugin einbauen:

    kurz zur Erklärung

    Ich habe jedem Schritt, den die Audiodaten durchlaufen einen eigenen Namen gegeben, in der Hoffnung, dass es dadurch etwas übersichtlicher wird - es ist aber auch sonst so manchmal praktischer.

    1. pcm.!default, ctl.!default
      Das sind nur die default-Geräte, wobei ctl.default nur das default-Gerät für die Lautstärkeregelung definiert. Das ! sorge übrigens dafür, dass mit der Konfigurationsdatei eine bereits existierende Definition des default-Geräts überschrieben bzw. überstimmt wird.
      In diesem Fall bietet pcm.default lediglich das plug-Plugin, das eventuell notwendige Konvertierungen des Sampleformates, der Samplerate und der Zahl der Kanäle übernimmt, abgesehen davon aber nur weiterleitet und zwar an
    2. pcm.duplex
      Das dient der Kombination von Wiedergabe- und Aufnahmegeräten unterschiedlicher Soundkarten. Der Aufnahmezweig wird an DeviceEEPROM, also das USB-Mikrofon weitergeleitet (also eigentlich nicht weitergeleitet, sondern umgekehrt die Aufnahmedaten werden von dort gelesen) – nun absichtlich mit hw statt plughw, weil bereits pcm.default das plug-Plugin beinhaltet.
      Der Wiedergabezweig wird dagegen nur nur weitergeleitet an
    3. pcm.dmixer
      dmix übernimmt das Mischen der Audioausgabe mehrerer Anwendungen und will nur direkt an die Soundkarte ausgeben, daher hier wieder hw statt plughw (und wie gesagt plug steckt bereits in der Definition von pcm.default drin).
  • Hallo ihr beiden.
    Danke für eure Antworten und mühen. Aber es will irgendwie noch nicht.

    Das Problem mit pyalsaaudio habe ich umgangen. Eine direkte Lösung konnte ich nicht finden. Der Workaround:



    Code
    def init_alsa():
    card_info = {}
    for device_number, card_name in enumerate(alsaaudio.cards()):
    card_info[card_name] = device_number
    return alsaaudio.Mixer(cardindex=int(card_info["Device"]), control='Speaker') #, control='Speaker'

    So komme ich an den 'richtigen' Cardindex. Eine direkte Angabe des Kartennamens im Mixer Aufruf konnte ich nicht finden. Es gibt zwar, lt Handbuch, einen Parameter 'Device', der war aber nicht aufrufbar.


    Quote

    return alsaaudio.Mixer(device="Device") # , control='Speaker'

    TypeError: 'device' is an invalid keyword argument for this function



    Zum dmixer Thema. Leider auch hier keinen Erfolg.

    Ich bekomme immer den Fehler das die Resource schon belegt ist.

    Muss ich noch etwas ändern als die .asoundrc? Den MPC habe ich schon wie folgt angepasst:


    Code
    audio_output {
    type "alsa"
    name "Device"
    #device "hw:0,0" # optional
    #format "44100:16:2" # optional
    mixer_device "default" # optional
    #mixer_control "PCM" # optional
    #mixer_index "0" # optional
    mixer_type "software" # optional
    }


    Habe gerade noch was anderes mit aplay probiert, geht auch nicht:


  • Update:
    Nach dem hinzufügen von


    Code
    options "dev=dmixer"
    device "plug:dmix"

    funktioniert jetzt der dmix. Der MPD kann Musik spielen und gleichzeitig kann ich etwas mit aplay abspielen.
    Hoffe ich mal das nicht noch ein drittes Programm etwas ausgeben möchte :-)

  • Gerade ist mir noch etwas aufgefallen:


    Du schreibst du hast eine ~/.asoundrc erstellt, aber du verwendest mpd. mpd läuft als Dienst normalerweise unter seinem eigenen Benutzeraccount, bekommt also von der ~/.asoundrc gar nichts mit. In dem Fall wäre es besser du schreibst das stattdessen in die /etc/asound.conf und löscht die ~/.asoundrc wieder (oder benennst sie um).


    Damit hättest du mit der asound.conf für alle Benutzer das Defaultgerät festgelegt und könntest in mpd schreiben:


    Code
    audio_output {
    type "alsa"
    name "USB-Soundkarte"
    device "dmixer"
    mixer_type "software"
    }

    oder alternativ sollte sogar das noch kürzere

    Code
    audio_output {
    type "alsa"
    name "USB-Soundkarte"
    mixer_type "software"
    }

    funktionieren (schließlich habe wir das selbst definierte „Gerät“ in der .asoundrc bzw. jetzt asound.conf zum Default gemacht).


    Die Wiedergabe der Sprache sollte dann ebenfalls ohne weitere Parameter funktionieren

    Code
    amixer -D hw:Device -- sset Speaker 50%
    pico2wave --wave /tmp/pico.wav -l de-DE "Hallo. Ich mache jetzt die Heizung an. Ok?"
    aplay -f S16_LE /tmp/pico.wav
    rm /tmp/pico.wav

    (root-Rechte/sudo sollten hier wirklich nicht notwendig sein!)