OLD | NEW |
---|---|
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 Loading... | |
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 |
OLD | NEW |