diff options
author | yhirano@chromium.org <yhirano@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-12 08:23:48 +0000 |
---|---|---|
committer | yhirano@chromium.org <yhirano@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-12 08:23:48 +0000 |
commit | 3e17c7e42f11398b1e0387bd551379b13b7b4538 (patch) | |
tree | 6e42087202a32b33a388b588ac43a5cfb2a1c0e3 /media/midi | |
parent | 5fb6f94f70432acc9b5c995e3cc6f1f85fc767bd (diff) | |
download | chromium_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.cc | 3 | ||||
-rw-r--r-- | media/midi/midi_manager_android.cc | 16 | ||||
-rw-r--r-- | media/midi/usb_midi_device.h | 1 | ||||
-rw-r--r-- | media/midi/usb_midi_device_android.cc | 49 | ||||
-rw-r--r-- | media/midi/usb_midi_device_android.h | 45 | ||||
-rw-r--r-- | media/midi/usb_midi_device_factory_android.cc | 78 | ||||
-rw-r--r-- | media/midi/usb_midi_device_factory_android.h | 48 |
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_ |