| Index: media/midi/midi_service.h
|
| diff --git a/media/midi/midi_service.h b/media/midi/midi_service.h
|
| index 5b870d6ce5b2719f4389ca01d56abebf37f74a13..0428527cc1d7b20fd4f0fdab35297db4c0ad8905 100644
|
| --- a/media/midi/midi_service.h
|
| +++ b/media/midi/midi_service.h
|
| @@ -11,19 +11,26 @@
|
| #include <vector>
|
|
|
| #include "base/macros.h"
|
| +#include "base/memory/ref_counted.h"
|
| +#include "base/single_thread_task_runner.h"
|
| #include "base/synchronization/lock.h"
|
| +#include "base/threading/thread.h"
|
| #include "media/midi/midi_export.h"
|
| #include "media/midi/midi_manager.h"
|
|
|
| namespace midi {
|
|
|
| +class MidiManagerAlsa;
|
| +
|
| // Manages MidiManager backends. This class expects to be constructed and
|
| // destructed on the browser main thread, but methods can be called on both
|
| // the main thread and the I/O thread.
|
| class MIDI_EXPORT MidiService final {
|
| public:
|
| + // Use the first constructor for production code.
|
| + MidiService();
|
| // |MidiManager| can be explicitly specified in the constructor for testing.
|
| - explicit MidiService(std::unique_ptr<MidiManager> manager = nullptr);
|
| + explicit MidiService(std::unique_ptr<MidiManager> manager);
|
| ~MidiService();
|
|
|
| // Called on the browser main thread to notify the I/O thread will stop and
|
| @@ -37,14 +44,44 @@ class MIDI_EXPORT MidiService final {
|
| void EndSession(MidiManagerClient* client);
|
|
|
| // A client calls DispatchSendMidiData() to send MIDI data.
|
| - virtual void DispatchSendMidiData(MidiManagerClient* client,
|
| - uint32_t port_index,
|
| - const std::vector<uint8_t>& data,
|
| - double timestamp);
|
| + void DispatchSendMidiData(MidiManagerClient* client,
|
| + uint32_t port_index,
|
| + const std::vector<uint8_t>& data,
|
| + double timestamp);
|
| +
|
| + private:
|
| + friend class MidiManagerAlsa;
|
|
|
| + // Returns a SingleThreadTaskRunner reference to serve MidiManager. Each
|
| + // TaskRunner will be constructed on demand.
|
| + // MidiManager that supports the dynamic instantiation feature will use this
|
| + // method to post tasks that should not run on I/O. Since TaskRunners outlive
|
| + // MidiManager, each task should ensure that MidiManager that posted the task
|
| + // is still alive while accessing |this|. TaskRunners will be reused when
|
| + // another MidiManager is instantiated.
|
| + scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner(size_t runner_id);
|
| +
|
| + // Holds MidiManager instance. If the dynamic instantiation feature is
|
| + // enabled, the MidiManager would be constructed and destructed on the I/O
|
| + // thread, and all MidiManager methods would be called on the I/O thread.
|
| std::unique_ptr<MidiManager> manager_;
|
| +
|
| + // A flag to indicate if the dynamic instantiation feature is supported and
|
| + // actually enabled.
|
| + const bool is_dynamic_instantiation_enabled_;
|
| +
|
| + // Counts active clients to manage dynamic MidiManager instantiation.
|
| + size_t active_clients_;
|
| +
|
| + // Protects all members above.
|
| base::Lock lock_;
|
|
|
| + // Threads to host SingleThreadTaskRunners.
|
| + std::vector<std::unique_ptr<base::Thread>> threads_;
|
| +
|
| + // Protects |threads_|.
|
| + base::Lock threads_lock_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(MidiService);
|
| };
|
|
|
|
|