// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MEDIA_MIDI_MIDI_MANAGER_WINRT_H_ #define MEDIA_MIDI_MIDI_MANAGER_WINRT_H_ #include #include "base/strings/string16.h" #include "base/threading/thread.h" #include "media/midi/midi_manager.h" namespace base { class ThreadChecker; } namespace midi { class MidiScheduler; class MidiService; class MIDI_EXPORT MidiManagerWinrt final : public MidiManager { public: explicit MidiManagerWinrt(MidiService* service); ~MidiManagerWinrt() override; // MidiManager overrides: void StartInitialization() final; void Finalize() final; void DispatchSendMidiData(MidiManagerClient* client, uint32_t port_index, const std::vector& data, double timestamp) final; private: // Callbacks on the COM thread. void InitializeOnComThread(); void FinalizeOnComThread(); void SendOnComThread(uint32_t port_index, const std::vector& data); // Callback from MidiPortManager::OnEnumerationComplete on the COM thread. // Calls CompleteInitialization() when both MidiPortManagers are ready. void OnPortManagerReady(); // Subclasses that access private/protected members of MidiManager. template class MidiPortManager; class MidiInPortManager; class MidiOutPortManager; // COM-initialized thread for calling WinRT methods. base::Thread com_thread_; // Lock to ensure all smart pointers initialized in InitializeOnComThread() // and destroyed in FinalizeOnComThread() will not be accidentally destructed // twice in the destructor. base::Lock lazy_init_member_lock_; // Should be instantiated on COM thread. std::unique_ptr com_thread_checker_; // GUARDED_BY(lazy_init_member_lock_) // All operations to MidiPortManager should be done on COM thread. std::unique_ptr port_manager_in_; // GUARDED_BY(lazy_init_member_lock_) std::unique_ptr port_manager_out_; // GUARDED_BY(lazy_init_member_lock_) // |scheduler_| is used by DispatchSendMidiData on Chrome_IOThread, should // acquire lock before use. std::unique_ptr scheduler_; // GUARDED_BY(lazy_init_member_lock_) // Incremented when a MidiPortManager is ready. uint8_t port_manager_ready_count_ = 0; DISALLOW_COPY_AND_ASSIGN(MidiManagerWinrt); }; } // namespace midi #endif // MEDIA_MIDI_MIDI_MANAGER_WINRT_H_