Enable ManagePasswordsBubbleViewTest.TwoTabsWtihBubble on linux x32.
[chromium-blink-merge.git] / media / midi / midi_manager.h
blob1e2bcb8dc793ae76ecb5d1787ffb541ec6f9b6f8
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.
5 #ifndef MEDIA_MIDI_MIDI_MANAGER_H_
6 #define MEDIA_MIDI_MIDI_MANAGER_H_
8 #include <set>
9 #include <vector>
11 #include "base/basictypes.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/synchronization/lock.h"
14 #include "base/time/time.h"
15 #include "media/base/media_export.h"
16 #include "media/midi/midi_port_info.h"
17 #include "media/midi/midi_result.h"
19 namespace base {
20 class SingleThreadTaskRunner;
21 } // namespace base
23 namespace media {
25 // A MidiManagerClient registers with the MidiManager to receive MIDI data.
26 // See MidiManager::RequestAccess() and MidiManager::ReleaseAccess()
27 // for details.
28 class MEDIA_EXPORT MidiManagerClient {
29 public:
30 virtual ~MidiManagerClient() {}
32 // CompleteStartSession() is called when platform dependent preparation is
33 // finished.
34 virtual void CompleteStartSession(MidiResult result) = 0;
36 // ReceiveMidiData() is called when MIDI data has been received from the
37 // MIDI system.
38 // |port_index| represents the specific input port from input_ports().
39 // |data| represents a series of bytes encoding one or more MIDI messages.
40 // |length| is the number of bytes in |data|.
41 // |timestamp| is the time the data was received, in seconds.
42 virtual void ReceiveMidiData(uint32 port_index,
43 const uint8* data,
44 size_t length,
45 double timestamp) = 0;
47 // AccumulateMidiBytesSent() is called to acknowledge when bytes have
48 // successfully been sent to the hardware.
49 // This happens as a result of the client having previously called
50 // MidiManager::DispatchSendMidiData().
51 virtual void AccumulateMidiBytesSent(size_t n) = 0;
54 // Manages access to all MIDI hardware.
55 class MEDIA_EXPORT MidiManager {
56 public:
57 static const size_t kMaxPendingClientCount = 128;
59 MidiManager();
60 virtual ~MidiManager();
62 // The constructor and the destructor will be called on the CrBrowserMain
63 // thread.
64 static MidiManager* Create();
66 // A client calls StartSession() to receive and send MIDI data.
67 // If the session is ready to start, the MIDI system is lazily initialized
68 // and the client is registered to receive MIDI data.
69 // CompleteStartSession() is called with MIDI_OK if the session is started.
70 // Otherwise CompleteStartSession() is called with proper MidiResult code.
71 // StartSession() and EndSession() can be called on the Chrome_IOThread.
72 // CompleteStartSession() will be invoked on the same Chrome_IOThread.
73 void StartSession(MidiManagerClient* client);
75 // A client calls EndSession() to stop receiving MIDI data.
76 void EndSession(MidiManagerClient* client);
78 // DispatchSendMidiData() is called when MIDI data should be sent to the MIDI
79 // system.
80 // This method is supposed to return immediately and should not block.
81 // |port_index| represents the specific output port from output_ports().
82 // |data| represents a series of bytes encoding one or more MIDI messages.
83 // |length| is the number of bytes in |data|.
84 // |timestamp| is the time to send the data, in seconds. A value of 0
85 // means send "now" or as soon as possible.
86 // The default implementation is for unsupported platforms.
87 virtual void DispatchSendMidiData(MidiManagerClient* client,
88 uint32 port_index,
89 const std::vector<uint8>& data,
90 double timestamp);
92 // input_ports() is a list of MIDI ports for receiving MIDI data.
93 // Each individual port in this list can be identified by its
94 // integer index into this list.
95 const MidiPortInfoList& input_ports() const { return input_ports_; }
97 // output_ports() is a list of MIDI ports for sending MIDI data.
98 // Each individual port in this list can be identified by its
99 // integer index into this list.
100 const MidiPortInfoList& output_ports() const { return output_ports_; }
102 protected:
103 friend class MidiManagerUsb;
105 // Initializes the platform dependent MIDI system. MidiManager class has a
106 // default implementation that synchronously calls CompleteInitialization()
107 // with MIDI_NOT_SUPPORTED on the caller thread. A derived class for a
108 // specific platform should override this method correctly.
109 // This method is called on Chrome_IOThread thread inside StartSession().
110 // Platform dependent initialization can be processed synchronously or
111 // asynchronously. When the initialization is completed,
112 // CompleteInitialization() should be called with |result|.
113 // |result| should be MIDI_OK on success, otherwise a proper MidiResult.
114 virtual void StartInitialization();
116 // Called from a platform dependent implementation of StartInitialization().
117 // It invokes CompleteInitializationInternal() on the thread that calls
118 // StartSession() and distributes |result| to MIDIManagerClient objects in
119 // |pending_clients_|.
120 void CompleteInitialization(MidiResult result);
122 void AddInputPort(const MidiPortInfo& info);
123 void AddOutputPort(const MidiPortInfo& info);
125 // Dispatches to all clients.
126 // TODO(toyoshim): Fix the mac implementation to use
127 // |ReceiveMidiData(..., base::TimeTicks)|.
128 void ReceiveMidiData(uint32 port_index,
129 const uint8* data,
130 size_t length,
131 double timestamp);
133 void ReceiveMidiData(uint32 port_index,
134 const uint8* data,
135 size_t length,
136 base::TimeTicks time) {
137 ReceiveMidiData(port_index, data, length,
138 (time - base::TimeTicks()).InSecondsF());
141 size_t clients_size_for_testing() const { return clients_.size(); }
142 size_t pending_clients_size_for_testing() const {
143 return pending_clients_.size();
146 private:
147 void CompleteInitializationInternal(MidiResult result);
149 // Keeps track of all clients who wish to receive MIDI data.
150 typedef std::set<MidiManagerClient*> ClientSet;
151 ClientSet clients_;
153 // Keeps track of all clients who are waiting for CompleteStartSession().
154 ClientSet pending_clients_;
156 // Keeps a SingleThreadTaskRunner of the thread that calls StartSession in
157 // order to invoke CompleteStartSession() on the thread.
158 scoped_refptr<base::SingleThreadTaskRunner> session_thread_runner_;
160 // Keeps true if platform dependent initialization is already completed.
161 bool initialized_;
163 // Keeps the platform dependent initialization result if initialization is
164 // completed. Otherwise keeps MIDI_NOT_SUPPORTED.
165 MidiResult result_;
167 // Protects access to |clients_|, |pending_clients_|, |initialized_|, and
168 // |result_|.
169 base::Lock lock_;
171 MidiPortInfoList input_ports_;
172 MidiPortInfoList output_ports_;
174 DISALLOW_COPY_AND_ASSIGN(MidiManager);
177 } // namespace media
179 #endif // MEDIA_MIDI_MIDI_MANAGER_H_