---
 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to