#include <ctime>
#include <list>
-#include <sigc++/bind.h>
#include "pbd/stl_delete.h"
#include "pbd/xml++.h"
_end (other._end),
_flags (other._flags)
{
- /* start and end flags can never be copied, because there can only ever be one of each */
-
- _flags = Flags (_flags & ~IsStart);
- _flags = Flags (_flags & ~IsEnd);
-
/* copy is not locked even if original was */
_locked = false;
return -1;
}
+ if (((is_auto_punch() || is_auto_loop()) && s >= _end) || (!is_mark() && s > _end)) {
+ return -1;
+ }
+
if (is_mark()) {
if (_start != s) {
-
_start = s;
_end = s;
-
- start_changed(this); /* EMIT SIGNAL */
- end_changed(this); /* EMIT SIGNAL */
-
- if ( is_start() ) {
-
- Session::StartTimeChanged (); /* EMIT SIGNAL */
- AudioFileSource::set_header_position_offset ( s );
- }
-
- if ( is_end() ) {
- Session::EndTimeChanged (); /* EMIT SIGNAL */
- }
+ start_changed (this); /* EMIT SIGNAL */
+ end_changed (this); /* EMIT SIGNAL */
}
return 0;
}
-
- if (((is_auto_punch() || is_auto_loop()) && s >= _end) || s > _end) {
- return -1;
- }
-
+
if (s != _start) {
_start = s;
- start_changed(this); /* EMIT SIGNAL */
+ start_changed (this); /* EMIT SIGNAL */
+ if (is_session_range ()) {
+ Session::StartTimeChanged (); /* EMIT SIGNAL */
+ AudioFileSource::set_header_position_offset (s);
+ }
}
return 0;
return -1;
}
+ if (((is_auto_punch() || is_auto_loop()) && e <= _start) || e < _start) {
+ return -1;
+ }
+
if (is_mark()) {
if (_start != e) {
_start = e;
_end = e;
- start_changed(this); /* EMIT SIGNAL */
- end_changed(this); /* EMIT SIGNAL */
-
- if ( is_start() ) {
- Session::StartTimeChanged (); /* EMIT SIGNAL */
- }
-
- if ( is_end() ) {
- Session::EndTimeChanged (); /* EMIT SIGNAL */
- }
-
+ start_changed (this); /* EMIT SIGNAL */
+ end_changed (this); /* EMIT SIGNAL */
}
return 0;
}
- if (((is_auto_punch() || is_auto_loop()) && e <= _start) || e < _start) {
- return -1;
- }
-
if (e != _end) {
_end = e;
- end_changed(this); /* EMIT SIGNAL */
+ end_changed(this); /* EMIT SIGNAL */
+
+ if (is_session_range()) {
+ Session::EndTimeChanged (); /* EMIT SIGNAL */
+ }
}
+
return 0;
}
int
Location::set (nframes64_t start, nframes64_t end)
{
- if (_locked) {
- return -1;
- }
+ int const s = set_start (start);
+ int const e = set_end (end);
- if (is_mark() && start != end) {
- return -1;
- } else if (((is_auto_punch() || is_auto_loop()) && start >= end) || (start > end)) {
- return -1;
- }
-
- if (_start != start) {
- _start = start;
- start_changed(this); /* EMIT SIGNAL */
- }
-
- if (_end != end) {
- _end = end;
- end_changed(this); /* EMIT SIGNAL */
- }
- return 0;
+ return (s == 0 && e == 0) ? 0 : -1;
}
int
}
}
-void
-Location::set_is_end (bool yn, void *src)
-{
- if (set_flag_internal (yn, IsEnd)) {
- FlagsChanged (this, src); /* EMIT SIGNAL */
- }
-}
-
-void
-Location::set_is_start (bool yn, void *src)
-{
- if (set_flag_internal (yn, IsStart)) {
- FlagsChanged (this, src); /* EMIT SIGNAL */
- }
-}
-
void
Location::set_is_range_marker (bool yn, void *src)
{
LocationList::iterator tmp = i;
++tmp;
- if (!(*i)->is_end() && !(*i)->is_start()) {
+ if (!(*i)->is_session_range()) {
locations.erase (i);
}
tmp = i;
++tmp;
- if ((*i)->is_mark() && !(*i)->is_end() && !(*i)->is_start()) {
+ if ((*i)->is_mark() && !(*i)->is_session_range()) {
locations.erase (i);
}
bool was_current = false;
LocationList::iterator i;
- if (loc->is_end() || loc->is_start()) {
+ if (loc->is_session_range()) {
return;
}
}
int
-Locations::set_state (const XMLNode& node, int /*version*/)
+Locations::set_state (const XMLNode& node, int version)
{
- XMLNodeList nlist;
- XMLNodeConstIterator niter;
-
if (node.name() != "Locations") {
error << _("incorrect XML mode passed to Locations::set_state") << endmsg;
return -1;
}
- nlist = node.children();
+ XMLNodeList nlist = node.children();
locations.clear ();
current_location = 0;
+ Location* session_range_location = 0;
+ if (version < 3000) {
+ session_range_location = new Location (0, 0, _("session"), Location::IsSessionRange);
+ locations.push_back (session_range_location);
+ }
+
{
Glib::Mutex::Lock lm (lock);
+ XMLNodeConstIterator niter;
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
try {
Location *loc = new Location (**niter);
- locations.push_back (loc);
+
+ bool add = true;
+
+ if (version < 3000) {
+ /* look for old-style IsStart / IsEnd properties in this location;
+ if they are present, update the session_range_location accordingly
+ */
+ XMLProperty const * prop = (*niter)->property ("flags");
+ if (prop) {
+ string v = prop->value ();
+ while (1) {
+ string::size_type const c = v.find_first_of (',');
+ string const s = v.substr (0, c);
+ if (s == X_("IsStart")) {
+ session_range_location->set_start (loc->start());
+ add = false;
+ } else if (s == X_("IsEnd")) {
+ session_range_location->set_end (loc->start());
+ add = false;
+ }
+
+ if (c == string::npos) {
+ break;
+ }
+
+ v = v.substr (c + 1);
+ }
+ }
+ }
+
+ if (add) {
+ locations.push_back (loc);
+ }
}
catch (failed_constructor& err) {
}
if (locations.size()) {
-
current_location = locations.front();
} else {
current_location = 0;
}
Location*
-Locations::end_location () const
-{
- for (LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
- if ((*i)->is_end()) {
- return const_cast<Location*> (*i);
- }
- }
- return 0;
-}
-
-Location*
-Locations::start_location () const
+Locations::session_range_location () const
{
for (LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
- if ((*i)->is_start()) {
+ if ((*i)->is_session_range()) {
return const_cast<Location*> (*i);
}
}
Locations::get_location_by_id(PBD::ID id)
{
LocationList::iterator it;
- for (it = locations.begin(); it != locations.end(); it++)
+ for (it = locations.begin(); it != locations.end(); ++it)
if (id == (*it)->id())
return *it;