Hartmut Geissbauer wrote:
> But to me it looks like, the audio interfaces are detected
> correctly as well.
>
> C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 0mA
> C: #Ifs= 5 Cfg#= 2 Atr=c0 MxPwr= 0mA
Configuration #1 is still active.
> ... snd-usb-audio is in use. Don't ask me from whom. lsmod won't
> tell me.
>
> Module Size Used by
> snd_usb_audio 70710 1
>
> ERROR: Removing 'snd_usb_audio': Device or resource busy
>
> It isn't released even if I unplug the device.
It seems it isn't possible to change the configuration at the place I
tried to do it, and the USB core gets thoroughly confused.
> > If that doesn't work, it would be possible to write a separate program
> > that switches the configuration, so that the audio driver can be
> > loaded later.
> >
> Am I right, that this separate program is handled by hotplug?
Yes (if somebody writes a hotplug script for it).
> Might the patch(the code in it) for usbaudio.c you posted before be
> helpfull for the program?
No. Please remove the patch.
Then compile the attached program (it requires libusb), and run it by
hand; after that, load snd-usb-audio.
> BTW: How many devices/"cards" is the snd-usb-audio driver able to
> handle?
8 (ALSA's card limit)
HTH
Clemens
/*
* noahinit.c - initialize a Creamware Noah to configuration #2
*
* ... blah blah ... freeware ... blah blah ... no warranty ... blah blah ...
*
* compile with "gcc -o noahinit noahinit.c -lusb"
*/
#include <stdio.h>
#include <usb.h>
static void noah_init(struct usb_device *dev)
{
usb_dev_handle *h = usb_open(dev);
if (!h) {
puts("Open failed!");
return;
}
puts("Setting configuration 2");
usb_set_configuration(h, 2);
usb_close(h);
}
int main(void)
{
struct usb_bus *bus;
struct usb_device *dev;
usb_set_debug(1);
usb_init();
usb_find_busses();
usb_find_devices();
for (bus = usb_get_busses(); bus; bus = bus->next) {
for (dev = bus->devices; dev; dev = dev->next) {
if (dev->descriptor.idVendor == 0x1107 &&
dev->descriptor.idProduct == 0x0102) {
printf("found Creamware Noah at %s\n", dev->filename);
noah_init(dev);
}
}
}
return 0;
}