diff options
author | Tomasz Moń <desowin@gmail.com> | 2019-05-05 11:03:05 +0200 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2019-05-07 15:32:11 +0000 |
commit | a90cc3309c750bf0de8a3a592609c5d52869fb10 (patch) | |
tree | c0bb781a42342e07c472da075405763f3c4d78e7 | |
parent | eb5f88c676294a82803293dfeb3d1e1987902a0e (diff) |
USB Audio: Separate MIDI event data from padding
Add SysEx reassembled message information under the "USB Midi Event
Packet" not under the "USB Audio".
Ping-Bug: 15503
Change-Id: I2c9367b1dcce0026964e1b9cdeb2af3875b5e882
Reviewed-on: https://code.wireshark.org/review/33085
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Anders Broman <a.broman58@gmail.com>
-rw-r--r-- | epan/dissectors/packet-usb-audio.c | 58 |
1 files changed, 53 insertions, 5 deletions
diff --git a/epan/dissectors/packet-usb-audio.c b/epan/dissectors/packet-usb-audio.c index 1469dc844e..e493efa06f 100644 --- a/epan/dissectors/packet-usb-audio.c +++ b/epan/dissectors/packet-usb-audio.c @@ -29,6 +29,7 @@ static int proto_usb_audio = -1; static int hf_midi_cable_number = -1; static int hf_midi_code_index = -1; static int hf_midi_event = -1; +static int hf_midi_padding = -1; static int hf_ac_if_desc_subtype = -1; static int hf_ac_if_hdr_ver = -1; static int hf_ac_if_hdr_total_len = -1; @@ -586,6 +587,38 @@ static const fragment_items sysex_msg_frag_items = { "Message fragments" }; +static gint +get_midi_event_size(guint8 code) +{ + switch (code) + { + case 0x0: /* Miscellaneous function codes. Reserved for future extensions. */ + case 0x1: /* Cable events. Reserved for future expansion. */ + /* The Event size can be 1, 2 or 3 bytes. Assume 3. */ + return 3; + case 0x5: /* Single-byte System Common Message or SysEx ends with following single byte. */ + case 0xF: /* Single Byte */ + return 1; + case 0x2: /* 2 Two-byte System Common messages like MTC, SongSelect, etc. */ + case 0x6: /* SysEx ends with following two bytes. */ + case 0xC: /* Program Change */ + case 0xD: /* Channel Pressure */ + return 2; + case 0x3: /* Three-byte System Common messages like SPP, etc. */ + case 0x4: /* SysEx starts or continues */ + case 0x7: /* SysEx ends with following three bytes. */ + case 0x8: /* Note-off */ + case 0x9: /* Note-on */ + case 0xA: /* Poly-KeyPress */ + case 0xB: /* Control Change */ + case 0xE: /* PitchBend Change */ + return 3; + default: + /* Invalid Code Index Number */ + return 0; + } +} + static inline gboolean is_sysex_code(guint8 code) { @@ -626,8 +659,6 @@ dissect_usb_midi_event(tvbuff_t *tvb, packet_info *pinfo, gboolean save_fragmented; proto_tree *tree = NULL; - col_set_str(pinfo->cinfo, COL_INFO, "USB-MIDI Event Packets"); - code = tvb_get_guint8(tvb, offset); cable = (code & 0xF0) >> 4; code &= 0x0F; @@ -635,12 +666,26 @@ dissect_usb_midi_event(tvbuff_t *tvb, packet_info *pinfo, if (parent_tree) { proto_item *ti; + gint event_size, padding_size; ti = proto_tree_add_protocol_format(usb_audio_tree, proto_usb_audio, tvb, offset, 4, "USB Midi Event Packet"); tree = proto_item_add_subtree(ti, ett_usb_audio); proto_tree_add_item(tree, hf_midi_cable_number, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_midi_code_index, tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_midi_event, tvb, offset+1, 3, ENC_BIG_ENDIAN); + + event_size = get_midi_event_size(code); + padding_size = 3 - event_size; + if (event_size > 0) + { + /* TODO: Create MIDI dissector and pass the event data to it */ + const gchar *event_data = tvb_get_ptr(tvb, offset+1, event_size); + proto_tree_add_bytes(tree, hf_midi_event, tvb, offset+1, event_size, event_data); + } + if (padding_size > 0) + { + const gchar *padding = tvb_get_ptr(tvb, offset+1+event_size, padding_size); + proto_tree_add_bytes(tree, hf_midi_padding, tvb, offset+1+event_size, padding_size, padding); + } } save_fragmented = pinfo->fragmented; @@ -678,7 +723,7 @@ dissect_usb_midi_event(tvbuff_t *tvb, packet_info *pinfo, { new_tvb = process_reassembled_data(tvb, offset+1, pinfo, "Reassembled Message", frag_sysex_msg, &sysex_msg_frag_items, - NULL, usb_audio_tree); + NULL, tree); if (code != 0x04) { /* Reassembled */ col_append_str(pinfo->cinfo, COL_INFO, @@ -1606,8 +1651,11 @@ proto_register_usb_audio(void) { "Code Index", "usbaudio.midi.code_index", FT_UINT8, BASE_HEX, VALS(code_index_vals), 0x0F, NULL, HFILL }}, { &hf_midi_event, - { "MIDI Event", "usbaudio.midi.event", FT_UINT24, BASE_HEX, + { "MIDI Event", "usbaudio.midi.event", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }}, + { &hf_midi_padding, + { "Padding", "usbaudio.midi.padding", FT_BYTES, BASE_NONE, + NULL, 0, "Must be zero", HFILL }}, { &hf_ac_if_desc_subtype, { "Subtype", "usbaudio.ac_if_subtype", FT_UINT8, BASE_HEX|BASE_EXT_STRING, |