summaryrefslogtreecommitdiff
path: root/gtk2_ardour/time_selection.cc
diff options
context:
space:
mode:
authorTaybin Rutkin <taybin@taybin.com>2005-09-25 18:42:24 +0000
committerTaybin Rutkin <taybin@taybin.com>2005-09-25 18:42:24 +0000
commit209d967b1bb80a9735d690d8f4f0455ecb9970ca (patch)
tree9d76ddcd7c1ac9d91bb2b1a33d31b66ce4ded5de /gtk2_ardour/time_selection.cc
parente4b9aed743fc765219ac775905a221c017c88fba (diff)
Initial import of gtk2_ardour.
git-svn-id: svn://localhost/trunk/ardour2@24 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/time_selection.cc')
-rw-r--r--gtk2_ardour/time_selection.cc108
1 files changed, 108 insertions, 0 deletions
diff --git a/gtk2_ardour/time_selection.cc b/gtk2_ardour/time_selection.cc
new file mode 100644
index 0000000000..551e861176
--- /dev/null
+++ b/gtk2_ardour/time_selection.cc
@@ -0,0 +1,108 @@
+/*
+ Copyright (C) 2003-2004 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ $Id$
+*/
+
+#include <algorithm>
+
+#include <pbd/error.h>
+#include <ardour/ardour.h>
+
+#include "time_selection.h"
+
+#include "i18n.h"
+
+using namespace ARDOUR;
+
+AudioRange&
+TimeSelection::operator[] (uint32_t which)
+{
+ for (std::list<AudioRange>::iterator i = begin(); i != end(); ++i) {
+ if ((*i).id == which) {
+ return *i;
+ }
+ }
+ fatal << compose (_("programming error: request for non-existent audio range (%1)!"), which) << endmsg;
+ /*NOTREACHED*/
+ return *(new AudioRange(0,0,0)); /* keep the compiler happy; never called */
+}
+
+bool
+TimeSelection::consolidate ()
+{
+ bool changed = false;
+
+ restart:
+ for (std::list<AudioRange>::iterator a = begin(); a != end(); ++a) {
+ for (std::list<AudioRange>::iterator b = begin(); b != end(); ++b) {
+
+ if (&(*a) == &(*b)) {
+ continue;
+ }
+
+ if ((*a).coverage ((*b).start, (*b).end) != OverlapNone) {
+ (*a).start = std::min ((*a).start, (*b).start);
+ (*a).end = std::max ((*a).end, (*b).end);
+ erase (b);
+ changed = true;
+ goto restart;
+ }
+ }
+ }
+
+ return changed;
+}
+
+jack_nframes_t
+TimeSelection::start ()
+{
+ if (empty()) {
+ return 0;
+ }
+
+ jack_nframes_t first = max_frames;
+
+ for (std::list<AudioRange>::iterator i = begin(); i != end(); ++i) {
+ if ((*i).start < first) {
+ first = (*i).start;
+ }
+ }
+ return first;
+}
+
+jack_nframes_t
+TimeSelection::end_frame ()
+{
+ jack_nframes_t last = 0;
+
+ /* XXX make this work like RegionSelection: no linear search needed */
+
+ for (std::list<AudioRange>::iterator i = begin(); i != end(); ++i) {
+ if ((*i).end > last) {
+ last = (*i).end;
+ }
+ }
+ return last;
+}
+
+jack_nframes_t
+TimeSelection::length()
+{
+ return end_frame() - start() + 1;
+}
+