refactor MIDISceneChange color property addition by moving it into SceneChange to...
[ardour.git] / libs / ardour / audio_playlist.cc
index dad62daf4178c99092dbeb854bee311e703a06ea..6ef4ec6454f7be83a2f097ff20645727676d418e 100644 (file)
@@ -164,8 +164,8 @@ ARDOUR::framecnt_t
 AudioPlaylist::read (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, framepos_t start,
                     framecnt_t cnt, unsigned chan_n)
 {
-       DEBUG_TRACE (DEBUG::AudioPlayback, string_compose ("Playlist %1 read @ %2 for %3, channel %4, regions %5\n",
-                                                          name(), start, cnt, chan_n, regions.size()));
+       DEBUG_TRACE (DEBUG::AudioPlayback, string_compose ("Playlist %1 read @ %2 for %3, channel %4, regions %5 mixdown @ %6 gain @ %7\n",
+                                                          name(), start, cnt, chan_n, regions.size(), mixdown_buffer, gain_buffer));
 
        /* optimizing this memset() away involves a lot of conditionals
           that may well cause more of a hit due to cache misses
@@ -207,6 +207,10 @@ AudioPlaylist::read (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, fr
        for (RegionList::iterator i = all->begin(); i != all->end(); ++i) {
                boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (*i);
 
+               /* muted regions don't figure into it at all */
+               if ( ar->muted() )
+                       continue;
+
                /* Work out which bits of this region need to be read;
                   first, trim to the range we are reading...
                */
@@ -218,7 +222,7 @@ AudioPlaylist::read (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, fr
 
                Evoral::RangeList<framepos_t> region_to_do = Evoral::subtract (region_range, done);
 
-               /* Read those bits, adding their bodies (the parts between end-of-fade-in
+               /* Make a note to read those bits, adding their bodies (the parts between end-of-fade-in
                   and start-of-fade-out) to the `done' list.
                */
 
@@ -252,198 +256,6 @@ AudioPlaylist::read (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, fr
        return cnt;
 }
 
-void
-AudioPlaylist::check_crossfades (Evoral::Range<framepos_t> range)
-{
-       if (in_set_state || in_partition || !_session.config.get_auto_xfade ()) {
-               return;
-       }
-       
-       boost::shared_ptr<RegionList> starts = regions_with_start_within (range);
-       boost::shared_ptr<RegionList> ends = regions_with_end_within (range);
-
-       RegionList all = *starts;
-       std::copy (ends->begin(), ends->end(), back_inserter (all));
-
-       all.sort (RegionSortByLayer ());
-
-       set<boost::shared_ptr<Region> > done_start;
-       set<boost::shared_ptr<Region> > done_end;
-
-       for (RegionList::reverse_iterator i = all.rbegin(); i != all.rend(); ++i) {
-               for (RegionList::reverse_iterator j = all.rbegin(); j != all.rend(); ++j) {
-
-                       if (i == j) {
-                               continue;
-                       }
-
-                       if ((*i)->muted() || (*j)->muted()) {
-                               continue;
-                       }
-
-                       if ((*i)->position() == (*j)->position() && ((*i)->length() == (*j)->length())) {
-                               /* precise overlay: no xfade */
-                               continue;
-                       }
-
-                       if ((*i)->position() == (*j)->position() || ((*i)->last_frame() == (*j)->last_frame())) {
-                               /* starts or ends match: no xfade */
-                               continue;
-                       }
-                       
-                       boost::shared_ptr<AudioRegion> top;
-                       boost::shared_ptr<AudioRegion> bottom;
-               
-                       if ((*i)->layer() < (*j)->layer()) {
-                               top = boost::dynamic_pointer_cast<AudioRegion> (*j);
-                               bottom = boost::dynamic_pointer_cast<AudioRegion> (*i);
-                       } else {
-                               top = boost::dynamic_pointer_cast<AudioRegion> (*i);
-                               bottom = boost::dynamic_pointer_cast<AudioRegion> (*j);
-                       }
-                       
-                       if (!top->opaque ()) {
-                               continue;
-                       }
-
-                       Evoral::OverlapType const c = top->coverage (bottom->position(), bottom->last_frame());
-                       
-                       if (c == Evoral::OverlapStart) {
-                               
-                               /* top starts within bottom but covers bottom's end */
-                               
-                               /*                   { ==== top ============ } 
-                                *   [---- bottom -------------------] 
-                                */
-
-                               if (done_start.find (top) == done_start.end() && done_end.find (bottom) == done_end.end ()) {
-
-                                       /* Top's fade-in will cause an implicit fade-out of bottom */
-                                       
-                                       if (top->fade_in_is_xfade() && top->fade_in_is_short()) {
-
-                                               /* its already an xfade. if its
-                                                * really short, leave it
-                                                * alone.
-                                                */
-
-                                       } else {
-                                               framecnt_t len = 0;
-                                               
-                                               if (_capture_insertion_underway) {
-                                                       len = _session.config.get_short_xfade_seconds() * _session.frame_rate();
-                                               } else {
-                                                       switch (_session.config.get_xfade_model()) {
-                                                       case FullCrossfade:
-                                                               len = bottom->last_frame () - top->first_frame ();
-                                                               top->set_fade_in_is_short (false);
-                                                               break;
-                                                       case ShortCrossfade:
-                                                               len = _session.config.get_short_xfade_seconds() * _session.frame_rate();
-                                                               top->set_fade_in_is_short (true);
-                                                               break;
-                                                       }
-                                               }
-                                               
-                                               top->set_fade_in_active (true);
-                                               top->set_fade_in_is_xfade (true);
-                                               
-                                               /* XXX may 2012: -3dB and -6dB curves
-                                                * are the same right now 
-                                                */
-                                               
-                                               switch (_session.config.get_xfade_choice ()) {
-                                               case ConstantPowerMinus3dB:
-                                                       top->set_fade_in (FadeConstantPower, len);
-                                                       break;
-                                               case ConstantPowerMinus6dB:
-                                                       top->set_fade_in (FadeConstantPower, len);
-                                                       break;
-                                               case RegionFades:
-                                                       top->set_fade_in_length (len);
-                                                       break;
-                                               }
-                                       }
-
-                                       done_start.insert (top);
-                               }
-
-                       } else if (c == Evoral::OverlapEnd) {
-                               
-                               /* top covers start of bottom but ends within it */
-                               
-                               /* [---- top ------------------------] 
-                                *                { ==== bottom ============ } 
-                                */
-
-                               if (done_end.find (top) == done_end.end() && done_start.find (bottom) == done_start.end ()) {
-                                       /* Top's fade-out will cause an implicit fade-in of bottom */
-                                       
-                                       
-                                       if (top->fade_out_is_xfade() && top->fade_out_is_short()) {
-
-                                               /* its already an xfade. if its
-                                                * really short, leave it
-                                                * alone.
-                                                */
-
-                                       } else {
-                                               framecnt_t len = 0;
-                                               
-                                               if (_capture_insertion_underway) {
-                                                       len = _session.config.get_short_xfade_seconds() * _session.frame_rate();
-                                               } else {
-                                                       switch (_session.config.get_xfade_model()) {
-                                                       case FullCrossfade:
-                                                               len = top->last_frame () - bottom->first_frame ();
-                                                               break;
-                                                       case ShortCrossfade:
-                                                               len = _session.config.get_short_xfade_seconds() * _session.frame_rate();
-                                                               break;
-                                                       }
-                                               }
-                                               
-                                               top->set_fade_out_active (true);
-                                               top->set_fade_out_is_xfade (true);
-                                               
-                                               switch (_session.config.get_xfade_choice ()) {
-                                               case ConstantPowerMinus3dB:
-                                                       top->set_fade_out (FadeConstantPower, len);
-                                                       break;
-                                               case ConstantPowerMinus6dB:
-                                                       top->set_fade_out (FadeConstantPower, len);
-                                                       break;
-                                               case RegionFades:
-                                                       top->set_fade_out_length (len);
-                                                       break;
-                                               }
-                                       }
-
-                                       done_end.insert (top);
-                               }
-                       }
-               }
-       }
-
-       for (RegionList::iterator i = starts->begin(); i != starts->end(); ++i) {
-               if (done_start.find (*i) == done_start.end()) {
-                       boost::shared_ptr<AudioRegion> r = boost::dynamic_pointer_cast<AudioRegion> (*i);
-                       if (r->fade_in_is_xfade()) {
-                               r->set_default_fade_in ();
-                       }
-               }
-       }
-
-       for (RegionList::iterator i = ends->begin(); i != ends->end(); ++i) {
-               if (done_end.find (*i) == done_end.end()) {
-                       boost::shared_ptr<AudioRegion> r = boost::dynamic_pointer_cast<AudioRegion> (*i);
-                       if (r->fade_out_is_xfade()) {
-                               r->set_default_fade_out ();
-                       }
-               }
-       }
-}
-
 void
 AudioPlaylist::dump () const
 {
@@ -734,13 +546,6 @@ AudioPlaylist::load_legacy_crossfades (const XMLNode& node, int version)
                                        }
                                }
                                
-                               if ((p = (*i)->property ("follow-overlap")) != 0) {
-                                       out_a->set_fade_out_is_short (!string_is_affirmative (p->value()));
-                               } else {
-                                       out_a->set_fade_out_is_short (false);
-                               }
-                               
-                               out_a->set_fade_out_is_xfade (true);
                                out_a->set_fade_out_active (true);
 
                        } else {
@@ -759,13 +564,6 @@ AudioPlaylist::load_legacy_crossfades (const XMLNode& node, int version)
                                        }
                                }
                                
-                               if ((p = (*i)->property ("follow-overlap")) != 0) {
-                                       in_a->set_fade_in_is_short (!string_is_affirmative (p->value()));
-                               } else {
-                                       in_a->set_fade_in_is_short (false);
-                               }
-                               
-                               in_a->set_fade_in_is_xfade (true);
                                in_a->set_fade_in_active (true);
                        }
                }