blob: 67845cef08d5b2c49add1954b5041d96045e5676 [file] [log] [blame]
crogers@google.com27356e42013-06-22 04:03:03 +00001// 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.
4
5#include "media/midi/midi_manager.h"
6
toyoshim@chromium.org2b058e82014-02-26 06:10:46 +00007#include "base/debug/trace_event.h"
crogers@google.com542a43a2013-07-31 05:16:49 +00008
crogers@google.com27356e42013-06-22 04:03:03 +00009namespace media {
10
yhirano@chromium.org881fec42014-02-12 08:23:48 +000011#if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(USE_ALSA) && \
toyoshim@chromium.org2b058e82014-02-26 06:10:46 +000012 !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
toyoshim@chromium.orgc82e66e2014-02-04 07:05:47 +000013MidiManager* MidiManager::Create() {
14 return new MidiManager;
crogers@google.com27356e42013-06-22 04:03:03 +000015}
16#endif
17
toyoshim@chromium.orgc82e66e2014-02-04 07:05:47 +000018MidiManager::MidiManager()
toyoshim@chromium.orgf77a1e62014-04-11 13:16:24 +000019 : initialized_(false),
20 result_(MIDI_NOT_SUPPORTED) {
crogers@google.com27356e42013-06-22 04:03:03 +000021}
22
toyoshim@chromium.orgc82e66e2014-02-04 07:05:47 +000023MidiManager::~MidiManager() {
yukawa@chromium.orgdb7ad8b2013-12-04 15:42:41 +000024}
crogers@google.com27356e42013-06-22 04:03:03 +000025
toyoshim@chromium.orgf77a1e62014-04-11 13:16:24 +000026void MidiManager::StartSession(MidiManagerClient* client, int client_id) {
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000027 bool session_is_ready;
28 bool session_needs_initialization = false;
29
30 {
31 base::AutoLock auto_lock(clients_lock_);
32 session_is_ready = initialized_;
33 if (!session_is_ready) {
34 // Call StartInitialization() only for the first request.
35 session_needs_initialization = pending_clients_.empty();
36 pending_clients_.insert(
37 std::pair<int, MidiManagerClient*>(client_id, client));
38 }
toyoshim@chromium.orgf77a1e62014-04-11 13:16:24 +000039 }
crogers@google.com27356e42013-06-22 04:03:03 +000040
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000041 // Lazily initialize the MIDI back-end.
42 if (!session_is_ready) {
43 if (session_needs_initialization) {
44 TRACE_EVENT0("midi", "MidiManager::StartInitialization");
45 StartInitialization();
46 }
47 // CompleteInitialization() will be called asynchronously when platform
48 // dependent initialization is finished.
49 return;
crogers@google.com27356e42013-06-22 04:03:03 +000050 }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000051
52 // Platform dependent initialization was already finished for previously
53 // initialized clients.
54 MidiResult result;
55 {
56 base::AutoLock auto_lock(clients_lock_);
57 if (result_ == MIDI_OK)
58 clients_.insert(client);
59 result = result_;
60 }
61 client->CompleteStartSession(client_id, result);
crogers@google.com27356e42013-06-22 04:03:03 +000062}
63
toyoshim@chromium.orgc82e66e2014-02-04 07:05:47 +000064void MidiManager::EndSession(MidiManagerClient* client) {
crogers@google.com27356e42013-06-22 04:03:03 +000065 base::AutoLock auto_lock(clients_lock_);
66 ClientList::iterator i = clients_.find(client);
67 if (i != clients_.end())
68 clients_.erase(i);
69}
70
toyoshim@chromium.orgc82e66e2014-02-04 07:05:47 +000071void MidiManager::DispatchSendMidiData(MidiManagerClient* client,
yhirano@chromium.orgc6d5b7b2013-12-20 07:27:23 +000072 uint32 port_index,
73 const std::vector<uint8>& data,
74 double timestamp) {
75 NOTREACHED();
76}
77
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000078void MidiManager::StartInitialization() {
79 CompleteInitialization(MIDI_NOT_SUPPORTED);
80}
81
82void MidiManager::CompleteInitialization(MidiResult result) {
83 TRACE_EVENT0("midi", "MidiManager::CompleteInitialization");
84
85 base::AutoLock auto_lock(clients_lock_);
86 DCHECK(clients_.empty());
87 DCHECK(!pending_clients_.empty());
88 DCHECK(!initialized_);
89 initialized_ = true;
90 result_ = result;
91
92 for (PendingClientMap::iterator it = pending_clients_.begin();
93 it != pending_clients_.end();
94 ++it) {
95 if (result_ == MIDI_OK)
96 clients_.insert(it->second);
97 it->second->CompleteStartSession(it->first, result_);
98 }
99 pending_clients_.clear();
yhirano@chromium.orgc6d5b7b2013-12-20 07:27:23 +0000100}
101
toyoshim@chromium.orgc82e66e2014-02-04 07:05:47 +0000102void MidiManager::AddInputPort(const MidiPortInfo& info) {
crogers@google.com27356e42013-06-22 04:03:03 +0000103 input_ports_.push_back(info);
104}
105
toyoshim@chromium.orgc82e66e2014-02-04 07:05:47 +0000106void MidiManager::AddOutputPort(const MidiPortInfo& info) {
crogers@google.com27356e42013-06-22 04:03:03 +0000107 output_ports_.push_back(info);
108}
109
toyoshim@chromium.orgc82e66e2014-02-04 07:05:47 +0000110void MidiManager::ReceiveMidiData(
toyoshim@chromium.orgae6ad362013-08-27 15:30:20 +0000111 uint32 port_index,
crogers@google.com27356e42013-06-22 04:03:03 +0000112 const uint8* data,
113 size_t length,
114 double timestamp) {
115 base::AutoLock auto_lock(clients_lock_);
116
crogers@google.com27356e42013-06-22 04:03:03 +0000117 for (ClientList::iterator i = clients_.begin(); i != clients_.end(); ++i)
toyoshim@chromium.orgc82e66e2014-02-04 07:05:47 +0000118 (*i)->ReceiveMidiData(port_index, data, length, timestamp);
crogers@google.com542a43a2013-07-31 05:16:49 +0000119}
120
crogers@google.com27356e42013-06-22 04:03:03 +0000121} // namespace media