aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-usb-audio.c
diff options
context:
space:
mode:
authorAlexis La Goutte <alexis.lagoutte@gmail.com>2016-04-26 08:08:51 +0200
committerMichael Mann <mmann78@netscape.net>2016-04-27 00:40:39 +0000
commit657c54a993adfa865c2f7f86e49b159f2de56c36 (patch)
tree7f4f557da4ecb3d5a249dac1546071962ca30ded /epan/dissectors/packet-usb-audio.c
parent37df3400dc13ccc2447514d5c060c635d1a85ae8 (diff)
USB Audio: Add feature Unit
Change-Id: Id23d1c945df3c0b7392b5c807ef04c85309999de Ping-Bug: 11858 Reviewed-on: https://code.wireshark.org/review/15118 Petri-Dish: Jaap Keuter <jaap.keuter@xs4all.nl> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com> Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan/dissectors/packet-usb-audio.c')
-rw-r--r--epan/dissectors/packet-usb-audio.c135
1 files changed, 134 insertions, 1 deletions
diff --git a/epan/dissectors/packet-usb-audio.c b/epan/dissectors/packet-usb-audio.c
index 98524ef34f..90c8e74aa3 100644
--- a/epan/dissectors/packet-usb-audio.c
+++ b/epan/dissectors/packet-usb-audio.c
@@ -58,6 +58,23 @@ static int hf_ac_if_output_terminaltype = -1;
static int hf_ac_if_output_assocterminal = -1;
static int hf_ac_if_output_sourceid = -1;
static int hf_ac_if_output_terminal = -1;
+static int hf_ac_if_fu_unitid = -1;
+static int hf_ac_if_fu_sourceid = -1;
+static int hf_ac_if_fu_controlsize = -1;
+static int hf_ac_if_fu_controls = -1;
+static int hf_ac_if_fu_control = -1;
+static int hf_ac_if_fu_controls_d0 = -1;
+static int hf_ac_if_fu_controls_d1 = -1;
+static int hf_ac_if_fu_controls_d2 = -1;
+static int hf_ac_if_fu_controls_d3 = -1;
+static int hf_ac_if_fu_controls_d4 = -1;
+static int hf_ac_if_fu_controls_d5 = -1;
+static int hf_ac_if_fu_controls_d6 = -1;
+static int hf_ac_if_fu_controls_d7 = -1;
+static int hf_ac_if_fu_controls_d8 = -1;
+static int hf_ac_if_fu_controls_d9 = -1;
+static int hf_ac_if_fu_controls_rsv = -1;
+static int hf_ac_if_fu_ifeature = -1;
static int hf_as_if_desc_subtype = -1;
static int hf_as_if_gen_term_id = -1;
static int hf_as_if_gen_delay = -1;
@@ -79,6 +96,10 @@ static reassembly_table midi_data_reassembly_table;
static gint ett_usb_audio = -1;
static gint ett_usb_audio_desc = -1;
+static gint ett_ac_if_fu_controls = -1;
+static gint ett_ac_if_fu_controls0 = -1;
+static gint ett_ac_if_fu_controls1 = -1;
+
static dissector_handle_t sysex_handle;
#define AUDIO_IF_SUBCLASS_UNDEFINED 0x00
@@ -498,6 +519,61 @@ dissect_ac_if_output_terminal(tvbuff_t *tvb, gint offset, packet_info *pinfo _U_
}
static gint
+dissect_ac_if_feature_unit(tvbuff_t *tvb, gint offset, packet_info *pinfo _U_,
+ proto_tree *tree, usb_conv_info_t *usb_conv_info _U_)
+{
+ gint offset_start;
+ guint8 controlsize;
+ proto_tree *bitmap_tree;
+ proto_item *ti;
+
+ static const int *fu_controls0[] = {
+ &hf_ac_if_fu_controls_d0,
+ &hf_ac_if_fu_controls_d1,
+ &hf_ac_if_fu_controls_d2,
+ &hf_ac_if_fu_controls_d3,
+ &hf_ac_if_fu_controls_d4,
+ &hf_ac_if_fu_controls_d5,
+ &hf_ac_if_fu_controls_d6,
+ &hf_ac_if_fu_controls_d7,
+ NULL };
+
+ static const int *fu_controls1[] = {
+ &hf_ac_if_fu_controls_d8,
+ &hf_ac_if_fu_controls_d9,
+ &hf_ac_if_fu_controls_rsv,
+ NULL };
+
+ offset_start = offset;
+
+ proto_tree_add_item(tree, hf_ac_if_fu_unitid, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ proto_tree_add_item(tree, hf_ac_if_fu_sourceid, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ proto_tree_add_item(tree, hf_ac_if_fu_controlsize, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ controlsize = tvb_get_guint8(tvb, offset) + 1;
+ offset += 1;
+
+ ti = proto_tree_add_item(tree, hf_ac_if_fu_controls, tvb, offset, controlsize, ENC_NA);
+ bitmap_tree = proto_item_add_subtree(ti, ett_ac_if_fu_controls);
+
+ proto_tree_add_bitmask(bitmap_tree, tvb, offset, hf_ac_if_fu_control, ett_ac_if_fu_controls0, fu_controls0, ENC_LITTLE_ENDIAN);
+
+ if(controlsize >= 1){
+ proto_tree_add_bitmask(bitmap_tree, tvb, offset + 1, hf_ac_if_fu_control, ett_ac_if_fu_controls1, fu_controls1, ENC_LITTLE_ENDIAN);
+ }
+
+ offset += controlsize;
+
+ proto_tree_add_item(tree, hf_ac_if_fu_ifeature, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ return offset-offset_start;
+}
+
+static gint
dissect_as_if_general_body(tvbuff_t *tvb, gint offset, packet_info *pinfo _U_,
proto_tree *tree, usb_conv_info_t *usb_conv_info)
{
@@ -659,6 +735,9 @@ dissect_usb_audio_descriptor(tvbuff_t *tvb, packet_info *pinfo,
case AC_SUBTYPE_OUTPUT_TERMINAL:
dissect_ac_if_output_terminal(tvb, offset, pinfo, desc_tree, usb_conv_info);
break;
+ case AC_SUBTYPE_FEATURE_UNIT:
+ dissect_ac_if_feature_unit(tvb, offset, pinfo, desc_tree, usb_conv_info);
+ break;
default:
proto_tree_add_expert(desc_tree, pinfo, &ei_usb_audio_undecoded, tvb, offset-3, desc_len);
break;
@@ -839,6 +918,57 @@ proto_register_usb_audio(void)
{ &hf_ac_if_output_terminal,
{ "Terminal", "usbaudio.ac_if_output.iTerminal",
FT_UINT8, BASE_DEC, NULL, 0x00, "iTerminal", HFILL }},
+ { &hf_ac_if_fu_unitid,
+ { "Unit ID", "usbaudio.ac_if_fu.bUnitID",
+ FT_UINT8, BASE_DEC, NULL, 0x00, "bUnitID", HFILL }},
+ { &hf_ac_if_fu_sourceid,
+ { "Source ID", "usbaudio.ac_if_fu.bSourceID",
+ FT_UINT8, BASE_DEC, NULL, 0x00, "bSourceID", HFILL }},
+ { &hf_ac_if_fu_controlsize,
+ { "Control Size", "usbaudio.ac_if_fu.bControlSize",
+ FT_UINT8, BASE_DEC, NULL, 0x00, "bControlSize", HFILL }},
+ { &hf_ac_if_fu_controls,
+ { "Controls", "usbaudio.ac_if_fu.bmaControls",
+ FT_BYTES, BASE_NONE, NULL, 0x00, "bmaControls", HFILL }},
+ { &hf_ac_if_fu_control,
+ { "Control", "usbaudio.ac_if_fu.bmaControl",
+ FT_UINT8, BASE_HEX, NULL, 0x00, "bmaControls", HFILL }},
+ { &hf_ac_if_fu_controls_d0,
+ { "Mute", "usbaudio.ac_if_fu.bmaControls.d0",
+ FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
+ { &hf_ac_if_fu_controls_d1,
+ { "Volume", "usbaudio.ac_if_fu.bmaControls.d1",
+ FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
+ { &hf_ac_if_fu_controls_d2,
+ { "Bass", "usbaudio.ac_if_fu.bmaControls.d2",
+ FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
+ { &hf_ac_if_fu_controls_d3,
+ { "Mid", "usbaudio.ac_if_fu.bmaControls.d3",
+ FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
+ { &hf_ac_if_fu_controls_d4,
+ { "Treble", "usbaudio.ac_if_fu.bmaControls.d4",
+ FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
+ { &hf_ac_if_fu_controls_d5,
+ { "Graphic Equalizer", "usbaudio.ac_if_fu.bmaControls.d5",
+ FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
+ { &hf_ac_if_fu_controls_d6,
+ { "Automatic Gain", "usbaudio.ac_if_fu.bmaControls.d6",
+ FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
+ { &hf_ac_if_fu_controls_d7,
+ { "Delay", "usbaudio.ac_if_fu.bmaControls.d7",
+ FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
+ { &hf_ac_if_fu_controls_d8,
+ { "Bass Boost", "usbaudio.ac_if_fu.bmaControls.d8",
+ FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
+ { &hf_ac_if_fu_controls_d9,
+ { "Loudness", "usbaudio.ac_if_fu.bmaControls.d9",
+ FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
+ { &hf_ac_if_fu_controls_rsv,
+ { "Reserved", "usbaudio.ac_if_fu.bmaControls.rsv",
+ FT_UINT8, BASE_HEX, NULL, 0xFC, "Must be zero", HFILL }},
+ { &hf_ac_if_fu_ifeature,
+ { "Feature", "usbaudio.ac_if_fu.iFeature",
+ FT_UINT8, BASE_DEC, NULL, 0x00, "iFeature", HFILL }},
{ &hf_as_if_desc_subtype,
{ "Subtype", "usbaudio.as_if_subtype", FT_UINT8, BASE_HEX|BASE_EXT_STRING,
&as_subtype_vals_ext, 0x00, "bDescriptorSubtype", HFILL }},
@@ -926,7 +1056,10 @@ proto_register_usb_audio(void)
&ett_usb_audio,
&ett_usb_audio_desc,
&ett_sysex_msg_fragment,
- &ett_sysex_msg_fragments
+ &ett_sysex_msg_fragments,
+ &ett_ac_if_fu_controls,
+ &ett_ac_if_fu_controls0,
+ &ett_ac_if_fu_controls1
};
static ei_register_info ei[] = {