+
+int
+AudioDiskstream::set_destructive (bool yn)
+{
+ bool bounce_ignored;
+
+ if (yn != destructive()) {
+
+ if (yn) {
+ /* requestor should already have checked this and
+ bounced if necessary and desired
+ */
+ if (!can_become_destructive (bounce_ignored)) {
+ return -1;
+ }
+ _flags |= Destructive;
+ use_destructive_playlist ();
+ } else {
+ _flags &= ~Destructive;
+ reset_write_sources (true, true);
+ }
+ }
+
+ return 0;
+}
+
+bool
+AudioDiskstream::can_become_destructive (bool& requires_bounce) const
+{
+ if (!_playlist) {
+ requires_bounce = false;
+ return false;
+ }
+
+ /* is there only one region ? */
+
+ if (_playlist->n_regions() != 1) {
+ requires_bounce = true;
+ return false;
+ }
+
+ boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
+ assert (first);
+
+ /* do the source(s) for the region cover the session start position ? */
+
+ if (first->position() != _session.current_start_frame()) {
+ if (first->start() > _session.current_start_frame()) {
+ requires_bounce = true;
+ return false;
+ }
+ }
+
+ /* is the source used by only 1 playlist ? */
+
+ boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
+
+ assert (afirst);
+
+ if (afirst->source()->used() > 1) {
+ requires_bounce = true;
+ return false;
+ }
+
+ requires_bounce = false;
+ return true;
+}