summaryrefslogtreecommitdiffstats
path: root/media/midi
diff options
context:
space:
mode:
authoryhirano@chromium.org <yhirano@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-12 08:23:48 +0000
committeryhirano@chromium.org <yhirano@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-12 08:23:48 +0000
commit3e17c7e42f11398b1e0387bd551379b13b7b4538 (patch)
tree6e42087202a32b33a388b588ac43a5cfb2a1c0e3 /media/midi
parent5fb6f94f70432acc9b5c995e3cc6f1f85fc767bd (diff)
downloadchromium_src-3e17c7e42f11398b1e0387bd551379b13b7b4538.zip
chromium_src-3e17c7e42f11398b1e0387bd551379b13b7b4538.tar.gz
chromium_src-3e17c7e42f11398b1e0387bd551379b13b7b4538.tar.bz2
Implement WebMIDI for android, output side.
Implement WebMIDI for android. This CL implements the output function only. BUG=303596 R=toyoshim@chromium.org Review URL: https://codereview.chromium.org/133163006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@250648 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/midi')
-rw-r--r--media/midi/midi_manager.cc3
-rw-r--r--media/midi/midi_manager_android.cc16
-rw-r--r--media/midi/usb_midi_device.h1
-rw-r--r--media/midi/usb_midi_device_android.cc49
-rw-r--r--media/midi/usb_midi_device_android.h45
-rw-r--r--media/midi/usb_midi_device_factory_android.cc78
-rw-r--r--media/midi/usb_midi_device_factory_android.h48
7 files changed, 239 insertions, 1 deletions
diff --git a/media/midi/midi_manager.cc b/media/midi/midi_manager.cc
index 49a51b3..4447a05 100644
--- a/media/midi/midi_manager.cc
+++ b/media/midi/midi_manager.cc
@@ -9,7 +9,8 @@
namespace media {
-#if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(USE_ALSA)
+#if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(USE_ALSA) && \
+ !defined(OS_ANDROID)
// TODO(toyoshim): implement MidiManager for other platforms.
MidiManager* MidiManager::Create() {
return new MidiManager;
diff --git a/media/midi/midi_manager_android.cc b/media/midi/midi_manager_android.cc
new file mode 100644
index 0000000..b8385fb
--- /dev/null
+++ b/media/midi/midi_manager_android.cc
@@ -0,0 +1,16 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/memory/scoped_ptr.h"
+#include "media/midi/midi_manager_usb.h"
+#include "media/midi/usb_midi_device_factory_android.h"
+
+namespace media {
+
+MidiManager* MidiManager::Create() {
+ return new MidiManagerUsb(
+ scoped_ptr<UsbMidiDevice::Factory>(new UsbMidiDeviceFactoryAndroid));
+}
+
+} // namespace media
diff --git a/media/midi/usb_midi_device.h b/media/midi/usb_midi_device.h
index 59f129d..28b32bc 100644
--- a/media/midi/usb_midi_device.h
+++ b/media/midi/usb_midi_device.h
@@ -51,6 +51,7 @@ class MEDIA_EXPORT UsbMidiDevice {
// Otherwise |callback| will be called with |false| and empty devices.
// When this factory is destroyed during the operation, the operation
// will be canceled silently (i.e. |callback| will not be called).
+ // This function can be called at most once per instance.
virtual void EnumerateDevices(UsbMidiDeviceDelegate* delegate,
Callback callback) = 0;
};
diff --git a/media/midi/usb_midi_device_android.cc b/media/midi/usb_midi_device_android.cc
new file mode 100644
index 0000000..f3ccc43
--- /dev/null
+++ b/media/midi/usb_midi_device_android.cc
@@ -0,0 +1,49 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/midi/usb_midi_device_android.h"
+
+#include <jni.h>
+#include <vector>
+
+#include "base/android/jni_array.h"
+#include "jni/UsbMidiDeviceAndroid_jni.h"
+
+namespace media {
+
+UsbMidiDeviceAndroid::UsbMidiDeviceAndroid(ObjectRef raw_device,
+ UsbMidiDeviceDelegate* delegate)
+ : raw_device_(raw_device), delegate_(delegate) {}
+
+UsbMidiDeviceAndroid::~UsbMidiDeviceAndroid() {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_UsbMidiDeviceAndroid_close(env, raw_device_.obj());
+}
+
+std::vector<uint8> UsbMidiDeviceAndroid::GetDescriptor() {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ base::android::ScopedJavaLocalRef<jbyteArray> descriptors =
+ Java_UsbMidiDeviceAndroid_getDescriptors(env, raw_device_.obj());
+
+ std::vector<uint8> ret;
+ base::android::JavaByteArrayToByteVector(env, descriptors.obj(), &ret);
+ return ret;
+}
+
+void UsbMidiDeviceAndroid::Send(int endpoint_number,
+ const std::vector<uint8>& data) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ const uint8* head = data.size() ? &data[0] : NULL;
+ ScopedJavaLocalRef<jbyteArray> data_to_pass =
+ base::android::ToJavaByteArray(env, head, data.size());
+
+ Java_UsbMidiDeviceAndroid_send(
+ env, raw_device_.obj(), endpoint_number, data_to_pass.obj());
+}
+
+bool UsbMidiDeviceAndroid::RegisterUsbMidiDevice(JNIEnv* env) {
+ return RegisterNativesImpl(env);
+}
+
+} // namespace media
diff --git a/media/midi/usb_midi_device_android.h b/media/midi/usb_midi_device_android.h
new file mode 100644
index 0000000..ed0a414
--- /dev/null
+++ b/media/midi/usb_midi_device_android.h
@@ -0,0 +1,45 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_MIDI_USB_MIDI_DEVICE_ANDROID_H_
+#define MEDIA_MIDI_USB_MIDI_DEVICE_ANDROID_H_
+
+#include <jni.h>
+#include <vector>
+
+#include "base/android/scoped_java_ref.h"
+#include "base/basictypes.h"
+#include "base/callback.h"
+#include "media/base/media_export.h"
+#include "media/midi/usb_midi_device.h"
+
+namespace media {
+
+class MEDIA_EXPORT UsbMidiDeviceAndroid : public UsbMidiDevice {
+ public:
+ typedef base::android::ScopedJavaLocalRef<jobject> ObjectRef;
+
+ static scoped_ptr<Factory> CreateFactory();
+
+ UsbMidiDeviceAndroid(ObjectRef raw_device, UsbMidiDeviceDelegate* delegate);
+ virtual ~UsbMidiDeviceAndroid();
+
+ // UsbMidiDevice implementation.
+ virtual std::vector<uint8> GetDescriptor() OVERRIDE;
+ virtual void Send(int endpoint_number,
+ const std::vector<uint8>& data) OVERRIDE;
+
+ static bool RegisterUsbMidiDevice(JNIEnv* env);
+
+ private:
+ // The actual device object.
+ base::android::ScopedJavaGlobalRef<jobject> raw_device_;
+ UsbMidiDeviceDelegate* delegate_;
+
+ DISALLOW_IMPLICIT_CONSTRUCTORS(UsbMidiDeviceAndroid);
+};
+
+} // namespace media
+
+#endif // MEDIA_MIDI_USB_MIDI_DEVICE_ANDROID_H_
diff --git a/media/midi/usb_midi_device_factory_android.cc b/media/midi/usb_midi_device_factory_android.cc
new file mode 100644
index 0000000..11385c26
--- /dev/null
+++ b/media/midi/usb_midi_device_factory_android.cc
@@ -0,0 +1,78 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/midi/usb_midi_device_factory_android.h"
+
+#include <jni.h>
+#include <vector>
+
+#include "base/android/scoped_java_ref.h"
+#include "base/bind.h"
+#include "base/containers/hash_tables.h"
+#include "base/lazy_instance.h"
+#include "base/memory/scoped_vector.h"
+#include "base/memory/weak_ptr.h"
+#include "base/message_loop/message_loop.h"
+#include "base/synchronization/lock.h"
+#include "jni/UsbMidiDeviceFactoryAndroid_jni.h"
+#include "media/midi/usb_midi_device_android.h"
+
+namespace media {
+
+namespace {
+
+typedef UsbMidiDevice::Factory::Callback Callback;
+
+} // namespace
+
+UsbMidiDeviceFactoryAndroid::UsbMidiDeviceFactoryAndroid() : delegate_(NULL) {}
+
+UsbMidiDeviceFactoryAndroid::~UsbMidiDeviceFactoryAndroid() {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ if (!raw_factory_.is_null())
+ Java_UsbMidiDeviceFactoryAndroid_close(env, raw_factory_.obj());
+}
+
+void UsbMidiDeviceFactoryAndroid::EnumerateDevices(
+ UsbMidiDeviceDelegate* delegate,
+ Callback callback) {
+ DCHECK(!delegate_);
+ JNIEnv* env = base::android::AttachCurrentThread();
+ uintptr_t pointer = reinterpret_cast<uintptr_t>(this);
+ raw_factory_.Reset(Java_UsbMidiDeviceFactoryAndroid_create(env, pointer));
+
+ delegate_ = delegate;
+ callback_ = callback;
+
+ if (Java_UsbMidiDeviceFactoryAndroid_enumerateDevices(
+ env, raw_factory_.obj(), base::android::GetApplicationContext())) {
+ // Asynchronous operation.
+ return;
+ }
+ // No devices are found.
+ ScopedVector<UsbMidiDevice> devices;
+ callback.Run(true, &devices);
+}
+
+// Called from the Java world.
+void UsbMidiDeviceFactoryAndroid::OnUsbMidiDeviceRequestDone(
+ JNIEnv* env,
+ jobject caller,
+ jobjectArray devices) {
+ size_t size = env->GetArrayLength(devices);
+ ScopedVector<UsbMidiDevice> devices_to_pass;
+ for (size_t i = 0; i < size; ++i) {
+ UsbMidiDeviceAndroid::ObjectRef raw_device(
+ env, env->GetObjectArrayElement(devices, i));
+ devices_to_pass.push_back(new UsbMidiDeviceAndroid(raw_device, delegate_));
+ }
+
+ callback_.Run(true, &devices_to_pass);
+}
+
+bool UsbMidiDeviceFactoryAndroid::RegisterUsbMidiDeviceFactory(JNIEnv* env) {
+ return RegisterNativesImpl(env);
+}
+
+} // namespace media
diff --git a/media/midi/usb_midi_device_factory_android.h b/media/midi/usb_midi_device_factory_android.h
new file mode 100644
index 0000000..63a9eb3
--- /dev/null
+++ b/media/midi/usb_midi_device_factory_android.h
@@ -0,0 +1,48 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_MIDI_USB_MIDI_DEVICE_FACTORY_ANDROID_H_
+#define MEDIA_MIDI_USB_MIDI_DEVICE_FACTORY_ANDROID_H_
+
+#include <jni.h>
+#include <vector>
+
+#include "base/android/scoped_java_ref.h"
+#include "base/basictypes.h"
+#include "base/callback.h"
+#include "base/memory/scoped_vector.h"
+#include "base/memory/weak_ptr.h"
+#include "media/base/media_export.h"
+#include "media/midi/usb_midi_device.h"
+
+namespace media {
+
+// This class enumerates UsbMidiDevices.
+class MEDIA_EXPORT UsbMidiDeviceFactoryAndroid : public UsbMidiDevice::Factory {
+ public:
+ UsbMidiDeviceFactoryAndroid();
+ virtual ~UsbMidiDeviceFactoryAndroid();
+
+ // UsbMidiDevice::Factory implementation.
+ virtual void EnumerateDevices(UsbMidiDeviceDelegate* delegate,
+ Callback callback) OVERRIDE;
+
+ void OnUsbMidiDeviceRequestDone(JNIEnv* env,
+ jobject caller,
+ jobjectArray devices);
+
+ static bool RegisterUsbMidiDeviceFactory(JNIEnv* env);
+
+ private:
+ base::android::ScopedJavaGlobalRef<jobject> raw_factory_;
+ // Not owned.
+ UsbMidiDeviceDelegate* delegate_;
+ Callback callback_;
+
+ DISALLOW_COPY_AND_ASSIGN(UsbMidiDeviceFactoryAndroid);
+};
+
+} // namespace media
+
+#endif // MEDIA_MIDI_USB_MIDI_DEVICE_FACTORY_ANDROID_H_