Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(619)

Unified Diff: media/midi/midi_service.h

Issue 2673423002: Web MIDI: add dynamic MidiManager instantiation support for Linux (Closed)
Patch Set: update metrics Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/midi/midi_service.h
diff --git a/media/midi/midi_service.h b/media/midi/midi_service.h
index 5b870d6ce5b2719f4389ca01d56abebf37f74a13..a36ad6150ed6a4cdbbaae6361b2edb2e191c4d6a 100644
--- a/media/midi/midi_service.h
+++ b/media/midi/midi_service.h
@@ -11,12 +11,17 @@
#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.
@@ -37,14 +42,49 @@ 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);
+
+ protected:
yhirano 2017/02/08 03:50:24 Why is this protected? Even if you place the frien
Takashi Toyoshima 2017/02/08 09:08:00 Done.
+ 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 be bound with WeakPtr<> if the task is not a
+ // static method. TaskRunners will be reused when another MidiManager is
+ // instantiated.
+ static scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner(
yhirano 2017/02/08 03:50:24 Can you tell me what this means? Does that mean ea
Takashi Toyoshima 2017/02/08 09:08:01 Oops, later part of this comment was stale (explai
+ size_t runner_id);
+ private:
+ scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunnerImpl(
+ 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.
+ bool is_dynamic_instantiation_enabled_;
yhirano 2017/02/08 03:50:24 I think you don't need to protect this member, rig
Takashi Toyoshima 2017/02/08 09:08:00 Done.
+
+ // 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);
};

Powered by Google App Engine
This is Rietveld 408576698