merge from 2.0-ongoing @ 3581
[ardour.git] / libs / midi++2 / event.cc
1 #include "midi++/event.h"
2
3 namespace MIDI {
4
5 #ifdef MIDI_EVENT_ALLOW_ALLOC
6 Event::Event(double t, uint32_t s, uint8_t* b, bool owns_buffer)
7         : _time(t)
8         , _size(s)
9         , _buffer(b)
10         , _owns_buffer(owns_buffer)
11 {
12         if (owns_buffer) {
13                 _buffer = (uint8_t*)malloc(_size);
14                 if (b) {
15                         memcpy(_buffer, b, _size);
16                 } else {
17                         memset(_buffer, 0, _size);
18                 }
19         }
20 }
21
22 Event::Event(const XMLNode& event)
23 {
24         string name = event.name();
25         
26         if (name == "ControlChange") {
27                 
28         } else if (name == "ProgramChange") {
29                 
30         }
31 }
32
33 Event::Event(const Event& copy, bool owns_buffer)
34         : _time(copy._time)
35         , _size(copy._size)
36         , _buffer(copy._buffer)
37         , _owns_buffer(owns_buffer)
38 {
39         if (owns_buffer) {
40                 _buffer = (uint8_t*)malloc(_size);
41                 if (copy._buffer) {
42                         memcpy(_buffer, copy._buffer, _size);
43                 } else {
44                         memset(_buffer, 0, _size);
45                 }
46         }
47 }
48
49 Event::~Event() {
50         if (_owns_buffer) {
51                 free(_buffer);
52         }
53 }
54
55
56 #endif // MIDI_EVENT_ALLOW_ALLOC
57
58 std::string      
59 Event::to_string() const 
60 {
61         std::ostringstream result(std::ios::ate);
62         result << "MIDI::Event type:" << std::hex << "0x" << int(type()) << "   buffer: ";
63         
64         for(uint32_t i = 0; i < size(); ++i) {
65                 result << " 0x" << int(_buffer[i]); 
66         }
67         return result.str();
68 }
69
70 boost::shared_ptr<XMLNode> 
71 Event::to_xml() const
72 {
73         XMLNode *result = 0;
74         
75         switch (type()) {
76                 case MIDI_CMD_CONTROL:
77                         result = new XMLNode("ControlChange");
78                         result->add_property("Channel", channel());
79                         result->add_property("Control", cc_number());
80                         result->add_property("Value",   cc_value());
81                         break;
82                         
83                 case MIDI_CMD_PGM_CHANGE:
84                         result = new XMLNode("ProgramChange");
85                         result->add_property("Channel", channel());
86                         result->add_property("number",  pgm_number());
87                         break;
88                 
89                 default:
90                         // The implementation is continued as needed
91                         break;
92         }
93         
94         return boost::shared_ptr<XMLNode>(result);
95 }
96
97 } // namespace MIDI