Home | History | Annotate | Download | only in midi
      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 
     14 namespace media {
     15 
     16 UsbMidiDeviceAndroid::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 
     24 UsbMidiDeviceAndroid::~UsbMidiDeviceAndroid() {
     25   JNIEnv* env = base::android::AttachCurrentThread();
     26   Java_UsbMidiDeviceAndroid_close(env, raw_device_.obj());
     27 }
     28 
     29 std::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 
     39 void 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 
     50 void 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 
     62 bool UsbMidiDeviceAndroid::RegisterUsbMidiDevice(JNIEnv* env) {
     63   return RegisterNativesImpl(env);
     64 }
     65 
     66 }  // namespace media
     67