| 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 #ifndef MEDIA_MIDI_MIDI_MANAGER_ALSA_H_ | 5 #ifndef MEDIA_MIDI_MIDI_MANAGER_ALSA_H_ | 
| 6 #define MEDIA_MIDI_MIDI_MANAGER_ALSA_H_ | 6 #define MEDIA_MIDI_MIDI_MANAGER_ALSA_H_ | 
| 7 | 7 | 
| 8 #include <alsa/asoundlib.h> | 8 #include <alsa/asoundlib.h> | 
| 9 #include <stdint.h> | 9 #include <stdint.h> | 
| 10 | 10 | 
| 11 #include <map> | 11 #include <map> | 
| 12 #include <memory> | 12 #include <memory> | 
| 13 #include <utility> | 13 #include <utility> | 
| 14 #include <vector> | 14 #include <vector> | 
| 15 | 15 | 
| 16 #include "base/containers/hash_tables.h" | 16 #include "base/containers/hash_tables.h" | 
| 17 #include "base/gtest_prod_util.h" | 17 #include "base/gtest_prod_util.h" | 
| 18 #include "base/macros.h" | 18 #include "base/macros.h" | 
| 19 #include "base/synchronization/lock.h" | 19 #include "base/synchronization/lock.h" | 
| 20 #include "base/threading/thread.h" | 20 #include "base/threading/thread.h" | 
| 21 #include "base/values.h" | 21 #include "base/values.h" | 
| 22 #include "device/udev_linux/scoped_udev.h" | 22 #include "device/udev_linux/scoped_udev.h" | 
| 23 #include "media/midi/midi_export.h" | 23 #include "media/midi/midi_export.h" | 
| 24 #include "media/midi/midi_manager.h" | 24 #include "media/midi/midi_manager.h" | 
| 25 | 25 | 
| 26 namespace base { |  | 
| 27 class ThreadChecker; |  | 
| 28 } |  | 
| 29 |  | 
| 30 namespace midi { | 26 namespace midi { | 
| 31 | 27 | 
| 32 class MIDI_EXPORT MidiManagerAlsa final : public MidiManager { | 28 class MIDI_EXPORT MidiManagerAlsa final : public MidiManager { | 
| 33  public: | 29  public: | 
| 34   explicit MidiManagerAlsa(MidiService* service); | 30   explicit MidiManagerAlsa(MidiService* service); | 
| 35   ~MidiManagerAlsa() override; | 31   ~MidiManagerAlsa() override; | 
| 36 | 32 | 
| 37   // MidiManager implementation. | 33   // MidiManager implementation. | 
| 38   void StartInitialization() override; | 34   void StartInitialization() override; | 
| 39   void Finalize() override; | 35   void Finalize() override; | 
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 366     }; | 362     }; | 
| 367   }; | 363   }; | 
| 368 | 364 | 
| 369   using SourceMap = base::hash_map<int, uint32_t>; | 365   using SourceMap = base::hash_map<int, uint32_t>; | 
| 370   using OutPortMap = base::hash_map<uint32_t, int>; | 366   using OutPortMap = base::hash_map<uint32_t, int>; | 
| 371   using ScopedSndSeqPtr = std::unique_ptr<snd_seq_t, SndSeqDeleter>; | 367   using ScopedSndSeqPtr = std::unique_ptr<snd_seq_t, SndSeqDeleter>; | 
| 372   using ScopedSndMidiEventPtr = | 368   using ScopedSndMidiEventPtr = | 
| 373       std::unique_ptr<snd_midi_event_t, SndMidiEventDeleter>; | 369       std::unique_ptr<snd_midi_event_t, SndMidiEventDeleter>; | 
| 374 | 370 | 
| 375   // An internal callback that runs on MidiSendThread. | 371   // An internal callback that runs on MidiSendThread. | 
| 376   void SendMidiData(int instance_id, | 372   void SendMidiData(MidiManagerClient* client, | 
| 377                     MidiManagerClient* client, |  | 
| 378                     uint32_t port_index, | 373                     uint32_t port_index, | 
| 379                     const std::vector<uint8_t>& data); | 374                     const std::vector<uint8_t>& data); | 
| 380 | 375 | 
| 381   void EventLoop(int instance_id); | 376   void EventLoop(); | 
| 382   void ProcessSingleEvent(snd_seq_event_t* event, double timestamp); | 377   void ProcessSingleEvent(snd_seq_event_t* event, double timestamp); | 
| 383   void ProcessClientStartEvent(int client_id); | 378   void ProcessClientStartEvent(int client_id); | 
| 384   void ProcessPortStartEvent(const snd_seq_addr_t& addr); | 379   void ProcessPortStartEvent(const snd_seq_addr_t& addr); | 
| 385   void ProcessClientExitEvent(const snd_seq_addr_t& addr); | 380   void ProcessClientExitEvent(const snd_seq_addr_t& addr); | 
| 386   void ProcessPortExitEvent(const snd_seq_addr_t& addr); | 381   void ProcessPortExitEvent(const snd_seq_addr_t& addr); | 
| 387   void ProcessUdevEvent(udev_device* dev); | 382   void ProcessUdevEvent(udev_device* dev); | 
| 388   void AddCard(udev_device* dev); | 383   void AddCard(udev_device* dev); | 
| 389   void RemoveCard(int number); | 384   void RemoveCard(int number); | 
| 390 | 385 | 
| 391   // Updates port_state_ and Web MIDI state from alsa_seq_state_. | 386   // Updates port_state_ and Web MIDI state from alsa_seq_state_. | 
| (...skipping 23 matching lines...) Expand all  Loading... | 
| 415 | 410 | 
| 416   // Mapping from card to devices. | 411   // Mapping from card to devices. | 
| 417   AlsaCardMap alsa_cards_; | 412   AlsaCardMap alsa_cards_; | 
| 418 | 413 | 
| 419   // This is the current count of midi devices across all cards we know | 414   // This is the current count of midi devices across all cards we know | 
| 420   // about. When this number matches card_client_count_ in AlsaSeqState, | 415   // about. When this number matches card_client_count_ in AlsaSeqState, | 
| 421   // we are safe to generate MIDIConnectionEvents. Otherwise we need to | 416   // we are safe to generate MIDIConnectionEvents. Otherwise we need to | 
| 422   // wait for our information from ALSA and udev to get back in sync. | 417   // wait for our information from ALSA and udev to get back in sync. | 
| 423   int alsa_card_midi_count_ = 0; | 418   int alsa_card_midi_count_ = 0; | 
| 424 | 419 | 
| 425   // This lock is needed to ensure that members destroyed in Finalize |  | 
| 426   // will be visibly destroyed before the destructor is run in the |  | 
| 427   // other thread. Otherwise, the same objects may have their destructors |  | 
| 428   // run multiple times in different threads. |  | 
| 429   base::Lock lazy_init_member_lock_;  // guards members below |  | 
| 430 |  | 
| 431   // Members initialized in StartInitialization() are below. |  | 
| 432   // Make sure to destroy these in Finalize()! |  | 
| 433   std::unique_ptr<base::ThreadChecker> initialization_thread_checker_; |  | 
| 434 |  | 
| 435   // ALSA seq handles and ids. | 420   // ALSA seq handles and ids. | 
| 436   ScopedSndSeqPtr in_client_; | 421   ScopedSndSeqPtr in_client_; | 
| 437   int in_client_id_; | 422   int in_client_id_; | 
| 438   ScopedSndSeqPtr out_client_; | 423   ScopedSndSeqPtr out_client_; | 
| 439   int out_client_id_; | 424   int out_client_id_; | 
| 440   int in_port_id_; | 425   int in_port_id_; | 
| 441 | 426 | 
| 442   // ALSA event -> MIDI coder. | 427   // ALSA event -> MIDI coder. | 
| 443   ScopedSndMidiEventPtr decoder_; | 428   ScopedSndMidiEventPtr decoder_; | 
| 444 | 429 | 
| 445   // udev, for querying hardware devices. | 430   // udev, for querying hardware devices. | 
| 446   device::ScopedUdevPtr udev_; | 431   device::ScopedUdevPtr udev_; | 
| 447   device::ScopedUdevMonitorPtr udev_monitor_; | 432   device::ScopedUdevMonitorPtr udev_monitor_; | 
| 448 | 433 | 
| 449   int instance_id_; |  | 
| 450 |  | 
| 451   DISALLOW_COPY_AND_ASSIGN(MidiManagerAlsa); | 434   DISALLOW_COPY_AND_ASSIGN(MidiManagerAlsa); | 
| 452 }; | 435 }; | 
| 453 | 436 | 
| 454 }  // namespace midi | 437 }  // namespace midi | 
| 455 | 438 | 
| 456 #endif  // MEDIA_MIDI_MIDI_MANAGER_ALSA_H_ | 439 #endif  // MEDIA_MIDI_MIDI_MANAGER_ALSA_H_ | 
| OLD | NEW | 
|---|