add sampo's synthesize_sources perl script to tools; add scroll-playhead-{forward...
[ardour.git] / gtk2_ardour / crossfade_edit.cc
index 5b587594de730f9bfc7b1397907587092e41253f..94e167282c1a0bcef2b62ad469104cb7cda6501d 100644 (file)
@@ -36,6 +36,7 @@
 #include <ardour/audioplaylist.h>
 #include <ardour/audiosource.h>
 #include <ardour/playlist_templates.h>
+#include <ardour/region_factory.h>
 
 #include <gtkmm2ext/gtk_ui.h>
 
@@ -71,7 +72,7 @@ CrossfadeEditor::Half::Half ()
 {
 }
 
-CrossfadeEditor::CrossfadeEditor (Session& s, Crossfade& xf, double my, double mxy)
+CrossfadeEditor::CrossfadeEditor (Session& s, boost::shared_ptr<Crossfade> xf, double my, double mxy)
        : ArdourDialog (_("ardour: x-fade edit")),
          xfade (xf),
          session (s),
@@ -95,7 +96,7 @@ CrossfadeEditor::CrossfadeEditor (Session& s, Crossfade& xf, double my, double m
          select_in_button (_("Fade In")),
          select_out_button (_("Fade Out"))
 {
-       set_wmclass ("ardour_automationedit", "Ardour");
+       set_wmclass (X_("ardour_automationedit"), "Ardour");
        set_name ("CrossfadeEditWindow");
        set_position (Gtk::WIN_POS_MOUSE);
 
@@ -278,14 +279,14 @@ CrossfadeEditor::CrossfadeEditor (Session& s, Crossfade& xf, double my, double m
 //     vpacker.pack_start (*foobut, false, false);
 
        current = In;
-       set (xfade.fade_in(), In);
+       set (xfade->fade_in(), In);
 
        current = Out;
-       set (xfade.fade_out(), Out);
+       set (xfade->fade_out(), Out);
 
        curve_select_clicked (In);
 
-       xfade.StateChanged.connect (mem_fun(*this, &CrossfadeEditor::xfade_changed));
+       xfade->StateChanged.connect (mem_fun(*this, &CrossfadeEditor::xfade_changed));
 
        session.AuditionActive.connect (mem_fun(*this, &CrossfadeEditor::audition_state_changed));
        show_all_children();
@@ -576,21 +577,21 @@ CrossfadeEditor::canvas_allocation (Gtk::Allocation& alloc)
        redraw ();
        current = old_current;
 
-       double spu = xfade.length() / (double) effective_width();
+       double spu = xfade->length() / (double) effective_width();
 
        if (fade[In].waves.empty()) {
-               make_waves (xfade.in(), In);
+               make_waves (xfade->in(), In);
        }
 
        if (fade[Out].waves.empty()) {
-               make_waves (xfade.out(), Out);
+               make_waves (xfade->out(), Out);
        }
 
        double ht;
        vector<ArdourCanvas::WaveView*>::iterator i;
        uint32_t n;
 
-       ht = canvas->get_allocation().get_height() / xfade.in().n_channels();
+       ht = canvas->get_allocation().get_height() / xfade->in()->n_channels();
 
        for (n = 0, i = fade[In].waves.begin(); i != fade[In].waves.end(); ++i, ++n) {
                double yoff;
@@ -602,7 +603,7 @@ CrossfadeEditor::canvas_allocation (Gtk::Allocation& alloc)
                (*i)->property_samples_per_unit() = spu;
        }
 
-       ht = canvas->get_allocation().get_height() / xfade.out().n_channels();
+       ht = canvas->get_allocation().get_height() / xfade->out()->n_channels();
 
        for (n = 0, i = fade[Out].waves.begin(); i != fade[Out].waves.end(); ++i, ++n) {
                double yoff;
@@ -620,8 +621,8 @@ CrossfadeEditor::canvas_allocation (Gtk::Allocation& alloc)
 void
 CrossfadeEditor::xfade_changed (Change ignored)
 {
-       set (xfade.fade_in(), In);
-       set (xfade.fade_out(), Out);
+       set (xfade->fade_in(), In);
+       set (xfade->fade_out(), Out);
 }
 
 void
@@ -631,7 +632,7 @@ CrossfadeEditor::redraw ()
                return;
        }
 
-       jack_nframes_t len = xfade.length ();
+       nframes_t len = xfade->length ();
 
        fade[current].normative_curve.clear ();
        fade[current].gain_curve.clear ();
@@ -697,8 +698,6 @@ CrossfadeEditor::redraw ()
 
        }
 
-       // GTK2FIX some odd math to fix up here
-
        size_t last_spt = (npoints + 3) - 1;
 
        for (size_t i = 0; i < npoints; ++i) {
@@ -742,11 +741,11 @@ CrossfadeEditor::apply_preset (Preset *preset)
 void
 CrossfadeEditor::apply ()
 {
-       _apply_to (&xfade);
+       _apply_to (xfade);
 }
 
 void
-CrossfadeEditor::_apply_to (Crossfade* xf)
+CrossfadeEditor::_apply_to (boost::shared_ptr<Crossfade> xf)
 {
        ARDOUR::Curve& in (xf->fade_in());
        ARDOUR::Curve& out (xf->fade_out());
@@ -797,7 +796,7 @@ CrossfadeEditor::_apply_to (Crossfade* xf)
 }
 
 void
-CrossfadeEditor::setup (Crossfade* xfade)
+CrossfadeEditor::setup (boost::shared_ptr<Crossfade> xfade)
 {
        _apply_to (xfade);
        xfade->set_active (true);
@@ -820,8 +819,8 @@ CrossfadeEditor::clear ()
 void
 CrossfadeEditor::reset ()
 {
-       set (xfade.fade_in(),  In);
-       set (xfade.fade_out(), Out);
+       set (xfade->fade_in(),  In);
+       set (xfade->fade_out(), Out);
 }
 
 void
@@ -1015,10 +1014,10 @@ CrossfadeEditor::y_coordinate (double& yfract) const
 }
 
 void
-CrossfadeEditor::make_waves (AudioRegion& region, WhichFade which)
+CrossfadeEditor::make_waves (boost::shared_ptr<AudioRegion> region, WhichFade which)
 {
        gdouble ht;
-       uint32_t nchans = region.n_channels();
+       uint32_t nchans = region->n_channels();
        guint32 color;
        double spu;
 
@@ -1029,17 +1028,17 @@ CrossfadeEditor::make_waves (AudioRegion& region, WhichFade which)
        }
 
        ht = canvas->get_allocation().get_height() / (double) nchans;
-       spu = xfade.length() / (double) effective_width();
+       spu = xfade->length() / (double) effective_width();
 
        for (uint32_t n = 0; n < nchans; ++n) {
                
                gdouble yoff = n * ht;
                
-               if (region.source(n).peaks_ready (bind (mem_fun(*this, &CrossfadeEditor::peaks_ready), &region, which), peaks_ready_connection)) {
+               if (region->source(n)->peaks_ready (bind (mem_fun(*this, &CrossfadeEditor::peaks_ready), region, which), peaks_ready_connection)) {
                        
                        WaveView* waveview = new WaveView (*(canvas->root()));
 
-                       waveview->property_data_src() = &region;
+                       waveview->property_data_src() = region.get();
                        waveview->property_cache_updater() =  true;
                        waveview->property_cache() = WaveView::create_cache();
                        waveview->property_channel() = n;
@@ -1064,26 +1063,26 @@ CrossfadeEditor::make_waves (AudioRegion& region, WhichFade which)
 }
 
 void
-CrossfadeEditor::peaks_ready (AudioRegion* r, WhichFade which)
+CrossfadeEditor::peaks_ready (boost::shared_ptr<AudioRegion> r, WhichFade which)
 {
        /* this should never be called, because the peak files for an xfade
           will be ready by the time we want them. but our API forces us
           to provide this, so ..
        */
        peaks_ready_connection.disconnect ();
-       make_waves (*r, which);
+       make_waves (r, which);
 }
 
 void
 CrossfadeEditor::audition_both ()
 {
-       AudioPlaylist& pl (session.the_auditioner().prepare_playlist());
-       jack_nframes_t preroll;
-       jack_nframes_t postroll;
-       jack_nframes_t length;
-       jack_nframes_t left_start_offset;
-       jack_nframes_t right_length;
-       jack_nframes_t left_length;
+       AudioPlaylist& pl (session.the_auditioner()->prepare_playlist());
+       nframes_t preroll;
+       nframes_t postroll;
+       nframes_t length;
+       nframes_t left_start_offset;
+       nframes_t right_length;
+       nframes_t left_length;
 
        if (preroll_button.get_active()) {
                preroll = ARDOUR_UI::instance()->preroll_clock.current_duration ();
@@ -1097,29 +1096,29 @@ CrossfadeEditor::audition_both ()
                postroll = 0;
        }
 
-       if ((left_start_offset = xfade.out().length() - xfade.length()) >= preroll) {
+       if ((left_start_offset = xfade->out()->length() - xfade->length()) >= preroll) {
                left_start_offset -= preroll;
        } 
 
        length = 0;
 
-       if ((left_length = xfade.length()) < xfade.out().length() - left_start_offset) {
+       if ((left_length = xfade->length()) < xfade->out()->length() - left_start_offset) {
                length += postroll;
        }
 
-       right_length = xfade.length();
+       right_length = xfade->length();
 
-       if (xfade.in().length() - right_length < postroll) {
+       if (xfade->in()->length() - right_length < postroll) {
                right_length += postroll;
        }
 
-       AudioRegion* left = new AudioRegion (xfade.out(), left_start_offset, left_length, "xfade out", 
-                                            0, Region::DefaultFlags, false);
-       AudioRegion* right = new AudioRegion (xfade.in(), 0, right_length, "xfade in", 
-                                             0, Region::DefaultFlags, false);
+       boost::shared_ptr<AudioRegion> left (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (xfade->out(), left_start_offset, left_length, "xfade out", 
+                                                                                                             0, Region::DefaultFlags, false)));
+       boost::shared_ptr<AudioRegion> right (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (xfade->in(), 0, right_length, "xfade in", 
+                                                                                                              0, Region::DefaultFlags, false)));
        
-       pl.add_region (*left, 0);
-       pl.add_region (*right, 1+preroll);
+       pl.add_region (left, 0);
+       pl.add_region (right, 1+preroll);
 
        /* there is only one ... */
 
@@ -1131,24 +1130,24 @@ CrossfadeEditor::audition_both ()
 void
 CrossfadeEditor::audition_left_dry ()
 {
-       AudioRegion* left = new AudioRegion (xfade.out(), xfade.out().length() - xfade.length(), xfade.length(), "xfade left", 
-                                            0, Region::DefaultFlags, false);
+       boost::shared_ptr<AudioRegion> left (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (xfade->out(), xfade->out()->length() - xfade->length(), xfade->length(), "xfade left", 
+                                                                                                             0, Region::DefaultFlags, false)));
        
-       session.audition_region (*left);
+       session.audition_region (left);
 }
 
 void
 CrossfadeEditor::audition_left ()
 {
-       AudioPlaylist& pl (session.the_auditioner().prepare_playlist());
+       AudioPlaylist& pl (session.the_auditioner()->prepare_playlist());
 
-       AudioRegion* left = new AudioRegion (xfade.out(), xfade.out().length() - xfade.length(), xfade.length(), "xfade left", 
-                                            0, Region::DefaultFlags, false);
-       AudioRegion* right = new AudioRegion (xfade.in(), 0, xfade.length(), "xfade in", 
-                                             0, Region::DefaultFlags, false);
+       boost::shared_ptr<AudioRegion> left (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (xfade->out(), xfade->out()->length() - xfade->length(), xfade->length(), "xfade left", 
+                                                                                                             0, Region::DefaultFlags, false)));
+       boost::shared_ptr<AudioRegion> right (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (xfade->in(), 0, xfade->length(), "xfade in", 
+                                                                                                              0, Region::DefaultFlags, false)));
 
-       pl.add_region (*left, 0);
-       pl.add_region (*right, 1);
+       pl.add_region (left, 0);
+       pl.add_region (right, 1);
 
        right->set_muted (true);
 
@@ -1164,23 +1163,23 @@ CrossfadeEditor::audition_left ()
 void
 CrossfadeEditor::audition_right_dry ()
 {
-       AudioRegion* right = new AudioRegion (xfade.in(), 0, xfade.length(), "xfade in", 
-                                             0, Region::DefaultFlags, false);
-       session.audition_region (*right);
+       boost::shared_ptr<AudioRegion> right (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (xfade->in(), 0, xfade->length(), "xfade in", 
+                                                                                                              0, Region::DefaultFlags, false)));
+       session.audition_region (right);
 }
 
 void
 CrossfadeEditor::audition_right ()
 {
-       AudioPlaylist& pl (session.the_auditioner().prepare_playlist());
+       AudioPlaylist& pl (session.the_auditioner()->prepare_playlist());
 
-       AudioRegion* left = new AudioRegion (xfade.out(), xfade.out().length() - xfade.length(), xfade.length(), "xfade out", 
-                                            0, Region::DefaultFlags, false);
-       AudioRegion* right = new AudioRegion (xfade.out(), 0, xfade.length(), "xfade out", 
-                                             0, Region::DefaultFlags, false);
+       boost::shared_ptr<AudioRegion> left (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (xfade->out(), xfade->out()->length() - xfade->length(), xfade->length(), "xfade out", 
+                                                                                                             0, Region::DefaultFlags, false)));
+                                            boost::shared_ptr<AudioRegion> right (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (xfade->out(), 0, xfade->length(), "xfade out", 
+                                                                                                              0, Region::DefaultFlags, false)));
 
-       pl.add_region (*left, 0);
-       pl.add_region (*right, 1);
+       pl.add_region (left, 0);
+       pl.add_region (right, 1);
        
        left->set_muted (true);