blob: 90420977700118eddffad46f2af5ca1f28e04cac [file] [log] [blame]
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +00001// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "media/midi/usb_midi_input_stream.h"
6
7#include <string.h>
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +00008
9#include "base/logging.h"
10#include "media/midi/usb_midi_device.h"
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000011
toyoshime147c5e2015-05-07 21:58:31 -070012namespace midi {
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000013
14UsbMidiInputStream::JackUniqueKey::JackUniqueKey(UsbMidiDevice* device,
15 int endpoint_number,
16 int cable_number)
17 : device(device),
18 endpoint_number(endpoint_number),
19 cable_number(cable_number) {}
20
21bool UsbMidiInputStream::JackUniqueKey::operator==(
22 const JackUniqueKey& that) const {
23 return device == that.device &&
24 endpoint_number == that.endpoint_number &&
25 cable_number == that.cable_number;
26}
27
28bool UsbMidiInputStream::JackUniqueKey::operator<(
29 const JackUniqueKey& that) const {
30 if (device != that.device)
31 return device < that.device;
32 if (endpoint_number != that.endpoint_number)
33 return endpoint_number < that.endpoint_number;
34 return cable_number < that.cable_number;
35}
36
yhirano33315c62015-02-26 17:01:15 -080037UsbMidiInputStream::UsbMidiInputStream(Delegate* delegate)
38 : delegate_(delegate) {}
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000039
Chris Watkinsc6cbcf62017-12-01 03:08:01 +000040UsbMidiInputStream::~UsbMidiInputStream() = default;
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000041
yhirano33315c62015-02-26 17:01:15 -080042void UsbMidiInputStream::Add(const UsbMidiJack& jack) {
43 JackUniqueKey key(jack.device,
44 jack.endpoint_number(),
45 jack.cable_number);
46
yhirano807f97f2015-02-26 18:44:10 -080047 jacks_.push_back(jack);
yhirano33315c62015-02-26 17:01:15 -080048 DCHECK(jack_dictionary_.end() == jack_dictionary_.find(key));
49 jack_dictionary_.insert(std::make_pair(key, jack_dictionary_.size()));
50}
51
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000052void UsbMidiInputStream::OnReceivedData(UsbMidiDevice* device,
53 int endpoint_number,
Avi Drissman3528fd02015-12-18 20:11:31 -050054 const uint8_t* data,
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000055 size_t size,
yhirano@chromium.orgcfa642c2014-05-01 08:54:41 +000056 base::TimeTicks time) {
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000057 DCHECK_EQ(0u, size % kPacketSize);
58 size_t current = 0;
59 while (current + kPacketSize <= size) {
yhirano@chromium.orgcfa642c2014-05-01 08:54:41 +000060 ProcessOnePacket(device, endpoint_number, &data[current], time);
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000061 current += kPacketSize;
62 }
63}
64
65void UsbMidiInputStream::ProcessOnePacket(UsbMidiDevice* device,
66 int endpoint_number,
Avi Drissman3528fd02015-12-18 20:11:31 -050067 const uint8_t* packet,
yhirano@chromium.orgcfa642c2014-05-01 08:54:41 +000068 base::TimeTicks time) {
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000069 // The first 4 bytes of the packet is accessible here.
Avi Drissman3528fd02015-12-18 20:11:31 -050070 uint8_t code_index = packet[0] & 0x0f;
71 uint8_t cable_number = packet[0] >> 4;
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000072 const size_t packet_size_table[16] = {
73 0, 0, 2, 3, 3, 1, 2, 3, 3, 3, 3, 3, 2, 2, 3, 1,
74 };
75 size_t packet_size = packet_size_table[code_index];
76 if (packet_size == 0) {
77 // These CINs are reserved. Ignore them.
78 DVLOG(1) << "code index number (" << code_index << ") arrives "
79 << "but it is reserved.";
80 return;
81 }
82 std::map<JackUniqueKey, size_t>::const_iterator it =
83 jack_dictionary_.find(JackUniqueKey(device,
84 endpoint_number,
85 cable_number));
86 if (it != jack_dictionary_.end())
yhirano@chromium.orgcfa642c2014-05-01 08:54:41 +000087 delegate_->OnReceivedData(it->second, &packet[1], packet_size, time);
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000088}
89
toyoshime147c5e2015-05-07 21:58:31 -070090} // namespace midi