| Index: media/midi/midi_manager_alsa.h
|
| diff --git a/media/midi/midi_manager_alsa.h b/media/midi/midi_manager_alsa.h
|
| index db78dff300fcfa188028674457838aaff7c22d55..e8b2f6b631f8fc9555bf33b10fc2094761772462 100644
|
| --- a/media/midi/midi_manager_alsa.h
|
| +++ b/media/midi/midi_manager_alsa.h
|
| @@ -41,6 +41,9 @@ class MIDI_EXPORT MidiManagerAlsa final : public MidiManager {
|
| FRIEND_TEST_ALL_PREFIXES(MidiManagerAlsaTest, ExtractManufacturer);
|
| FRIEND_TEST_ALL_PREFIXES(MidiManagerAlsaTest, ToMidiPortState);
|
|
|
| + class AlsaCard;
|
| + typedef std::map<int, AlsaCard*> AlsaCardMap;
|
| +
|
| class MidiPort {
|
| public:
|
| enum class Type { kInput, kOutput };
|
| @@ -210,7 +213,10 @@ class MIDI_EXPORT MidiManagerAlsa final : public MidiManager {
|
| bool midi);
|
| void PortExit(int client_id, int port_id);
|
| snd_seq_client_type_t ClientType(int client_id) const;
|
| - scoped_ptr<TemporaryMidiPortState> ToMidiPortState();
|
| + scoped_ptr<TemporaryMidiPortState> ToMidiPortState(
|
| + const AlsaCardMap& alsa_cards);
|
| +
|
| + int card_client_count() { return card_client_count_; }
|
|
|
| private:
|
| class Port {
|
| @@ -259,20 +265,63 @@ class MIDI_EXPORT MidiManagerAlsa final : public MidiManager {
|
| ClientMap clients_;
|
| STLValueDeleter<ClientMap> clients_deleter_;
|
|
|
| + // This is the current number of clients we know about that have
|
| + // cards. When this number matches alsa_card_midi_count_, we know
|
| + // we are in sync between ALSA and udev. Until then, we cannot generate
|
| + // MIDIConnectionEvents to web clients.
|
| + int card_client_count_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(AlsaSeqState);
|
| };
|
|
|
| + class AlsaCard {
|
| + public:
|
| + AlsaCard(udev_device* dev,
|
| + const std::string& alsa_name,
|
| + const std::string& alsa_longname,
|
| + const std::string& alsa_driver,
|
| + int midi_device_count);
|
| + ~AlsaCard();
|
| + const std::string alsa_name() const { return alsa_name_; }
|
| + const std::string alsa_longname() const { return alsa_longname_; }
|
| + const std::string manufacturer() const { return manufacturer_; }
|
| + const std::string alsa_driver() const { return alsa_driver_; }
|
| + int midi_device_count() const { return midi_device_count_; }
|
| + // Returns hardware path.
|
| + const std::string path() const;
|
| + // Returns the id we can use to try to match hardware across different
|
| + // paths.
|
| + const std::string id() const;
|
| +
|
| + private:
|
| + FRIEND_TEST_ALL_PREFIXES(MidiManagerAlsaTest, ExtractManufacturer);
|
| +
|
| + // Extracts the manufacturer using heuristics and a variety of sources.
|
| + static std::string ExtractManufacturerString(
|
| + const std::string& udev_id_vendor,
|
| + const std::string& udev_id_vendor_id,
|
| + const std::string& udev_id_vendor_from_database,
|
| + const std::string& alsa_name,
|
| + const std::string& alsa_longname);
|
| +
|
| + std::string alsa_name_;
|
| + std::string alsa_longname_;
|
| + std::string manufacturer_;
|
| + std::string alsa_driver_;
|
| + std::string path_;
|
| + std::string bus_;
|
| + std::string serial_;
|
| + std::string vendor_id_;
|
| + std::string model_id_;
|
| + std::string usb_interface_num_;
|
| + int midi_device_count_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(AlsaCard);
|
| + };
|
| +
|
| typedef base::hash_map<int, uint32> SourceMap;
|
| typedef base::hash_map<uint32, int> OutPortMap;
|
|
|
| - // Extracts the manufacturer using heuristics and a variety of sources.
|
| - static std::string ExtractManufacturerString(
|
| - const std::string& udev_id_vendor,
|
| - const std::string& udev_id_vendor_id,
|
| - const std::string& udev_id_vendor_from_database,
|
| - const std::string& alsa_name,
|
| - const std::string& alsa_longname);
|
| -
|
| // An internal callback that runs on MidiSendThread.
|
| void SendMidiData(uint32 port_index, const std::vector<uint8>& data);
|
|
|
| @@ -284,6 +333,8 @@ class MIDI_EXPORT MidiManagerAlsa final : public MidiManager {
|
| void ProcessClientExitEvent(const snd_seq_addr_t& addr);
|
| void ProcessPortExitEvent(const snd_seq_addr_t& addr);
|
| void ProcessUdevEvent(udev_device* dev);
|
| + void AddCard(udev_device* dev);
|
| + void RemoveCard(int number);
|
|
|
| // Updates port_state_ and Web MIDI state from alsa_seq_state_.
|
| void UpdatePortStateAndGenerateEvents();
|
| @@ -315,6 +366,16 @@ class MIDI_EXPORT MidiManagerAlsa final : public MidiManager {
|
| // Mapping from ALSA client:port to our index.
|
| SourceMap source_map_;
|
|
|
| + // Mapping from card to devices.
|
| + AlsaCardMap alsa_cards_;
|
| + STLValueDeleter<AlsaCardMap> alsa_cards_deleter_;
|
| +
|
| + // This is the current count of midi devices across all cards we know
|
| + // about. When this number matches card_client_count_ in AlsaSeqState,
|
| + // we are safe to generate MIDIConnectionEvents. Otherwise we need to
|
| + // wait for our information from ALSA and udev to get back in sync.
|
| + int alsa_card_midi_count_;
|
| +
|
| // ALSA event -> MIDI coder.
|
| snd_midi_event_t* decoder_;
|
|
|
|
|