OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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_service.h" | 5 #include "media/midi/midi_service.h" |
6 | 6 |
7 #include "base/feature_list.h" | |
8 #include "base/memory/ptr_util.h" | |
9 #include "base/strings/stringprintf.h" | |
7 #include "media/midi/midi_manager.h" | 10 #include "media/midi/midi_manager.h" |
11 #include "media/midi/midi_switches.h" | |
8 | 12 |
9 namespace midi { | 13 namespace midi { |
10 | 14 |
11 MidiService::MidiService(std::unique_ptr<MidiManager> manager) { | 15 namespace { |
16 | |
17 bool IsDynamicInstantiationEnabled() { | |
18 // TODO(toyoshim): Support on all platforms. See https://crbug.com/672793. | |
19 #if defined(OS_LINUX) | |
20 return base::FeatureList::IsEnabled( | |
21 features::kMidiManagerDynamicInstantiation); | |
22 #else | |
23 return false; | |
24 #endif | |
25 } | |
26 | |
27 } // namespace | |
28 | |
29 MidiService::MidiService(void) | |
30 : is_dynamic_instantiation_enabled_(IsDynamicInstantiationEnabled()) { | |
12 base::AutoLock lock(lock_); | 31 base::AutoLock lock(lock_); |
13 if (manager.get()) | 32 |
14 manager_ = std::move(manager); | 33 active_clients_ = 0u; |
yhirano
2017/02/08 10:04:37
Can you move this initialization to the member ini
Takashi Toyoshima
2017/02/08 11:08:56
Done.
| |
15 else | 34 if (!is_dynamic_instantiation_enabled_) |
16 manager_.reset(MidiManager::Create()); | 35 manager_ = base::WrapUnique(MidiManager::Create(this)); |
36 } | |
37 | |
38 MidiService::MidiService(std::unique_ptr<MidiManager> manager) | |
39 : is_dynamic_instantiation_enabled_(false) { | |
40 base::AutoLock lock(lock_); | |
41 | |
42 active_clients_ = 0u; | |
yhirano
2017/02/08 10:04:37
ditto
Takashi Toyoshima
2017/02/08 11:08:56
Done.
| |
43 manager_ = std::move(manager); | |
17 } | 44 } |
18 | 45 |
19 MidiService::~MidiService() { | 46 MidiService::~MidiService() { |
20 base::AutoLock lock(lock_); | 47 base::AutoLock lock(lock_); |
48 | |
21 manager_.reset(); | 49 manager_.reset(); |
50 | |
51 base::AutoLock threads_lock(threads_lock_); | |
52 threads_.clear(); | |
22 } | 53 } |
23 | 54 |
24 void MidiService::Shutdown() { | 55 void MidiService::Shutdown() { |
25 base::AutoLock lock(lock_); | 56 base::AutoLock lock(lock_); |
26 manager_->Shutdown(); | 57 if (manager_.get()) |
58 manager_->Shutdown(); | |
27 } | 59 } |
28 | 60 |
29 void MidiService::StartSession(MidiManagerClient* client) { | 61 void MidiService::StartSession(MidiManagerClient* client) { |
30 base::AutoLock lock(lock_); | 62 base::AutoLock lock(lock_); |
63 if (!manager_.get()) { | |
64 CHECK(is_dynamic_instantiation_enabled_); | |
65 CHECK_EQ(0u, active_clients_); | |
66 manager_.reset(MidiManager::Create(this)); | |
67 } | |
68 active_clients_++; | |
31 manager_->StartSession(client); | 69 manager_->StartSession(client); |
32 } | 70 } |
33 | 71 |
34 void MidiService::EndSession(MidiManagerClient* client) { | 72 void MidiService::EndSession(MidiManagerClient* client) { |
35 base::AutoLock lock(lock_); | 73 base::AutoLock lock(lock_); |
74 CHECK(manager_.get()); | |
75 CHECK_NE(0u, active_clients_); | |
36 manager_->EndSession(client); | 76 manager_->EndSession(client); |
77 active_clients_--; | |
78 if (is_dynamic_instantiation_enabled_ && !active_clients_) { | |
79 // MidiManager for each platform should be able to shutdown correctly even | |
80 // if following Shutdown() call happens in the middle of | |
81 // StartInitialization() to support the dynamic instantiation feature. | |
82 manager_->Shutdown(); | |
83 manager_.reset(); | |
84 } | |
37 } | 85 } |
38 | 86 |
39 void MidiService::DispatchSendMidiData(MidiManagerClient* client, | 87 void MidiService::DispatchSendMidiData(MidiManagerClient* client, |
40 uint32_t port_index, | 88 uint32_t port_index, |
41 const std::vector<uint8_t>& data, | 89 const std::vector<uint8_t>& data, |
42 double timestamp) { | 90 double timestamp) { |
43 base::AutoLock lock(lock_); | 91 base::AutoLock lock(lock_); |
44 manager_->DispatchSendMidiData(client, port_index, data, timestamp); | 92 manager_->DispatchSendMidiData(client, port_index, data, timestamp); |
45 } | 93 } |
46 | 94 |
95 scoped_refptr<base::SingleThreadTaskRunner> MidiService::GetTaskRunner( | |
96 size_t runner_id) { | |
97 base::AutoLock lock(threads_lock_); | |
98 if (threads_.size() <= runner_id) | |
99 threads_.resize(runner_id + 1); | |
100 if (!threads_[runner_id].get()) { | |
101 threads_[runner_id] = base::MakeUnique<base::Thread>( | |
102 base::StringPrintf("MidiServiceThread(%zu)", runner_id)); | |
103 threads_[runner_id]->Start(); | |
104 } | |
105 return threads_[runner_id]->task_runner(); | |
106 } | |
107 | |
47 } // namespace midi | 108 } // namespace midi |
OLD | NEW |