usb_midi_device_factory_android.cc 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. #include "media/midi/usb_midi_device_factory_android.h"
  5. #include <stddef.h>
  6. #include <memory>
  7. #include "base/bind.h"
  8. #include "base/synchronization/lock.h"
  9. #include "media/midi/midi_jni_headers/UsbMidiDeviceFactoryAndroid_jni.h"
  10. #include "media/midi/usb_midi_device_android.h"
  11. using base::android::JavaParamRef;
  12. namespace midi {
  13. namespace {
  14. using Callback = UsbMidiDevice::Factory::Callback;
  15. } // namespace
  16. UsbMidiDeviceFactoryAndroid::UsbMidiDeviceFactoryAndroid()
  17. : delegate_(nullptr) {}
  18. UsbMidiDeviceFactoryAndroid::~UsbMidiDeviceFactoryAndroid() {
  19. JNIEnv* env = base::android::AttachCurrentThread();
  20. if (!raw_factory_.is_null())
  21. Java_UsbMidiDeviceFactoryAndroid_close(env, raw_factory_);
  22. }
  23. void UsbMidiDeviceFactoryAndroid::EnumerateDevices(
  24. UsbMidiDeviceDelegate* delegate,
  25. Callback callback) {
  26. DCHECK(!delegate_);
  27. JNIEnv* env = base::android::AttachCurrentThread();
  28. uintptr_t pointer = reinterpret_cast<uintptr_t>(this);
  29. raw_factory_.Reset(Java_UsbMidiDeviceFactoryAndroid_create(env, pointer));
  30. delegate_ = delegate;
  31. callback_ = std::move(callback);
  32. if (Java_UsbMidiDeviceFactoryAndroid_enumerateDevices(env, raw_factory_)) {
  33. // Asynchronous operation.
  34. return;
  35. }
  36. // No devices are found.
  37. UsbMidiDevice::Devices devices;
  38. std::move(callback_).Run(true, &devices);
  39. }
  40. // Called from the Java world.
  41. void UsbMidiDeviceFactoryAndroid::OnUsbMidiDeviceRequestDone(
  42. JNIEnv* env,
  43. const JavaParamRef<jobjectArray>& devices) {
  44. UsbMidiDevice::Devices devices_to_pass;
  45. for (auto raw_device : devices.ReadElements<jobject>()) {
  46. devices_to_pass.push_back(
  47. std::make_unique<UsbMidiDeviceAndroid>(raw_device, delegate_));
  48. }
  49. std::move(callback_).Run(true, &devices_to_pass);
  50. }
  51. // Called from the Java world.
  52. void UsbMidiDeviceFactoryAndroid::OnUsbMidiDeviceAttached(
  53. JNIEnv* env,
  54. const JavaParamRef<jobject>& device) {
  55. delegate_->OnDeviceAttached(
  56. std::make_unique<UsbMidiDeviceAndroid>(device, delegate_));
  57. }
  58. // Called from the Java world.
  59. void UsbMidiDeviceFactoryAndroid::OnUsbMidiDeviceDetached(
  60. JNIEnv* env,
  61. jint index) {
  62. delegate_->OnDeviceDetached(index);
  63. }
  64. } // namespace midi