blob: 7d122b4aef3b9851e96792897e08e23d1f6738cc [file] [log] [blame]
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +00001// 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
5#ifndef MEDIA_MIDI_USB_MIDI_OUTPUT_STREAM_H_
6#define MEDIA_MIDI_USB_MIDI_OUTPUT_STREAM_H_
7
avi793390d2015-12-22 22:22:36 -08008#include <stddef.h>
Avi Drissman3528fd02015-12-18 20:11:31 -05009#include <stdint.h>
10
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000011#include <vector>
12
Avi Drissman3528fd02015-12-18 20:11:31 -050013#include "base/macros.h"
brettw49ff0172015-05-05 12:43:04 -070014#include "media/midi/usb_midi_export.h"
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000015#include "media/midi/usb_midi_jack.h"
16
toyoshime147c5e2015-05-07 21:58:31 -070017namespace midi {
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000018
19// UsbMidiOutputStream converts MIDI data to USB-MIDI data.
20// See "USB Device Class Definition for MIDI Devices" Release 1.0,
21// Section 4 "USB-MIDI Event Packets" for details.
brettw49ff0172015-05-05 12:43:04 -070022class USB_MIDI_EXPORT UsbMidiOutputStream {
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000023 public:
24 explicit UsbMidiOutputStream(const UsbMidiJack& jack);
25
Peter Boström5e5c4fa2021-10-15 21:43:24 +000026 UsbMidiOutputStream(const UsbMidiOutputStream&) = delete;
27 UsbMidiOutputStream& operator=(const UsbMidiOutputStream&) = delete;
28
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000029 // Converts |data| to USB-MIDI data and send it to the jack.
Avi Drissman3528fd02015-12-18 20:11:31 -050030 void Send(const std::vector<uint8_t>& data);
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000031
yhirano@chromium.org3cecb692014-01-29 09:27:41 +000032 const UsbMidiJack& jack() const { return jack_; }
33
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000034 private:
Avi Drissman3528fd02015-12-18 20:11:31 -050035 size_t GetSize(const std::vector<uint8_t>& data) const;
36 uint8_t Get(const std::vector<uint8_t>& data, size_t index) const;
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000037
Avi Drissman3528fd02015-12-18 20:11:31 -050038 bool PushSysExMessage(const std::vector<uint8_t>& data,
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000039 size_t* current,
Avi Drissman3528fd02015-12-18 20:11:31 -050040 std::vector<uint8_t>* data_to_send);
41 bool PushSysCommonMessage(const std::vector<uint8_t>& data,
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000042 size_t* current,
Avi Drissman3528fd02015-12-18 20:11:31 -050043 std::vector<uint8_t>* data_to_send);
44 void PushSysRTMessage(const std::vector<uint8_t>& data,
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000045 size_t* current,
Avi Drissman3528fd02015-12-18 20:11:31 -050046 std::vector<uint8_t>* data_to_send);
47 bool PushChannelMessage(const std::vector<uint8_t>& data,
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000048 size_t* current,
Avi Drissman3528fd02015-12-18 20:11:31 -050049 std::vector<uint8_t>* data_to_send);
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000050
51 static const size_t kPacketContentSize = 3;
52
53 UsbMidiJack jack_;
54 size_t pending_size_;
Avi Drissman3528fd02015-12-18 20:11:31 -050055 uint8_t pending_data_[kPacketContentSize];
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000056 bool is_sending_sysex_;
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000057};
58
toyoshime147c5e2015-05-07 21:58:31 -070059} // namespace midi
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000060
61#endif // MEDIA_MIDI_USB_MIDI_OUTPUT_STREAM_H_