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;
}

Reply via email to