blob: 2eaa6e36b478e9142fdaf6ba9b8a00d74b14725c [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
12namespace media {
toyoshime147c5e2015-05-07 21:58:31 -070013namespace midi {
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000014
15UsbMidiInputStream::JackUniqueKey::JackUniqueKey(UsbMidiDevice* device,
16 int endpoint_number,
17 int cable_number)
18 : device(device),
19 endpoint_number(endpoint_number),
20 cable_number(cable_number) {}
21
22bool UsbMidiInputStream::JackUniqueKey::operator==(
23 const JackUniqueKey& that) const {
24 return device == that.device &&
25 endpoint_number == that.endpoint_number &&
26 cable_number == that.cable_number;
27}
28
29bool UsbMidiInputStream::JackUniqueKey::operator<(
30 const JackUniqueKey& that) const {
31 if (device != that.device)
32 return device < that.device;
33 if (endpoint_number != that.endpoint_number)
34 return endpoint_number < that.endpoint_number;
35 return cable_number < that.cable_number;
36}
37
yhirano33315c62015-02-26 17:01:15 -080038UsbMidiInputStream::UsbMidiInputStream(Delegate* delegate)
39 : delegate_(delegate) {}
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000040
41UsbMidiInputStream::~UsbMidiInputStream() {}
42
yhirano33315c62015-02-26 17:01:15 -080043void UsbMidiInputStream::Add(const UsbMidiJack& jack) {
44 JackUniqueKey key(jack.device,
45 jack.endpoint_number(),
46 jack.cable_number);
47
yhirano807f97f2015-02-26 18:44:10 -080048 jacks_.push_back(jack);
yhirano33315c62015-02-26 17:01:15 -080049 DCHECK(jack_dictionary_.end() == jack_dictionary_.find(key));
50 jack_dictionary_.insert(std::make_pair(key, jack_dictionary_.size()));
51}
52
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000053void UsbMidiInputStream::OnReceivedData(UsbMidiDevice* device,
54 int endpoint_number,
Avi Drissman3528fd02015-12-18 20:11:31 -050055 const uint8_t* data,
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000056 size_t size,
yhirano@chromium.orgcfa642c2014-05-01 08:54:41 +000057 base::TimeTicks time) {
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000058 DCHECK_EQ(0u, size % kPacketSize);
59 size_t current = 0;
60 while (current + kPacketSize <= size) {
yhirano@chromium.orgcfa642c2014-05-01 08:54:41 +000061 ProcessOnePacket(device, endpoint_number, &data[current], time);
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000062 current += kPacketSize;
63 }
64}
65
66void UsbMidiInputStream::ProcessOnePacket(UsbMidiDevice* device,
67 int endpoint_number,
Avi Drissman3528fd02015-12-18 20:11:31 -050068 const uint8_t* packet,
yhirano@chromium.orgcfa642c2014-05-01 08:54:41 +000069 base::TimeTicks time) {
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000070 // The first 4 bytes of the packet is accessible here.
Avi Drissman3528fd02015-12-18 20:11:31 -050071 uint8_t code_index = packet[0] & 0x0f;
72 uint8_t cable_number = packet[0] >> 4;
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000073 const size_t packet_size_table[16] = {
74 0, 0, 2, 3, 3, 1, 2, 3, 3, 3, 3, 3, 2, 2, 3, 1,
75 };
76 size_t packet_size = packet_size_table[code_index];
77 if (packet_size == 0) {
78 // These CINs are reserved. Ignore them.
79 DVLOG(1) << "code index number (" << code_index << ") arrives "
80 << "but it is reserved.";
81 return;
82 }
83 std::map<JackUniqueKey, size_t>::const_iterator it =
84 jack_dictionary_.find(JackUniqueKey(device,
85 endpoint_number,
86 cable_number));
87 if (it != jack_dictionary_.end())
yhirano@chromium.orgcfa642c2014-05-01 08:54:41 +000088 delegate_->OnReceivedData(it->second, &packet[1], packet_size, time);
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000089}
90
toyoshime147c5e2015-05-07 21:58:31 -070091} // namespace midi
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000092} // namespace media