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

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

Issue 1177973003: [Web MIDI] Use Android MIDI API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 4 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
OLDNEW
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_android.h"
6
7 #include "base/android/build_info.h"
8 #include "base/command_line.h"
5 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/strings/stringprintf.h"
11 #include "base/vlog.h"
12 #include "jni/MidiManagerAndroid_jni.h"
13 #include "media/midi/midi_device_android.h"
6 #include "media/midi/midi_manager_usb.h" 14 #include "media/midi/midi_manager_usb.h"
15 #include "media/midi/midi_output_port_android.h"
16 #include "media/midi/midi_switches.h"
7 #include "media/midi/usb_midi_device_factory_android.h" 17 #include "media/midi/usb_midi_device_factory_android.h"
8 18
9 namespace media { 19 namespace media {
10 namespace midi { 20 namespace midi {
11 21
12 MidiManager* MidiManager::Create() { 22 MidiManager* MidiManager::Create() {
13 return new MidiManagerUsb( 23 auto sdk_version = base::android::BuildInfo::GetInstance()->sdk_int();
14 scoped_ptr<UsbMidiDevice::Factory>(new UsbMidiDeviceFactoryAndroid)); 24 if (sdk_version <= base::android::SDK_VERSION_LOLLIPOP ||
25 !base::CommandLine::ForCurrentProcess()->HasSwitch(
26 switches::kUseAndroidMidiApi)) {
27 VLOG(0) << "WEBMIDI: Use usb-midi implementation";
28 return new MidiManagerUsb(
29 scoped_ptr<UsbMidiDevice::Factory>(new UsbMidiDeviceFactoryAndroid));
30 }
31
32 VLOG(0) << "WEBMIDI: Use Android M API implementation";
33 return new MidiManagerAndroid();
34 }
35
36 MidiManagerAndroid::MidiManagerAndroid() {
37 }
38
39 MidiManagerAndroid::~MidiManagerAndroid() {
40 }
41
42 void MidiManagerAndroid::StartInitialization() {
43 JNIEnv* env = base::android::AttachCurrentThread();
44
45 uintptr_t pointer = reinterpret_cast<uintptr_t>(this);
46 raw_manager_.Reset(Java_MidiManagerAndroid_create(
47 env, base::android::GetApplicationContext(), pointer));
48 scheduler_.reset(new MidiScheduler(this));
49 Java_MidiManagerAndroid_initialize(env, raw_manager_.obj());
50 }
51
52 void MidiManagerAndroid::DispatchSendMidiData(MidiManagerClient* client,
53 uint32 port_index,
54 const std::vector<uint8>& data,
55 double timestamp) {
56 if (port_index >= all_output_ports_.size()) {
57 // |port_index| is provided by a renderer so we can't believe that it is
58 // in the valid range.
59 return;
60 }
61 // output_streams_[port_index] is alive unless MidiManagerUsb is deleted.
62 // The task posted to the MidiScheduler will be disposed safely on deleting
63 // the scheduler.
64 scheduler_->PostSendDataTask(
65 client, data.size(), timestamp,
66 base::Bind(&MidiOutputPortAndroid::Send,
67 base::Unretained(all_output_ports_[port_index]), data));
68 }
69
70 void MidiManagerAndroid::OnReceivedData(MidiInputPortAndroid* port,
71 const uint8* data,
72 size_t size,
73 base::TimeTicks timestamp) {
74 const auto i = input_port_to_index_.find(port);
75 DCHECK(input_port_to_index_.end() != i);
76 ReceiveMidiData(i->second, data, size, timestamp);
77 }
78
79 void MidiManagerAndroid::OnInitialized(JNIEnv* env,
80 jobject caller,
81 jobjectArray devices) {
82 jsize length = env->GetArrayLength(devices);
83
84 for (jsize i = 0; i < length; ++i) {
85 jobject raw_device = env->GetObjectArrayElement(devices, i);
86 AddDevice(make_scoped_ptr(new MidiDeviceAndroid(env, raw_device, this)));
87 }
88 CompleteInitialization(Result::OK);
89 }
90
91 void MidiManagerAndroid::OnAttached(JNIEnv* env,
92 jobject caller,
93 jobject raw_device) {
94 AddDevice(make_scoped_ptr(new MidiDeviceAndroid(env, raw_device, this)));
95 }
96
97 void MidiManagerAndroid::OnDetached(JNIEnv* env,
98 jobject caller,
99 jobject raw_device) {
100 for (const auto& device : devices_) {
101 if (env->IsSameObject(device->raw_device(), raw_device)) {
102 for (const auto& port : device->input_ports()) {
103 DCHECK(input_port_to_index_.end() != input_port_to_index_.find(port));
104 size_t index = input_port_to_index_[port];
105 SetInputPortState(index, MIDI_PORT_DISCONNECTED);
106 }
107 for (const auto& port : device->output_ports()) {
108 DCHECK(output_port_to_index_.end() != output_port_to_index_.find(port));
109 size_t index = output_port_to_index_[port];
110 SetOutputPortState(index, MIDI_PORT_DISCONNECTED);
111 }
112 }
113 }
114 }
115
116 void MidiManagerAndroid::AddDevice(scoped_ptr<MidiDeviceAndroid> device) {
117 for (const auto& port : device->input_ports()) {
118 const size_t index = all_input_ports_.size();
119 all_input_ports_.push_back(port);
120 // Port ID must be unique in a MIDI manager. This ID setting is
121 // sufficiently unique although there is no user-friendly meaning.
122 // TODO(yhirano): Use a hashed string as ID.
123 const std::string id(
124 base::StringPrintf("port-in-%ld", static_cast<long>(index)));
125
126 input_port_to_index_.insert(std::make_pair(port, index));
127 AddInputPort(MidiPortInfo(id, device->GetManufacturer(),
128 device->GetProductName(),
129 device->GetDeviceVersion(), MIDI_PORT_OPENED));
130 }
131 for (const auto& port : device->output_ports()) {
132 const size_t index = all_output_ports_.size();
133 all_output_ports_.push_back(port);
134
135 // Port ID must be unique in a MIDI manager. This ID setting is
136 // sufficiently unique although there is no user-friendly meaning.
137 // TODO(yhirano): Use a hashed string as ID.
138 const std::string id(
139 base::StringPrintf("port-out-%ld", static_cast<long>(index)));
140
141 output_port_to_index_.insert(std::make_pair(port, index));
142 AddOutputPort(MidiPortInfo(id, device->GetManufacturer(),
143 device->GetProductName(),
144 device->GetDeviceVersion(), MIDI_PORT_OPENED));
145 }
146 devices_.push_back(device.release());
147 }
148
149 bool MidiManagerAndroid::Register(JNIEnv* env) {
150 return RegisterNativesImpl(env);
15 } 151 }
16 152
17 } // namespace midi 153 } // namespace midi
18 } // namespace media 154 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698