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 3// found in the LICENSE file. 4 5#include "media/midi/usb_midi_device_android.h" 6 7#include <jni.h> 8#include <vector> 9 10#include "base/android/jni_array.h" 11#include "base/time/time.h" 12#include "jni/UsbMidiDeviceAndroid_jni.h" 13 14namespace media { 15 16UsbMidiDeviceAndroid::UsbMidiDeviceAndroid(ObjectRef raw_device, 17 UsbMidiDeviceDelegate* delegate) 18 : raw_device_(raw_device), delegate_(delegate) { 19 JNIEnv* env = base::android::AttachCurrentThread(); 20 Java_UsbMidiDeviceAndroid_registerSelf( 21 env, raw_device_.obj(), reinterpret_cast<jlong>(this)); 22} 23 24UsbMidiDeviceAndroid::~UsbMidiDeviceAndroid() { 25 JNIEnv* env = base::android::AttachCurrentThread(); 26 Java_UsbMidiDeviceAndroid_close(env, raw_device_.obj()); 27} 28 29std::vector<uint8> UsbMidiDeviceAndroid::GetDescriptor() { 30 JNIEnv* env = base::android::AttachCurrentThread(); 31 base::android::ScopedJavaLocalRef<jbyteArray> descriptors = 32 Java_UsbMidiDeviceAndroid_getDescriptors(env, raw_device_.obj()); 33 34 std::vector<uint8> ret; 35 base::android::JavaByteArrayToByteVector(env, descriptors.obj(), &ret); 36 return ret; 37} 38 39void UsbMidiDeviceAndroid::Send(int endpoint_number, 40 const std::vector<uint8>& data) { 41 JNIEnv* env = base::android::AttachCurrentThread(); 42 const uint8* head = data.size() ? &data[0] : NULL; 43 ScopedJavaLocalRef<jbyteArray> data_to_pass = 44 base::android::ToJavaByteArray(env, head, data.size()); 45 46 Java_UsbMidiDeviceAndroid_send( 47 env, raw_device_.obj(), endpoint_number, data_to_pass.obj()); 48} 49 50void UsbMidiDeviceAndroid::OnData(JNIEnv* env, 51 jobject caller, 52 jint endpoint_number, 53 jbyteArray data) { 54 std::vector<uint8> bytes; 55 base::android::JavaByteArrayToByteVector(env, data, &bytes); 56 57 const uint8* head = bytes.size() ? &bytes[0] : NULL; 58 delegate_->ReceiveUsbMidiData(this, endpoint_number, head, bytes.size(), 59 base::TimeTicks::HighResNow()); 60} 61 62bool UsbMidiDeviceAndroid::RegisterUsbMidiDevice(JNIEnv* env) { 63 return RegisterNativesImpl(env); 64} 65 66} // namespace media 67