MusicalTime => Beats.
[ardour.git] / libs / evoral / src / Event.cpp
index b64ab7347c99564f3f7d2b1e761f51a52ffd9eb7..66e45ab2ad706bfa5b31752f8aa903f2a1a0a842 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of Evoral.
- * Copyright (C) 2008 Dave Robillard <http://drobilla.net>
+ * Copyright (C) 2008 David Robillard <http://drobilla.net>
  * Copyright (C) 2000-2008 Paul Davis
  *
  * Evoral is free software; you can redistribute it and/or modify it under the
  * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include <glib.h>
 #include "evoral/Event.hpp"
 
 namespace Evoral {
 
+static event_id_t _event_id_counter = 0;
+
+event_id_t
+event_id_counter()
+{
+       return g_atomic_int_get (&_event_id_counter); 
+}
+
+void 
+init_event_id_counter(event_id_t n) 
+{ 
+       g_atomic_int_set (&_event_id_counter, n); 
+}
+
+event_id_t
+next_event_id ()
+{
+       return g_atomic_int_add (&_event_id_counter, 1);
+}
+
 #ifdef EVORAL_EVENT_ALLOC
 
 template<typename Timestamp>
@@ -29,6 +50,7 @@ Event<Timestamp>::Event(EventType type, Timestamp time, uint32_t size, uint8_t*
        , _nominal_time(time)
        , _size(size)
        , _buf(buf)
+       , _id(-1)
        , _owns_buf(alloc)
 {
        if (alloc) {
@@ -48,6 +70,7 @@ Event<Timestamp>::Event(const Event& copy, bool owns_buf)
        , _nominal_time(copy._nominal_time)
        , _size(copy._size)
        , _buf(copy._buf)
+       , _id(copy.id())
        , _owns_buf(owns_buf)
 {
        if (owns_buf) {
@@ -67,10 +90,74 @@ Event<Timestamp>::~Event() {
        }
 }
 
+template<typename Timestamp>
+const Event<Timestamp>&
+Event<Timestamp>::operator=(const Event& copy)
+{
+       _id = copy.id(); // XXX is this right? do we want ID copy semantics?
+       _type = copy._type;
+       _original_time = copy._original_time;
+       _nominal_time = copy._nominal_time;
+       _owns_buf = copy._owns_buf;
+       if (_owns_buf) {
+               if (copy._buf) {
+                       if (copy._size > _size) {
+                               _buf = (uint8_t*)::realloc(_buf, copy._size);
+                       }
+                       memcpy(_buf, copy._buf, copy._size);
+               } else {
+                       free(_buf);
+                       _buf = NULL;
+               }
+       } else {
+               _buf = copy._buf;
+       }
+
+       _size = copy._size;
+       return *this;
+}
+
+template<typename Timestamp>
+void
+Event<Timestamp>::set (const uint8_t* buf, uint32_t size, Timestamp t)
+{
+       if (_owns_buf) {
+               if (_size < size) {
+                       _buf = (uint8_t*) ::realloc(_buf, size);
+               }
+               memcpy (_buf, buf, size);
+       } else {
+               /* XXX this is really dangerous given the
+                  const-ness of buf. The API should really
+                  intervene here.
+               */
+               _buf = const_cast<uint8_t*> (buf);
+       }
+
+       _original_time = t;
+       _nominal_time = t;
+       _size = size;
+}
+
+template<typename Timestamp>
+void
+Event<Timestamp>::set_time (Timestamp t)
+{
+       _nominal_time = t;
+}
+
+template<typename Timestamp>
+void
+Event<Timestamp>::set_original_time (Timestamp t)
+{
+       _original_time = t;
+}
+       
 #endif // EVORAL_EVENT_ALLOC
 
-template class Event<Evoral::MusicalTime>;
-template class Event<uint32_t>;
+template class Event<Evoral::Beats>;
+template class Event<double>;
+template class Event<int64_t>;
 
 } // namespace Evoral