Index: media/midi/midi_manager_usb.cc |
diff --git a/media/midi/midi_manager_usb.cc b/media/midi/midi_manager_usb.cc |
index cefbc1aac35c7865afb2be47f52701d7e5629f5b..bb07580f465caea2b9155d5f9f3ff1c3dcd89569 100644 |
--- a/media/midi/midi_manager_usb.cc |
+++ b/media/midi/midi_manager_usb.cc |
@@ -18,6 +18,16 @@ |
namespace media { |
+namespace { |
+ |
+int DecodeBcd(uint8 byte) { |
+ DCHECK_LT((byte & 0xf0) >> 4, 0xa); |
+ DCHECK_LT(byte & 0x0f, 0xa); |
+ return ((byte & 0xf0) >> 4) * 10 + (byte & 0x0f); |
+} |
+ |
+} // namespace |
+ |
MidiManagerUsb::MidiManagerUsb(scoped_ptr<UsbMidiDevice::Factory> factory) |
: device_factory_(factory.Pass()) { |
} |
@@ -124,7 +134,7 @@ void MidiManagerUsb::OnEnumerateDevicesDone(bool result, |
bool MidiManagerUsb::AddPorts(UsbMidiDevice* device, int device_id) { |
UsbMidiDescriptorParser parser; |
- std::vector<uint8> descriptor = device->GetDescriptor(); |
+ std::vector<uint8> descriptor = device->GetDescriptors(); |
const uint8* data = descriptor.size() > 0 ? &descriptor[0] : NULL; |
std::vector<UsbMidiJack> jacks; |
bool parse_result = parser.Parse(device, |
@@ -134,30 +144,29 @@ bool MidiManagerUsb::AddPorts(UsbMidiDevice* device, int device_id) { |
if (!parse_result) |
return false; |
+ std::string manufacturer(device->GetManufacturer()); |
+ std::string product_name(device->GetProductName()); |
+ uint16 bcd_version(device->GetDeviceVersion()); |
+ 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.
|
+ base::StringPrintf("%d.%02d", |
+ DecodeBcd(bcd_version >> 8), |
+ DecodeBcd(bcd_version & 0xff)); |
+ |
for (size_t j = 0; j < jacks.size(); ++j) { |
+ // Port ID must be unique in a MIDI manager. This ID setting is |
+ // 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.
|
+ std::string id(base::StringPrintf("port-%d-%ld", |
+ device_id, |
+ static_cast<long>(j))); |
if (jacks[j].direction() == UsbMidiJack::DIRECTION_OUT) { |
output_streams_.push_back(new UsbMidiOutputStream(jacks[j])); |
- // TODO(yhirano): Set appropriate properties. |
- // TODO(yhiran): Port ID should contain product ID / vendor ID. |
- // Port ID must be unique in a MIDI manager. This (and the below) ID |
- // setting is sufficiently unique although there is no user-friendly |
- // meaning. |
- MidiPortInfo port; |
- port.state = MIDI_PORT_OPENED; |
- port.id = base::StringPrintf("port-%d-%ld", |
- device_id, |
- static_cast<long>(j)); |
- AddOutputPort(port); |
+ AddOutputPort(MidiPortInfo( |
+ id, manufacturer, product_name, version, MIDI_PORT_OPENED)); |
} else { |
DCHECK_EQ(jacks[j].direction(), UsbMidiJack::DIRECTION_IN); |
input_stream_->Add(jacks[j]); |
- // TODO(yhirano): Set appropriate properties. |
- MidiPortInfo port; |
- port.state = MIDI_PORT_OPENED; |
- port.id = base::StringPrintf("port-%d-%ld", |
- device_id, |
- static_cast<long>(j)); |
- AddInputPort(port); |
+ AddInputPort(MidiPortInfo( |
+ id, manufacturer, product_name, version, MIDI_PORT_OPENED)); |
} |
} |
return true; |