midi_manager_mac.h 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Copyright (c) 2013 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef MEDIA_MIDI_MIDI_MANAGER_MAC_H_
  5. #define MEDIA_MIDI_MIDI_MANAGER_MAC_H_
  6. #include <CoreMIDI/MIDIServices.h>
  7. #include <stdint.h>
  8. #include <vector>
  9. #include "base/callback.h"
  10. #include "base/compiler_specific.h"
  11. #include "base/synchronization/lock.h"
  12. #include "base/thread_annotations.h"
  13. #include "base/threading/thread.h"
  14. #include "media/midi/midi_export.h"
  15. #include "media/midi/midi_manager.h"
  16. #include "media/midi/midi_service.mojom.h"
  17. namespace midi {
  18. class MidiService;
  19. class MIDI_EXPORT MidiManagerMac final : public MidiManager {
  20. public:
  21. explicit MidiManagerMac(MidiService* service);
  22. MidiManagerMac(const MidiManagerMac&) = delete;
  23. MidiManagerMac& operator=(const MidiManagerMac&) = delete;
  24. ~MidiManagerMac() override;
  25. // MidiManager implementation.
  26. void StartInitialization() override;
  27. void DispatchSendMidiData(MidiManagerClient* client,
  28. uint32_t port_index,
  29. const std::vector<uint8_t>& data,
  30. base::TimeTicks timestamp) override;
  31. private:
  32. // Initializes CoreMIDI on |client_thread_| asynchronously. Called from
  33. // StartInitialization().
  34. void InitializeCoreMIDI();
  35. // Completes CoreMIDI initialization and asks the thread that ran
  36. // StartInitialization() to call CompleteStartSession() safely.
  37. void CompleteCoreMIDIInitialization(mojom::Result result);
  38. // CoreMIDI callback for MIDI notification.
  39. // Receives MIDI related event notifications from CoreMIDI.
  40. static void ReceiveMidiNotifyDispatch(const MIDINotification* message,
  41. void* refcon);
  42. void ReceiveMidiNotify(const MIDINotification* message);
  43. // CoreMIDI callback for MIDI data.
  44. // Each callback can contain multiple packets, each of which can contain
  45. // multiple MIDI messages.
  46. static void ReadMidiDispatch(const MIDIPacketList* packet_list,
  47. void* read_proc_refcon,
  48. void* src_conn_refcon);
  49. // An internal callback that runs on MidiSendThread.
  50. void SendMidiData(MidiManagerClient* client,
  51. uint32_t port_index,
  52. const std::vector<uint8_t>& data,
  53. base::TimeTicks timestamp);
  54. // CoreMIDI client reference.
  55. MIDIClientRef midi_client_ GUARDED_BY(midi_client_lock_) = 0;
  56. base::Lock midi_client_lock_;
  57. // Following members can be accessed without any lock on kClientTaskRunner,
  58. // or on I/O thread before calling BindInstance() or after calling
  59. // UnbindInstance().
  60. // CoreMIDI other references.
  61. MIDIPortRef midi_input_ = 0;
  62. MIDIPortRef midi_output_ = 0;
  63. std::vector<uint8_t> midi_buffer_;
  64. // Keeps track of all sources.
  65. std::vector<MIDIEndpointRef> sources_;
  66. // Keeps track of all destinations.
  67. std::vector<MIDIEndpointRef> destinations_;
  68. };
  69. } // namespace midi
  70. #endif // MEDIA_MIDI_MIDI_MANAGER_MAC_H_