// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MEDIA_MIDI_MIDI_MANAGER_ANDROID_H_ #define MEDIA_MIDI_MIDI_MANAGER_ANDROID_H_ #include #include #include #include #include "base/android/scoped_java_ref.h" #include "base/containers/hash_tables.h" #include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" #include "base/time/time.h" #include "media/midi/midi_input_port_android.h" #include "media/midi/midi_manager.h" #include "media/midi/midi_scheduler.h" namespace media { namespace midi { class MidiDeviceAndroid; class MidiOutputPortAndroid; // MidiManagerAndroid is a MidiManager subclass for Android M or newer. For // older android OSes, we use MidiManagerUsb. class MidiManagerAndroid final : public MidiManager, public MidiInputPortAndroid::Delegate { public: MidiManagerAndroid(); ~MidiManagerAndroid() override; // MidiManager implementation. void StartInitialization() override; void DispatchSendMidiData(MidiManagerClient* client, uint32_t port_index, const std::vector& data, double timestamp) override; // MidiInputPortAndroid::Delegate implementation. void OnReceivedData(MidiInputPortAndroid*, const uint8_t* data, size_t size, base::TimeTicks timestamp) override; // Called from the Java world. void OnInitialized(JNIEnv* env, const base::android::JavaParamRef& caller, const base::android::JavaParamRef& devices); void OnAttached(JNIEnv* env, const base::android::JavaParamRef& caller, const base::android::JavaParamRef& device); void OnDetached(JNIEnv* env, const base::android::JavaParamRef& caller, const base::android::JavaParamRef& device); static bool Register(JNIEnv* env); private: void AddDevice(scoped_ptr device); void AddInputPortAndroid(MidiInputPortAndroid* port, MidiDeviceAndroid* device); void AddOutputPortAndroid(MidiOutputPortAndroid* port, MidiDeviceAndroid* device); ScopedVector devices_; // All ports held in |devices_|. Each device has ownership of ports, but we // can store pointers here because a device will keep its ports while it is // alive. std::vector all_input_ports_; // A dictionary from a port to its index. // input_port_to_index_[all_input_ports_[i]] == i for each valid |i|. base::hash_map input_port_to_index_; // Ditto for output ports. std::vector all_output_ports_; base::hash_map output_port_to_index_; base::android::ScopedJavaGlobalRef raw_manager_; scoped_ptr scheduler_; }; } // namespace midi } // namespace media #endif // MEDIA_MIDI_MIDI_MANAGER_ANDROID_H_