probably fix cleanup issues, but testing required
[ardour.git] / gtk2_ardour / crossfade_edit.cc
index 1a4304b2e8c9180e745b3f10da801b7f665e08eb..a69383c7ee4c96ef20797e93cb0abe289e8686d3 100644 (file)
@@ -15,7 +15,6 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id$
 */
 
 #include <cmath>
@@ -34,7 +33,9 @@
 #include <ardour/session.h>
 #include <ardour/auditioner.h>
 #include <ardour/audioplaylist.h>
+#include <ardour/audiosource.h>
 #include <ardour/playlist_templates.h>
+#include <ardour/region_factory.h>
 
 #include <gtkmm2ext/gtk_ui.h>
 
@@ -51,6 +52,7 @@
 
 using namespace std;
 using namespace ARDOUR;
+using namespace PBD;
 using namespace Gtk;
 using namespace sigc;
 using namespace Editing;
@@ -62,8 +64,6 @@ const double CrossfadeEditor::canvas_border = 10;
 CrossfadeEditor::Presets* CrossfadeEditor::fade_in_presets = 0;
 CrossfadeEditor::Presets* CrossfadeEditor::fade_out_presets = 0;
 
-#include "crossfade_xpms.h"
-
 CrossfadeEditor::Half::Half ()
        : line (0), 
          normative_curve (0.0, 1.0, 1.0, true),
@@ -71,7 +71,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 +95,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);
 
