1// 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
26  const UsbMidiJack& jack() const { return jack_; }
27
28 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_
58