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/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 Loading... |
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; |
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 Loading... |
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 |
OLD | NEW |