@@ -193,7 +193,7 @@ CrossfadeEditor::CrossfadeEditor (Session& s, Crossfade& xf, double my, double m
 
        for (list<Preset*>::iterator i = fade_in_presets->begin(); i != fade_in_presets->end(); ++i) {
 
-               pxmap = manage (new Image (Gdk::Pixbuf::create_from_xpm_data((*i)->xpm)));
+               pxmap = manage (new Image (::get_icon ((*i)->image_name)));
                pbutton = manage (new Button);
                pbutton->add (*pxmap);
                pbutton->set_name ("CrossfadeEditButton");
@@ -214,7 +214,7 @@ CrossfadeEditor::CrossfadeEditor (Session& s, Crossfade& xf, double my, double m
 
        for (list<Preset*>::iterator i = fade_out_presets->begin(); i != fade_out_presets->end(); ++i) {
 
-               pxmap = manage (new Image (Gdk::Pixbuf::create_from_xpm_data((*i)->xpm)));
+               pxmap = manage (new Image (::get_icon ((*i)->image_name)));
                pbutton = manage (new Button);
                pbutton->add (*pxmap);
                pbutton->set_name ("CrossfadeEditButton");
@@ -278,14 +278,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 +576,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 +602,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 +620,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 +631,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 +697,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 +740,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 +795,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 +818,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
@@ -833,8 +831,8 @@ CrossfadeEditor::build_presets ()
        fade_out_presets = new Presets;
 
        /* FADE OUT */
-
-       p = new Preset (hiin_xpm);
+       // p = new Preset ("hiin.xpm");
+       p = new Preset ("crossfade_in_fast-cut");
        p->push_back (PresetPoint (0, 0));
        p->push_back (PresetPoint (0.0207373, 0.197222));
        p->push_back (PresetPoint (0.0645161, 0.525));
@@ -845,7 +843,8 @@ CrossfadeEditor::build_presets ()
        p->push_back (PresetPoint (1, 1));
        fade_in_presets->push_back (p);
        
-       p = new Preset (loin_xpm);
+       // p = new Preset ("loin.xpm");
+       p = new Preset ("crossfade_in_transition");
        p->push_back (PresetPoint (0, 0));
        p->push_back (PresetPoint (0.389401, 0.0333333));
        p->push_back (PresetPoint (0.629032, 0.0861111));
@@ -855,7 +854,8 @@ CrossfadeEditor::build_presets ()
        p->push_back (PresetPoint (1, 1));
        fade_in_presets->push_back (p);
 
-       p = new Preset (regin_xpm);
+       // p = new Preset ("regin.xpm");
+       p = new Preset ("crossfade_in_constant");
        p->push_back (PresetPoint (0, 0));
        p->push_back (PresetPoint (0.0737327, 0.308333));
        p->push_back (PresetPoint (0.246544, 0.658333));
@@ -865,7 +865,8 @@ CrossfadeEditor::build_presets ()
        p->push_back (PresetPoint (1, 1));
        fade_in_presets->push_back (p);
 
-       p = new Preset (regin2_xpm);
+       // p = new Preset ("regin2.xpm");
+       p = new Preset ("crossfade_in_slow-cut");
        p->push_back (PresetPoint (0, 0));
        p->push_back (PresetPoint (0.304147, 0.0694444));
        p->push_back (PresetPoint (0.529954, 0.152778));
@@ -875,14 +876,16 @@ CrossfadeEditor::build_presets ()
        p->push_back (PresetPoint (1, 1));
        fade_in_presets->push_back (p);
 
-       p = new Preset (linin_xpm);
+       // p = new Preset ("linin.xpm");
+       p = new Preset ("crossfade_in_dipped");
        p->push_back (PresetPoint (0, 0));
        p->push_back (PresetPoint (1, 1));
        fade_in_presets->push_back (p);
 
        /* FADE OUT */
 
-       p = new Preset (hiout_xpm);
+       // p = new Preset ("hiout.xpm");
+       p = new Preset ("crossfade_out_fast-cut");
        p->push_back (PresetPoint (0, 1));
        p->push_back (PresetPoint (0.305556, 1));
        p->push_back (PresetPoint (0.548611, 0.991736));
@@ -892,7 +895,8 @@ CrossfadeEditor::build_presets ()
        p->push_back (PresetPoint (1, 0));
        fade_out_presets->push_back (p);
        
-       p = new Preset (regout_xpm);
+       // p = new Preset ("regout.xpm");
+       p = new Preset ("crossfade_out_constant");
        p->push_back (PresetPoint (0, 1));
        p->push_back (PresetPoint (0.228111, 0.988889));
        p->push_back (PresetPoint (0.347926, 0.972222));
@@ -902,7 +906,8 @@ CrossfadeEditor::build_presets ()
        p->push_back (PresetPoint (1, 0));
        fade_out_presets->push_back (p);
 
-       p = new Preset (loout_xpm);
+       // p = new Preset ("loout.xpm");
+       p = new Preset ("crossfade_out_transition");
        p->push_back (PresetPoint (0, 1));
        p->push_back (PresetPoint (0.023041, 0.697222));
        p->push_back (PresetPoint (0.0553,   0.483333));
@@ -912,7 +917,8 @@ CrossfadeEditor::build_presets ()
        p->push_back (PresetPoint (1, 0));
        fade_out_presets->push_back (p);
 
-       p = new Preset (regout2_xpm);
+       // p = new Preset ("regout2.xpm");
+       p = new Preset ("crossfade_out_slow-fade");
        p->push_back (PresetPoint (0, 1));
        p->push_back (PresetPoint (0.080645, 0.730556));
        p->push_back (PresetPoint (0.277778, 0.289256));
@@ -921,7 +927,8 @@ CrossfadeEditor::build_presets ()
        p->push_back (PresetPoint (1, 0));
        fade_out_presets->push_back (p);
 
-       p = new Preset (linout_xpm);
+       // p = new Preset ("linout.xpm");
+       p = new Preset ("crossfade_out_dipped");
        p->push_back (PresetPoint (0, 1));
        p->push_back (PresetPoint (1, 0));
        fade_out_presets->push_back (p);
@@ -983,7 +990,7 @@ CrossfadeEditor::curve_select_clicked (WhichFade wf)
                }
                
                for (list<Point*>::iterator i = fade[Out].points.begin(); i != fade[Out].points.end(); ++i) {
-                       (*i)->box->hide();
+                       (*i)->box->show();
                }
 
                for (vector<Button*>::iterator i = fade_out_buttons.begin(); i != fade_out_buttons.end(); ++i) {
@@ -1016,10 +1023,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;
 
@@ -1030,17 +1037,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;
@@ -1065,26 +1072,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 ();
@@ -1098,29 +1105,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 ... */
 
@@ -1132,24 +1139,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);
 
@@ -1165,23 +1172,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);