Chromium Code Reviews| 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 |