sound/usb/format.c
Source file repositories/reference/linux-study-clean/sound/usb/format.c
File Facts
- System
- Linux kernel
- Corpus path
sound/usb/format.c- Extension
.c- Size
- 25513 bytes
- Lines
- 924
- Domain
- Driver Families
- Bucket
- sound/usb
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/init.hlinux/slab.hlinux/usb.hlinux/usb/audio.hlinux/usb/audio-v2.hlinux/usb/audio-v3.hsound/core.hsound/pcm.husbaudio.hcard.hquirks.hhelper.hclock.hformat.h
Detected Declarations
function parse_audio_format_i_typefunction set_fixed_ratefunction set_rate_table_min_maxfunction tablefunction altsettingfunction focusrite_rate_pairfunction altsettingsfunction parse_uac2_sample_rate_rangefunction line6_parse_audio_format_rates_quirkfunction check_valid_altsetting_v2v3function validate_sample_rate_table_v2v3function tablefunction parse_audio_format_ifunction parse_audio_format_iifunction snd_usb_parse_audio_formatfunction snd_usb_parse_audio_format_v3
Annotated Snippet
if (format >= 64) {
usb_audio_info(chip,
"%u:%d: invalid format type 0x%llx is detected, processed as PCM\n",
fp->iface, fp->altsetting, format);
format = UAC_FORMAT_TYPE_I_PCM;
}
sample_width = fmt->bBitResolution;
sample_bytes = fmt->bSubframeSize;
format = 1ULL << format;
break;
}
case UAC_VERSION_2: {
struct uac_format_type_i_ext_descriptor *fmt = _fmt;
sample_width = fmt->bBitResolution;
sample_bytes = fmt->bSubslotSize;
if (format & UAC2_FORMAT_TYPE_I_RAW_DATA) {
pcm_formats |= SNDRV_PCM_FMTBIT_SPECIAL;
/* flag potentially raw DSD capable altsettings */
fp->dsd_raw = true;
/* clear special format bit to avoid "unsupported format" msg below */
format &= ~UAC2_FORMAT_TYPE_I_RAW_DATA;
}
format <<= 1;
break;
}
case UAC_VERSION_3: {
struct uac3_as_header_descriptor *as = _fmt;
sample_width = as->bBitResolution;
sample_bytes = as->bSubslotSize;
if (format & UAC3_FORMAT_TYPE_I_RAW_DATA) {
pcm_formats |= SNDRV_PCM_FMTBIT_SPECIAL;
/* clear special format bit to avoid "unsupported format" msg below */
format &= ~UAC3_FORMAT_TYPE_I_RAW_DATA;
}
format <<= 1;
break;
}
}
fp->fmt_bits = sample_width;
fp->fmt_sz = sample_bytes;
if ((pcm_formats == 0) &&
(format == 0 || format == BIT(UAC_FORMAT_TYPE_I_UNDEFINED))) {
/* some devices don't define this correctly... */
usb_audio_info(chip, "%u:%d : format type 0 is detected, processed as PCM\n",
fp->iface, fp->altsetting);
format = BIT(UAC_FORMAT_TYPE_I_PCM);
}
if (format & BIT(UAC_FORMAT_TYPE_I_PCM)) {
if (((chip->usb_id == USB_ID(0x0582, 0x0016)) ||
/* Edirol SD-90 */
(chip->usb_id == USB_ID(0x0582, 0x000c))) &&
/* Roland SC-D70 */
sample_width == 24 && sample_bytes == 2)
sample_bytes = 3;
else if (sample_width > sample_bytes * 8) {
usb_audio_info(chip, "%u:%d : sample bitwidth %d in over sample bytes %d\n",
fp->iface, fp->altsetting,
sample_width, sample_bytes);
}
/* check the format byte size */
switch (sample_bytes) {
case 1:
pcm_formats |= SNDRV_PCM_FMTBIT_S8;
break;
case 2:
if (snd_usb_is_big_endian_format(chip, fp))
pcm_formats |= SNDRV_PCM_FMTBIT_S16_BE; /* grrr, big endian!! */
else
pcm_formats |= SNDRV_PCM_FMTBIT_S16_LE;
break;
case 3:
if (snd_usb_is_big_endian_format(chip, fp))
pcm_formats |= SNDRV_PCM_FMTBIT_S24_3BE; /* grrr, big endian!! */
else
pcm_formats |= SNDRV_PCM_FMTBIT_S24_3LE;
break;
case 4:
pcm_formats |= SNDRV_PCM_FMTBIT_S32_LE;
break;
default:
usb_audio_info(chip,
"%u:%d : unsupported sample bitwidth %d in %d bytes\n",
Annotation
- Immediate include surface: `linux/init.h`, `linux/slab.h`, `linux/usb.h`, `linux/usb/audio.h`, `linux/usb/audio-v2.h`, `linux/usb/audio-v3.h`, `sound/core.h`, `sound/pcm.h`.
- Detected declarations: `function parse_audio_format_i_type`, `function set_fixed_rate`, `function set_rate_table_min_max`, `function table`, `function altsetting`, `function focusrite_rate_pair`, `function altsettings`, `function parse_uac2_sample_rate_range`, `function line6_parse_audio_format_rates_quirk`, `function check_valid_altsetting_v2v3`.
- Atlas domain: Driver Families / sound/usb.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.