blob: c176e46ef4c077993a967999616e83a897c89862 [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
Avi Drissman3528fd02015-12-18 20:11:31 -05008#include <stdint.h>
9
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000010#include <vector>
11
Avi Drissman3528fd02015-12-18 20:11:31 -050012#include "base/macros.h"
brettw49ff0172015-05-05 12:43:04 -070013#include "media/midi/usb_midi_export.h"
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000014#include "media/midi/usb_midi_jack.h"
15
16namespace media {
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
26 // Converts |data| to USB-MIDI data and send it to the jack.
Avi Drissman3528fd02015-12-18 20:11:31 -050027 void Send(const std::vector<uint8_t>& data);
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000028
yhirano@chromium.org3cecb692014-01-29 09:27:41 +000029 const UsbMidiJack& jack() const { return jack_; }
30
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000031 private:
Avi Drissman3528fd02015-12-18 20:11:31 -050032 size_t GetSize(const std::vector<uint8_t>& data) const;
33 uint8_t Get(const std::vector<uint8_t>& data, size_t index) const;
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000034
Avi Drissman3528fd02015-12-18 20:11:31 -050035 bool PushSysExMessage(const std::vector<uint8_t>& data,
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000036 size_t* current,
Avi Drissman3528fd02015-12-18 20:11:31 -050037 std::vector<uint8_t>* data_to_send);
38 bool PushSysCommonMessage(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 void PushSysRTMessage(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 bool PushChannelMessage(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);
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000047
48 static const size_t kPacketContentSize = 3;
49
50 UsbMidiJack jack_;
51 size_t pending_size_;
Avi Drissman3528fd02015-12-18 20:11:31 -050052 uint8_t pending_data_[kPacketContentSize];
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000053 bool is_sending_sysex_;
54
55 DISALLOW_COPY_AND_ASSIGN(UsbMidiOutputStream);
56};
57
toyoshime147c5e2015-05-07 21:58:31 -070058} // namespace midi
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000059} // namespace media
60
61#endif // MEDIA_MIDI_USB_MIDI_OUTPUT_STREAM_H_