along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- $Id$
*/
#include <cmath>
#include <libgnomecanvasmm/line.h>
-#include <ardour/automation_event.h>
-#include <ardour/curve.h>
+#include <ardour/automation_list.h>
+#include <evoral/Curve.hpp>
#include <ardour/crossfade.h>
#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>
#include "canvas_impl.h"
#include "simplerect.h"
#include "waveview.h"
-#include "color.h"
using namespace std;
using namespace ARDOUR;
CrossfadeEditor::Half::Half ()
: line (0),
- normative_curve (0.0, 1.0, 1.0, true),
- gain_curve (0.0, 2.0, 1.0, true)
+ //normative_curve (Evoral::Parameter(GainAutomation, 0.0, 1.0, 1.0)), // FIXME: GainAutomation?
+ normative_curve (Evoral::Parameter(GainAutomation)),
+ gain_curve (Evoral::Parameter(GainAutomation))
{
}
-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),
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);
toplevel->property_x2() = 10.0;
toplevel->property_y2() = 10.0;
toplevel->property_fill() = true;
- toplevel->property_fill_color_rgba() = color_map[cCrossfadeEditorBase];
+ 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));
fade[Out].line = new ArdourCanvas::Line (*(canvas->root()));
fade[Out].line->property_width_pixels() = 1;
- fade[Out].line->property_fill_color_rgba() = color_map[cCrossfadeEditorLine];
+ 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() = color_map[cCrossfadeEditorLineShading];
+ 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() = color_map[cCrossfadeEditorLine];
+ 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() = color_map[cCrossfadeEditorLineShading];
+ 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));
for (list<Preset*>::iterator i = fade_in_presets->begin(); i != fade_in_presets->end(); ++i) {
- pxmap = manage (new Image (get_xpm((*i)->xpm)));
+ pxmap = manage (new Image (::get_icon ((*i)->image_name)));
pbutton = manage (new Button);
pbutton->add (*pxmap);
pbutton->set_name ("CrossfadeEditButton");
for (list<Preset*>::iterator i = fade_out_presets->begin(); i != fade_out_presets->end(); ++i) {
- pxmap = manage (new Image (get_xpm((*i)->xpm)));
+ pxmap = manage (new Image (::get_icon ((*i)->image_name)));
pbutton = manage (new Button);
pbutton->add (*pxmap);
pbutton->set_name ("CrossfadeEditButton");
// 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();
}
void
-CrossfadeEditor::set (const ARDOUR::Curve& curve, WhichFade which)
+CrossfadeEditor::set (const ARDOUR::AutomationList& curve, WhichFade which)
{
double firstx, endx;
- ARDOUR::Curve::const_iterator the_end;
+ ARDOUR::AutomationList::const_iterator the_end;
for (list<Point*>::iterator i = fade[which].points.begin(); i != fade[which].points.end(); ++i) {
delete *i;
goto out;
}
- the_end = curve.const_end();
+ the_end = curve.end();
--the_end;
- firstx = (*curve.const_begin())->when;
+ firstx = (*curve.begin())->when;
endx = (*the_end)->when;
- for (ARDOUR::Curve::const_iterator i = curve.const_begin(); i != curve.const_end(); ++i) {
+ 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);
case GDK_BUTTON_PRESS:
add_control_point ((event->button.x - canvas_border)/effective_width(),
1.0 - ((event->button.y - canvas_border)/effective_height()));
- return TRUE;
+ return true;
break;
default:
break;
}
- return FALSE;
+ return false;
}
CrossfadeEditor::Point::~Point()
p->box = new ArdourCanvas::SimpleRect (*(canvas->root()));
p->box->property_fill() = true;
- p->box->property_fill_color_rgba() = color_map[cCrossfadeEditorPointFill];
- p->box->property_outline_color_rgba() = color_map[cCrossfadeEditorPointOutline];
+ p->box->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorPointFill.get();
+ p->box->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorPointOutline.get();
p->box->property_outline_pixels() = 1;
p->curve = fade[current].line;
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;
(*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;
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
return;
}
- jack_nframes_t len = xfade.length ();
+ nframes_t len = xfade->length ();
fade[current].normative_curve.clear ();
fade[current].gain_curve.clear ();
for (list<Point*>::iterator i = fade[current].points.begin(); i != fade[current].points.end(); ++i) {
fade[current].normative_curve.add ((*i)->x, (*i)->y);
- fade[current].gain_curve.add (((*i)->x * len), (*i)->y);
+ double offset;
+ if (current==In)
+ offset = xfade->in()->start();
+ else
+ offset = xfade->out()->start()+xfade->out()->length()-xfade->length();
+ fade[current].gain_curve.add (((*i)->x * len) + offset, (*i)->y);
}
+
size_t npoints = (size_t) effective_width();
float vec[npoints];
- fade[current].normative_curve.get_vector (0, 1.0, vec, npoints);
+ fade[current].normative_curve.curve().get_vector (0, 1.0, vec, npoints);
ArdourCanvas::Points pts;
ArdourCanvas::Points spts;
}
- // GTK2FIX some odd math to fix up here
-
size_t last_spt = (npoints + 3) - 1;
for (size_t i = 0; i < npoints; ++i) {
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 ()
{
- _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());
+ ARDOUR::AutomationList& in (xf->fade_in());
+ ARDOUR::AutomationList& out (xf->fade_out());
/* IN */
- ARDOUR::Curve::const_iterator the_end = in.const_end();
+ ARDOUR::AutomationList::const_iterator the_end = in.end();
--the_end;
double firstx = (*in.begin())->when;
/* OUT */
- the_end = out.const_end();
+ the_end = out.end();
--the_end;
firstx = (*out.begin())->when;
}
void
-CrossfadeEditor::setup (Crossfade* xfade)
+CrossfadeEditor::setup (boost::shared_ptr<Crossfade> xfade)
{
_apply_to (xfade);
xfade->set_active (true);
- xfade->fade_in().solve ();
- xfade->fade_out().solve ();
+ xfade->fade_in().curve().solve ();
+ xfade->fade_out().curve().solve ();
}
void
void
CrossfadeEditor::reset ()
{
- set (xfade.fade_in(), In);
- set (xfade.fade_out(), Out);
+ set (xfade->fade_in(), In);
+ set (xfade->fade_out(), Out);
+
+ curve_select_clicked (current);
}
void
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));
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));
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));
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));
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);
+ p = new Preset ("crossfade_in_default");
+ 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 (0.8, 0.97));
+ p->push_back (PresetPoint (0.9, 0.99));
+ 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));
p->push_back (PresetPoint (1, 0));
fade_out_presets->push_back (p);
- p = new Preset ("regout.xpm");
- 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.529954, 0.886111));
- p->push_back (PresetPoint (0.753456, 0.658333));
- p->push_back (PresetPoint (0.9262673, 0.308333));
- 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));
p->push_back (PresetPoint (1, 0));
fade_out_presets->push_back (p);
- p = new Preset ("regout2.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));
+ p->push_back (PresetPoint (0.529954, 0.886111));
+ p->push_back (PresetPoint (0.753456, 0.658333));
+ p->push_back (PresetPoint (0.9262673, 0.308333));
+ p->push_back (PresetPoint (1, 0));
+ fade_out_presets->push_back (p);
+
+ // 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));
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);
+
+ p = new Preset ("crossfade_out_default");
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 (0.8, 0.03));
+ p->push_back (PresetPoint (0.9, 0.01));
p->push_back (PresetPoint (1, 0));
fade_out_presets->push_back (p);
}
if (wf == In) {
for (vector<ArdourCanvas::WaveView*>::iterator i = fade[In].waves.begin(); i != fade[In].waves.end(); ++i) {
- (*i)->property_wave_color() = color_map[cSelectedCrossfadeEditorWave];
+ (*i)->property_wave_color() = ARDOUR_UI::config()->canvasvar_SelectedCrossfadeEditorWave.get();
+ (*i)->property_fill_color() = ARDOUR_UI::config()->canvasvar_SelectedCrossfadeEditorWave.get();
}
for (vector<ArdourCanvas::WaveView*>::iterator i = fade[Out].waves.begin(); i != fade[Out].waves.end(); ++i) {
- (*i)->property_wave_color() = color_map[cCrossfadeEditorWave];
+ (*i)->property_wave_color() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorWave.get();
+ (*i)->property_fill_color() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorWave.get();
}
- fade[In].line->property_fill_color_rgba() = color_map[cSelectedCrossfadeEditorLine];
- fade[Out].line->property_fill_color_rgba() = color_map[cCrossfadeEditorLine];
+ fade[In].line->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_SelectedCrossfadeEditorLine.get();
+ fade[Out].line->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorLine.get();
fade[Out].shading->hide();
fade[In].shading->show();
(*i)->box->show ();
}
- for (vector<Button*>::iterator i = fade_out_buttons.begin(); i != fade_out_buttons.end(); ++i) {
- (*i)->set_sensitive (false);
- }
-
- for (vector<Button*>::iterator i = fade_in_buttons.begin(); i != fade_in_buttons.end(); ++i) {
- (*i)->set_sensitive (true);
- }
-
} else {
for (vector<ArdourCanvas::WaveView*>::iterator i = fade[In].waves.begin(); i != fade[In].waves.end(); ++i) {
- (*i)->property_wave_color() = color_map[cCrossfadeEditorWave];
+ (*i)->property_wave_color() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorWave.get();
+ (*i)->property_fill_color() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorWave.get();
}
for (vector<ArdourCanvas::WaveView*>::iterator i = fade[Out].waves.begin(); i != fade[Out].waves.end(); ++i) {
- (*i)->property_wave_color() = color_map[cSelectedCrossfadeEditorWave];
+ (*i)->property_wave_color() = ARDOUR_UI::config()->canvasvar_SelectedCrossfadeEditorWave.get();
+ (*i)->property_fill_color() = ARDOUR_UI::config()->canvasvar_SelectedCrossfadeEditorWave.get();
}
- fade[Out].line->property_fill_color_rgba() = color_map[cSelectedCrossfadeEditorLine];
- fade[In].line->property_fill_color_rgba() = color_map[cCrossfadeEditorLine];
+ fade[Out].line->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_SelectedCrossfadeEditorLine.get();
+ fade[In].line->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_CrossfadeEditorLine.get();
fade[In].shading->hide();
fade[Out].shading->show();
(*i)->box->show();
}
- for (vector<Button*>::iterator i = fade_out_buttons.begin(); i != fade_out_buttons.end(); ++i) {
- (*i)->set_sensitive (true);
- }
-
- for (vector<Button*>::iterator i = fade_in_buttons.begin(); i != fade_in_buttons.end(); ++i) {
- (*i)->set_sensitive (false);
- }
-
}
}
}
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;
if (which == In) {
- color = color_map[cSelectedCrossfadeEditorWave];
+ color = ARDOUR_UI::config()->canvasvar_SelectedCrossfadeEditorWave.get();
} else {
- color = color_map[cCrossfadeEditorWave];
+ color = ARDOUR_UI::config()->canvasvar_CrossfadeEditorWave.get();
}
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), ®ion, which), peaks_ready_connection)) {
-
+ if (region->audio_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() = ®ion;
+ waveview->property_data_src() = region.get();
waveview->property_cache_updater() = true;
waveview->property_cache() = WaveView::create_cache();
waveview->property_channel() = n;
waveview->property_samples_per_unit() = spu;
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
+ waveview->property_region_start() = region->start()+region->length()-xfade->length();
+
waveview->lower_to_bottom();
fade[which].waves.push_back (waveview);
}
}
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 ()
+CrossfadeEditor::audition (Audition which)
{
- 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;
-
- if (preroll_button.get_active()) {
- preroll = ARDOUR_UI::instance()->preroll_clock.current_duration ();
+ 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;
+
+ if (which != Right && preroll_button.get_active()) {
+ preroll = session.frame_rate() * 2; //2 second hardcoded preroll for now
} else {
preroll = 0;
}
- if (postroll_button.get_active()) {
- postroll = ARDOUR_UI::instance()->postroll_clock.current_duration ();
+ if (which != Left && postroll_button.get_active()) {
+ postroll = session.frame_rate() * 2; //2 second hardcoded postroll for now
} else {
postroll = 0;
}
- 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) {
- length += postroll;
- }
-
- right_length = xfade.length();
+ // Is there enough data for the whole preroll?
+ left_length = xfade->length();
+ if ((left_start_offset = xfade->out()->length() - xfade->length()) > preroll) {
+ left_start_offset -= preroll;
+ } else {
+ preroll = left_start_offset;
+ left_start_offset = 0;
+ }
+ left_length += preroll;
- if (xfade.in().length() - right_length < postroll) {
+ // Is there enough data for the whole postroll?
+ right_length = xfade->length();
+ if ((xfade->in()->length() - right_length) > postroll) {
right_length += postroll;
+ } else {
+ right_length = xfade->in()->length();
}
- 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);
+ //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);
+
+ pl.add_region (left, 0);
+ pl.add_region (right, 1 + preroll);
+
+ if (which == Left) {
+ right->set_scale_amplitude (0.0);
+ } else if (which == Right) {
+ left->set_scale_amplitude (0.0);
+ }
/* there is only one ... */
-
pl.foreach_crossfade (this, &CrossfadeEditor::setup);
session.audition_playlist ();
}
+void
+CrossfadeEditor::audition_both ()
+{
+ 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());
-
- 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);
-
- pl.add_region (*left, 0);
- pl.add_region (*right, 1);
-
- right->set_muted (true);
-
- /* there is only one ... */
-
- pl.foreach_crossfade (this, &CrossfadeEditor::setup);
-
- session.audition_playlist ();
-
- /* memory leak for regions */
+ 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());
-
- 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);
-
- pl.add_region (*left, 0);
- pl.add_region (*right, 1);
-
- left->set_muted (true);
-
- /* there is only one ... */
-
- pl.foreach_crossfade (this, &CrossfadeEditor::setup);
-
- session.audition_playlist ();
+ audition (Right);
}
void