OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_alsa.h" | 5 #include "media/midi/midi_manager_alsa.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 #include <poll.h> | 8 #include <poll.h> |
9 #include <stddef.h> | 9 #include <stddef.h> |
10 #include <stdlib.h> | 10 #include <stdlib.h> |
(...skipping 14 matching lines...) Expand all Loading... |
25 #include "base/strings/string_number_conversions.h" | 25 #include "base/strings/string_number_conversions.h" |
26 #include "base/strings/stringprintf.h" | 26 #include "base/strings/stringprintf.h" |
27 #include "base/time/time.h" | 27 #include "base/time/time.h" |
28 #include "crypto/sha2.h" | 28 #include "crypto/sha2.h" |
29 #include "media/midi/midi_port_info.h" | 29 #include "media/midi/midi_port_info.h" |
30 | 30 |
31 namespace midi { | 31 namespace midi { |
32 | 32 |
33 namespace { | 33 namespace { |
34 | 34 |
35 using midi::mojom::Result; | 35 using mojom::PortState; |
| 36 using mojom::Result; |
36 | 37 |
37 // Per-output buffer. This can be smaller, but then large sysex messages | 38 // Per-output buffer. This can be smaller, but then large sysex messages |
38 // will be (harmlessly) split across multiple seq events. This should | 39 // will be (harmlessly) split across multiple seq events. This should |
39 // not have any real practical effect, except perhaps to slightly reorder | 40 // not have any real practical effect, except perhaps to slightly reorder |
40 // realtime messages with respect to sysex. | 41 // realtime messages with respect to sysex. |
41 const size_t kSendBufferSize = 256; | 42 const size_t kSendBufferSize = 256; |
42 | 43 |
43 // Minimum client id for which we will have ALSA card devices for. When we | 44 // Minimum client id for which we will have ALSA card devices for. When we |
44 // are searching for card devices (used to get the path, id, and manufacturer), | 45 // are searching for card devices (used to get the path, id, and manufacturer), |
45 // we don't want to get confused by kernel clients that do not have a card. | 46 // we don't want to get confused by kernel clients that do not have a card. |
(...skipping 1149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1195 // Disconnect any connected old ports that are now missing. | 1196 // Disconnect any connected old ports that are now missing. |
1196 for (auto& old_port : port_state_) { | 1197 for (auto& old_port : port_state_) { |
1197 if (old_port->connected() && | 1198 if (old_port->connected() && |
1198 (new_port_state->FindConnected(*old_port) == new_port_state->end())) { | 1199 (new_port_state->FindConnected(*old_port) == new_port_state->end())) { |
1199 old_port->set_connected(false); | 1200 old_port->set_connected(false); |
1200 uint32_t web_port_index = old_port->web_port_index(); | 1201 uint32_t web_port_index = old_port->web_port_index(); |
1201 switch (old_port->type()) { | 1202 switch (old_port->type()) { |
1202 case MidiPort::Type::kInput: | 1203 case MidiPort::Type::kInput: |
1203 source_map_.erase( | 1204 source_map_.erase( |
1204 AddrToInt(old_port->client_id(), old_port->port_id())); | 1205 AddrToInt(old_port->client_id(), old_port->port_id())); |
1205 SetInputPortState(web_port_index, MIDI_PORT_DISCONNECTED); | 1206 SetInputPortState(web_port_index, PortState::DISCONNECTED); |
1206 break; | 1207 break; |
1207 case MidiPort::Type::kOutput: | 1208 case MidiPort::Type::kOutput: |
1208 DeleteAlsaOutputPort(web_port_index); | 1209 DeleteAlsaOutputPort(web_port_index); |
1209 SetOutputPortState(web_port_index, MIDI_PORT_DISCONNECTED); | 1210 SetOutputPortState(web_port_index, PortState::DISCONNECTED); |
1210 break; | 1211 break; |
1211 } | 1212 } |
1212 } | 1213 } |
1213 } | 1214 } |
1214 | 1215 |
1215 // Reconnect or add new ports. | 1216 // Reconnect or add new ports. |
1216 auto it = new_port_state->begin(); | 1217 auto it = new_port_state->begin(); |
1217 while (it != new_port_state->end()) { | 1218 while (it != new_port_state->end()) { |
1218 auto& new_port = *it; | 1219 auto& new_port = *it; |
1219 auto old_port = port_state_.Find(*new_port); | 1220 auto old_port = port_state_.Find(*new_port); |
1220 if (old_port == port_state_.end()) { | 1221 if (old_port == port_state_.end()) { |
1221 // Add new port. | 1222 // Add new port. |
1222 const auto& opaque_key = new_port->OpaqueKey(); | 1223 const auto& opaque_key = new_port->OpaqueKey(); |
1223 const auto& manufacturer = new_port->manufacturer(); | 1224 const auto& manufacturer = new_port->manufacturer(); |
1224 const auto& port_name = new_port->port_name(); | 1225 const auto& port_name = new_port->port_name(); |
1225 const auto& version = new_port->version(); | 1226 const auto& version = new_port->version(); |
1226 const auto& type = new_port->type(); | 1227 const auto& type = new_port->type(); |
1227 const auto& client_id = new_port->client_id(); | 1228 const auto& client_id = new_port->client_id(); |
1228 const auto& port_id = new_port->port_id(); | 1229 const auto& port_id = new_port->port_id(); |
1229 | 1230 |
1230 uint32_t web_port_index = port_state_.push_back(std::move(new_port)); | 1231 uint32_t web_port_index = port_state_.push_back(std::move(new_port)); |
1231 it = new_port_state->erase(it); | 1232 it = new_port_state->erase(it); |
1232 | 1233 |
1233 MidiPortInfo info(opaque_key, manufacturer, port_name, version, | 1234 MidiPortInfo info(opaque_key, manufacturer, port_name, version, |
1234 MIDI_PORT_OPENED); | 1235 PortState::OPENED); |
1235 switch (type) { | 1236 switch (type) { |
1236 case MidiPort::Type::kInput: | 1237 case MidiPort::Type::kInput: |
1237 if (Subscribe(web_port_index, client_id, port_id)) | 1238 if (Subscribe(web_port_index, client_id, port_id)) |
1238 AddInputPort(info); | 1239 AddInputPort(info); |
1239 break; | 1240 break; |
1240 case MidiPort::Type::kOutput: | 1241 case MidiPort::Type::kOutput: |
1241 if (CreateAlsaOutputPort(web_port_index, client_id, port_id)) | 1242 if (CreateAlsaOutputPort(web_port_index, client_id, port_id)) |
1242 AddOutputPort(info); | 1243 AddOutputPort(info); |
1243 break; | 1244 break; |
1244 } | 1245 } |
1245 } else if (!(*old_port)->connected()) { | 1246 } else if (!(*old_port)->connected()) { |
1246 // Reconnect. | 1247 // Reconnect. |
1247 uint32_t web_port_index = (*old_port)->web_port_index(); | 1248 uint32_t web_port_index = (*old_port)->web_port_index(); |
1248 (*old_port)->Update(new_port->path(), new_port->client_id(), | 1249 (*old_port)->Update(new_port->path(), new_port->client_id(), |
1249 new_port->port_id(), new_port->client_name(), | 1250 new_port->port_id(), new_port->client_name(), |
1250 new_port->port_name(), new_port->manufacturer(), | 1251 new_port->port_name(), new_port->manufacturer(), |
1251 new_port->version()); | 1252 new_port->version()); |
1252 switch ((*old_port)->type()) { | 1253 switch ((*old_port)->type()) { |
1253 case MidiPort::Type::kInput: | 1254 case MidiPort::Type::kInput: |
1254 if (Subscribe(web_port_index, (*old_port)->client_id(), | 1255 if (Subscribe(web_port_index, (*old_port)->client_id(), |
1255 (*old_port)->port_id())) | 1256 (*old_port)->port_id())) |
1256 SetInputPortState(web_port_index, MIDI_PORT_OPENED); | 1257 SetInputPortState(web_port_index, PortState::OPENED); |
1257 break; | 1258 break; |
1258 case MidiPort::Type::kOutput: | 1259 case MidiPort::Type::kOutput: |
1259 if (CreateAlsaOutputPort(web_port_index, (*old_port)->client_id(), | 1260 if (CreateAlsaOutputPort(web_port_index, (*old_port)->client_id(), |
1260 (*old_port)->port_id())) | 1261 (*old_port)->port_id())) |
1261 SetOutputPortState(web_port_index, MIDI_PORT_OPENED); | 1262 SetOutputPortState(web_port_index, PortState::OPENED); |
1262 break; | 1263 break; |
1263 } | 1264 } |
1264 (*old_port)->set_connected(true); | 1265 (*old_port)->set_connected(true); |
1265 ++it; | 1266 ++it; |
1266 } else { | 1267 } else { |
1267 ++it; | 1268 ++it; |
1268 } | 1269 } |
1269 } | 1270 } |
1270 } | 1271 } |
1271 | 1272 |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1398 // Update our map. | 1399 // Update our map. |
1399 source_map_[AddrToInt(client_id, port_id)] = port_index; | 1400 source_map_[AddrToInt(client_id, port_id)] = port_index; |
1400 return true; | 1401 return true; |
1401 } | 1402 } |
1402 | 1403 |
1403 MidiManager* MidiManager::Create() { | 1404 MidiManager* MidiManager::Create() { |
1404 return new MidiManagerAlsa(); | 1405 return new MidiManagerAlsa(); |
1405 } | 1406 } |
1406 | 1407 |
1407 } // namespace midi | 1408 } // namespace midi |
OLD | NEW |