summaryrefslogtreecommitdiff
path: root/libs/ardour/strip_silence.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2010-03-06 15:40:42 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2010-03-06 15:40:42 +0000
commitb6b68881b2c59c216d2195b1cea5e667187d83ed (patch)
tree6f6cae22e8d2175bbc54d428472402cd2d73eb2c /libs/ardour/strip_silence.cc
parent4ffcec7b7974f9fb65b2da295cbadb219f2a1970 (diff)
remove the session region list; GUI now represents (a relatively unfiltered view of) the raw region list that always contains every single region ever created
git-svn-id: svn://localhost/ardour2/branches/3.0@6739 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/strip_silence.cc')
-rw-r--r--libs/ardour/strip_silence.cc94
1 files changed, 46 insertions, 48 deletions
diff --git a/libs/ardour/strip_silence.cc b/libs/ardour/strip_silence.cc
index ae35eebd8f..21e1ad5450 100644
--- a/libs/ardour/strip_silence.cc
+++ b/libs/ardour/strip_silence.cc
@@ -17,6 +17,8 @@
*/
+#include "pbd/property_list.h"
+
#include "ardour/strip_silence.h"
#include "ardour/audioregion.h"
#include "ardour/region_factory.h"
@@ -44,7 +46,8 @@ StripSilence::run (boost::shared_ptr<Region> r)
results.clear ();
/* we only operate on AudioRegions, for now, though this could be adapted to MIDI
- as well I guess */
+ as well I guess
+ */
boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (r);
InterThreadInfo itt;
@@ -78,59 +81,54 @@ StripSilence::run (boost::shared_ptr<Region> r)
}
std::list<std::pair<framepos_t, framecnt_t > >::const_iterator s = silence.begin ();
- framepos_t const pos = region->position ();
- framepos_t const end = region->start () + region->length() - 1;
- framepos_t const start = region->start ();
-
- region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (region));
- region->set_name (session.new_region_name (region->name ()));
- boost::shared_ptr<AudioRegion> last_region = region;
- results.push_back (region);
-
- if (s->first == 0) {
- /* the region starts with some silence */
-
- /* we must set length to an intermediate value here, otherwise the call
- ** to set_start will fail */
- region->set_length (region->length() - s->second + _fade_length, 0);
- region->set_start (start + s->second - _fade_length, 0);
- region->set_position (pos + s->second - _fade_length, 0);
- region->set_fade_in_active (true);
- region->set_fade_in (AudioRegion::Linear, _fade_length);
- s++;
- }
+ PBD::PropertyList plist;
+ framepos_t start = 0;
+ framepos_t end;
+ bool in_silence;
+ boost::shared_ptr<AudioRegion> copy;
- while (s != silence.end()) {
+ if (s->first == 0) {
+ /* initial segment, starting at zero, is silent */
+ end = s->second;
+ in_silence = true;
+ } else {
+ /* initial segment, starting at zero, is audible */
+ end = s->first;
+ in_silence = false;
+ }
- /* trim the end of this region */
- region->trim_end (pos + s->first + _fade_length, 0);
- region->set_fade_out_active (true);
- region->set_fade_out (AudioRegion::Linear, _fade_length);
+ while (s != silence.end()) {
- /* make a new region and trim its start */
- region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (region));
- region->set_name (session.new_region_name (region->name ()));
- last_region = region;
- assert (region);
- results.push_back (region);
+ framecnt_t interval_duration;
- /* set length here for the same reasons as above */
- region->set_length (region->length() - s->second + _fade_length, 0);
- region->set_start (start + s->second - _fade_length, 0);
- region->set_position (pos + s->second - _fade_length, 0);
- region->set_fade_in_active (true);
- region->set_fade_in (AudioRegion::Linear, _fade_length);
+ interval_duration = end - start;
- s++;
- }
- if (silence.back().second == end) {
- /* the last region we created is zero-sized, so just remove it */
- results.pop_back ();
- } else {
- /* finish off the last region */
- last_region->trim_end (end, 0);
- }
+ if (!in_silence && interval_duration > 0) {
+
+ plist.clear ();
+ plist.add (Properties::length, interval_duration);
+ plist.add (Properties::position, region->position() + start);
+
+ copy = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create
+ (region, start, plist));
+
+ copy->set_name (session.new_region_name (region->name ()));
+
+ std::cerr << "New silent delineated region called " << copy->name()
+ << " @ " << copy->start() << " length = " << copy->length() << " pos = " <<
+ copy->position() << std::endl;
+
+ copy->set_fade_in_active (true);
+ copy->set_fade_in (AudioRegion::Linear, _fade_length);
+ results.push_back (copy);
+ }
+
+ start = end;
+ ++s;
+ end = s->first;
+ in_silence = !in_silence;
+ }
return 0;
}