ALSA: usb-audio: add Roland OCTA-CAPTURE multirate support

The OCTA-CAPTURE provides one alternate setting for each supported
sample rate. Add the 48, 96 and 192 kHz playback and capture settings.

The existing S32_LE description causes the white-noise playback reported
by Niklas Aldervall and other users. The device sends packed 24-bit
samples, but S32_LE makes ALSA interpret each sample as a four-byte value,
which misaligns the stream. USB captures and PCM streaming tests confirm
that S24_3LE is the correct format for every setting.

The device provides 10 playback and 12 capture channels through
96 kHz, and four channels in each direction at 192 kHz. Correct the
product name in the commented override.

Tested on a physical OCTA-CAPTURE with full-duplex streams at 44.1,
48, 96 and 192 kHz.

Reported-by: Niklas Aldervall <niklas@aldervall.se>
Closes: https://lore.kernel.org/alsa-devel/6b623cb6-3a9b-4fe4-a57c-9a165d261692@aldervall.se/
Signed-off-by: Jonathan Seth Mainguy <jon@soh.re>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Link: https://patch.msgid.link/20260829005001.534571-2-jon@soh.re
This commit is contained in:
Jonathan Seth Mainguy 2026-08-28 20:49:58 -04:00 committed by Takashi Iwai
parent 9b110a9dce
commit a13515c7f1

View File

@ -1227,15 +1227,15 @@ YAMAHA_DEVICE(0x7010, "UB99"),
}
},
{
/* only 44.1 kHz works at the moment */
/* S24_3LE; altsettings 1-4 match the device clock. */
USB_DEVICE(0x0582, 0x0120),
QUIRK_DRIVER_INFO {
/* .vendor_name = "Roland", */
/* .product_name = "OCTO-CAPTURE", */
/* .product_name = "OCTA-CAPTURE", */
QUIRK_DATA_COMPOSITE {
{
QUIRK_DATA_AUDIOFORMAT(0) {
.formats = SNDRV_PCM_FMTBIT_S32_LE,
.formats = SNDRV_PCM_FMTBIT_S24_3LE,
.channels = 10,
.iface = 0,
.altsetting = 1,
@ -1249,9 +1249,57 @@ YAMAHA_DEVICE(0x7010, "UB99"),
.rate_table = (unsigned int[]) { 44100 }
}
},
{
QUIRK_DATA_AUDIOFORMAT(0) {
.formats = SNDRV_PCM_FMTBIT_S24_3LE,
.channels = 10,
.iface = 0,
.altsetting = 2,
.altset_idx = 2,
.endpoint = 0x05,
.ep_attr = 0x05,
.rates = SNDRV_PCM_RATE_48000,
.rate_min = 48000,
.rate_max = 48000,
.nr_rates = 1,
.rate_table = (unsigned int[]) { 48000 }
}
},
{
QUIRK_DATA_AUDIOFORMAT(0) {
.formats = SNDRV_PCM_FMTBIT_S24_3LE,
.channels = 10,
.iface = 0,
.altsetting = 3,
.altset_idx = 3,
.endpoint = 0x05,
.ep_attr = 0x05,
.rates = SNDRV_PCM_RATE_96000,
.rate_min = 96000,
.rate_max = 96000,
.nr_rates = 1,
.rate_table = (unsigned int[]) { 96000 }
}
},
{
QUIRK_DATA_AUDIOFORMAT(0) {
.formats = SNDRV_PCM_FMTBIT_S24_3LE,
.channels = 4,
.iface = 0,
.altsetting = 4,
.altset_idx = 4,
.endpoint = 0x05,
.ep_attr = 0x05,
.rates = SNDRV_PCM_RATE_192000,
.rate_min = 192000,
.rate_max = 192000,
.nr_rates = 1,
.rate_table = (unsigned int[]) { 192000 }
}
},
{
QUIRK_DATA_AUDIOFORMAT(1) {
.formats = SNDRV_PCM_FMTBIT_S32_LE,
.formats = SNDRV_PCM_FMTBIT_S24_3LE,
.channels = 12,
.iface = 1,
.altsetting = 1,
@ -1265,6 +1313,54 @@ YAMAHA_DEVICE(0x7010, "UB99"),
.rate_table = (unsigned int[]) { 44100 }
}
},
{
QUIRK_DATA_AUDIOFORMAT(1) {
.formats = SNDRV_PCM_FMTBIT_S24_3LE,
.channels = 12,
.iface = 1,
.altsetting = 2,
.altset_idx = 2,
.endpoint = 0x85,
.ep_attr = 0x25,
.rates = SNDRV_PCM_RATE_48000,
.rate_min = 48000,
.rate_max = 48000,
.nr_rates = 1,
.rate_table = (unsigned int[]) { 48000 }
}
},
{
QUIRK_DATA_AUDIOFORMAT(1) {
.formats = SNDRV_PCM_FMTBIT_S24_3LE,
.channels = 12,
.iface = 1,
.altsetting = 3,
.altset_idx = 3,
.endpoint = 0x85,
.ep_attr = 0x25,
.rates = SNDRV_PCM_RATE_96000,
.rate_min = 96000,
.rate_max = 96000,
.nr_rates = 1,
.rate_table = (unsigned int[]) { 96000 }
}
},
{
QUIRK_DATA_AUDIOFORMAT(1) {
.formats = SNDRV_PCM_FMTBIT_S24_3LE,
.channels = 4,
.iface = 1,
.altsetting = 4,
.altset_idx = 4,
.endpoint = 0x85,
.ep_attr = 0x25,
.rates = SNDRV_PCM_RATE_192000,
.rate_min = 192000,
.rate_max = 192000,
.nr_rates = 1,
.rate_table = (unsigned int[]) { 192000 }
}
},
{
QUIRK_DATA_MIDI_FIXED_ENDPOINT(2) {
.out_cables = 0x0001,