| // Copyright 2014 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_USB_H_ |
| #define MEDIA_MIDI_MIDI_MANAGER_USB_H_ |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| #include <memory> |
| #include <unordered_map> |
| #include <utility> |
| #include <vector> |
| |
| #include "base/compiler_specific.h" |
| #include "base/hash/hash.h" |
| #include "base/macros.h" |
| #include "base/synchronization/lock.h" |
| #include "base/time/time.h" |
| #include "media/midi/midi_manager.h" |
| #include "media/midi/usb_midi_device.h" |
| #include "media/midi/usb_midi_export.h" |
| #include "media/midi/usb_midi_input_stream.h" |
| #include "media/midi/usb_midi_jack.h" |
| #include "media/midi/usb_midi_output_stream.h" |
| |
| namespace midi { |
| |
| class MidiService; |
| |
| // MidiManager for USB-MIDI. |
| class USB_MIDI_EXPORT MidiManagerUsb : public MidiManager, |
| public UsbMidiDeviceDelegate, |
| public UsbMidiInputStream::Delegate { |
| public: |
| MidiManagerUsb(MidiService* service, |
| std::unique_ptr<UsbMidiDevice::Factory> device_factory); |
| |
| MidiManagerUsb(const MidiManagerUsb&) = delete; |
| MidiManagerUsb& operator=(const MidiManagerUsb&) = delete; |
| |
| ~MidiManagerUsb() override; |
| |
| // MidiManager implementation. |
| void StartInitialization() override; |
| void DispatchSendMidiData(MidiManagerClient* client, |
| uint32_t port_index, |
| const std::vector<uint8_t>& data, |
| base::TimeTicks timestamp) override; |
| |
| // UsbMidiDeviceDelegate implementation. |
| void ReceiveUsbMidiData(UsbMidiDevice* device, |
| int endpoint_number, |
| const uint8_t* data, |
| size_t size, |
| base::TimeTicks time) override; |
| void OnDeviceAttached(std::unique_ptr<UsbMidiDevice> device) override; |
| void OnDeviceDetached(size_t index) override; |
| |
| // UsbMidiInputStream::Delegate implementation. |
| void OnReceivedData(size_t jack_index, |
| const uint8_t* data, |
| size_t size, |
| base::TimeTicks time) override; |
| |
| const std::vector<std::unique_ptr<UsbMidiOutputStream>>& output_streams() |
| const { |
| return output_streams_; |
| } |
| const UsbMidiInputStream* input_stream() const { return input_stream_.get(); } |
| |
| private: |
| // Initializes this object. |
| // When the initialization finishes, CompleteInitialization will be called |
| // with the result on the same thread, but asynchronously. |
| // When this factory is destroyed during the operation, the operation |
| // will be canceled silently (i.e. CompleteInitialization will not be called). |
| void Initialize(); |
| |
| void OnEnumerateDevicesDone(bool result, UsbMidiDevice::Devices* devices); |
| bool AddPorts(UsbMidiDevice* device, int device_id); |
| |
| // TODO(toyoshim): Remove |lock_| once dynamic instantiation mode is enabled |
| // by default. This protects objects allocated on the I/O thread from doubly |
| // released on the main thread. |
| base::Lock lock_; |
| |
| std::unique_ptr<UsbMidiDevice::Factory> device_factory_; |
| std::vector<std::unique_ptr<UsbMidiDevice>> devices_; |
| std::vector<std::unique_ptr<UsbMidiOutputStream>> output_streams_; |
| std::unique_ptr<UsbMidiInputStream> input_stream_; |
| |
| // A map from <endpoint_number, cable_number> to the index of input jacks. |
| std::unordered_map<std::pair<int, int>, |
| size_t, |
| base::IntPairHash<std::pair<int, int>>> |
| input_jack_dictionary_; |
| }; |
| |
| } // namespace midi |
| |
| #endif // MEDIA_MIDI_MIDI_MANAGER_USB_H_ |