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 <poll.h> | 7 #include <poll.h> |
8 #include <stdlib.h> | 8 #include <stdlib.h> |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <string> | 10 #include <string> |
11 | 11 |
12 #include "base/bind.h" | 12 #include "base/bind.h" |
13 #include "base/json/json_string_value_serializer.h" | 13 #include "base/json/json_string_value_serializer.h" |
14 #include "base/logging.h" | 14 #include "base/logging.h" |
15 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
16 #include "base/posix/eintr_wrapper.h" | 16 #include "base/posix/eintr_wrapper.h" |
17 #include "base/safe_strerror_posix.h" | 17 #include "base/posix/safe_strerror.h" |
18 #include "base/strings/string_number_conversions.h" | 18 #include "base/strings/string_number_conversions.h" |
19 #include "base/strings/stringprintf.h" | 19 #include "base/strings/stringprintf.h" |
20 #include "base/time/time.h" | 20 #include "base/time/time.h" |
21 #include "crypto/sha2.h" | 21 #include "crypto/sha2.h" |
22 #include "media/midi/midi_port_info.h" | 22 #include "media/midi/midi_port_info.h" |
23 | 23 |
24 namespace media { | 24 namespace media { |
25 namespace midi { | 25 namespace midi { |
26 | 26 |
27 namespace { | 27 namespace { |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
254 udev_monitor_.reset( | 254 udev_monitor_.reset( |
255 device::udev_monitor_new_from_netlink(udev_.get(), kUdev)); | 255 device::udev_monitor_new_from_netlink(udev_.get(), kUdev)); |
256 if (!udev_monitor_.get()) { | 256 if (!udev_monitor_.get()) { |
257 VLOG(1) << "udev_monitor_new_from_netlink fails"; | 257 VLOG(1) << "udev_monitor_new_from_netlink fails"; |
258 return CompleteInitialization(MIDI_INITIALIZATION_ERROR); | 258 return CompleteInitialization(MIDI_INITIALIZATION_ERROR); |
259 } | 259 } |
260 err = device::udev_monitor_filter_add_match_subsystem_devtype( | 260 err = device::udev_monitor_filter_add_match_subsystem_devtype( |
261 udev_monitor_.get(), kUdevSubsystemSound, nullptr); | 261 udev_monitor_.get(), kUdevSubsystemSound, nullptr); |
262 if (err != 0) { | 262 if (err != 0) { |
263 VLOG(1) << "udev_monitor_add_match_subsystem fails: " | 263 VLOG(1) << "udev_monitor_add_match_subsystem fails: " |
264 << safe_strerror(-err); | 264 << base::safe_strerror(-err); |
265 return CompleteInitialization(MIDI_INITIALIZATION_ERROR); | 265 return CompleteInitialization(MIDI_INITIALIZATION_ERROR); |
266 } | 266 } |
267 err = device::udev_monitor_enable_receiving(udev_monitor_.get()); | 267 err = device::udev_monitor_enable_receiving(udev_monitor_.get()); |
268 if (err != 0) { | 268 if (err != 0) { |
269 VLOG(1) << "udev_monitor_enable_receiving fails: " << safe_strerror(-err); | 269 VLOG(1) << "udev_monitor_enable_receiving fails: " |
| 270 << base::safe_strerror(-err); |
270 return CompleteInitialization(MIDI_INITIALIZATION_ERROR); | 271 return CompleteInitialization(MIDI_INITIALIZATION_ERROR); |
271 } | 272 } |
272 | 273 |
273 // Generate hotplug events for existing udev devices. | 274 // Generate hotplug events for existing udev devices. |
274 EnumerateUdevCards(); | 275 EnumerateUdevCards(); |
275 | 276 |
276 // Start processing events. | 277 // Start processing events. |
277 event_thread_.Start(); | 278 event_thread_.Start(); |
278 event_thread_.message_loop()->PostTask( | 279 event_thread_.message_loop()->PostTask( |
279 FROM_HERE, | 280 FROM_HERE, |
(...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
867 void MidiManagerAlsa::EventLoop() { | 868 void MidiManagerAlsa::EventLoop() { |
868 bool loop_again = true; | 869 bool loop_again = true; |
869 | 870 |
870 struct pollfd pfd[2]; | 871 struct pollfd pfd[2]; |
871 snd_seq_poll_descriptors(in_client_, &pfd[0], 1, POLLIN); | 872 snd_seq_poll_descriptors(in_client_, &pfd[0], 1, POLLIN); |
872 pfd[1].fd = device::udev_monitor_get_fd(udev_monitor_.get()); | 873 pfd[1].fd = device::udev_monitor_get_fd(udev_monitor_.get()); |
873 pfd[1].events = POLLIN; | 874 pfd[1].events = POLLIN; |
874 | 875 |
875 int err = HANDLE_EINTR(poll(pfd, arraysize(pfd), -1)); | 876 int err = HANDLE_EINTR(poll(pfd, arraysize(pfd), -1)); |
876 if (err < 0) { | 877 if (err < 0) { |
877 VLOG(1) << "poll fails: " << safe_strerror(errno); | 878 VLOG(1) << "poll fails: " << base::safe_strerror(errno); |
878 loop_again = false; | 879 loop_again = false; |
879 } else { | 880 } else { |
880 if (pfd[0].revents & POLLIN) { | 881 if (pfd[0].revents & POLLIN) { |
881 // Read available incoming MIDI data. | 882 // Read available incoming MIDI data. |
882 int remaining; | 883 int remaining; |
883 double timestamp = | 884 double timestamp = |
884 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); | 885 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); |
885 do { | 886 do { |
886 snd_seq_event_t* event; | 887 snd_seq_event_t* event; |
887 err = snd_seq_event_input(in_client_, &event); | 888 err = snd_seq_event_input(in_client_, &event); |
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1261 device::udev_enumerate_new(udev_.get())); | 1262 device::udev_enumerate_new(udev_.get())); |
1262 if (!enumerate.get()) { | 1263 if (!enumerate.get()) { |
1263 VLOG(1) << "udev_enumerate_new fails"; | 1264 VLOG(1) << "udev_enumerate_new fails"; |
1264 return false; | 1265 return false; |
1265 } | 1266 } |
1266 | 1267 |
1267 err = device::udev_enumerate_add_match_subsystem(enumerate.get(), | 1268 err = device::udev_enumerate_add_match_subsystem(enumerate.get(), |
1268 kUdevSubsystemSound); | 1269 kUdevSubsystemSound); |
1269 if (err) { | 1270 if (err) { |
1270 VLOG(1) << "udev_enumerate_add_match_subsystem fails: " | 1271 VLOG(1) << "udev_enumerate_add_match_subsystem fails: " |
1271 << safe_strerror(-err); | 1272 << base::safe_strerror(-err); |
1272 return false; | 1273 return false; |
1273 } | 1274 } |
1274 | 1275 |
1275 err = device::udev_enumerate_scan_devices(enumerate.get()); | 1276 err = device::udev_enumerate_scan_devices(enumerate.get()); |
1276 if (err) { | 1277 if (err) { |
1277 VLOG(1) << "udev_enumerate_scan_devices fails: " << safe_strerror(-err); | 1278 VLOG(1) << "udev_enumerate_scan_devices fails: " |
| 1279 << base::safe_strerror(-err); |
1278 return false; | 1280 return false; |
1279 } | 1281 } |
1280 | 1282 |
1281 udev_list_entry* list_entry; | 1283 udev_list_entry* list_entry; |
1282 auto* devices = device::udev_enumerate_get_list_entry(enumerate.get()); | 1284 auto* devices = device::udev_enumerate_get_list_entry(enumerate.get()); |
1283 udev_list_entry_foreach(list_entry, devices) { | 1285 udev_list_entry_foreach(list_entry, devices) { |
1284 const char* path = device::udev_list_entry_get_name(list_entry); | 1286 const char* path = device::udev_list_entry_get_name(list_entry); |
1285 device::ScopedUdevDevicePtr dev( | 1287 device::ScopedUdevDevicePtr dev( |
1286 device::udev_device_new_from_syspath(udev_.get(), path)); | 1288 device::udev_device_new_from_syspath(udev_.get(), path)); |
1287 if (dev.get()) | 1289 if (dev.get()) |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1358 source_map_[AddrToInt(client_id, port_id)] = port_index; | 1360 source_map_[AddrToInt(client_id, port_id)] = port_index; |
1359 return true; | 1361 return true; |
1360 } | 1362 } |
1361 | 1363 |
1362 MidiManager* MidiManager::Create() { | 1364 MidiManager* MidiManager::Create() { |
1363 return new MidiManagerAlsa(); | 1365 return new MidiManagerAlsa(); |
1364 } | 1366 } |
1365 | 1367 |
1366 } // namespace midi | 1368 } // namespace midi |
1367 } // namespace media | 1369 } // namespace media |
OLD | NEW |