/*
- Copyright (C) 2004 Paul Davis
+ Copyright (C) 2004 Paul Davis
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include <libgnomecanvasmm/line.h>
+#include "pbd/memento_command.h"
#include "ardour/automation_list.h"
#include "evoral/Curve.hpp"
#include "ardour/crossfade.h"
#include "ardour/auditioner.h"
#include "ardour/audioplaylist.h"
#include "ardour/audiosource.h"
-#include "ardour/playlist_templates.h"
#include "ardour/region_factory.h"
#include "ardour/profile.h"
+#include "ardour/crossfade_binder.h"
#include <gtkmm2ext/gtk_ui.h>
using namespace ARDOUR;
using namespace PBD;
using namespace Gtk;
-using namespace sigc;
using namespace Editing;
+using Gtkmm2ext::Keyboard;
+
#include "i18n.h"
const int32_t CrossfadeEditor::Point::size = 7;
{
}
-CrossfadeEditor::CrossfadeEditor (Session& s, boost::shared_ptr<Crossfade> xf, double my, double mxy)
- : ArdourDialog (_("ardour: x-fade edit")),
+CrossfadeEditor::CrossfadeEditor (Session* s, boost::shared_ptr<Crossfade> xf, double my, double mxy)
+ : ArdourDialog (_("Edit Crossfade")),
xfade (xf),
- session (s),
clear_button (_("Clear")),
revert_button (_("Reset")),
audition_both_button (_("Fade")),
preroll_button (_("With Pre-roll")),
postroll_button (_("With Post-roll")),
-
+
miny (my),
maxy (mxy),
fade_out_table (3, 3),
select_in_button (_("Fade In")),
- select_out_button (_("Fade Out"))
+ select_out_button (_("Fade Out")),
+
+ _peaks_ready_connection (0)
+
{
- set_wmclass (X_("ardour_automationedit"), "Ardour");
+ set_session (s);
+
+ set_wmclass (X_("ardour_automationedit"), PROGRAM_NAME);
set_name ("CrossfadeEditWindow");
set_position (Gtk::WIN_POS_MOUSE);
toplevel = 0;
canvas = new ArdourCanvas::CanvasAA ();
- canvas->signal_size_allocate().connect (mem_fun(*this, &CrossfadeEditor::canvas_allocation));
+ canvas->signal_size_allocate().connect (sigc::mem_fun(*this, &CrossfadeEditor::canvas_allocation));
canvas->set_size_request (425, 200);
-
+
toplevel = new ArdourCanvas::SimpleRect (*(canvas->root()));
toplevel->property_x1() = 0.0;
toplevel->property_y1() = 0.0;
toplevel->property_fill() = true;
toplevel->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorBase.get();
toplevel->property_outline_pixels() = 0;
- toplevel->signal_event().connect (mem_fun (*this, &CrossfadeEditor::canvas_event));
-
+ toplevel->signal_event().connect (sigc::mem_fun (*this, &CrossfadeEditor::canvas_event));
+
fade[Out].line = new ArdourCanvas::Line (*(canvas->root()));
fade[Out].line->property_width_pixels() = 1;
fade[Out].line->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorLine.get();
-
+
fade[Out].shading = new ArdourCanvas::Polygon (*(canvas->root()));
fade[Out].shading->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorLineShading.get();
fade[In].line = new ArdourCanvas::Line (*(canvas->root()));
fade[In].line->property_width_pixels() = 1;
fade[In].line->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorLine.get();
-
+
fade[In].shading = new ArdourCanvas::Polygon (*(canvas->root()));
fade[In].shading->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorLineShading.get();
-
- fade[In].shading->signal_event().connect (mem_fun (*this, &CrossfadeEditor::canvas_event));
- fade[In].line->signal_event().connect (mem_fun (*this, &CrossfadeEditor::curve_event));
- fade[Out].shading->signal_event().connect (mem_fun (*this, &CrossfadeEditor::canvas_event));
- fade[Out].line->signal_event().connect (mem_fun (*this, &CrossfadeEditor::curve_event));
+
+ fade[In].shading->signal_event().connect (sigc::mem_fun (*this, &CrossfadeEditor::canvas_event));
+ fade[In].line->signal_event().connect (sigc::mem_fun (*this, &CrossfadeEditor::curve_event));
+ fade[Out].shading->signal_event().connect (sigc::mem_fun (*this, &CrossfadeEditor::canvas_event));
+ fade[Out].line->signal_event().connect (sigc::mem_fun (*this, &CrossfadeEditor::curve_event));
select_in_button.set_name (X_("CrossfadeEditCurveButton"));
select_out_button.set_name (X_("CrossfadeEditCurveButton"));
- select_in_button.signal_clicked().connect (bind (mem_fun (*this, &CrossfadeEditor::curve_select_clicked), In));
- select_out_button.signal_clicked().connect (bind (mem_fun (*this, &CrossfadeEditor::curve_select_clicked), Out));
+ select_in_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &CrossfadeEditor::curve_select_clicked), In));
+ select_out_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &CrossfadeEditor::curve_select_clicked), Out));
HBox* acbox = manage (new HBox);
-
+
audition_box.set_border_width (7);
audition_box.set_spacing (5);
audition_box.set_homogeneous (false);
audition_box.pack_start (audition_right_dry_button, false, false);
Frame* audition_frame = manage (new Frame (_("Audition")));
-
+
audition_frame->set_name (X_("CrossfadeEditFrame"));
audition_frame->add (audition_box);
pbutton = manage (new Button);
pbutton->add (*pxmap);
pbutton->set_name ("CrossfadeEditButton");
- pbutton->signal_clicked().connect (bind (mem_fun(*this, &CrossfadeEditor::apply_preset), *i));
+ pbutton->signal_clicked().connect (sigc::bind (sigc::mem_fun(*this, &CrossfadeEditor::apply_preset), *i));
ARDOUR_UI::instance()->set_tip (pbutton, (*i)->name, "");
fade_in_table.attach (*pbutton, col, col+1, row, row+1);
fade_in_buttons.push_back (pbutton);
pbutton = manage (new Button);
pbutton->add (*pxmap);
pbutton->set_name ("CrossfadeEditButton");
- pbutton->signal_clicked().connect (bind (mem_fun(*this, &CrossfadeEditor::apply_preset), *i));
+ pbutton->signal_clicked().connect (sigc::bind (sigc::mem_fun(*this, &CrossfadeEditor::apply_preset), *i));
ARDOUR_UI::instance()->set_tip (pbutton, (*i)->name, "");
fade_out_table.attach (*pbutton, col, col+1, row, row+1);
fade_out_buttons.push_back (pbutton);
audition_right_dry_button.set_name ("CrossfadeEditAuditionButton");
audition_right_button.set_name ("CrossfadeEditAuditionButton");
- clear_button.signal_clicked().connect (mem_fun(*this, &CrossfadeEditor::clear));
- revert_button.signal_clicked().connect (mem_fun(*this, &CrossfadeEditor::reset));
- audition_both_button.signal_toggled().connect (mem_fun(*this, &CrossfadeEditor::audition_toggled));
- audition_right_button.signal_toggled().connect (mem_fun(*this, &CrossfadeEditor::audition_right_toggled));
- audition_right_dry_button.signal_toggled().connect (mem_fun(*this, &CrossfadeEditor::audition_right_dry_toggled));
- audition_left_button.signal_toggled().connect (mem_fun(*this, &CrossfadeEditor::audition_left_toggled));
- audition_left_dry_button.signal_toggled().connect (mem_fun(*this, &CrossfadeEditor::audition_left_dry_toggled));
+ clear_button.signal_clicked().connect (sigc::mem_fun(*this, &CrossfadeEditor::clear));
+ revert_button.signal_clicked().connect (sigc::mem_fun(*this, &CrossfadeEditor::reset));
+ audition_both_button.signal_toggled().connect (sigc::mem_fun(*this, &CrossfadeEditor::audition_toggled));
+ audition_right_button.signal_toggled().connect (sigc::mem_fun(*this, &CrossfadeEditor::audition_right_toggled));
+ audition_right_dry_button.signal_toggled().connect (sigc::mem_fun(*this, &CrossfadeEditor::audition_right_dry_toggled));
+ audition_left_button.signal_toggled().connect (sigc::mem_fun(*this, &CrossfadeEditor::audition_left_toggled));
+ audition_left_dry_button.signal_toggled().connect (sigc::mem_fun(*this, &CrossfadeEditor::audition_left_dry_toggled));
roll_box.pack_start (preroll_button, false, false);
roll_box.pack_start (postroll_button, false, false);
curve_button_box.pack_start (fade_out_table, false, false, 12);
curve_button_box.pack_start (*vpacker2, false, false, 12);
curve_button_box.pack_start (fade_in_table, false, false, 12);
-
+
get_vbox()->pack_start (*canvas_frame, true, true);
get_vbox()->pack_start (curve_button_box, false, false);
/* button to allow hackers to check the actual curve values */
// Button* foobut = manage (new Button ("dump"));
-// foobut-.signal_clicked().connect (mem_fun(*this, &CrossfadeEditor::dump));
+// foobut-.signal_clicked().connect (sigc::mem_fun(*this, &CrossfadeEditor::dump));
// vpacker.pack_start (*foobut, false, false);
current = In;
curve_select_clicked (In);
- xfade->StateChanged.connect (mem_fun(*this, &CrossfadeEditor::xfade_changed));
+ xfade->PropertyChanged.connect (state_connection, invalidator (*this), boost::bind (&CrossfadeEditor::xfade_changed, this, _1), gui_context());
- session.AuditionActive.connect (mem_fun(*this, &CrossfadeEditor::audition_state_changed));
+ _session->AuditionActive.connect (_session_connections, invalidator (*this), boost::bind (&CrossfadeEditor::audition_state_changed, this, _1), gui_context());
show_all_children();
}
for (list<Point*>::iterator i = fade[Out].points.begin(); i != fade[Out].points.end(); ++i) {
delete *i;
}
+
+ delete _peaks_ready_connection;
}
void
void
CrossfadeEditor::audition_state_changed (bool yn)
{
- ENSURE_GUI_THREAD (bind (mem_fun(*this, &CrossfadeEditor::audition_state_changed), yn));
+ ENSURE_GUI_THREAD (*this, &CrossfadeEditor::audition_state_changed, yn)
if (!yn) {
audition_both_button.set_active (false);
for (list<Point*>::iterator i = fade[which].points.begin(); i != fade[which].points.end(); ++i) {
delete *i;
}
-
+
fade[which].points.clear ();
fade[which].gain_curve.clear ();
fade[which].normative_curve.clear ();
if (curve.empty()) {
goto out;
}
-
+
the_end = curve.end();
--the_end;
-
+
firstx = (*curve.begin())->when;
endx = (*the_end)->when;
for (ARDOUR::AutomationList::const_iterator i = curve.begin(); i != curve.end(); ++i) {
-
+
double xfract = ((*i)->when - firstx) / (endx - firstx);
double yfract = ((*i)->value - miny) / (maxy - miny);
-
+
Point* p = make_point ();
p->move_to (x_coordinate (xfract), y_coordinate (yfract),
xfract, yfract);
-
+
fade[which].points.push_back (p);
}
/* no need to sort because curve is already time-ordered */
out:
-
+
swap (which, current);
redraw ();
swap (which, current);
if (Keyboard::is_delete_event (&event->button)) {
fade[current].points.remove (point);
delete point;
- }
+ }
redraw ();
break;
if (point_grabbed) {
double new_x, new_y;
- /* can't drag first or last points horizontally */
+ /* can't drag first or last points horizontally or vertically */
if (point == fade[current].points.front() || point == fade[current].points.back()) {
new_x = point->x;
+ new_y = point->y;
} else {
new_x = (event->motion.x - canvas_border)/effective_width();
+ new_y = 1.0 - ((event->motion.y - canvas_border)/effective_height());
}
- new_y = 1.0 - ((event->motion.y - canvas_border)/effective_height());
- point->move_to (x_coordinate (new_x), y_coordinate (new_y),
+ point->move_to (x_coordinate (new_x), y_coordinate (new_y),
new_x, new_y);
redraw ();
}
p->curve = fade[current].line;
- p->box->signal_event().connect (bind (mem_fun (*this, &CrossfadeEditor::point_event), p));
-
+ p->box->signal_event().connect (sigc::bind (sigc::mem_fun (*this, &CrossfadeEditor::point_event), p));
+
return p;
}
PointSorter cmp;
/* enforce end point x location */
-
+
if (fade[current].points.empty()) {
x = 0.0;
} else if (fade[current].points.size() == 1) {
x = 1.0;
- }
+ }
Point* p = make_point ();
void
CrossfadeEditor::Point::move_to (double nx, double ny, double xfract, double yfract)
{
+ if ( xfract < 0.0 ) {
+ xfract = 0.0;
+ } else if ( xfract > 1.0 ) {
+ xfract = 1.0;
+ }
+
+ if ( yfract < 0.0 ) {
+ yfract = 0.0;
+ } else if ( yfract > 1.0 ) {
+ yfract = 1.0;
+ }
+
const double half_size = rint(size/2.0);
double x1 = nx - half_size;
double x2 = nx + half_size;
}
void
-CrossfadeEditor::canvas_allocation (Gtk::Allocation& alloc)
+CrossfadeEditor::canvas_allocation (Gtk::Allocation& /*alloc*/)
{
if (toplevel) {
toplevel->property_x1() = 0.0;
toplevel->property_x2() = (double) canvas->get_allocation().get_width() + canvas_border;
toplevel->property_y2() = (double) canvas->get_allocation().get_height() + canvas_border;
}
-
- canvas->set_scroll_region (0.0, 0.0,
- canvas->get_allocation().get_width(),
+
+ canvas->set_scroll_region (0.0, 0.0,
+ canvas->get_allocation().get_width(),
canvas->get_allocation().get_height());
Point* end = make_point ();
(*i)->move_to (x_coordinate((*i)->x), y_coordinate((*i)->y),
(*i)->x, (*i)->y);
}
-
+
end = make_point ();
-
+
if (fade[Out].points.size() > 1) {
Point* old_end = fade[Out].points.back();
fade[Out].points.pop_back ();
y_coordinate ((*i)->y),
(*i)->x, (*i)->y);
}
-
+
WhichFade old_current = current;
current = In;
redraw ();
void
-CrossfadeEditor::xfade_changed (Change ignored)
+CrossfadeEditor::xfade_changed (const PropertyChange&)
{
set (xfade->fade_in(), In);
set (xfade->fade_out(), Out);
return;
}
- nframes_t len = xfade->length ();
+ framecnt_t len = xfade->length ();
fade[current].normative_curve.clear ();
fade[current].gain_curve.clear ();
float vec[npoints];
fade[current].normative_curve.curve().get_vector (0, 1.0, vec, npoints);
-
+
ArdourCanvas::Points pts;
ArdourCanvas::Points spts;
spts[2].set_x (effective_width() + canvas_border);
spts[2].set_y (canvas_border);
-
+
} else {
/* upper left */
-
+
spts[0].set_x (canvas_border);
spts[0].set_y (canvas_border);
for (size_t i = 0; i < npoints; ++i) {
double y = vec[i];
-
+
pts[i].set_x (canvas_border + i);
pts[i].set_y (y_coordinate (y));
void
CrossfadeEditor::apply_preset (Preset *preset)
{
-
+
WhichFade wf = find(fade_in_presets->begin(), fade_in_presets->end(), preset) != fade_in_presets->end() ? In : Out;
-
+
if (current != wf) {
-
+
if (wf == In) {
select_in_button.clicked();
} else {
select_out_button.clicked();
}
-
+
curve_select_clicked (wf);
- }
-
+ }
+
for (list<Point*>::iterator i = fade[current].points.begin(); i != fade[current].points.end(); ++i) {
delete *i;
}
void
CrossfadeEditor::apply ()
{
+ _session->begin_reversible_command (_("Edit crossfade"));
+
+ XMLNode& before = xfade->get_state ();
+
_apply_to (xfade);
+
+ _session->add_command (
+ new MementoCommand<Crossfade> (
+ new ARDOUR::CrossfadeBinder (_session->playlists, xfade->id ()),
+ &before, &xfade->get_state ()
+ )
+ );
+
+ _session->commit_reversible_command ();
}
void
double firstx = (*in.begin())->when;
double endx = (*the_end)->when;
- double miny = in.get_min_y ();
- double maxy = in.get_max_y ();
in.freeze ();
in.clear ();
for (list<Point*>::iterator i = fade[In].points.begin(); i != fade[In].points.end(); ++i) {
double when = firstx + ((*i)->x * (endx - firstx));
- double value = (*i)->y; // miny + ((*i)->y * (maxy - miny));
+ double value = (*i)->y;
in.add (when, value);
}
firstx = (*out.begin())->when;
endx = (*the_end)->when;
- miny = out.get_min_y ();
- maxy = out.get_max_y ();
out.freeze ();
out.clear ();
for (list<Point*>::iterator i = fade[Out].points.begin(); i != fade[Out].points.end(); ++i) {
double when = firstx + ((*i)->x * (endx - firstx));
- double value = (*i)->y; // miny + ((*i)->y * (maxy - miny));
+ double value = (*i)->y;
out.add (when, value);
}
set (xfade->fade_in(), In);
set (xfade->fade_out(), Out);
- curve_select_clicked (current);
+ curve_select_clicked (current);
}
void
/* FADE IN */
- p = new Preset ("Linear (-6dB)", "crossfade-in-linear");
+ p = new Preset ("Linear (-6dB)", "fadein-linear");
p->push_back (PresetPoint (0, 0));
p->push_back (PresetPoint (0.000000, 0.000000));
p->push_back (PresetPoint (0.166667, 0.166366));
p->push_back (PresetPoint (1.000000, 1.000000));
fade_in_presets->push_back (p);
- p = new Preset ("S(1)-curve", "crossfade-in-S1");
+ p = new Preset ("S(1)-curve", "fadein-S1");
p->push_back (PresetPoint (0, 0));
p->push_back (PresetPoint (0.1, 0.01));
p->push_back (PresetPoint (0.2, 0.03));
p->push_back (PresetPoint (1, 1));
fade_in_presets->push_back (p);
- p = new Preset ("S(2)-curve", "crossfade-in-S2");
+ p = new Preset ("S(2)-curve", "fadein-S2");
p->push_back (PresetPoint (0.0, 0.0));
p->push_back (PresetPoint (0.055, 0.222));
p->push_back (PresetPoint (0.163, 0.35));
p->push_back (PresetPoint (1.0, 1.0));
fade_in_presets->push_back (p);
- p = new Preset ("Constant Power (-3dB)", "crossfade-in-constant-power");
+ p = new Preset ("Constant Power (-3dB)", "fadein-constant-power");
p->push_back (PresetPoint (0.000000, 0.000000));
p->push_back (PresetPoint (0.166667, 0.282192));
if (!Profile->get_sae()) {
- p = new Preset ("Short cut", "crossfade-in-short-cut");
+ p = new Preset ("Short cut", "fadein-short-cut");
p->push_back (PresetPoint (0, 0));
p->push_back (PresetPoint (0.389401, 0.0333333));
p->push_back (PresetPoint (0.629032, 0.0861111));
p->push_back (PresetPoint (0.976959, 0.697222));
p->push_back (PresetPoint (1, 1));
fade_in_presets->push_back (p);
-
- p = new Preset ("Slow cut", "crossfade-in-slow-cut");
+
+ p = new Preset ("Slow cut", "fadein-slow-cut");
p->push_back (PresetPoint (0, 0));
p->push_back (PresetPoint (0.304147, 0.0694444));
p->push_back (PresetPoint (0.529954, 0.152778));
p->push_back (PresetPoint (0.919355, 0.730556));
p->push_back (PresetPoint (1, 1));
fade_in_presets->push_back (p);
-
- p = new Preset ("Fast cut", "crossfade-in-fast-cut");
+
+ p = new Preset ("Fast cut", "fadein-fast-cut");
p->push_back (PresetPoint (0, 0));
p->push_back (PresetPoint (0.0737327, 0.308333));
p->push_back (PresetPoint (0.246544, 0.658333));
p->push_back (PresetPoint (1, 1));
fade_in_presets->push_back (p);
- p = new Preset ("Long cut", "crossfade-in-long-cut");
+ p = new Preset ("Long cut", "fadein-long-cut");
p->push_back (PresetPoint (0, 0));
p->push_back (PresetPoint (0.0207373, 0.197222));
p->push_back (PresetPoint (0.0645161, 0.525));
p->push_back (PresetPoint (1, 1));
fade_in_presets->push_back (p);
}
-
+
/* FADE OUT */
// p = new Preset ("regout.xpm");
- p = new Preset ("Linear (-6dB cut)", "crossfade-out-linear");
+ p = new Preset ("Linear (-6dB cut)", "fadeout-linear");
p->push_back (PresetPoint (0, 1));
p->push_back (PresetPoint (0.000000, 1.000000));
p->push_back (PresetPoint (0.166667, 0.833033));
p->push_back (PresetPoint (1.000000, 0.000000));
fade_out_presets->push_back (p);
- p = new Preset ("S(1)-Curve", "crossfade-out-S1");
+ p = new Preset ("S(1)-Curve", "fadeout-S1");
p->push_back (PresetPoint (0, 1));
p->push_back (PresetPoint (0.1, 0.99));
p->push_back (PresetPoint (0.2, 0.97));
p->push_back (PresetPoint (1, 0));
fade_out_presets->push_back (p);
- p = new Preset ("S(2)-Curve", "crossfade-out-S2");
+ p = new Preset ("S(2)-Curve", "fadeout-S2");
p->push_back (PresetPoint (0.0, 1.0));
p->push_back (PresetPoint (0.163, 0.678));
p->push_back (PresetPoint (0.055, 0.783));
fade_out_presets->push_back (p);
// p = new Preset ("linout.xpm");
- p = new Preset ("Constant Power (-3dB cut)", "crossfade-out-constant-power");
+ p = new Preset ("Constant Power (-3dB cut)", "fadeout-constant-power");
p->push_back (PresetPoint (0.000000, 1.000000));
p->push_back (PresetPoint (0.166667, 0.948859));
p->push_back (PresetPoint (0.333333, 0.851507));
p->push_back (PresetPoint (0.833333, 0.282192));
p->push_back (PresetPoint (1.000000, 0.000000));
fade_out_presets->push_back (p);
-
+
if (!Profile->get_sae()) {
// p = new Preset ("hiout.xpm");
- p = new Preset ("Short cut", "crossfade-out-short-cut");
+ p = new Preset ("Short cut", "fadeout-short-cut");
p->push_back (PresetPoint (0, 1));
p->push_back (PresetPoint (0.305556, 1));
p->push_back (PresetPoint (0.548611, 0.991736));
p->push_back (PresetPoint (0.976852, 0.22865));
p->push_back (PresetPoint (1, 0));
fade_out_presets->push_back (p);
-
- p = new Preset ("Slow cut", "crossfade-out-slow-cut");
+
+ p = new Preset ("Slow cut", "fadeout-slow-cut");
p->push_back (PresetPoint (0, 1));
p->push_back (PresetPoint (0.228111, 0.988889));
p->push_back (PresetPoint (0.347926, 0.972222));
p->push_back (PresetPoint (0.9262673, 0.308333));
p->push_back (PresetPoint (1, 0));
fade_out_presets->push_back (p);
-
- p = new Preset ("Fast cut", "crossfade-out-fast-cut");
+
+ p = new Preset ("Fast cut", "fadeout-fast-cut");
p->push_back (PresetPoint (0, 1));
p->push_back (PresetPoint (0.080645, 0.730556));
p->push_back (PresetPoint (0.277778, 0.289256));
p->push_back (PresetPoint (0.695853, 0.0694444));
p->push_back (PresetPoint (1, 0));
fade_out_presets->push_back (p);
-
+
// p = new Preset ("loout.xpm");
- p = new Preset ("Long cut", "crossfade-out-long-cut");
+ p = new Preset ("Long cut", "fadeout-long-cut");
p->push_back (PresetPoint (0, 1));
p->push_back (PresetPoint (0.023041, 0.697222));
p->push_back (PresetPoint (0.0553, 0.483333));
p->push_back (PresetPoint (0.610599, 0.0333333));
p->push_back (PresetPoint (1, 0));
fade_out_presets->push_back (p);
-
+
}
}
CrossfadeEditor::curve_select_clicked (WhichFade wf)
{
current = wf;
-
+
if (wf == In) {
-
+
for (vector<ArdourCanvas::WaveView*>::iterator i = fade[In].waves.begin(); i != fade[In].waves.end(); ++i) {
(*i)->property_wave_color() = ARDOUR_UI::config()->canvasvar_SelectedCrossfadeEditorWave.get();
(*i)->property_fill_color() = ARDOUR_UI::config()->canvasvar_SelectedCrossfadeEditorWave.get();
for (list<Point*>::iterator i = fade[In].points.begin(); i != fade[In].points.end(); ++i) {
(*i)->box->hide();
}
-
+
for (list<Point*>::iterator i = fade[Out].points.begin(); i != fade[Out].points.end(); ++i) {
(*i)->box->show();
}
}
}
-double
+double
CrossfadeEditor::x_coordinate (double& xfract) const
{
xfract = min (1.0, xfract);
ht = canvas->get_allocation().get_height() / (double) nchans;
spu = xfade->length() / (double) effective_width();
+ delete _peaks_ready_connection;
+ _peaks_ready_connection = 0;
+
for (uint32_t n = 0; n < nchans; ++n) {
-
+
gdouble yoff = n * ht;
-
- if (region->audio_source(n)->peaks_ready (bind (mem_fun(*this, &CrossfadeEditor::peaks_ready), region, which), peaks_ready_connection)) {
+
+ if (region->audio_source(n)->peaks_ready (boost::bind (&CrossfadeEditor::peaks_ready, this, boost::weak_ptr<AudioRegion>(region), which), &_peaks_ready_connection, gui_context())) {
WaveView* waveview = new WaveView (*(canvas->root()));
waveview->property_data_src() = region.get();
waveview->property_amplitude_above_axis() = 2.0;
waveview->property_wave_color() = color;
waveview->property_fill_color() = color;
-
+
if (which==In)
waveview->property_region_start() = region->start();
else
}
void
-CrossfadeEditor::peaks_ready (boost::shared_ptr<AudioRegion> r, WhichFade which)
+CrossfadeEditor::peaks_ready (boost::weak_ptr<AudioRegion> wr, WhichFade which)
{
+ boost::shared_ptr<AudioRegion> r (wr.lock());
+
+ if (!r) {
+ return;
+ }
+
/* 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 ();
+ delete _peaks_ready_connection;
+ _peaks_ready_connection = 0;
+
make_waves (r, which);
}
void
CrossfadeEditor::audition (Audition which)
{
- AudioPlaylist& pl (session.the_auditioner()->prepare_playlist());
- nframes_t preroll;
- nframes_t postroll;
- nframes_t left_start_offset;
- nframes_t right_length;
- nframes_t left_length;
+ AudioPlaylist& pl (_session->the_auditioner()->prepare_playlist());
+ framecnt_t preroll;
+ framecnt_t postroll;
+ framecnt_t left_start_offset;
+ framecnt_t right_length;
+ framecnt_t left_length;
if (which != Right && preroll_button.get_active()) {
- preroll = session.frame_rate() * 2; //2 second hardcoded preroll for now
+ preroll = _session->frame_rate() * 2; //2 second hardcoded preroll for now
} else {
preroll = 0;
}
if (which != Left && postroll_button.get_active()) {
- postroll = session.frame_rate() * 2; //2 second hardcoded postroll for now
+ postroll = _session->frame_rate() * 2; //2 second hardcoded postroll for now
} else {
postroll = 0;
}
right_length = xfade->in()->length();
}
- 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)));
-
- //apply a 20ms declicking fade at the start and end of auditioning
- left->set_fade_in_active(true);
- left->set_fade_in_length(session.frame_rate() / 50);
- right->set_fade_out_active(true);
- right->set_fade_out_length(session.frame_rate() / 50);
+ PropertyList left_plist;
+ PropertyList right_plist;
+
+
+ left_plist.add (ARDOUR::Properties::start, left_start_offset);
+ left_plist.add (ARDOUR::Properties::length, left_length);
+ left_plist.add (ARDOUR::Properties::name, string ("xfade out"));
+ left_plist.add (ARDOUR::Properties::layer, 0);
+ left_plist.add (ARDOUR::Properties::fade_in_active, true);
+
+ right_plist.add (ARDOUR::Properties::start, 0);
+ right_plist.add (ARDOUR::Properties::length, right_length);
+ right_plist.add (ARDOUR::Properties::name, string("xfade in"));
+ right_plist.add (ARDOUR::Properties::layer, 0);
+ right_plist.add (ARDOUR::Properties::fade_out_active, true);
- pl.add_region (left, 0);
- pl.add_region (right, 1 + preroll);
-
if (which == Left) {
- right->set_scale_amplitude (0.0);
+ right_plist.add (ARDOUR::Properties::scale_amplitude, 0.0f);
} else if (which == Right) {
- left->set_scale_amplitude (0.0);
+ left_plist.add (ARDOUR::Properties::scale_amplitude, 0.0f);
}
+ boost::shared_ptr<AudioRegion> left (boost::dynamic_pointer_cast<AudioRegion>
+ (RegionFactory::create (xfade->out(), left_plist, false)));
+ boost::shared_ptr<AudioRegion> right (boost::dynamic_pointer_cast<AudioRegion>
+ (RegionFactory::create (xfade->in(), right_plist, false)));
+
+ // apply a 20ms declicking fade at the start and end of auditioning
+ // XXX this should really be a property
+
+ left->set_fade_in_length (_session->frame_rate() / 50);
+ right->set_fade_out_length (_session->frame_rate() / 50);
+
+ pl.add_region (left, 0);
+ pl.add_region (right, 1 + preroll);
+
/* there is only one ... */
- pl.foreach_crossfade (this, &CrossfadeEditor::setup);
+ pl.foreach_crossfade (sigc::mem_fun (*this, &CrossfadeEditor::setup));
- session.audition_playlist ();
+ _session->audition_playlist ();
}
void
void
CrossfadeEditor::audition_left_dry ()
{
- 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);
+ PropertyList plist;
+
+ plist.add (ARDOUR::Properties::start, xfade->out()->length() - xfade->length());
+ plist.add (ARDOUR::Properties::length, xfade->length());
+ plist.add (ARDOUR::Properties::name, string("xfade left"));
+ plist.add (ARDOUR::Properties::layer, 0);
+
+ boost::shared_ptr<AudioRegion> left (boost::dynamic_pointer_cast<AudioRegion>
+ (RegionFactory::create (xfade->out(), plist, false)));
+
+ _session->audition_region (left);
}
void
void
CrossfadeEditor::audition_right_dry ()
{
- 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);
+ PropertyList plist;
+
+ plist.add (ARDOUR::Properties::start, 0);
+ plist.add (ARDOUR::Properties::length, xfade->length());
+ plist.add (ARDOUR::Properties::name, string ("xfade right"));
+ plist.add (ARDOUR::Properties::layer, 0);
+
+ boost::shared_ptr<AudioRegion> right (boost::dynamic_pointer_cast<AudioRegion>
+ (RegionFactory::create (xfade->in(), plist, false)));
+
+ _session->audition_region (right);
}
void
{
audition (Right);
}
-
+
void
CrossfadeEditor::cancel_audition ()
{
- session.cancel_audition ();
+ _session->cancel_audition ();
}
void
{
bool x;
- if ((x = audition_both_button.get_active ()) != session.is_auditioning()) {
+ if ((x = audition_both_button.get_active ()) != _session->is_auditioning()) {
if (x) {
audition_both ();
CrossfadeEditor::audition_right_toggled ()
{
bool x;
-
- if ((x = audition_right_button.get_active ()) != session.is_auditioning()) {
+
+ if ((x = audition_right_button.get_active ()) != _session->is_auditioning()) {
if (x) {
audition_right ();
{
bool x;
- if ((x = audition_right_dry_button.get_active ()) != session.is_auditioning()) {
+ if ((x = audition_right_dry_button.get_active ()) != _session->is_auditioning()) {
if (x) {
audition_right_dry ();
{
bool x;
- if ((x = audition_left_button.get_active ()) != session.is_auditioning()) {
+ if ((x = audition_left_button.get_active ()) != _session->is_auditioning()) {
if (x) {
audition_left ();
{
bool x;
- if ((x = audition_left_dry_button.get_active ()) != session.is_auditioning()) {
-
+ if ((x = audition_left_dry_button.get_active ()) != _session->is_auditioning()) {
+
if (x) {
audition_left_dry ();
} else {
}
bool
-CrossfadeEditor::on_key_press_event (GdkEventKey *ev)
+CrossfadeEditor::on_key_press_event (GdkEventKey */*ev*/)
{
return true;
}
break;
case GDK_space:
- if (session.is_auditioning()) {
+ if (_session->is_auditioning()) {
cancel_audition ();
} else {
audition_both_button.set_active (!audition_both_button.get_active());