71d1808628aeea9a00b80087333ec3f5e23ac56c
[ardour.git] / libs / evoral / src / Event.cpp
1 /* This file is part of Evoral.
2  * Copyright (C) 2008 Dave Robillard <http://drobilla.net>
3  * Copyright (C) 2000-2008 Paul Davis
4  * 
5  * Evoral is free software; you can redistribute it and/or modify it under the
6  * terms of the GNU General Public License as published by the Free Software
7  * Foundation; either version 2 of the License, or (at your option) any later
8  * version.
9  * 
10  * Evoral is distributed in the hope that it will be useful, but WITHOUT ANY
11  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for details.
13  * 
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18
19 #include <evoral/Event.hpp>
20
21 namespace Evoral {
22
23 #ifdef EVENT_ALLOW_ALLOC
24 Event::Event(double t, uint32_t s, uint8_t* b, bool owns_buffer)
25         : _time(t)
26         , _size(s)
27         , _buffer(b)
28         , _owns_buffer(owns_buffer)
29 {
30         if (owns_buffer) {
31                 _buffer = (uint8_t*)malloc(_size);
32                 if (b) {
33                         memcpy(_buffer, b, _size);
34                 } else {
35                         memset(_buffer, 0, _size);
36                 }
37         }
38 }
39
40 Event::Event(const Event& copy, bool owns_buffer)
41         : _time(copy._time)
42         , _size(copy._size)
43         , _buffer(copy._buffer)
44         , _owns_buffer(owns_buffer)
45 {
46         if (owns_buffer) {
47                 _buffer = (uint8_t*)malloc(_size);
48                 if (copy._buffer) {
49                         memcpy(_buffer, copy._buffer, _size);
50                 } else {
51                         memset(_buffer, 0, _size);
52                 }
53         }
54 }
55
56 Event::~Event() {
57         if (_owns_buffer) {
58                 free(_buffer);
59         }
60 }
61
62 #endif // EVENT_ALLOW_ALLOC
63
64 #ifdef EVENT_WITH_XML
65
66 Event::Event(const XMLNode& event)
67 {
68         string name = event.name();
69         
70         if (name == "ControlChange") {
71                 
72         } else if (name == "ProgramChange") {
73                 
74         }
75 }
76
77
78 boost::shared_ptr<XMLNode> 
79 Event::to_xml() const
80 {
81         XMLNode *result = 0;
82         
83         switch (type()) {
84         case MIDI_CMD_CONTROL:
85                 result = new XMLNode("ControlChange");
86                 result->add_property("Channel", channel());
87                 result->add_property("Control", cc_number());
88                 result->add_property("Value",   cc_value());
89                 break;
90                         
91         case MIDI_CMD_PGM_CHANGE:
92                 result = new XMLNode("ProgramChange");
93                 result->add_property("Channel", channel());
94                 result->add_property("Number",  pgm_number());
95                 break;
96                 
97         default:
98                 // The implementation is continued as needed
99                 break;
100         }
101         
102         return boost::shared_ptr<XMLNode>(result);
103 }
104 #endif // EVENT_WITH_XML
105
106 } // namespace MIDI
107