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

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

Issue 1145653002: Web MIDI ALSA: Enable hardware based device matching (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@magical-sound-shower
Patch Set: Update comment Created 5 years, 7 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
« no previous file with comments | « media/midi/midi_manager_alsa.h ('k') | media/midi/midi_manager_alsa_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_alsa.h" 5 #include "media/midi/midi_manager_alsa.h"
6 6
7 #include <poll.h> 7 #include <poll.h>
8 #include <stdlib.h> 8 #include <stdlib.h>
9 #include <algorithm> 9 #include <algorithm>
10 #include <string> 10 #include <string>
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 size_t i = syspath_str.rfind(kCardSyspath); 117 size_t i = syspath_str.rfind(kCardSyspath);
118 if (i == std::string::npos) 118 if (i == std::string::npos)
119 return -1; 119 return -1;
120 120
121 int number; 121 int number;
122 if (!base::StringToInt(syspath_str.substr(i + strlen(kCardSyspath)), &number)) 122 if (!base::StringToInt(syspath_str.substr(i + strlen(kCardSyspath)), &number))
123 return -1; 123 return -1;
124 return number; 124 return number;
125 } 125 }
126 126
127 std::string GetVendor(udev_device* dev) {
128 // Try to get the vendor string. Sometimes it is encoded.
129 std::string vendor = device::UdevDecodeString(
130 device::UdevDeviceGetPropertyValue(dev, kUdevIdVendorEnc));
131 // Sometimes it is not encoded.
132 if (vendor.empty())
133 vendor =
134 UdevDeviceGetPropertyOrSysattr(dev, kUdevIdVendor, kSysattrVendorName);
135 return vendor;
136 }
137
127 void SetStringIfNonEmpty(base::DictionaryValue* value, 138 void SetStringIfNonEmpty(base::DictionaryValue* value,
128 const std::string& path, 139 const std::string& path,
129 const std::string& in_value) { 140 const std::string& in_value) {
130 if (!in_value.empty()) 141 if (!in_value.empty())
131 value->SetString(path, in_value); 142 value->SetString(path, in_value);
132 } 143 }
133 144
134 } // namespace 145 } // namespace
135 146
136 MidiManagerAlsa::MidiManagerAlsa() 147 MidiManagerAlsa::MidiManagerAlsa()
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 FROM_HERE, base::Bind(&MidiManagerAlsa::SendMidiData, 302 FROM_HERE, base::Bind(&MidiManagerAlsa::SendMidiData,
292 base::Unretained(this), port_index, data), 303 base::Unretained(this), port_index, data),
293 delay); 304 delay);
294 305
295 // Acknowledge send. 306 // Acknowledge send.
296 send_thread_.message_loop()->PostTask( 307 send_thread_.message_loop()->PostTask(
297 FROM_HERE, base::Bind(&MidiManagerClient::AccumulateMidiBytesSent, 308 FROM_HERE, base::Bind(&MidiManagerClient::AccumulateMidiBytesSent,
298 base::Unretained(client), data.size())); 309 base::Unretained(client), data.size()));
299 } 310 }
300 311
312 MidiManagerAlsa::MidiPort::Id::Id() = default;
313
314 MidiManagerAlsa::MidiPort::Id::Id(const std::string& bus,
315 const std::string& vendor_id,
316 const std::string& model_id,
317 const std::string& usb_interface_num,
318 const std::string& serial)
319 : bus_(bus),
320 vendor_id_(vendor_id),
321 model_id_(model_id),
322 usb_interface_num_(usb_interface_num),
323 serial_(serial) {
324 }
325
326 MidiManagerAlsa::MidiPort::Id::Id(const Id&) = default;
327
328 MidiManagerAlsa::MidiPort::Id::~Id() = default;
329
330 bool MidiManagerAlsa::MidiPort::Id::operator==(const Id& rhs) const {
331 return (bus_ == rhs.bus_) && (vendor_id_ == rhs.vendor_id_) &&
332 (model_id_ == rhs.model_id_) &&
333 (usb_interface_num_ == rhs.usb_interface_num_) &&
334 (serial_ == rhs.serial_);
335 }
336
337 bool MidiManagerAlsa::MidiPort::Id::empty() const {
338 return bus_.empty() && vendor_id_.empty() && model_id_.empty() &&
339 usb_interface_num_.empty() && serial_.empty();
340 }
341
301 MidiManagerAlsa::MidiPort::MidiPort(const std::string& path, 342 MidiManagerAlsa::MidiPort::MidiPort(const std::string& path,
302 const std::string& id, 343 const Id& id,
303 int client_id, 344 int client_id,
304 int port_id, 345 int port_id,
305 int midi_device, 346 int midi_device,
306 const std::string& client_name, 347 const std::string& client_name,
307 const std::string& port_name, 348 const std::string& port_name,
308 const std::string& manufacturer, 349 const std::string& manufacturer,
309 const std::string& version, 350 const std::string& version,
310 Type type) 351 Type type)
311 : id_(id), 352 : id_(id),
312 midi_device_(midi_device), 353 midi_device_(midi_device),
(...skipping 19 matching lines...) Expand all
332 switch (type_) { 373 switch (type_) {
333 case Type::kInput: 374 case Type::kInput:
334 type = "input"; 375 type = "input";
335 break; 376 break;
336 case Type::kOutput: 377 case Type::kOutput:
337 type = "output"; 378 type = "output";
338 break; 379 break;
339 } 380 }
340 value->SetString("type", type); 381 value->SetString("type", type);
341 SetStringIfNonEmpty(value.get(), "path", path_); 382 SetStringIfNonEmpty(value.get(), "path", path_);
342 SetStringIfNonEmpty(value.get(), "id", id_);
343 SetStringIfNonEmpty(value.get(), "clientName", client_name_); 383 SetStringIfNonEmpty(value.get(), "clientName", client_name_);
344 SetStringIfNonEmpty(value.get(), "portName", port_name_); 384 SetStringIfNonEmpty(value.get(), "portName", port_name_);
345 value->SetInteger("clientId", client_id_); 385 value->SetInteger("clientId", client_id_);
346 value->SetInteger("portId", port_id_); 386 value->SetInteger("portId", port_id_);
347 value->SetInteger("midiDevice", midi_device_); 387 value->SetInteger("midiDevice", midi_device_);
348 388
389 // Flatten id fields.
390 SetStringIfNonEmpty(value.get(), "bus", id_.bus());
391 SetStringIfNonEmpty(value.get(), "vendorId", id_.vendor_id());
392 SetStringIfNonEmpty(value.get(), "modelId", id_.model_id());
393 SetStringIfNonEmpty(value.get(), "usbInterfaceNum", id_.usb_interface_num());
394 SetStringIfNonEmpty(value.get(), "serial", id_.serial());
395
349 return value.Pass(); 396 return value.Pass();
350 } 397 }
351 398
352 std::string MidiManagerAlsa::MidiPort::JSONValue() const { 399 std::string MidiManagerAlsa::MidiPort::JSONValue() const {
353 std::string json; 400 std::string json;
354 JSONStringValueSerializer serializer(&json); 401 JSONStringValueSerializer serializer(&json);
355 serializer.Serialize(*Value().get()); 402 serializer.Serialize(*Value().get());
356 return json; 403 return json;
357 } 404 }
358 405
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
614 int card_midi_device = -1; 661 int card_midi_device = -1;
615 for (const auto& client_pair : clients_) { 662 for (const auto& client_pair : clients_) {
616 int client_id = client_pair.first; 663 int client_id = client_pair.first;
617 const auto& client = client_pair.second; 664 const auto& client = client_pair.second;
618 665
619 // Get client metadata. 666 // Get client metadata.
620 const std::string client_name = client->name(); 667 const std::string client_name = client->name();
621 std::string manufacturer; 668 std::string manufacturer;
622 std::string driver; 669 std::string driver;
623 std::string path; 670 std::string path;
624 std::string id; 671 MidiPort::Id id;
625 std::string serial;
626 std::string card_name; 672 std::string card_name;
627 std::string card_longname; 673 std::string card_longname;
628 int midi_device = -1; 674 int midi_device = -1;
629 675
630 if (IsCardClient(client->type(), client_id)) { 676 if (IsCardClient(client->type(), client_id)) {
631 auto& card = card_it->second; 677 auto& card = card_it->second;
632 if (card_midi_device == -1) 678 if (card_midi_device == -1)
633 card_midi_device = 0; 679 card_midi_device = 0;
634 680
635 manufacturer = card->manufacturer(); 681 manufacturer = card->manufacturer();
682 path = card->path();
683 id = MidiPort::Id(card->bus(), card->vendor_id(), card->model_id(),
684 card->usb_interface_num(), card->serial());
685 card_name = card->name();
686 card_longname = card->longname();
636 midi_device = card_midi_device; 687 midi_device = card_midi_device;
637 688
638 ++card_midi_device; 689 ++card_midi_device;
639 if (card_midi_device >= card->midi_device_count()) { 690 if (card_midi_device >= card->midi_device_count()) {
640 card_midi_device = -1; 691 card_midi_device = -1;
641 ++card_it; 692 ++card_it;
642 } 693 }
643 } 694 }
644 695
645 for (const auto& port_pair : *client) { 696 for (const auto& port_pair : *client) {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
708 MidiManagerAlsa::AlsaSeqState::Client::begin() const { 759 MidiManagerAlsa::AlsaSeqState::Client::begin() const {
709 return ports_.begin(); 760 return ports_.begin();
710 } 761 }
711 762
712 MidiManagerAlsa::AlsaSeqState::Client::PortMap::const_iterator 763 MidiManagerAlsa::AlsaSeqState::Client::PortMap::const_iterator
713 MidiManagerAlsa::AlsaSeqState::Client::end() const { 764 MidiManagerAlsa::AlsaSeqState::Client::end() const {
714 return ports_.end(); 765 return ports_.end();
715 } 766 }
716 767
717 MidiManagerAlsa::AlsaCard::AlsaCard(udev_device* dev, 768 MidiManagerAlsa::AlsaCard::AlsaCard(udev_device* dev,
718 const std::string& alsa_name, 769 const std::string& name,
719 const std::string& alsa_longname, 770 const std::string& longname,
720 const std::string& alsa_driver, 771 const std::string& driver,
721 int midi_device_count) 772 int midi_device_count)
722 : alsa_name_(alsa_name), 773 : name_(name),
723 alsa_longname_(alsa_longname), 774 longname_(longname),
724 alsa_driver_(alsa_driver), 775 driver_(driver),
725 midi_device_count_(midi_device_count) { 776 path_(device::UdevDeviceGetPropertyValue(dev, kUdevIdPath)),
726 // Try to get the vendor string. Sometimes it is encoded. 777 bus_(device::UdevDeviceGetPropertyValue(dev, kUdevIdBus)),
727 std::string vendor = device::UdevDecodeString( 778 vendor_id_(
728 device::UdevDeviceGetPropertyValue(dev, kUdevIdVendorEnc)); 779 UdevDeviceGetPropertyOrSysattr(dev, kUdevIdVendorId, kSysattrVendor)),
729 // Sometimes it is not encoded. 780 model_id_(
730 if (vendor.empty()) 781 UdevDeviceGetPropertyOrSysattr(dev, kUdevIdModelId, kSysattrModel)),
731 vendor = 782 usb_interface_num_(
732 UdevDeviceGetPropertyOrSysattr(dev, kUdevIdVendor, kSysattrVendorName); 783 device::UdevDeviceGetPropertyValue(dev, kUdevIdUsbInterfaceNum)),
733 // Also get the vendor string from the hardware database. 784 serial_(UdevDeviceGetPropertyOrSysattr(dev,
734 std::string vendor_from_database = 785 kUdevIdSerialShort,
735 device::UdevDeviceGetPropertyValue(dev, kUdevIdVendorFromDatabase); 786 kSysattrGuid)),
736 787 midi_device_count_(midi_device_count),
737 // Get the device path. 788 manufacturer_(ExtractManufacturerString(
738 path_ = device::UdevDeviceGetPropertyValue(dev, kUdevIdPath); 789 GetVendor(dev),
739 // Get the bus. 790 vendor_id_,
740 bus_ = device::UdevDeviceGetPropertyValue(dev, kUdevIdBus); 791 device::UdevDeviceGetPropertyValue(dev, kUdevIdVendorFromDatabase),
741 792 name,
742 // Get the "serial" number. (Often untrustable or missing.) 793 longname)) {
743 serial_ =
744 UdevDeviceGetPropertyOrSysattr(dev, kUdevIdSerialShort, kSysattrGuid);
745
746 // Get the vendor id, by either property or sysattr.
747 vendor_id_ =
748 UdevDeviceGetPropertyOrSysattr(dev, kUdevIdVendorId, kSysattrVendor);
749 // Get the model id, by either property or sysattr.
750 model_id_ =
751 UdevDeviceGetPropertyOrSysattr(dev, kUdevIdModelId, kSysattrModel);
752 // Get the usb interface number.
753 usb_interface_num_ =
754 device::UdevDeviceGetPropertyValue(dev, kUdevIdUsbInterfaceNum);
755 manufacturer_ = ExtractManufacturerString(
756 vendor, vendor_id_, vendor_from_database, alsa_name, alsa_longname);
757 } 794 }
758 795
759 MidiManagerAlsa::AlsaCard::~AlsaCard() = default; 796 MidiManagerAlsa::AlsaCard::~AlsaCard() = default;
760 797
761 // static 798 // static
762 std::string MidiManagerAlsa::AlsaCard::ExtractManufacturerString( 799 std::string MidiManagerAlsa::AlsaCard::ExtractManufacturerString(
763 const std::string& udev_id_vendor, 800 const std::string& udev_id_vendor,
764 const std::string& udev_id_vendor_id, 801 const std::string& udev_id_vendor_id,
765 const std::string& udev_id_vendor_from_database, 802 const std::string& udev_id_vendor_from_database,
766 const std::string& alsa_name, 803 const std::string& alsa_name,
(...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after
1321 source_map_[AddrToInt(client_id, port_id)] = port_index; 1358 source_map_[AddrToInt(client_id, port_id)] = port_index;
1322 return true; 1359 return true;
1323 } 1360 }
1324 1361
1325 MidiManager* MidiManager::Create() { 1362 MidiManager* MidiManager::Create() {
1326 return new MidiManagerAlsa(); 1363 return new MidiManagerAlsa();
1327 } 1364 }
1328 1365
1329 } // namespace midi 1366 } // namespace midi
1330 } // namespace media 1367 } // namespace media
OLDNEW
« no previous file with comments | « media/midi/midi_manager_alsa.h ('k') | media/midi/midi_manager_alsa_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698