--- desc-defs.c | 277 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- desc-defs.h | 3 + desc-dump.c | 5 ++ 3 files changed, 270 insertions(+), 15 deletions(-) diff --git a/desc-defs.c b/desc-defs.c index 6bc558e..3b5ea1e 100644 --- a/desc-defs.c +++ b/desc-defs.c @@ -61,6 +61,16 @@ static const char * const uac2_input_term_bmcontrols[] = { NULL }; +/* USB DCD for Audio Devices Release 3.0: Section 4.5.2.1, Table 4-16, pp67 */ +static const char * const uac3_input_term_bmcontrols[] = { + "Insertion", + "Overload", + "Underflow", + "Overflow", + "Underflow", + NULL +}; + static const char * const uac2_output_term_bmcontrols[] = { "Copy Protect", "Connector", @@ -70,6 +80,15 @@ static const char * const uac2_output_term_bmcontrols[] = { NULL }; +/* USB DCD for Audio Devices Release 3.0: Section 4.5.2.2, Table 4-17, pp69 */ +static const char * const uac3_output_term_bmcontrols[] = { + "Insertion", + "Overload", + "Underflow", + "Overflow", + NULL +}; + static const char * const uac2_mixer_unit_bmcontrols[] = { "Cluster", "Underflow", @@ -77,6 +96,13 @@ static const char * const uac2_mixer_unit_bmcontrols[] = { NULL }; +/* USB DCD for Audio Devices Release 3.0: Section 4.5.2.5, Table 4-29, pp79 */ +static const char * const uac3_mixer_unit_bmcontrols[] = { + "Underflow", + "Overflow", + NULL +}; + static const char * const uac2_extension_unit_bmcontrols[] = { "Enable", "Cluster", @@ -85,6 +111,13 @@ static const char * const uac2_extension_unit_bmcontrols[] = { NULL }; +/* USB DCD for Audio Devices Release 3.0: Section 4.5.2.11, Table 4-42, pp91 */ +static const char * const uac3_extension_unit_bmcontrols[] = { + "Underflow", + "Overflow", + NULL +}; + static const char * const uac2_clock_source_bmcontrols[] = { "Clock Frequency", "Clock Validity", @@ -146,10 +179,18 @@ static const struct desc desc_audio_2_ac_header[] = { .bmcontrol = uac2_interface_header_bmcontrols }, { .field = NULL } }; +/** UAC3: 4.5.2 Class-Specific AC Interface Descriptor; Table 4-15. */ +static const struct desc desc_audio_3_ac_header[] = { + { .field = "bCategory", .size = 1, .type = DESC_CONSTANT }, + { .field = "wTotalLength", .size = 2, .type = DESC_NUMBER }, + { .field = "bmControls", .size = 4, .type = DESC_BMCONTROL_2, + .bmcontrol = uac2_interface_header_bmcontrols }, + { .field = NULL } +}; const struct desc * const desc_audio_ac_header[3] = { desc_audio_1_ac_header, desc_audio_2_ac_header, - NULL, /* UAC3 not implemented yet */ + desc_audio_3_ac_header, }; /** UAC2: 4.7.2.10 Effect Unit Descriptor; Table 4-15. */ @@ -162,10 +203,20 @@ static const struct desc desc_audio_2_ac_effect_unit[] = { { .field = "iEffects", .size = 1, .type = DESC_STR_DESC_INDEX }, { .field = NULL } }; +/** UAC3: 4.5.2.9 Effect Unit Descriptor; Table 4-33. */ +static const struct desc desc_audio_3_ac_effect_unit[] = { + { .field = "bUnitID", .size = 1, .type = DESC_NUMBER }, + { .field = "wEffectType", .size = 2, .type = DESC_CONSTANT }, + { .field = "bSourceID", .size = 1, .type = DESC_CONSTANT }, + { .field = "bmaControls", .size = 4, .type = DESC_BITMAP, + .array = { .array = true } }, + { .field = "wEffectsDescrStr", .size = 2, .type = DESC_CS_STR_DESC_ID }, + { .field = NULL } +}; const struct desc * const desc_audio_ac_effect_unit[3] = { NULL, /* UAC1 not supported */ desc_audio_2_ac_effect_unit, - NULL, /* UAC3 not implemented yet */ + desc_audio_3_ac_effect_unit, }; @@ -196,10 +247,24 @@ static const struct desc desc_audio_2_ac_input_terminal[] = { { .field = "iTerminal", .size = 1, .type = DESC_STR_DESC_INDEX }, { .field = NULL } }; +/** UAC3: 4.5.2.1 Input Terminal Descriptor; Table 4-16. */ +static const struct desc desc_audio_3_ac_input_terminal[] = { + { .field = "bTerminalID", .size = 1, .type = DESC_NUMBER }, + { .field = "wTerminalType", .size = 2, .type = DESC_TERMINAL_STR }, + { .field = "bAssocTerminal", .size = 1, .type = DESC_NUMBER }, + { .field = "bCSourceID", .size = 1, .type = DESC_NUMBER }, + { .field = "bmControls", .size = 4, .type = DESC_BMCONTROL_2, + .bmcontrol = uac3_input_term_bmcontrols }, + { .field = "wClusterDescrID", .size = 2, .type = DESC_NUMBER }, + { .field = "wExTerminalDescrID", .size = 2, .type = DESC_NUMBER }, + { .field = "wConnectorsDescrID", .size = 2, .type = DESC_NUMBER }, + { .field = "wTerminalDescrStr", .size = 2, .type = DESC_CS_STR_DESC_ID }, + { .field = NULL } +}; const struct desc * const desc_audio_ac_input_terminal[3] = { desc_audio_1_ac_input_terminal, desc_audio_2_ac_input_terminal, - NULL, /* UAC3 not implemented yet */ + desc_audio_3_ac_input_terminal, }; @@ -224,10 +289,55 @@ static const struct desc desc_audio_2_ac_output_terminal[] = { { .field = "iTerminal", .size = 1, .type = DESC_STR_DESC_INDEX }, { .field = NULL } }; +/** UAC3: 4.5.2.2 Output Terminal Descriptor; Table 4-17. */ +static const struct desc desc_audio_3_ac_output_terminal[] = { + { .field = "bTerminalID", .size = 1, .type = DESC_NUMBER }, + { .field = "wTerminalType", .size = 2, .type = DESC_TERMINAL_STR }, + { .field = "bAssocTerminal", .size = 1, .type = DESC_NUMBER }, + { .field = "bSourceID", .size = 1, .type = DESC_NUMBER }, + { .field = "bCSourceID", .size = 1, .type = DESC_NUMBER }, + { .field = "bmControls", .size = 4, .type = DESC_BMCONTROL_2, + .bmcontrol = uac3_output_term_bmcontrols }, + { .field = "wExTerminalDescrID", .size = 2, .type = DESC_NUMBER }, + { .field = "wConnectorsDescrID", .size = 2, .type = DESC_NUMBER }, + { .field = "wTerminalDescrStr", .size = 2, .type = DESC_CS_STR_DESC_ID }, + { .field = NULL } +}; const struct desc * const desc_audio_ac_output_terminal[3] = { desc_audio_1_ac_output_terminal, desc_audio_2_ac_output_terminal, - NULL, /* UAC3 not implemented yet */ + desc_audio_3_ac_output_terminal, +}; + + +/** UAC3: 4.5.2.3.1 Extended Terminal Header Descriptor; Table 4-18. */ +static const struct desc desc_audio_3_ac_extended_terminal_header[] = { + { .field = "wDescriptorID", .size = 2, .type = DESC_NUMBER }, + { .field = "bNrChannels", .size = 1, .type = DESC_NUMBER }, + { .field = NULL } +}; +const struct desc * const desc_audio_ac_extended_terminal[3] = { + NULL, /* UAC1 not supported */ + NULL, /* UAC2 not supported */ + desc_audio_3_ac_extended_terminal_header, +}; + + +/** UAC3: 4.5.2.15 Power Domain Descriptor; Table 4-46. */ +static const struct desc desc_audio_3_ac_power_domain[] = { + { .field = "bPowerDomainID", .size = 1, .type = DESC_NUMBER }, + { .field = "waRecoveryTime(1)", .size = 2, .type = DESC_NUMBER }, + { .field = "waRecoveryTime(2)", .size = 2, .type = DESC_NUMBER }, + { .field = "bNrEntities", .size = 1, .type = DESC_NUMBER }, + { .field = "baEntityID", .size = 1, .type = DESC_NUMBER, + .array = { .array = true, .length_field1 = "bNrEntities" } }, + { .field = "wPDomainDescrStr", .size = 2, .type = DESC_CS_STR_DESC_ID }, + { .field = NULL } +}; +const struct desc * const desc_audio_ac_power_domain[3] = { + NULL, /* UAC1 not supported */ + NULL, /* UAC2 not supported */ + desc_audio_3_ac_power_domain, }; @@ -267,10 +377,24 @@ static const struct desc desc_audio_2_ac_mixer_unit[] = { { .field = "iMixer", .size = 1, .type = DESC_STR_DESC_INDEX }, { .field = NULL } }; +/** UAC3: 4.5.2.5 Mixer Unit Descriptor; Table 4-29. */ +static const struct desc desc_audio_3_ac_mixer_unit[] = { + { .field = "bUnitID", .size = 1, .type = DESC_NUMBER }, + { .field = "bNrInPins", .size = 1, .type = DESC_NUMBER }, + { .field = "baSourceID", .size = 1, .type = DESC_NUMBER, + .array = { .array = true, .length_field1 = "bNrInPins" } }, + { .field = "wClusterDescrID",.size = 2, .type = DESC_NUMBER }, + { .field = "bmMixerControls",.size = 1, .type = DESC_BITMAP, + .array = { .array = true } }, + { .field = "bmControls", .size = 4, .type = DESC_BMCONTROL_2, + .bmcontrol = uac3_mixer_unit_bmcontrols }, + { .field = "wMixerDescrStr", .size = 2, .type = DESC_CS_STR_DESC_ID }, + { .field = NULL } +}; const struct desc * const desc_audio_ac_mixer_unit[3] = { desc_audio_1_ac_mixer_unit, desc_audio_2_ac_mixer_unit, - NULL, /* UAC3 not implemented yet */ + desc_audio_3_ac_mixer_unit, }; @@ -294,10 +418,21 @@ static const struct desc desc_audio_2_ac_selector_unit[] = { { .field = "iSelector", .size = 1, .type = DESC_STR_DESC_INDEX }, { .field = NULL } }; +/** UAC3: 4.5.2.6 Selector Unit Descriptor; Table 4-30. */ +static const struct desc desc_audio_3_ac_selector_unit[] = { + { .field = "bUnitID", .size = 1, .type = DESC_NUMBER }, + { .field = "bNrInPins", .size = 1, .type = DESC_NUMBER }, + { .field = "baSourceID", .size = 1, .type = DESC_NUMBER, + .array = { .array = true, .length_field1 = "bNrInPins" } }, + { .field = "bmControls", .size = 4, .type = DESC_BMCONTROL_2, + .bmcontrol = uac2_selector_bmcontrols }, + { .field = "wSelectorDescrStr", .size = 2, .type = DESC_CS_STR_DESC_ID }, + { .field = NULL } +}; const struct desc * const desc_audio_ac_selector_unit[3] = { desc_audio_1_ac_selector_unit, desc_audio_2_ac_selector_unit, - NULL, /* UAC3 not implemented yet */ + desc_audio_3_ac_selector_unit, }; @@ -339,10 +474,22 @@ static const struct desc desc_audio_2_ac_processing_unit[] = { .array = { .array = true } }, { .field = NULL } }; +/** UAC3: 4.5.2.10 Processing Unit Descriptor; Table 4-38. */ +static const struct desc desc_audio_3_ac_processing_unit[] = { + { .field = "bUnitID", .size = 1, .type = DESC_NUMBER }, + { .field = "wProcessType", .size = 2, .type = DESC_CONSTANT }, + { .field = "bNrInPins", .size = 1, .type = DESC_NUMBER }, + { .field = "baSourceID", .size = 1, .type = DESC_NUMBER, + .array = { .array = true, .length_field1 = "bNrInPins" } }, + { .field = "wProcessingDescrStr", .size = 2, .type = DESC_CS_STR_DESC_ID }, + { .field = "Process-specific", .size = 1, .type = DESC_BITMAP, + .array = { .array = true } }, + { .field = NULL } +}; const struct desc * const desc_audio_ac_processing_unit[3] = { desc_audio_1_ac_processing_unit, desc_audio_2_ac_processing_unit, - NULL, /* UAC3 not implemented yet */ + desc_audio_3_ac_processing_unit, }; @@ -365,10 +512,19 @@ static const struct desc desc_audio_2_ac_feature_unit[] = { { .field = "iFeature", .size = 1, .type = DESC_STR_DESC_INDEX }, { .field = NULL } }; +/** UAC3: 4.5.2.7 Feature Unit Descriptor; Table 4-31. */ +static const struct desc desc_audio_3_ac_feature_unit[] = { + { .field = "bUnitID", .size = 1, .type = DESC_NUMBER }, + { .field = "bSourceID", .size = 1, .type = DESC_NUMBER }, + { .field = "bmaControls", .size = 4, .type = DESC_BMCONTROL_2, + .bmcontrol = uac_feature_unit_bmcontrols, .array = { .array = true } }, + { .field = "wFeatureDescrStr", .size = 2, .type = DESC_CS_STR_DESC_ID }, + { .field = NULL } +}; const struct desc * const desc_audio_ac_feature_unit[3] = { desc_audio_1_ac_feature_unit, desc_audio_2_ac_feature_unit, - NULL, /* UAC3 not implemented yet */ + desc_audio_3_ac_feature_unit, }; @@ -405,10 +561,23 @@ static const struct desc desc_audio_2_ac_extension_unit[] = { { .field = "iExtension", .size = 1, .type = DESC_STR_DESC_INDEX }, { .field = NULL } }; +/** UAC3: 4.5.2.11 Extension Unit Descriptor; Table 4-42. */ +static const struct desc desc_audio_3_ac_extension_unit[] = { + { .field = "bUnitID", .size = 1, .type = DESC_NUMBER }, + { .field = "wExtensionCode", .size = 2, .type = DESC_CONSTANT }, + { .field = "bNrInPins", .size = 1, .type = DESC_NUMBER }, + { .field = "baSourceID", .size = 1, .type = DESC_NUMBER, + .array = { .array = true, .length_field1 = "bNrInPins" } }, + { .field = "wExtensionDescrStr", .size = 2, .type = DESC_CS_STR_DESC_ID }, + { .field = "bmControls", .size = 4, .type = DESC_BMCONTROL_2, + .bmcontrol = uac3_extension_unit_bmcontrols }, + { .field = "wClusterDescrID", .size = 2, .type = DESC_NUMBER }, + { .field = NULL } +}; const struct desc * const desc_audio_ac_extension_unit[3] = { desc_audio_1_ac_extension_unit, desc_audio_2_ac_extension_unit, - NULL, /* UAC3 not implemented yet */ + desc_audio_3_ac_extension_unit, }; @@ -435,6 +604,16 @@ static void desc_snowflake_dump_uac2_clk_src_bmattr( (value & 0x4) ? uac3_clk_src_bmattr[3] : ""); } +/** Special rendering function for UAC3 clock source bmAttributes */ +static void desc_snowflake_dump_uac3_clk_src_bmattr( + unsigned long long value, + unsigned int indent) +{ + printf(" %s clock %s\n", + uac3_clk_src_bmattr[(value & 0x1)], + uac3_clk_src_bmattr[0x2 | ((value & 0x2) >> 1)]); +} + /** UAC2: 4.7.2.1 Clock Source Descriptor; Table 4-6. */ static const struct desc desc_audio_2_ac_clock_source[] = { { .field = "bClockID", .size = 1, .type = DESC_CONSTANT }, @@ -446,10 +625,21 @@ static const struct desc desc_audio_2_ac_clock_source[] = { { .field = "iClockSource", .size = 1, .type = DESC_STR_DESC_INDEX }, { .field = NULL } }; +/** UAC3: 4.5.2.12 Clock Source Descriptor; Table 4-43. */ +static const struct desc desc_audio_3_ac_clock_source[] = { + { .field = "bClockID", .size = 1, .type = DESC_NUMBER }, + { .field = "bmAttributes", .size = 1, .type = DESC_SNOWFLAKE, + .snowflake = desc_snowflake_dump_uac3_clk_src_bmattr }, + { .field = "bmControls", .size = 4, .type = DESC_BMCONTROL_2, + .bmcontrol = uac2_clock_source_bmcontrols }, + { .field = "bReferenceTerminal", .size = 1, .type = DESC_NUMBER }, + { .field = "wClockSourceStr", .size = 2, .type = DESC_CS_STR_DESC_ID }, + { .field = NULL } +}; const struct desc * const desc_audio_ac_clock_source[3] = { NULL, /* UAC1 not supported */ desc_audio_2_ac_clock_source, - NULL, /* UAC3 not implemented yet */ + desc_audio_3_ac_clock_source, }; @@ -464,10 +654,21 @@ static const struct desc desc_audio_2_ac_clock_selector[] = { { .field = "iClockSelector", .size = 1, .type = DESC_STR_DESC_INDEX }, { .field = NULL } }; +/** UAC3: 4.5.2.13 Clock Selector Descriptor; Table 4-44. */ +static const struct desc desc_audio_3_ac_clock_selector[] = { + { .field = "bClockID", .size = 1, .type = DESC_NUMBER }, + { .field = "bNrInPins", .size = 1, .type = DESC_NUMBER }, + { .field = "baCSourceID", .size = 1, .type = DESC_NUMBER, + .array = { .array = true, .length_field1 = "bNrInPins" } }, + { .field = "bmControls", .size = 4, .type = DESC_BMCONTROL_2, + .bmcontrol = uac2_clock_selector_bmcontrols }, + { .field = "wCSelectorDescrStr", .size = 2, .type = DESC_CS_STR_DESC_ID }, + { .field = NULL } +}; const struct desc * const desc_audio_ac_clock_selector[3] = { NULL, /* UAC1 not supported */ desc_audio_2_ac_clock_selector, - NULL, /* UAC3 not implemented yet */ + desc_audio_3_ac_clock_selector, }; @@ -480,10 +681,19 @@ static const struct desc desc_audio_2_ac_clock_multiplier[] = { { .field = "iClockMultiplier", .size = 1, .type = DESC_STR_DESC_INDEX }, { .field = NULL } }; +/** UAC3: 4.5.2.14 Clock Multiplier Descriptor; Table 4-45. */ +static const struct desc desc_audio_3_ac_clock_multiplier[] = { + { .field = "bClockID", .size = 1, .type = DESC_NUMBER }, + { .field = "bCSourceID", .size = 1, .type = DESC_NUMBER }, + { .field = "bmControls", .size = 4, .type = DESC_BMCONTROL_2, + .bmcontrol = uac2_clock_multiplier_bmcontrols }, + { .field = "wCMultiplierDescrStr", .size = 2, .type = DESC_CS_STR_DESC_ID }, + { .field = NULL } +}; const struct desc * const desc_audio_ac_clock_multiplier[3] = { NULL, /* UAC1 not supported */ desc_audio_2_ac_clock_multiplier, - NULL, /* UAC3 not implemented yet */ + desc_audio_3_ac_clock_multiplier, }; @@ -496,10 +706,19 @@ static const struct desc desc_audio_2_ac_sample_rate_converter[] = { { .field = "iSRC", .size = 1, .type = DESC_STR_DESC_INDEX }, { .field = NULL } }; +/** UAC3: 4.5.2.8 Sampling Rate Converter Descriptor; Table 4-32. */ +static const struct desc desc_audio_3_ac_sample_rate_converter[] = { + { .field = "bUnitID", .size = 1, .type = DESC_NUMBER }, + { .field = "bSourceID", .size = 1, .type = DESC_NUMBER }, + { .field = "bCSourceInID", .size = 1, .type = DESC_NUMBER }, + { .field = "bCSourceOutID", .size = 1, .type = DESC_NUMBER }, + { .field = "wSRCDescrStr", .size = 2, .type = DESC_CS_STR_DESC_ID }, + { .field = NULL } +}; const struct desc * const desc_audio_ac_sample_rate_converter[3] = { NULL, /* UAC1 not supported */ desc_audio_2_ac_sample_rate_converter, - NULL, /* UAC3 not implemented yet */ + desc_audio_3_ac_sample_rate_converter, }; @@ -508,6 +727,12 @@ static const char * const uac2_as_interface_bmcontrols[] = { "Valid Alternate Setting", NULL }; +static const char * const uac3_as_interface_bmcontrols[] = { + "Active Alternate Setting", + "Valid Alternate Setting", + "Audio Data Format Control", + NULL +}; static const char * const audio_data_format_type_i[] = { "TYPE_I_UNDEFINED", "PCM", @@ -591,10 +816,23 @@ static const struct desc desc_audio_2_as_interface[] = { { .field = "iChannelNames", .size = 1, .type = DESC_STR_DESC_INDEX }, { .field = NULL } }; +/** UAC3: 4.7.2 Class-Specific AS Interface Descriptor; Table 4-49. */ +static const struct desc desc_audio_3_as_interface[] = { + { .field = "bTerminalLink", .size = 1, .type = DESC_NUMBER }, + { .field = "bmControls", .size = 4, .type = DESC_BMCONTROL_2, + .bmcontrol = uac3_as_interface_bmcontrols }, + { .field = "wClusterDescrID", .size = 2, .type = DESC_NUMBER }, + { .field = "bmFormats", .size = 8, .type = DESC_BITMAP }, + { .field = "bSubslotSize", .size = 1, .type = DESC_NUMBER }, + { .field = "bBitResolution", .size = 1, .type = DESC_NUMBER }, + { .field = "bmAuxProtocols", .size = 2, .type = DESC_BITMAP }, + { .field = "bControlSize", .size = 1, .type = DESC_NUMBER }, + { .field = NULL } +}; const struct desc * const desc_audio_as_interface[3] = { desc_audio_1_as_interface, desc_audio_2_as_interface, - NULL, /* UAC3 not implemented yet */ + desc_audio_3_as_interface, }; @@ -640,8 +878,17 @@ static const struct desc desc_audio_2_as_isochronous_audio_data_endpoint[] = { { .field = "wLockDelay", .size = 2, .type = DESC_NUMBER }, { .field = NULL } }; +/** UAC3: 4.8.1.2 Class-Specific AS Isochronous Audio Data Endpoint Descriptor; Table 4-52. */ +static const struct desc desc_audio_3_as_isochronous_audio_data_endpoint[] = { + { .field = "bmControls", .size = 4, .type = DESC_BMCONTROL_2, + .bmcontrol = uac2_as_isochronous_audio_data_endpoint_bmcontrols }, + { .field = "bLockDelayUnits", .size = 1, .type = DESC_NUMBER_STRINGS, + .number_strings = uac_as_isochronous_audio_data_endpoint_blockdelayunits }, + { .field = "wLockDelay", .size = 2, .type = DESC_NUMBER }, + { .field = NULL } +}; const struct desc * const desc_audio_as_isochronous_audio_data_endpoint[3] = { desc_audio_1_as_isochronous_audio_data_endpoint, desc_audio_2_as_isochronous_audio_data_endpoint, - NULL, /* UAC3 not implemented yet */ + desc_audio_3_as_isochronous_audio_data_endpoint, }; diff --git a/desc-defs.h b/desc-defs.h index 759ac4c..d88ebd8 100644 --- a/desc-defs.h +++ b/desc-defs.h @@ -43,6 +43,7 @@ enum desc_type { DESC_BMCONTROL_1, /**< UAC1 style bmControl field */ DESC_BMCONTROL_2, /**< UAC2/UAC3 style bmControl field */ DESC_STR_DESC_INDEX, /**< String index. */ + DESC_CS_STR_DESC_ID, /**< UAC3 style class-specific string request. */ DESC_TERMINAL_STR, /**< Audio terminal string. */ DESC_BITMAP_STRINGS, /**< Bitfield with string per bit. */ DESC_NUMBER_STRINGS, /**< Use for enum-style value to string. */ @@ -134,6 +135,8 @@ extern const struct desc * const desc_audio_ac_header[3]; extern const struct desc * const desc_audio_ac_effect_unit[3]; extern const struct desc * const desc_audio_ac_input_terminal[3]; extern const struct desc * const desc_audio_ac_output_terminal[3]; +extern const struct desc * const desc_audio_ac_extended_terminal[3]; +extern const struct desc * const desc_audio_ac_power_domain[3]; extern const struct desc * const desc_audio_ac_mixer_unit[3]; extern const struct desc * const desc_audio_ac_selector_unit[3]; extern const struct desc * const desc_audio_ac_processing_unit[3]; diff --git a/desc-dump.c b/desc-dump.c index eb79eaf..5c2a488 100644 --- a/desc-dump.c +++ b/desc-dump.c @@ -272,6 +272,11 @@ static void value_renderer( } break; } + case DESC_CS_STR_DESC_ID: + number_renderer(buf, size_chars, offset, current_size); + /* TODO: Add support for UAC3 class-specific String descriptor */ + printf("\n"); + break; case DESC_TERMINAL_STR: number_renderer(buf, size_chars, offset, current_size); printf(" %s\n", names_audioterminal( -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html