OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/midi/midi_manager.h" | 5 #include "media/midi/midi_manager.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/message_loop/message_loop_proxy.h" | 10 #include "base/message_loop/message_loop_proxy.h" |
(...skipping 25 matching lines...) Expand all Loading... |
36 session_is_ready = initialized_; | 36 session_is_ready = initialized_; |
37 if (!session_is_ready) { | 37 if (!session_is_ready) { |
38 // Do not accept a new request if the pending client list contains too | 38 // Do not accept a new request if the pending client list contains too |
39 // many clients. | 39 // many clients. |
40 too_many_pending_clients_exist = | 40 too_many_pending_clients_exist = |
41 pending_clients_.size() >= kMaxPendingClientCount; | 41 pending_clients_.size() >= kMaxPendingClientCount; |
42 | 42 |
43 if (!too_many_pending_clients_exist) { | 43 if (!too_many_pending_clients_exist) { |
44 // Call StartInitialization() only for the first request. | 44 // Call StartInitialization() only for the first request. |
45 session_needs_initialization = pending_clients_.empty(); | 45 session_needs_initialization = pending_clients_.empty(); |
46 pending_clients_.insert( | 46 pending_clients_.insert(std::make_pair(client, client_id)); |
47 std::pair<int, MidiManagerClient*>(client_id, client)); | |
48 } | 47 } |
49 } | 48 } |
50 } | 49 } |
51 | 50 |
52 // Lazily initialize the MIDI back-end. | 51 // Lazily initialize the MIDI back-end. |
53 if (!session_is_ready) { | 52 if (!session_is_ready) { |
54 if (session_needs_initialization) { | 53 if (session_needs_initialization) { |
55 TRACE_EVENT0("midi", "MidiManager::StartInitialization"); | 54 TRACE_EVENT0("midi", "MidiManager::StartInitialization"); |
56 session_thread_runner_ = | 55 session_thread_runner_ = |
57 base::MessageLoop::current()->message_loop_proxy(); | 56 base::MessageLoop::current()->message_loop_proxy(); |
(...skipping 16 matching lines...) Expand all Loading... |
74 base::AutoLock auto_lock(lock_); | 73 base::AutoLock auto_lock(lock_); |
75 if (result_ == MIDI_OK) | 74 if (result_ == MIDI_OK) |
76 clients_.insert(client); | 75 clients_.insert(client); |
77 result = result_; | 76 result = result_; |
78 } | 77 } |
79 client->CompleteStartSession(client_id, result); | 78 client->CompleteStartSession(client_id, result); |
80 } | 79 } |
81 | 80 |
82 void MidiManager::EndSession(MidiManagerClient* client) { | 81 void MidiManager::EndSession(MidiManagerClient* client) { |
83 base::AutoLock auto_lock(lock_); | 82 base::AutoLock auto_lock(lock_); |
84 ClientList::iterator i = clients_.find(client); | 83 clients_.erase(client); |
85 if (i != clients_.end()) | 84 pending_clients_.erase(client); |
86 clients_.erase(i); | |
87 } | 85 } |
88 | 86 |
89 void MidiManager::DispatchSendMidiData(MidiManagerClient* client, | 87 void MidiManager::DispatchSendMidiData(MidiManagerClient* client, |
90 uint32 port_index, | 88 uint32 port_index, |
91 const std::vector<uint8>& data, | 89 const std::vector<uint8>& data, |
92 double timestamp) { | 90 double timestamp) { |
93 NOTREACHED(); | 91 NOTREACHED(); |
94 } | 92 } |
95 | 93 |
96 void MidiManager::StartInitialization() { | 94 void MidiManager::StartInitialization() { |
(...skipping 28 matching lines...) Expand all Loading... |
125 | 123 |
126 for (ClientList::iterator i = clients_.begin(); i != clients_.end(); ++i) | 124 for (ClientList::iterator i = clients_.begin(); i != clients_.end(); ++i) |
127 (*i)->ReceiveMidiData(port_index, data, length, timestamp); | 125 (*i)->ReceiveMidiData(port_index, data, length, timestamp); |
128 } | 126 } |
129 | 127 |
130 void MidiManager::CompleteInitializationInternal(MidiResult result) { | 128 void MidiManager::CompleteInitializationInternal(MidiResult result) { |
131 TRACE_EVENT0("midi", "MidiManager::CompleteInitialization"); | 129 TRACE_EVENT0("midi", "MidiManager::CompleteInitialization"); |
132 | 130 |
133 base::AutoLock auto_lock(lock_); | 131 base::AutoLock auto_lock(lock_); |
134 DCHECK(clients_.empty()); | 132 DCHECK(clients_.empty()); |
135 DCHECK(!pending_clients_.empty()); | |
136 DCHECK(!initialized_); | 133 DCHECK(!initialized_); |
137 initialized_ = true; | 134 initialized_ = true; |
138 result_ = result; | 135 result_ = result; |
139 | 136 |
140 for (PendingClientMap::iterator it = pending_clients_.begin(); | 137 for (PendingClientMap::iterator it = pending_clients_.begin(); |
141 it != pending_clients_.end(); | 138 it != pending_clients_.end(); |
142 ++it) { | 139 ++it) { |
143 if (result_ == MIDI_OK) | 140 if (result_ == MIDI_OK) |
144 clients_.insert(it->second); | 141 clients_.insert(it->first); |
145 it->second->CompleteStartSession(it->first, result_); | 142 it->first->CompleteStartSession(it->second, result_); |
146 } | 143 } |
147 pending_clients_.clear(); | 144 pending_clients_.clear(); |
148 } | 145 } |
149 | 146 |
150 } // namespace media | 147 } // namespace media |
OLD | NEW |