Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(136)

Side by Side Diff: media/midi/midi_manager_usb.cc

Issue 1098913003: [WebMIDI] [Android] Set appropriate port properties. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/midi/midi_manager_usb.h" 5 #include "media/midi/midi_manager_usb.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
11 #include "base/strings/stringprintf.h" 11 #include "base/strings/stringprintf.h"
12 #include "media/midi/midi_scheduler.h" 12 #include "media/midi/midi_scheduler.h"
13 #include "media/midi/usb_midi_descriptor_parser.h" 13 #include "media/midi/usb_midi_descriptor_parser.h"
14 #include "media/midi/usb_midi_device.h" 14 #include "media/midi/usb_midi_device.h"
15 #include "media/midi/usb_midi_input_stream.h" 15 #include "media/midi/usb_midi_input_stream.h"
16 #include "media/midi/usb_midi_jack.h" 16 #include "media/midi/usb_midi_jack.h"
17 #include "media/midi/usb_midi_output_stream.h" 17 #include "media/midi/usb_midi_output_stream.h"
18 18
19 namespace media { 19 namespace media {
20 20
21 namespace {
22
23 int DecodeBcd(uint8 byte) {
24 DCHECK_LT((byte & 0xf0) >> 4, 0xa);
25 DCHECK_LT(byte & 0x0f, 0xa);
26 return ((byte & 0xf0) >> 4) * 10 + (byte & 0x0f);
27 }
28
29 } // namespace
30
21 MidiManagerUsb::MidiManagerUsb(scoped_ptr<UsbMidiDevice::Factory> factory) 31 MidiManagerUsb::MidiManagerUsb(scoped_ptr<UsbMidiDevice::Factory> factory)
22 : device_factory_(factory.Pass()) { 32 : device_factory_(factory.Pass()) {
23 } 33 }
24 34
25 MidiManagerUsb::~MidiManagerUsb() { 35 MidiManagerUsb::~MidiManagerUsb() {
26 } 36 }
27 37
28 void MidiManagerUsb::StartInitialization() { 38 void MidiManagerUsb::StartInitialization() {
29 Initialize( 39 Initialize(
30 base::Bind(&MidiManager::CompleteInitialization, base::Unretained(this))); 40 base::Bind(&MidiManager::CompleteInitialization, base::Unretained(this)));
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 if (!AddPorts(devices_[i], i)) { 127 if (!AddPorts(devices_[i], i)) {
118 initialize_callback_.Run(MIDI_INITIALIZATION_ERROR); 128 initialize_callback_.Run(MIDI_INITIALIZATION_ERROR);
119 return; 129 return;
120 } 130 }
121 } 131 }
122 initialize_callback_.Run(MIDI_OK); 132 initialize_callback_.Run(MIDI_OK);
123 } 133 }
124 134
125 bool MidiManagerUsb::AddPorts(UsbMidiDevice* device, int device_id) { 135 bool MidiManagerUsb::AddPorts(UsbMidiDevice* device, int device_id) {
126 UsbMidiDescriptorParser parser; 136 UsbMidiDescriptorParser parser;
127 std::vector<uint8> descriptor = device->GetDescriptor(); 137 std::vector<uint8> descriptor = device->GetDescriptors();
128 const uint8* data = descriptor.size() > 0 ? &descriptor[0] : NULL; 138 const uint8* data = descriptor.size() > 0 ? &descriptor[0] : NULL;
129 std::vector<UsbMidiJack> jacks; 139 std::vector<UsbMidiJack> jacks;
130 bool parse_result = parser.Parse(device, 140 bool parse_result = parser.Parse(device,
131 data, 141 data,
132 descriptor.size(), 142 descriptor.size(),
133 &jacks); 143 &jacks);
134 if (!parse_result) 144 if (!parse_result)
135 return false; 145 return false;
136 146
147 std::string manufacturer(device->GetManufacturer());
148 std::string product_name(device->GetProductName());
149 uint16 bcd_version(device->GetDeviceVersion());
150 std::string version =
Takashi Toyoshima 2015/04/22 05:25:13 Can you add a comment as the endian is converted i
yhirano 2015/04/22 06:11:09 Done.
151 base::StringPrintf("%d.%02d",
152 DecodeBcd(bcd_version >> 8),
153 DecodeBcd(bcd_version & 0xff));
154
137 for (size_t j = 0; j < jacks.size(); ++j) { 155 for (size_t j = 0; j < jacks.size(); ++j) {
156 // Port ID must be unique in a MIDI manager. This ID setting is
157 // sufficiently unique although there is no user-friendly meaning.
Takashi Toyoshima 2015/04/22 05:25:13 Can we use SHA256 from crypto/sha2.h to hash this
yhirano 2015/04/22 06:11:08 Should I care about hash collision?
Takashi Toyoshima 2015/04/22 06:52:27 I think we can safely ignore it. Also, it would be
yhirano 2015/04/22 08:07:42 Added TODO.
158 std::string id(base::StringPrintf("port-%d-%ld",
159 device_id,
160 static_cast<long>(j)));
138 if (jacks[j].direction() == UsbMidiJack::DIRECTION_OUT) { 161 if (jacks[j].direction() == UsbMidiJack::DIRECTION_OUT) {
139 output_streams_.push_back(new UsbMidiOutputStream(jacks[j])); 162 output_streams_.push_back(new UsbMidiOutputStream(jacks[j]));
140 // TODO(yhirano): Set appropriate properties. 163 AddOutputPort(MidiPortInfo(
141 // TODO(yhiran): Port ID should contain product ID / vendor ID. 164 id, manufacturer, product_name, version, MIDI_PORT_OPENED));
142 // Port ID must be unique in a MIDI manager. This (and the below) ID
143 // setting is sufficiently unique although there is no user-friendly
144 // meaning.
145 MidiPortInfo port;
146 port.state = MIDI_PORT_OPENED;
147 port.id = base::StringPrintf("port-%d-%ld",
148 device_id,
149 static_cast<long>(j));
150 AddOutputPort(port);
151 } else { 165 } else {
152 DCHECK_EQ(jacks[j].direction(), UsbMidiJack::DIRECTION_IN); 166 DCHECK_EQ(jacks[j].direction(), UsbMidiJack::DIRECTION_IN);
153 input_stream_->Add(jacks[j]); 167 input_stream_->Add(jacks[j]);
154 // TODO(yhirano): Set appropriate properties. 168 AddInputPort(MidiPortInfo(
155 MidiPortInfo port; 169 id, manufacturer, product_name, version, MIDI_PORT_OPENED));
156 port.state = MIDI_PORT_OPENED;
157 port.id = base::StringPrintf("port-%d-%ld",
158 device_id,
159 static_cast<long>(j));
160 AddInputPort(port);
161 } 170 }
162 } 171 }
163 return true; 172 return true;
164 } 173 }
165 174
166 } // namespace media 175 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698