AudioSystem.getMixerInfo -> USB Hardwareadresse herausfinden

Hough

Mitglied
Hallo,

ich habe u.a. zwei USB-Audiogeräte angeschlossen, die den gleichen Namen haben. Exakt gleiches Modell. Der Hersteller hat eine Möglichkeit vorgesehen, per Firmware-Update die USB Serial Number zu verändern, um die Geräte unterscheidbar zu machen, nicht jedoch den Namen oder sonstige Parameter des Gerätes. Unter MacOS per ioreg und unter Linux per lsusb - so läßt sich die Number auslesen und ggf. parsen.

AudioSystem.getMixerInfo liefert mir eine Liste mit allen Audiodevices, jedoch sind nur Name und Description im Ergebnis enthalten, keine USB Serial Number. Ich erhalte also für die zwei Audiogeräte exakt zwei gleiche Einträge, mit gleichem Namen und gleicher Description.

Die Reihenfolge, die ioreg und lsusb liefern, stimmt nicht mit der Reihenfolge überein, die AudioSystem.getMixerInfo liefert, was ich anhand weitere USB-Audiogeräte festgestellt habe. Das heißt, diese Zuordnungsmöglichkeit fällt aus.

Bevor ich jetzt den Umweg über ffmpeg gehe, gibt es noch andere Vorschläge, wie sich eine eindeutige Zuordnung herstellen läßt? Idealerweise über die USB Hardwareadresse und dann parsen der ioreg / lsusb-Outputs. Aber wie komme ich an die USB Hardwareadresse mit Java Bordmitteln?

Vielen Dank für alle Tipps!
 

Robert Zenz

Top Contributor
Musst du die beiden in AudioSystem unterscheiden koennen? Also wissen welche welches ist?

Dann waere meine erste Idee eine udev-Regel welche dir das Ding irgendwie umbenennt so dass es in den Eigenschaften auch unterschieden werden kann. Das funktioniert aber halt nur auf Linux. Plattformuebergreifend wird recht schwierig werden.
 

KonradN

Super-Moderator
Mitarbeiter
Wenn Du Details über USB Geräte bekommen willst, dann wäre evtl. eine Library wie usb4java interessant. Du kannst ja mal prüfen, ob das die gewünschten Informationen ausliest.
usb4java – About
Was Du bekommst wäre dann so ein DeviceDescriptor:
DeviceDescriptor (usb4java 1.3.0 API)
Und das iSerialNumber hört sich da prinzipiell nach dem an, das Du evtl. suchst.

Ansonsten wären da noch Libraries wie
OSHI oshi/oshi: Native Operating System and Hardware Information (github.com)
JNA: java-native-access/jna: Java Native Access (github.com)
die evtl. so Informationen bieten können. Die sind dann nicht USB spezifisch aber decken das vermutlich auch ab.

So hat bei OSHI das
UsbDevice (oshi-core-java11 6.6.1 API)
ein getSerialNumber()

JNA hat da selbst noch nichts aber es kann eine gute Grundlage sein, wenn man Funktionen aus native Libraries aufrufen möchte (vermutlich nichts, was Du willst, so die SerialNumber, die die anderen Libraries liefern können, bereits das ist, was Du willst/suchst.

Hier noch der generelle Hinweis: Ich bin kein Experte für USB Hardware oder so - evtl. suchst Du also etwas ganz anderes wenn Du Hardwareadresse sagst. Evtl. ist die aber ja auch in den genannten Klassen drin (Dazu habe ich das JavaDoc der jeweiligen Klassen bei usb4java und OSHI einmal verlinkt).
 

Hough

Mitglied
Musst du die beiden in AudioSystem unterscheiden koennen? Also wissen welche welches ist?
Ja.
Dann waere meine erste Idee eine udev-Regel welche dir das Ding irgendwie umbenennt so dass es in den Eigenschaften auch unterschieden werden kann. Das funktioniert aber halt nur auf Linux. Plattformuebergreifend wird recht schwierig werden.
Das mit den udev-Regeln hatte ich auch vor. Nur leider wird das Umbenennen nicht mehr unterstützt.
 

Hough

Mitglied
Man kann grundsätzlich die SerialNumber von einem USB-Gerät herausfinden. Problem ist eben, die Zuordnung zu den von AudioSystem gelieferten Devices herzustellen. Unter Linux geht es jetzt über den folgenden Weg:
Dort erscheint im Device-Namen eine sog. Hardware-Adresse in der Form [plughw:4,0] Das ist allerdings keine Hardware-Adresse, sondern die Alsa-Nummer. Jetzt kann man /proc/asound/cards parsen, um die USB-Adresse herauszufinden.
Danach ist lsusb nicht sonderlich hilfreich, aber der Output von dmesg, um die SerialNumber zu der gegebenen USB-Adresse zu ermitteln.
 

Neue Themen


Oben