blob: 1d98d584fd0c6e4a635968460fd869ef7b171fdf [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
8#include <vector>
9
10#include "base/basictypes.h"
11#include "media/base/media_export.h"
12#include "media/midi/usb_midi_jack.h"
13
14namespace media {
15
16// UsbMidiOutputStream converts MIDI data to USB-MIDI data.
17// See "USB Device Class Definition for MIDI Devices" Release 1.0,
18// Section 4 "USB-MIDI Event Packets" for details.
19class MEDIA_EXPORT UsbMidiOutputStream {
20 public:
21 explicit UsbMidiOutputStream(const UsbMidiJack& jack);
22
23 // Converts |data| to USB-MIDI data and send it to the jack.
24 void Send(const std::vector<uint8>& data);
25
yhirano@chromium.org3cecb692014-01-29 09:27:41 +000026 const UsbMidiJack& jack() const { return jack_; }
27
yhirano@chromium.org0e3c3ea2014-01-22 10:39:41 +000028 private:
29 size_t GetSize(const std::vector<uint8>& data) const;
30 uint8_t Get(const std::vector<uint8>& data, size_t index) const;
31
32 bool PushSysExMessage(const std::vector<uint8>& data,
33 size_t* current,
34 std::vector<uint8>* data_to_send);
35 bool PushSysCommonMessage(const std::vector<uint8>& data,
36 size_t* current,
37 std::vector<uint8>* data_to_send);
38 void PushSysRTMessage(const std::vector<uint8>& data,
39 size_t* current,
40 std::vector<uint8>* data_to_send);
41 bool PushChannelMessage(const std::vector<uint8>& data,
42 size_t* current,
43 std::vector<uint8>* data_to_send);
44
45 static const size_t kPacketContentSize = 3;
46
47 UsbMidiJack jack_;
48 size_t pending_size_;
49 uint8 pending_data_[kPacketContentSize];
50 bool is_sending_sysex_;
51
52 DISALLOW_COPY_AND_ASSIGN(UsbMidiOutputStream);
53};
54
55} // namespace media
56
57#endif // MEDIA_MIDI_USB_MIDI_OUTPUT_STREAM_H_