| 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 <map> | 9 #include <map> |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| 12 #include "base/basictypes.h" | |
| 13 #include "base/gtest_prod_util.h" | 12 #include "base/gtest_prod_util.h" |
| 14 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
| 15 #include "base/synchronization/lock.h" | 14 #include "base/synchronization/lock.h" |
| 16 #include "base/threading/thread.h" | 15 #include "base/threading/thread.h" |
| 17 #include "base/values.h" | 16 #include "base/values.h" |
| 18 #include "device/udev_linux/scoped_udev.h" | 17 #include "device/udev_linux/scoped_udev.h" |
| 19 #include "media/midi/midi_export.h" | 18 #include "media/midi/midi_export.h" |
| 20 #include "media/midi/midi_manager.h" | 19 #include "media/midi/midi_manager.h" |
| 21 | 20 |
| 22 namespace media { | 21 namespace media { |
| 23 namespace midi { | 22 namespace midi { |
| 24 | 23 |
| 25 class MIDI_EXPORT MidiManagerAlsa final : public MidiManager { | 24 class MIDI_EXPORT MidiManagerAlsa final : public MidiManager { |
| 26 public: | 25 public: |
| 27 MidiManagerAlsa(); | 26 MidiManagerAlsa(); |
| 28 ~MidiManagerAlsa() override; | 27 ~MidiManagerAlsa() override; |
| 29 | 28 |
| 30 // MidiManager implementation. | 29 // MidiManager implementation. |
| 31 void StartInitialization() override; | 30 void StartInitialization() override; |
| 32 void Finalize() override; | 31 void Finalize() override; |
| 33 void DispatchSendMidiData(MidiManagerClient* client, | 32 void DispatchSendMidiData(MidiManagerClient* client, |
| 34 uint32 port_index, | 33 uint32_t port_index, |
| 35 const std::vector<uint8>& data, | 34 const std::vector<uint8_t>& data, |
| 36 double timestamp) override; | 35 double timestamp) override; |
| 37 | 36 |
| 38 private: | 37 private: |
| 39 friend class MidiManagerAlsaTest; | 38 friend class MidiManagerAlsaTest; |
| 40 FRIEND_TEST_ALL_PREFIXES(MidiManagerAlsaTest, ExtractManufacturer); | 39 FRIEND_TEST_ALL_PREFIXES(MidiManagerAlsaTest, ExtractManufacturer); |
| 41 FRIEND_TEST_ALL_PREFIXES(MidiManagerAlsaTest, ToMidiPortState); | 40 FRIEND_TEST_ALL_PREFIXES(MidiManagerAlsaTest, ToMidiPortState); |
| 42 | 41 |
| 43 class AlsaCard; | 42 class AlsaCard; |
| 44 using AlsaCardMap = std::map<int, scoped_ptr<AlsaCard>>; | 43 using AlsaCardMap = std::map<int, scoped_ptr<AlsaCard>>; |
| 45 | 44 |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 117 std::string path() const { return path_; } | 116 std::string path() const { return path_; } |
| 118 Id id() const { return id_; } | 117 Id id() const { return id_; } |
| 119 std::string client_name() const { return client_name_; } | 118 std::string client_name() const { return client_name_; } |
| 120 std::string port_name() const { return port_name_; } | 119 std::string port_name() const { return port_name_; } |
| 121 std::string manufacturer() const { return manufacturer_; } | 120 std::string manufacturer() const { return manufacturer_; } |
| 122 std::string version() const { return version_; } | 121 std::string version() const { return version_; } |
| 123 int client_id() const { return client_id_; } | 122 int client_id() const { return client_id_; } |
| 124 int port_id() const { return port_id_; } | 123 int port_id() const { return port_id_; } |
| 125 int midi_device() const { return midi_device_; } | 124 int midi_device() const { return midi_device_; } |
| 126 Type type() const { return type_; } | 125 Type type() const { return type_; } |
| 127 uint32 web_port_index() const { return web_port_index_; } | 126 uint32_t web_port_index() const { return web_port_index_; } |
| 128 bool connected() const { return connected_; } | 127 bool connected() const { return connected_; } |
| 129 | 128 |
| 130 // mutators | 129 // mutators |
| 131 void set_web_port_index(uint32 web_port_index) { | 130 void set_web_port_index(uint32_t web_port_index) { |
| 132 web_port_index_ = web_port_index; | 131 web_port_index_ = web_port_index; |
| 133 } | 132 } |
| 134 void set_connected(bool connected) { connected_ = connected; } | 133 void set_connected(bool connected) { connected_ = connected; } |
| 135 void Update(const std::string& path, | 134 void Update(const std::string& path, |
| 136 int client_id, | 135 int client_id, |
| 137 int port_id, | 136 int port_id, |
| 138 const std::string& client_name, | 137 const std::string& client_name, |
| 139 const std::string& port_name, | 138 const std::string& port_name, |
| 140 const std::string& manufacturer, | 139 const std::string& manufacturer, |
| 141 const std::string& version) { | 140 const std::string& version) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 159 // drivers change. | 158 // drivers change. |
| 160 std::string path_; | 159 std::string path_; |
| 161 int client_id_; | 160 int client_id_; |
| 162 int port_id_; | 161 int port_id_; |
| 163 std::string client_name_; | 162 std::string client_name_; |
| 164 std::string port_name_; | 163 std::string port_name_; |
| 165 std::string manufacturer_; | 164 std::string manufacturer_; |
| 166 std::string version_; | 165 std::string version_; |
| 167 | 166 |
| 168 // Index for MidiManager. | 167 // Index for MidiManager. |
| 169 uint32 web_port_index_ = 0; | 168 uint32_t web_port_index_ = 0; |
| 170 | 169 |
| 171 // Port is present in the ALSA system. | 170 // Port is present in the ALSA system. |
| 172 bool connected_ = true; | 171 bool connected_ = true; |
| 173 | 172 |
| 174 DISALLOW_COPY_AND_ASSIGN(MidiPort); | 173 DISALLOW_COPY_AND_ASSIGN(MidiPort); |
| 175 }; | 174 }; |
| 176 | 175 |
| 177 class MidiPortStateBase { | 176 class MidiPortStateBase { |
| 178 public: | 177 public: |
| 179 typedef std::vector<scoped_ptr<MidiPort>>::iterator iterator; | 178 typedef std::vector<scoped_ptr<MidiPort>>::iterator iterator; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 void push_back(scoped_ptr<MidiPort> port) { | 210 void push_back(scoped_ptr<MidiPort> port) { |
| 212 MidiPortStateBase::push_back(port.Pass()); | 211 MidiPortStateBase::push_back(port.Pass()); |
| 213 } | 212 } |
| 214 }; | 213 }; |
| 215 | 214 |
| 216 class MidiPortState final : public MidiPortStateBase { | 215 class MidiPortState final : public MidiPortStateBase { |
| 217 public: | 216 public: |
| 218 MidiPortState(); | 217 MidiPortState(); |
| 219 | 218 |
| 220 // Inserts a port at the end. Returns web_port_index. | 219 // Inserts a port at the end. Returns web_port_index. |
| 221 uint32 push_back(scoped_ptr<MidiPort> port); | 220 uint32_t push_back(scoped_ptr<MidiPort> port); |
| 222 | 221 |
| 223 private: | 222 private: |
| 224 uint32 num_input_ports_ = 0; | 223 uint32_t num_input_ports_ = 0; |
| 225 uint32 num_output_ports_ = 0; | 224 uint32_t num_output_ports_ = 0; |
| 226 }; | 225 }; |
| 227 | 226 |
| 228 class AlsaSeqState { | 227 class AlsaSeqState { |
| 229 public: | 228 public: |
| 230 enum class PortDirection { kInput, kOutput, kDuplex }; | 229 enum class PortDirection { kInput, kOutput, kDuplex }; |
| 231 | 230 |
| 232 AlsaSeqState(); | 231 AlsaSeqState(); |
| 233 ~AlsaSeqState(); | 232 ~AlsaSeqState(); |
| 234 | 233 |
| 235 void ClientStart(int client_id, | 234 void ClientStart(int client_id, |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 struct SndSeqDeleter { | 349 struct SndSeqDeleter { |
| 351 void operator()(snd_seq_t* seq) const { snd_seq_close(seq); } | 350 void operator()(snd_seq_t* seq) const { snd_seq_close(seq); } |
| 352 }; | 351 }; |
| 353 | 352 |
| 354 struct SndMidiEventDeleter { | 353 struct SndMidiEventDeleter { |
| 355 void operator()(snd_midi_event_t* coder) const { | 354 void operator()(snd_midi_event_t* coder) const { |
| 356 snd_midi_event_free(coder); | 355 snd_midi_event_free(coder); |
| 357 }; | 356 }; |
| 358 }; | 357 }; |
| 359 | 358 |
| 360 typedef base::hash_map<int, uint32> SourceMap; | 359 typedef base::hash_map<int, uint32_t> SourceMap; |
| 361 typedef base::hash_map<uint32, int> OutPortMap; | 360 typedef base::hash_map<uint32_t, int> OutPortMap; |
| 362 | 361 |
| 363 // An internal callback that runs on MidiSendThread. | 362 // An internal callback that runs on MidiSendThread. |
| 364 void SendMidiData(uint32 port_index, const std::vector<uint8>& data); | 363 void SendMidiData(uint32_t port_index, const std::vector<uint8_t>& data); |
| 365 | 364 |
| 366 void ScheduleEventLoop(); | 365 void ScheduleEventLoop(); |
| 367 void EventLoop(); | 366 void EventLoop(); |
| 368 void ProcessSingleEvent(snd_seq_event_t* event, double timestamp); | 367 void ProcessSingleEvent(snd_seq_event_t* event, double timestamp); |
| 369 void ProcessClientStartEvent(int client_id); | 368 void ProcessClientStartEvent(int client_id); |
| 370 void ProcessPortStartEvent(const snd_seq_addr_t& addr); | 369 void ProcessPortStartEvent(const snd_seq_addr_t& addr); |
| 371 void ProcessClientExitEvent(const snd_seq_addr_t& addr); | 370 void ProcessClientExitEvent(const snd_seq_addr_t& addr); |
| 372 void ProcessPortExitEvent(const snd_seq_addr_t& addr); | 371 void ProcessPortExitEvent(const snd_seq_addr_t& addr); |
| 373 void ProcessUdevEvent(udev_device* dev); | 372 void ProcessUdevEvent(udev_device* dev); |
| 374 void AddCard(udev_device* dev); | 373 void AddCard(udev_device* dev); |
| 375 void RemoveCard(int number); | 374 void RemoveCard(int number); |
| 376 | 375 |
| 377 // Updates port_state_ and Web MIDI state from alsa_seq_state_. | 376 // Updates port_state_ and Web MIDI state from alsa_seq_state_. |
| 378 void UpdatePortStateAndGenerateEvents(); | 377 void UpdatePortStateAndGenerateEvents(); |
| 379 | 378 |
| 380 // Enumerates ports. Call once after subscribing to the announce port. | 379 // Enumerates ports. Call once after subscribing to the announce port. |
| 381 void EnumerateAlsaPorts(); | 380 void EnumerateAlsaPorts(); |
| 382 // Enumerates udev cards. Call once after initializing the udev monitor. | 381 // Enumerates udev cards. Call once after initializing the udev monitor. |
| 383 bool EnumerateUdevCards(); | 382 bool EnumerateUdevCards(); |
| 384 // Returns true if successful. | 383 // Returns true if successful. |
| 385 bool CreateAlsaOutputPort(uint32 port_index, int client_id, int port_id); | 384 bool CreateAlsaOutputPort(uint32_t port_index, int client_id, int port_id); |
| 386 void DeleteAlsaOutputPort(uint32 port_index); | 385 void DeleteAlsaOutputPort(uint32_t port_index); |
| 387 // Returns true if successful. | 386 // Returns true if successful. |
| 388 bool Subscribe(uint32 port_index, int client_id, int port_id); | 387 bool Subscribe(uint32_t port_index, int client_id, int port_id); |
| 389 | 388 |
| 390 AlsaSeqState alsa_seq_state_; | 389 AlsaSeqState alsa_seq_state_; |
| 391 MidiPortState port_state_; | 390 MidiPortState port_state_; |
| 392 | 391 |
| 393 // ALSA seq handles. | 392 // ALSA seq handles. |
| 394 scoped_ptr<snd_seq_t, SndSeqDeleter> in_client_; | 393 scoped_ptr<snd_seq_t, SndSeqDeleter> in_client_; |
| 395 int in_client_id_ = -1; | 394 int in_client_id_ = -1; |
| 396 scoped_ptr<snd_seq_t, SndSeqDeleter> out_client_; | 395 scoped_ptr<snd_seq_t, SndSeqDeleter> out_client_; |
| 397 int out_client_id_ = -1; | 396 int out_client_id_ = -1; |
| 398 | 397 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 426 bool event_thread_shutdown_ = false; // guarded by shutdown_lock_ | 425 bool event_thread_shutdown_ = false; // guarded by shutdown_lock_ |
| 427 base::Lock shutdown_lock_; // guards event_thread_shutdown_ | 426 base::Lock shutdown_lock_; // guards event_thread_shutdown_ |
| 428 | 427 |
| 429 DISALLOW_COPY_AND_ASSIGN(MidiManagerAlsa); | 428 DISALLOW_COPY_AND_ASSIGN(MidiManagerAlsa); |
| 430 }; | 429 }; |
| 431 | 430 |
| 432 } // namespace midi | 431 } // namespace midi |
| 433 } // namespace media | 432 } // namespace media |
| 434 | 433 |
| 435 #endif // MEDIA_MIDI_MIDI_MANAGER_ALSA_H_ | 434 #endif // MEDIA_MIDI_MIDI_MANAGER_ALSA_H_ |
| OLD | NEW |