ardour
Event.cpp
Go to the documentation of this file.
1 /* This file is part of Evoral.
2  * Copyright (C) 2008 David 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 <glib.h>
20 #include "evoral/Event.hpp"
21 
22 namespace Evoral {
23 
25 
28 {
29  return g_atomic_int_get (&_event_id_counter);
30 }
31 
32 void
34 {
35  g_atomic_int_set (&_event_id_counter, n);
36 }
37 
40 {
41  return g_atomic_int_add (&_event_id_counter, 1);
42 }
43 
44 #ifdef EVORAL_EVENT_ALLOC
45 
46 template<typename Timestamp>
47 Event<Timestamp>::Event(EventType type, Timestamp time, uint32_t size, uint8_t* buf, bool alloc)
48  : _type(type)
49  , _original_time(time)
50  , _nominal_time(time)
51  , _size(size)
52  , _buf(buf)
53  , _id(-1)
54  , _owns_buf(alloc)
55 {
56  if (alloc) {
57  _buf = (uint8_t*)malloc(_size);
58  if (buf) {
59  memcpy(_buf, buf, _size);
60  } else {
61  memset(_buf, 0, _size);
62  }
63  }
64 }
65 
66 template<typename Timestamp>
67 Event<Timestamp>::Event(EventType type,
68  Timestamp time,
69  uint32_t size,
70  const uint8_t* buf)
71  : _type(type)
72  , _original_time(time)
73  , _nominal_time(time)
74  , _size(size)
75  , _buf((uint8_t*)malloc(size))
76  , _id(-1)
77  , _owns_buf(true)
78 {
79  memcpy(_buf, buf, _size);
80 }
81 
82 template<typename Timestamp>
83 Event<Timestamp>::Event(const Event& copy, bool owns_buf)
84  : _type(copy._type)
85  , _original_time(copy._original_time)
86  , _nominal_time(copy._nominal_time)
87  , _size(copy._size)
88  , _buf(copy._buf)
89  , _id(copy.id())
90  , _owns_buf(owns_buf)
91 {
92  if (owns_buf) {
93  _buf = (uint8_t*)malloc(_size);
94  if (copy._buf) {
95  memcpy(_buf, copy._buf, _size);
96  } else {
97  memset(_buf, 0, _size);
98  }
99  }
100 }
101 
102 template<typename Timestamp>
103 Event<Timestamp>::~Event() {
104  if (_owns_buf) {
105  free(_buf);
106  }
107 }
108 
109 template<typename Timestamp>
110 const Event<Timestamp>&
111 Event<Timestamp>::operator=(const Event& copy)
112 {
113  _id = copy.id(); // XXX is this right? do we want ID copy semantics?
114  _type = copy._type;
115  _original_time = copy._original_time;
116  _nominal_time = copy._nominal_time;
117  _owns_buf = copy._owns_buf;
118  if (_owns_buf) {
119  if (copy._buf) {
120  if (copy._size > _size) {
121  _buf = (uint8_t*)::realloc(_buf, copy._size);
122  }
123  memcpy(_buf, copy._buf, copy._size);
124  } else {
125  free(_buf);
126  _buf = NULL;
127  }
128  } else {
129  _buf = copy._buf;
130  }
131 
132  _size = copy._size;
133  return *this;
134 }
135 
136 template<typename Timestamp>
137 void
138 Event<Timestamp>::set (const uint8_t* buf, uint32_t size, Timestamp t)
139 {
140  if (_owns_buf) {
141  if (_size < size) {
142  _buf = (uint8_t*) ::realloc(_buf, size);
143  }
144  memcpy (_buf, buf, size);
145  } else {
146  /* XXX this is really dangerous given the
147  const-ness of buf. The API should really
148  intervene here.
149  */
150  _buf = const_cast<uint8_t*> (buf);
151  }
152 
153  _original_time = t;
154  _nominal_time = t;
155  _size = size;
156 }
157 
158 template<typename Timestamp>
159 void
160 Event<Timestamp>::set_time (Timestamp t)
161 {
162  _nominal_time = t;
163 }
164 
165 template<typename Timestamp>
166 void
167 Event<Timestamp>::set_original_time (Timestamp t)
168 {
169  _original_time = t;
170 }
171 
172 #endif // EVORAL_EVENT_ALLOC
173 
174 template class Event<Evoral::Beats>;
175 template class Event<double>;
176 template class Event<int64_t>;
177 
178 } // namespace Evoral
179 
int32_t event_id_t
Definition: types.hpp:40
LIBEVORAL_API event_id_t event_id_counter()
Definition: Event.cpp:27
LIBEVORAL_API void init_event_id_counter(event_id_t n)
Definition: Event.cpp:33
LIBEVORAL_API event_id_t next_event_id()
Definition: Event.cpp:39
uint32_t EventType
Definition: types.hpp:43
Event(EventType type=0, Time time=Time(), uint32_t size=0, uint8_t *buf=NULL, bool alloc=false)
static event_id_t _event_id_counter
Definition: Event.cpp:24