midi_input_port_android.cc 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // Copyright 2015 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. #include "media/midi/midi_input_port_android.h"
  5. #include "base/android/jni_array.h"
  6. #include "base/time/time.h"
  7. #include "media/midi/midi_jni_headers/MidiInputPortAndroid_jni.h"
  8. using base::android::JavaParamRef;
  9. namespace midi {
  10. MidiInputPortAndroid::MidiInputPortAndroid(JNIEnv* env,
  11. jobject raw,
  12. Delegate* delegate)
  13. : raw_port_(env, raw), delegate_(delegate) {}
  14. MidiInputPortAndroid::~MidiInputPortAndroid() {
  15. Close();
  16. }
  17. bool MidiInputPortAndroid::Open() {
  18. JNIEnv* env = base::android::AttachCurrentThread();
  19. return Java_MidiInputPortAndroid_open(env, raw_port_,
  20. reinterpret_cast<jlong>(this));
  21. }
  22. void MidiInputPortAndroid::Close() {
  23. JNIEnv* env = base::android::AttachCurrentThread();
  24. Java_MidiInputPortAndroid_close(env, raw_port_);
  25. }
  26. void MidiInputPortAndroid::OnData(JNIEnv* env,
  27. const JavaParamRef<jbyteArray>& data,
  28. jint offset,
  29. jint size,
  30. jlong timestamp) {
  31. std::vector<uint8_t> bytes;
  32. base::android::JavaByteArrayToByteVector(env, data, &bytes);
  33. if (size == 0) {
  34. return;
  35. }
  36. // TimeTick's internal value is in microseconds, |timestamp| is in
  37. // nanoseconds. Both are monotonic.
  38. base::TimeTicks timestamp_to_pass = base::TimeTicks::FromInternalValue(
  39. timestamp / base::TimeTicks::kNanosecondsPerMicrosecond);
  40. delegate_->OnReceivedData(this, &bytes[offset], size, timestamp_to_pass);
  41. }
  42. } // namespace midi