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