Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(318)

Side by Side Diff: media/midi/midi_manager.cc

Issue 2673423002: Web MIDI: add dynamic MidiManager instantiation support for Linux (Closed)
Patch Set: rebase again Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/midi/midi_manager.h ('k') | media/midi/midi_manager_alsa.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/location.h" 8 #include "base/location.h"
9 #include "base/metrics/histogram_macros.h" 9 #include "base/metrics/histogram_macros.h"
10 #include "base/single_thread_task_runner.h" 10 #include "base/single_thread_task_runner.h"
(...skipping 28 matching lines...) Expand all
39 }; 39 };
40 40
41 void ReportUsage(Usage usage) { 41 void ReportUsage(Usage usage) {
42 UMA_HISTOGRAM_ENUMERATION("Media.Midi.Usage", 42 UMA_HISTOGRAM_ENUMERATION("Media.Midi.Usage",
43 static_cast<Sample>(usage), 43 static_cast<Sample>(usage),
44 static_cast<Sample>(Usage::MAX) + 1); 44 static_cast<Sample>(Usage::MAX) + 1);
45 } 45 }
46 46
47 } // namespace 47 } // namespace
48 48
49 MidiManager::MidiManager() 49 MidiManager::MidiManager(MidiService* service)
50 : initialization_state_(InitializationState::NOT_STARTED), 50 : initialization_state_(InitializationState::NOT_STARTED),
51 finalized_(false), 51 finalized_(false),
52 result_(Result::NOT_INITIALIZED) { 52 result_(Result::NOT_INITIALIZED),
53 service_(service) {
53 ReportUsage(Usage::CREATED); 54 ReportUsage(Usage::CREATED);
54 } 55 }
55 56
56 MidiManager::~MidiManager() { 57 MidiManager::~MidiManager() {
57 // Make sure that Finalize() is called to clean up resources allocated on 58 // Make sure that Finalize() is called to clean up resources allocated on
58 // the Chrome_IOThread. 59 // the Chrome_IOThread.
59 base::AutoLock auto_lock(lock_); 60 base::AutoLock auto_lock(lock_);
60 CHECK(finalized_); 61 CHECK(finalized_);
61 } 62 }
62 63
63 #if !defined(OS_MACOSX) && !defined(OS_WIN) && \ 64 #if !defined(OS_MACOSX) && !defined(OS_WIN) && \
64 !(defined(USE_ALSA) && defined(USE_UDEV)) && !defined(OS_ANDROID) 65 !(defined(USE_ALSA) && defined(USE_UDEV)) && !defined(OS_ANDROID)
65 MidiManager* MidiManager::Create() { 66 MidiManager* MidiManager::Create(MidiService* service) {
66 ReportUsage(Usage::CREATED_ON_UNSUPPORTED_PLATFORMS); 67 ReportUsage(Usage::CREATED_ON_UNSUPPORTED_PLATFORMS);
67 return new MidiManager; 68 return new MidiManager(service);
68 } 69 }
69 #endif 70 #endif
70 71
71 void MidiManager::Shutdown() { 72 void MidiManager::Shutdown() {
72 UMA_HISTOGRAM_ENUMERATION("Media.Midi.ResultOnShutdown", 73 UMA_HISTOGRAM_ENUMERATION("Media.Midi.ResultOnShutdown",
73 static_cast<int>(result_), 74 static_cast<int>(result_),
74 static_cast<int>(Result::MAX) + 1); 75 static_cast<int>(Result::MAX) + 1);
75 base::AutoLock auto_lock(lock_); 76 bool shutdown_synchronously = false;
76 if (session_thread_runner_) { 77 {
77 session_thread_runner_->PostTask( 78 base::AutoLock auto_lock(lock_);
78 FROM_HERE, base::Bind(&MidiManager::ShutdownOnSessionThread, 79 if (session_thread_runner_) {
79 base::Unretained(this))); 80 if (session_thread_runner_->BelongsToCurrentThread()) {
80 session_thread_runner_ = nullptr; 81 shutdown_synchronously = true;
81 } else { 82 } else {
82 finalized_ = true; 83 session_thread_runner_->PostTask(
84 FROM_HERE, base::Bind(&MidiManager::ShutdownOnSessionThread,
85 base::Unretained(this)));
86 }
87 session_thread_runner_ = nullptr;
88 } else {
89 finalized_ = true;
90 }
83 } 91 }
92 if (shutdown_synchronously)
93 ShutdownOnSessionThread();
84 } 94 }
85 95
86 void MidiManager::StartSession(MidiManagerClient* client) { 96 void MidiManager::StartSession(MidiManagerClient* client) {
87 ReportUsage(Usage::SESSION_STARTED); 97 ReportUsage(Usage::SESSION_STARTED);
88 98
89 bool needs_initialization = false; 99 bool needs_initialization = false;
90 100
91 { 101 {
92 base::AutoLock auto_lock(lock_); 102 base::AutoLock auto_lock(lock_);
93 if (clients_.find(client) != clients_.end() || 103 if (clients_.find(client) != clients_.end() ||
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
264 Finalize(); 274 Finalize();
265 base::AutoLock auto_lock(lock_); 275 base::AutoLock auto_lock(lock_);
266 finalized_ = true; 276 finalized_ = true;
267 277
268 // Detach all clients so that they do not call MidiManager methods any more. 278 // Detach all clients so that they do not call MidiManager methods any more.
269 for (auto* client : clients_) 279 for (auto* client : clients_)
270 client->Detach(); 280 client->Detach();
271 } 281 }
272 282
273 } // namespace midi 283 } // namespace midi
OLDNEW
« no previous file with comments | « media/midi/midi_manager.h ('k') | media/midi/midi_manager_alsa.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698