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_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 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 void SetStringIfNonEmpty(base::DictionaryValue* value, | 138 void SetStringIfNonEmpty(base::DictionaryValue* value, |
139 const std::string& path, | 139 const std::string& path, |
140 const std::string& in_value) { | 140 const std::string& in_value) { |
141 if (!in_value.empty()) | 141 if (!in_value.empty()) |
142 value->SetString(path, in_value); | 142 value->SetString(path, in_value); |
143 } | 143 } |
144 | 144 |
145 } // namespace | 145 } // namespace |
146 | 146 |
147 MidiManagerAlsa::MidiManagerAlsa() | 147 MidiManagerAlsa::MidiManagerAlsa() |
148 : alsa_cards_deleter_(&alsa_cards_), | 148 : udev_(device::udev_new()), |
149 udev_(device::udev_new()), | |
150 send_thread_("MidiSendThread"), | 149 send_thread_("MidiSendThread"), |
151 event_thread_("MidiEventThread") { | 150 event_thread_("MidiEventThread") { |
152 // Initialize decoder. | 151 // Initialize decoder. |
153 snd_midi_event_t* decoder; | 152 snd_midi_event_t* decoder; |
154 snd_midi_event_new(0, &decoder); | 153 snd_midi_event_new(0, &decoder); |
155 decoder_.reset(decoder); | 154 decoder_.reset(decoder); |
156 snd_midi_event_no_status(decoder_.get(), 1); | 155 snd_midi_event_no_status(decoder_.get(), 1); |
157 } | 156 } |
158 | 157 |
159 MidiManagerAlsa::~MidiManagerAlsa() { | 158 MidiManagerAlsa::~MidiManagerAlsa() { |
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
580 break; | 579 break; |
581 case MidiPort::Type::kOutput: | 580 case MidiPort::Type::kOutput: |
582 web_port_index = num_output_ports_++; | 581 web_port_index = num_output_ports_++; |
583 break; | 582 break; |
584 } | 583 } |
585 port->set_web_port_index(web_port_index); | 584 port->set_web_port_index(web_port_index); |
586 ports().push_back(port.release()); | 585 ports().push_back(port.release()); |
587 return web_port_index; | 586 return web_port_index; |
588 } | 587 } |
589 | 588 |
590 MidiManagerAlsa::AlsaSeqState::AlsaSeqState() | 589 MidiManagerAlsa::AlsaSeqState::AlsaSeqState() : card_client_count_(0) { |
591 : clients_deleter_(&clients_), card_client_count_(0) { | |
592 } | 590 } |
593 | 591 |
594 MidiManagerAlsa::AlsaSeqState::~AlsaSeqState() = default; | 592 MidiManagerAlsa::AlsaSeqState::~AlsaSeqState() = default; |
595 | 593 |
596 void MidiManagerAlsa::AlsaSeqState::ClientStart(int client_id, | 594 void MidiManagerAlsa::AlsaSeqState::ClientStart(int client_id, |
597 const std::string& client_name, | 595 const std::string& client_name, |
598 snd_seq_client_type_t type) { | 596 snd_seq_client_type_t type) { |
599 ClientExit(client_id); | 597 ClientExit(client_id); |
600 clients_[client_id] = new Client(client_name, type); | 598 clients_.insert(client_id, make_scoped_ptr(new Client(client_name, type))); |
601 if (IsCardClient(type, client_id)) | 599 if (IsCardClient(type, client_id)) |
602 ++card_client_count_; | 600 ++card_client_count_; |
603 } | 601 } |
604 | 602 |
605 bool MidiManagerAlsa::AlsaSeqState::ClientStarted(int client_id) { | 603 bool MidiManagerAlsa::AlsaSeqState::ClientStarted(int client_id) { |
606 return clients_.find(client_id) != clients_.end(); | 604 return clients_.find(client_id) != clients_.end(); |
607 } | 605 } |
608 | 606 |
609 void MidiManagerAlsa::AlsaSeqState::ClientExit(int client_id) { | 607 void MidiManagerAlsa::AlsaSeqState::ClientExit(int client_id) { |
610 auto it = clients_.find(client_id); | 608 auto it = clients_.find(client_id); |
611 if (it != clients_.end()) { | 609 if (it != clients_.end()) { |
612 if (IsCardClient(it->second->type(), client_id)) | 610 if (IsCardClient(it->second->type(), client_id)) |
613 --card_client_count_; | 611 --card_client_count_; |
614 delete it->second; | |
615 clients_.erase(it); | 612 clients_.erase(it); |
616 } | 613 } |
617 } | 614 } |
618 | 615 |
619 void MidiManagerAlsa::AlsaSeqState::PortStart( | 616 void MidiManagerAlsa::AlsaSeqState::PortStart( |
620 int client_id, | 617 int client_id, |
621 int port_id, | 618 int port_id, |
622 const std::string& port_name, | 619 const std::string& port_name, |
623 MidiManagerAlsa::AlsaSeqState::PortDirection direction, | 620 MidiManagerAlsa::AlsaSeqState::PortDirection direction, |
624 bool midi) { | 621 bool midi) { |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
721 const std::string& name, | 718 const std::string& name, |
722 MidiManagerAlsa::AlsaSeqState::PortDirection direction, | 719 MidiManagerAlsa::AlsaSeqState::PortDirection direction, |
723 bool midi) | 720 bool midi) |
724 : name_(name), direction_(direction), midi_(midi) { | 721 : name_(name), direction_(direction), midi_(midi) { |
725 } | 722 } |
726 | 723 |
727 MidiManagerAlsa::AlsaSeqState::Port::~Port() = default; | 724 MidiManagerAlsa::AlsaSeqState::Port::~Port() = default; |
728 | 725 |
729 MidiManagerAlsa::AlsaSeqState::Client::Client(const std::string& name, | 726 MidiManagerAlsa::AlsaSeqState::Client::Client(const std::string& name, |
730 snd_seq_client_type_t type) | 727 snd_seq_client_type_t type) |
731 : name_(name), type_(type), ports_deleter_(&ports_) { | 728 : name_(name), type_(type) { |
732 } | 729 } |
733 | 730 |
734 MidiManagerAlsa::AlsaSeqState::Client::~Client() = default; | 731 MidiManagerAlsa::AlsaSeqState::Client::~Client() = default; |
735 | 732 |
736 void MidiManagerAlsa::AlsaSeqState::Client::AddPort(int addr, | 733 void MidiManagerAlsa::AlsaSeqState::Client::AddPort(int addr, |
737 scoped_ptr<Port> port) { | 734 scoped_ptr<Port> port) { |
738 RemovePort(addr); | 735 ports_.set(addr, port.Pass()); |
739 ports_[addr] = port.release(); | |
740 } | 736 } |
741 | 737 |
742 void MidiManagerAlsa::AlsaSeqState::Client::RemovePort(int addr) { | 738 void MidiManagerAlsa::AlsaSeqState::Client::RemovePort(int addr) { |
743 auto it = ports_.find(addr); | 739 ports_.erase(addr); |
744 if (it != ports_.end()) { | |
745 delete it->second; | |
746 ports_.erase(it); | |
747 } | |
748 } | 740 } |
749 | 741 |
750 MidiManagerAlsa::AlsaSeqState::Client::PortMap::const_iterator | 742 MidiManagerAlsa::AlsaSeqState::Client::PortMap::const_iterator |
751 MidiManagerAlsa::AlsaSeqState::Client::begin() const { | 743 MidiManagerAlsa::AlsaSeqState::Client::begin() const { |
752 return ports_.begin(); | 744 return ports_.begin(); |
753 } | 745 } |
754 | 746 |
755 MidiManagerAlsa::AlsaSeqState::Client::PortMap::const_iterator | 747 MidiManagerAlsa::AlsaSeqState::Client::PortMap::const_iterator |
756 MidiManagerAlsa::AlsaSeqState::Client::end() const { | 748 MidiManagerAlsa::AlsaSeqState::Client::end() const { |
757 return ports_.end(); | 749 return ports_.end(); |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1122 VLOG(1) << "snd_ctl_hwdep_info fails: " << snd_strerror(err); | 1114 VLOG(1) << "snd_ctl_hwdep_info fails: " << snd_strerror(err); |
1123 continue; | 1115 continue; |
1124 } | 1116 } |
1125 snd_hwdep_iface_t iface = snd_hwdep_info_get_iface(hwdep); | 1117 snd_hwdep_iface_t iface = snd_hwdep_info_get_iface(hwdep); |
1126 if (iface == SND_HWDEP_IFACE_OPL2 || iface == SND_HWDEP_IFACE_OPL3 || | 1118 if (iface == SND_HWDEP_IFACE_OPL2 || iface == SND_HWDEP_IFACE_OPL3 || |
1127 iface == SND_HWDEP_IFACE_OPL4) | 1119 iface == SND_HWDEP_IFACE_OPL4) |
1128 ++midi_count; | 1120 ++midi_count; |
1129 } | 1121 } |
1130 snd_ctl_close(handle); | 1122 snd_ctl_close(handle); |
1131 | 1123 |
1132 if (midi_count > 0) | 1124 if (midi_count > 0) { |
1133 alsa_cards_[number] = new AlsaCard(dev, name, longname, driver, midi_count); | 1125 scoped_ptr<AlsaCard> card( |
1134 alsa_card_midi_count_ += midi_count; | 1126 new AlsaCard(dev, name, longname, driver, midi_count)); |
| 1127 alsa_cards_.insert(number, card.Pass()); |
| 1128 alsa_card_midi_count_ += midi_count; |
| 1129 } |
1135 } | 1130 } |
1136 | 1131 |
1137 void MidiManagerAlsa::RemoveCard(int number) { | 1132 void MidiManagerAlsa::RemoveCard(int number) { |
1138 auto it = alsa_cards_.find(number); | 1133 auto it = alsa_cards_.find(number); |
1139 if (it == alsa_cards_.end()) | 1134 if (it == alsa_cards_.end()) |
1140 return; | 1135 return; |
1141 | 1136 |
1142 alsa_card_midi_count_ -= it->second->midi_device_count(); | 1137 alsa_card_midi_count_ -= it->second->midi_device_count(); |
1143 delete it->second; | |
1144 alsa_cards_.erase(it); | 1138 alsa_cards_.erase(it); |
1145 } | 1139 } |
1146 | 1140 |
1147 void MidiManagerAlsa::UpdatePortStateAndGenerateEvents() { | 1141 void MidiManagerAlsa::UpdatePortStateAndGenerateEvents() { |
1148 // Verify that our information from ALSA and udev are in sync. If | 1142 // Verify that our information from ALSA and udev are in sync. If |
1149 // not, we cannot generate events right now. | 1143 // not, we cannot generate events right now. |
1150 if (alsa_card_midi_count_ != alsa_seq_state_.card_client_count()) | 1144 if (alsa_card_midi_count_ != alsa_seq_state_.card_client_count()) |
1151 return; | 1145 return; |
1152 | 1146 |
1153 // Generate new port state. | 1147 // Generate new port state. |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1352 source_map_[AddrToInt(client_id, port_id)] = port_index; | 1346 source_map_[AddrToInt(client_id, port_id)] = port_index; |
1353 return true; | 1347 return true; |
1354 } | 1348 } |
1355 | 1349 |
1356 MidiManager* MidiManager::Create() { | 1350 MidiManager* MidiManager::Create() { |
1357 return new MidiManagerAlsa(); | 1351 return new MidiManagerAlsa(); |
1358 } | 1352 } |
1359 | 1353 |
1360 } // namespace midi | 1354 } // namespace midi |
1361 } // namespace media | 1355 } // namespace media |
OLD | NEW |