Hi I thought I would post an update on this thread. I realise it is quite old but what I have now is relevant.
/* * Digidesign Mbox 2 * * Interface list: * 0 Firmware * 1 Control * 2 Playback (Async) * 3 IEC958 (Ignore) * 4 Record (Sync) * 5 Record (Async) (Ignore) * 6 MIDI * */
My previous posts may have demonstrated a lack of understanding of how USB audio devices work, but I believe I have learnt a bit more since last time I posted.
I have determined that there is a combination of altsettings for this device that allows hardcoding of them and still provides duplex support, ie, the fact that it supports multiple endpoints is irrelevant. If you use interfaces 2 and 4 both with #2 altsetting, hardcode the samplerate to 48000Hz (max) and the bit depth at 24 (max) and send some control magic to set it up, it works great!
It also requires a boot quirk to load firmware into the device from an onboard memory chip. I determined the control sequence to do so but it also needs a 3 second delay while the firmware activates and I dont have the knowledge to do a proper in-kernel delay.
In summary there are 3 parts to make this device work: 1) Boot quirk - load firmware and wait 3 seconds 2) Set up samplerate/bitrate in the device once and force S24_3BE format. 3) Select interfaces 2 and 4 both with altsetting 2, and interface 6 for midi.
I can provide working code for all three steps (except the waiting part is dodgey). I can't submit a proper patch. I hope we can get this accepted into your alsa usb driver soon because maintaining a small quirk is time consuming for me. I don't feel right cloning your entire code and attaching a tiny quirk to it and releasing it on my website for others, but so far it's the only way people have been able to use this device in linux. I have about 200 valid comments on my blog post about it.
Here is the quirk part:
{ USB_DEVICE(0x0dba, 0x3000), .driver_info = (unsigned long) & (const struct snd_mbox2_quirk) { .vendor_name = "Digidesign", .product_name = "Mbox 2", .ifnum = QUIRK_ANY_INTERFACE, .type = QUIRK_COMPOSITE, .data = (const struct snd_mbox2_quirk[]) { { .ifnum = 0, .type = QUIRK_IGNORE_INTERFACE }, { .ifnum = 1, .type = QUIRK_IGNORE_INTERFACE }, { .ifnum = 2, .type = QUIRK_AUDIO_FIXED_ENDPOINT, .data = & (const struct audioformat) { .formats = SNDRV_PCM_FMTBIT_S24_3BE, .channels = 2, .iface = 2, .altsetting = 2, .altset_idx = 1, .attributes = 0x00, .endpoint = 0x03, .ep_attr = USB_ENDPOINT_SYNC_ASYNC, .maxpacksize = 0x128, .rates = SNDRV_PCM_RATE_48000, .rate_min = 48000, .rate_max = 48000, .nr_rates = 1, .rate_table = (unsigned int[]) { 48000 } } }, { .ifnum = 3, .type = QUIRK_IGNORE_INTERFACE }, { .ifnum = 4, .type = QUIRK_AUDIO_FIXED_ENDPOINT, .data = & (const struct audioformat) { .formats = SNDRV_PCM_FMTBIT_S24_3BE, .channels = 2, .iface = 4, .altsetting = 2, .altset_idx = 1, .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE, .endpoint = 0x85, .ep_attr = USB_ENDPOINT_SYNC_SYNC, .maxpacksize = 0x128, .rates = SNDRV_PCM_RATE_48000, .rate_min = 48000, .rate_max = 48000, .nr_rates = 1, .rate_table = (unsigned int[]) { 48000 } } }, { .ifnum = 5, .type = QUIRK_IGNORE_INTERFACE }, { .ifnum = 6, .type = QUIRK_MIDI_MBOX2, .data = & (const struct snd_usb_midi_endpoint_info) { .out_ep = 0x02, .out_cables = 0x0001, .in_ep = 0x81, .in_interval = 0x01, .in_cables = 0x0001 } }, { .ifnum = -1 } } } },