midi_manager_android.h 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. #ifndef MEDIA_MIDI_MIDI_MANAGER_ANDROID_H_
  5. #define MEDIA_MIDI_MIDI_MANAGER_ANDROID_H_
  6. #include <jni.h>
  7. #include <stddef.h>
  8. #include <stdint.h>
  9. #include <memory>
  10. #include <unordered_map>
  11. #include <vector>
  12. #include "base/android/scoped_java_ref.h"
  13. #include "base/synchronization/lock.h"
  14. #include "base/time/time.h"
  15. #include "media/midi/midi_input_port_android.h"
  16. #include "media/midi/midi_manager.h"
  17. namespace midi {
  18. class MidiDeviceAndroid;
  19. class MidiOutputPortAndroid;
  20. class MidiService;
  21. // MidiManagerAndroid is a MidiManager subclass for Android M or newer. For
  22. // older android OSes, we use MidiManagerUsb.
  23. class MidiManagerAndroid final : public MidiManager,
  24. public MidiInputPortAndroid::Delegate {
  25. public:
  26. explicit MidiManagerAndroid(MidiService* service);
  27. ~MidiManagerAndroid() override;
  28. // MidiManager implementation.
  29. void StartInitialization() override;
  30. void DispatchSendMidiData(MidiManagerClient* client,
  31. uint32_t port_index,
  32. const std::vector<uint8_t>& data,
  33. base::TimeTicks timestamp) override;
  34. // MidiInputPortAndroid::Delegate implementation.
  35. void OnReceivedData(MidiInputPortAndroid*,
  36. const uint8_t* data,
  37. size_t size,
  38. base::TimeTicks timestamp) override;
  39. // Called from the Java world.
  40. void OnInitialized(JNIEnv* env,
  41. const base::android::JavaParamRef<jobjectArray>& devices);
  42. void OnInitializationFailed(JNIEnv* env);
  43. void OnAttached(JNIEnv* env,
  44. const base::android::JavaParamRef<jobject>& device);
  45. void OnDetached(JNIEnv* env,
  46. const base::android::JavaParamRef<jobject>& device);
  47. private:
  48. void AddDevice(std::unique_ptr<MidiDeviceAndroid> device);
  49. void AddInputPortAndroid(MidiInputPortAndroid* port,
  50. MidiDeviceAndroid* device);
  51. void AddOutputPortAndroid(MidiOutputPortAndroid* port,
  52. MidiDeviceAndroid* device);
  53. // TODO(toyoshim): Remove |lock_| once dynamic instantiation mode is enabled
  54. // by default. This protects objects allocated on the I/O thread from doubly
  55. // released on the main thread.
  56. base::Lock lock_;
  57. std::vector<std::unique_ptr<MidiDeviceAndroid>> devices_;
  58. // All ports held in |devices_|. Each device has ownership of ports, but we
  59. // can store pointers here because a device will keep its ports while it is
  60. // alive.
  61. std::vector<MidiInputPortAndroid*> all_input_ports_;
  62. // A dictionary from a port to its index.
  63. // input_port_to_index_[all_input_ports_[i]] == i for each valid |i|.
  64. std::unordered_map<MidiInputPortAndroid*, size_t> input_port_to_index_;
  65. // Ditto for output ports.
  66. std::vector<MidiOutputPortAndroid*> all_output_ports_;
  67. std::unordered_map<MidiOutputPortAndroid*, size_t> output_port_to_index_;
  68. base::android::ScopedJavaGlobalRef<jobject> raw_manager_;
  69. };
  70. } // namespace midi
  71. #endif // MEDIA_MIDI_MIDI_MANAGER_ANDROID_H_