I want to build a streaming server using Debian 10, Darkice and Icecast that streams two live recorded channels.
The sound cards are two Behringer UCA202 always plugged into the same physical USB-ports of the machine. Let's say one is the upper USB-port and the other one is the lower USB-port.
When checking with amixer -l one of the sound cards is named CODEC and the other one is CODEC_1. You can enter that in the config file of Darkice for the corresponding channel and assign a mountpoint for Icecast there.
So for the moment we have the following configuration:
Card in upper USB -> name is CODEC -> Mountpoint stream1 in Icecast
Card in lower USB -> name is CODEC_1 -> Mountpoint stream2 in Icecast
The problem is that after a reboot the sound cards can sometimes switch their names due to the nature of device discovery. CODEC becomes CODEC_1 and vice versa. And with this happening the streams on the mount points have also switched and stream1 is from the wrong sound card.
Now how can I assign the same name each time so that CODEC is always the sound card on the upper USB-port? Some kind of udev rule probably?
As requested I've added the output of udevadm info -ap /sys/
Here we go with the output of udevadm info -ap /sys/class/sound/controlC0
looking at device '/devices/pci0000:00/0000:00:1a.1/usb3/3-2/3-2:1.0/sound/card0/controlC0': KERNEL=="controlC0" SUBSYSTEM=="sound" DRIVER=="" looking at parent device '/devices/pci0000:00/0000:00:1a.1/usb3/3-2/3-2:1.0/sound/card0': KERNELS=="card0" SUBSYSTEMS=="sound" DRIVERS=="" ATTRS{id}=="CODEC_1" ATTRS{number}=="0" looking at parent device '/devices/pci0000:00/0000:00:1a.1/usb3/3-2/3-2:1.0': KERNELS=="3-2:1.0" SUBSYSTEMS=="usb" DRIVERS=="snd-usb-audio" ATTRS{bInterfaceClass}=="01" ATTRS{bInterfaceNumber}=="00" ATTRS{bNumEndpoints}=="00" ATTRS{bInterfaceSubClass}=="01" ATTRS{supports_autosuspend}=="1" ATTRS{bAlternateSetting}==" 0" ATTRS{bInterfaceProtocol}=="00" ATTRS{authorized}=="1" looking at parent device '/devices/pci0000:00/0000:00:1a.1/usb3/3-2': KERNELS=="3-2" SUBSYSTEMS=="usb" DRIVERS=="usb" ATTRS{bMaxPacketSize0}=="8" ATTRS{busnum}=="3" ATTRS{rx_lanes}=="1" ATTRS{bDeviceProtocol}=="00" ATTRS{devpath}=="2" ATTRS{bMaxPower}=="100mA" ATTRS{maxchild}=="0" ATTRS{configuration}=="" ATTRS{tx_lanes}=="1" ATTRS{bcdDevice}=="0100" ATTRS{product}=="USB Audio CODEC " ATTRS{bDeviceSubClass}=="00" ATTRS{speed}=="12" ATTRS{idVendor}=="08bb" ATTRS{bmAttributes}=="80" ATTRS{devnum}=="3" ATTRS{authorized}=="1" ATTRS{bNumConfigurations}=="1" ATTRS{bConfigurationValue}=="1" ATTRS{ltm_capable}=="no" ATTRS{idProduct}=="2902" ATTRS{version}==" 1.10" ATTRS{bDeviceClass}=="00" ATTRS{bNumInterfaces}==" 4" ATTRS{quirks}=="0x0" ATTRS{removable}=="unknown" ATTRS{avoid_reset_quirk}=="0" ATTRS{manufacturer}=="Burr-Brown from TI " ATTRS{urbnum}=="1331512" looking at parent device '/devices/pci0000:00/0000:00:1a.1/usb3': KERNELS=="usb3" SUBSYSTEMS=="usb" DRIVERS=="usb" ATTRS{serial}=="0000:00:1a.1" ATTRS{urbnum}=="89" ATTRS{idProduct}=="0001" ATTRS{bMaxPacketSize0}=="64" ATTRS{avoid_reset_quirk}=="0" ATTRS{configuration}=="" ATTRS{busnum}=="3" ATTRS{devnum}=="1" ATTRS{interface_authorized_default}=="1" ATTRS{rx_lanes}=="1" ATTRS{devpath}=="0" ATTRS{speed}=="12" ATTRS{bmAttributes}=="e0" ATTRS{bDeviceClass}=="09" ATTRS{removable}=="unknown" ATTRS{product}=="UHCI Host Controller" ATTRS{version}==" 1.10" ATTRS{bcdDevice}=="0419" ATTRS{authorized_default}=="1" ATTRS{authorized}=="1" ATTRS{tx_lanes}=="1" ATTRS{bDeviceSubClass}=="00" ATTRS{bNumConfigurations}=="1" ATTRS{bDeviceProtocol}=="00" ATTRS{bConfigurationValue}=="1" ATTRS{ltm_capable}=="no" ATTRS{idVendor}=="1d6b" ATTRS{bNumInterfaces}==" 1" ATTRS{maxchild}=="2" ATTRS{quirks}=="0x0" ATTRS{manufacturer}=="Linux 4.19.0-5-amd64 uhci_hcd" ATTRS{bMaxPower}=="0mA" looking at parent device '/devices/pci0000:00/0000:00:1a.1': KERNELS=="0000:00:1a.1" SUBSYSTEMS=="pci" DRIVERS=="uhci_hcd" ATTRS{ari_enabled}=="0" ATTRS{driver_override}=="(null)" ATTRS{d3cold_allowed}=="0" ATTRS{device}=="0x2835" ATTRS{msi_bus}=="1" ATTRS{subsystem_device}=="0x2808" ATTRS{broken_parity_status}=="0" ATTRS{local_cpulist}=="0-1" ATTRS{irq}=="21" ATTRS{subsystem_vendor}=="0x103c" ATTRS{class}=="0x0c0300" ATTRS{numa_node}=="-1" ATTRS{dma_mask_bits}=="32" ATTRS{consistent_dma_mask_bits}=="32" ATTRS{vendor}=="0x8086" ATTRS{revision}=="0x02" ATTRS{enable}=="1" ATTRS{local_cpus}=="3" looking at parent device '/devices/pci0000:00': KERNELS=="pci0000:00" SUBSYSTEMS=="" DRIVERS=="" And here is the output of udevadm info -ap /sys/class/sound/controlC1
looking at device '/devices/pci0000:00/0000:00:1a.1/usb3/3-1/3-1:1.0/sound/card1/controlC1': KERNEL=="controlC1" SUBSYSTEM=="sound" DRIVER=="" looking at parent device '/devices/pci0000:00/0000:00:1a.1/usb3/3-1/3-1:1.0/sound/card1': KERNELS=="card1" SUBSYSTEMS=="sound" DRIVERS=="" ATTRS{id}=="CODEC" ATTRS{number}=="1" looking at parent device '/devices/pci0000:00/0000:00:1a.1/usb3/3-1/3-1:1.0': KERNELS=="3-1:1.0" SUBSYSTEMS=="usb" DRIVERS=="snd-usb-audio" ATTRS{bInterfaceClass}=="01" ATTRS{supports_autosuspend}=="1" ATTRS{bNumEndpoints}=="00" ATTRS{bInterfaceNumber}=="00" ATTRS{bInterfaceSubClass}=="01" ATTRS{bAlternateSetting}==" 0" ATTRS{bInterfaceProtocol}=="00" ATTRS{authorized}=="1" looking at parent device '/devices/pci0000:00/0000:00:1a.1/usb3/3-1': KERNELS=="3-1" SUBSYSTEMS=="usb" DRIVERS=="usb" ATTRS{tx_lanes}=="1" ATTRS{bMaxPacketSize0}=="8" ATTRS{avoid_reset_quirk}=="0" ATTRS{speed}=="12" ATTRS{product}=="USB Audio CODEC " ATTRS{version}==" 1.10" ATTRS{bcdDevice}=="0100" ATTRS{busnum}=="3" ATTRS{ltm_capable}=="no" ATTRS{devnum}=="5" ATTRS{configuration}=="" ATTRS{devpath}=="1" ATTRS{manufacturer}=="Burr-Brown from TI " ATTRS{quirks}=="0x0" ATTRS{bDeviceSubClass}=="00" ATTRS{authorized}=="1" ATTRS{rx_lanes}=="1" ATTRS{bMaxPower}=="100mA" ATTRS{bNumInterfaces}==" 4" ATTRS{maxchild}=="0" ATTRS{bDeviceClass}=="00" ATTRS{bDeviceProtocol}=="00" ATTRS{bNumConfigurations}=="1" ATTRS{bmAttributes}=="80" ATTRS{bConfigurationValue}=="1" ATTRS{urbnum}=="62" ATTRS{removable}=="unknown" ATTRS{idProduct}=="2902" ATTRS{idVendor}=="08bb" looking at parent device '/devices/pci0000:00/0000:00:1a.1/usb3': KERNELS=="usb3" SUBSYSTEMS=="usb" DRIVERS=="usb" ATTRS{manufacturer}=="Linux 4.19.0-5-amd64 uhci_hcd" ATTRS{idVendor}=="1d6b" ATTRS{devnum}=="1" ATTRS{bDeviceProtocol}=="00" ATTRS{interface_authorized_default}=="1" ATTRS{authorized_default}=="1" ATTRS{bNumConfigurations}=="1" ATTRS{bNumInterfaces}==" 1" ATTRS{product}=="UHCI Host Controller" ATTRS{ltm_capable}=="no" ATTRS{rx_lanes}=="1" ATTRS{removable}=="unknown" ATTRS{maxchild}=="2" ATTRS{bMaxPower}=="0mA" ATTRS{bcdDevice}=="0419" ATTRS{busnum}=="3" ATTRS{serial}=="0000:00:1a.1" ATTRS{bConfigurationValue}=="1" ATTRS{idProduct}=="0001" ATTRS{bDeviceClass}=="09" ATTRS{bDeviceSubClass}=="00" ATTRS{bMaxPacketSize0}=="64" ATTRS{bmAttributes}=="e0" ATTRS{authorized}=="1" ATTRS{quirks}=="0x0" ATTRS{speed}=="12" ATTRS{avoid_reset_quirk}=="0" ATTRS{devpath}=="0" ATTRS{configuration}=="" ATTRS{urbnum}=="89" ATTRS{version}==" 1.10" ATTRS{tx_lanes}=="1" looking at parent device '/devices/pci0000:00/0000:00:1a.1': KERNELS=="0000:00:1a.1" SUBSYSTEMS=="pci" DRIVERS=="uhci_hcd" ATTRS{local_cpulist}=="0-1" ATTRS{driver_override}=="(null)" ATTRS{irq}=="21" ATTRS{revision}=="0x02" ATTRS{dma_mask_bits}=="32" ATTRS{consistent_dma_mask_bits}=="32" ATTRS{broken_parity_status}=="0" ATTRS{class}=="0x0c0300" ATTRS{subsystem_vendor}=="0x103c" ATTRS{enable}=="1" ATTRS{subsystem_device}=="0x2808" ATTRS{d3cold_allowed}=="0" ATTRS{local_cpus}=="3" ATTRS{ari_enabled}=="0" ATTRS{msi_bus}=="1" ATTRS{vendor}=="0x8086" ATTRS{numa_node}=="-1" ATTRS{device}=="0x2835" looking at parent device '/devices/pci0000:00': KERNELS=="pci0000:00" SUBSYSTEMS=="" DRIVERS==""
udevadm info -ap /sys/...can be your friend to figure out the unique parameters. I think you might be able to use e.g.ATTRS{devpath}and/orATTRS{busnum}to identify the devices by the usb socket they were plugged into. See reactivated.net/writing_udev_rules.html for how to write the rules..for i in /sys/class/sound/card* ; do udevadm info -ap $i ; doneinto your question to get going?