midi_manager_winrt.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // Copyright 2016 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_WINRT_H_
  5. #define MEDIA_MIDI_MIDI_MANAGER_WINRT_H_
  6. #include <memory>
  7. #include "base/thread_annotations.h"
  8. #include "media/midi/midi_manager.h"
  9. namespace midi {
  10. class MidiService;
  11. class MIDI_EXPORT MidiManagerWinrt final : public MidiManager {
  12. public:
  13. class MidiInPortManager;
  14. class MidiOutPortManager;
  15. explicit MidiManagerWinrt(MidiService* service);
  16. MidiManagerWinrt(const MidiManagerWinrt&) = delete;
  17. MidiManagerWinrt& operator=(const MidiManagerWinrt&) = delete;
  18. ~MidiManagerWinrt() override;
  19. // MidiManager overrides:
  20. void StartInitialization() final;
  21. void DispatchSendMidiData(MidiManagerClient* client,
  22. uint32_t port_index,
  23. const std::vector<uint8_t>& data,
  24. base::TimeTicks timestamp) final;
  25. private:
  26. // Subclasses that access private/protected members of MidiManager.
  27. template <typename InterfaceType,
  28. typename RuntimeType,
  29. typename StaticsInterfaceType,
  30. wchar_t const* runtime_class_id>
  31. class MidiPortManager;
  32. // Callbacks on kComTaskRunner.
  33. void InitializeOnComRunner();
  34. void SendOnComRunner(uint32_t port_index, const std::vector<uint8_t>& data);
  35. // Callback from MidiPortManager::OnEnumerationComplete on kComTaskRunner.
  36. // Calls CompleteInitialization() when both MidiPortManagers are ready.
  37. void OnPortManagerReady();
  38. // Lock to ensure all smart pointers initialized in InitializeOnComRunner()
  39. // and destroyed in FinalizeOnComRunner() will not be accidentally destructed
  40. // twice in the destructor.
  41. base::Lock lazy_init_member_lock_;
  42. // All operations to Midi{In|Out}PortManager should be done on kComTaskRunner.
  43. std::unique_ptr<MidiInPortManager> port_manager_in_
  44. GUARDED_BY(lazy_init_member_lock_);
  45. std::unique_ptr<MidiOutPortManager> port_manager_out_
  46. GUARDED_BY(lazy_init_member_lock_);
  47. // Incremented when a MidiPortManager is ready.
  48. uint8_t port_manager_ready_count_ = 0;
  49. };
  50. } // namespace midi
  51. #endif // MEDIA_MIDI_MIDI_MANAGER_WINRT_H_