MusicalTime => Beats.
[ardour.git] / libs / evoral / src / Event.cpp
index 930a18e77b045e11fbdabb6bf4dae9b1421557ea..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
@@ -26,32 +26,32 @@ static event_id_t _event_id_counter = 0;
 event_id_t
 event_id_counter()
 {
-        return g_atomic_int_get (&_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); 
+       g_atomic_int_set (&_event_id_counter, n); 
 }
 
 event_id_t
 next_event_id ()
 {
-        return g_atomic_int_exchange_and_add (&_event_id_counter, 1);
+       return g_atomic_int_add (&_event_id_counter, 1);
 }
 
 #ifdef EVORAL_EVENT_ALLOC
 
 template<typename Timestamp>
 Event<Timestamp>::Event(EventType type, Timestamp time, uint32_t size, uint8_t* buf, bool alloc)
-        : _type(type)
+       : _type(type)
        , _original_time(time)
        , _nominal_time(time)
        , _size(size)
        , _buf(buf)
+       , _id(-1)
        , _owns_buf(alloc)
-        , _id (-1)
 {
        if (alloc) {
                _buf = (uint8_t*)malloc(_size);
@@ -70,8 +70,8 @@ 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)
-        , _id (copy.id())
 {
        if (owns_buf) {
                _buf = (uint8_t*)malloc(_size);
@@ -90,9 +90,73 @@ 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<Evoral::Beats>;
+template class Event<double>;
 template class Event<int64_t>;
 
 } // namespace Evoral