• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
14 namespace 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.
19 class 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 
jack()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