15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/midi/usb_midi_device_android.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <jni.h> 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector> 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/android/jni_array.h" 115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/time/time.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "jni/UsbMidiDeviceAndroid_jni.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace media { 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UsbMidiDeviceAndroid::UsbMidiDeviceAndroid(ObjectRef raw_device, 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UsbMidiDeviceDelegate* delegate) 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : raw_device_(raw_device), delegate_(delegate) { 19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch JNIEnv* env = base::android::AttachCurrentThread(); 20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Java_UsbMidiDeviceAndroid_registerSelf( 21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch env, raw_device_.obj(), reinterpret_cast<jlong>(this)); 22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UsbMidiDeviceAndroid::~UsbMidiDeviceAndroid() { 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) JNIEnv* env = base::android::AttachCurrentThread(); 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Java_UsbMidiDeviceAndroid_close(env, raw_device_.obj()); 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::vector<uint8> UsbMidiDeviceAndroid::GetDescriptor() { 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) JNIEnv* env = base::android::AttachCurrentThread(); 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::android::ScopedJavaLocalRef<jbyteArray> descriptors = 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Java_UsbMidiDeviceAndroid_getDescriptors(env, raw_device_.obj()); 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<uint8> ret; 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::android::JavaByteArrayToByteVector(env, descriptors.obj(), &ret); 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ret; 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void UsbMidiDeviceAndroid::Send(int endpoint_number, 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<uint8>& data) { 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) JNIEnv* env = base::android::AttachCurrentThread(); 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const uint8* head = data.size() ? &data[0] : NULL; 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedJavaLocalRef<jbyteArray> data_to_pass = 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::android::ToJavaByteArray(env, head, data.size()); 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Java_UsbMidiDeviceAndroid_send( 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) env, raw_device_.obj(), endpoint_number, data_to_pass.obj()); 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid UsbMidiDeviceAndroid::OnData(JNIEnv* env, 51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch jobject caller, 52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch jint endpoint_number, 53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch jbyteArray data) { 54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::vector<uint8> bytes; 55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::android::JavaByteArrayToByteVector(env, data, &bytes); 56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const uint8* head = bytes.size() ? &bytes[0] : NULL; 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu delegate_->ReceiveUsbMidiData(this, endpoint_number, head, bytes.size(), 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::TimeTicks::HighResNow()); 60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool UsbMidiDeviceAndroid::RegisterUsbMidiDevice(JNIEnv* env) { 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return RegisterNativesImpl(env); 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace media 67