#include <sigc++/bind.h>
-#include <pbd/stacktrace.h>
+#include "pbd/stacktrace.h"
-#include <ardour/types.h>
-#include <ardour/crossfade.h>
-#include <ardour/crossfade_compare.h>
-#include <ardour/audioregion.h>
-#include <ardour/playlist.h>
-#include <ardour/utils.h>
-#include <ardour/session.h>
-#include <ardour/source.h>
+#include "ardour/types.h"
+#include "ardour/crossfade.h"
+#include "ardour/crossfade_compare.h"
+#include "ardour/audioregion.h"
+#include "ardour/playlist.h"
+#include "ardour/utils.h"
+#include "ardour/session.h"
+#include "ardour/source.h"
#include "i18n.h"
#include <locale.h>
void
Crossfade::set_buffer_size (nframes_t sz)
{
- if (crossfade_buffer_out) {
- delete [] crossfade_buffer_out;
- crossfade_buffer_out = 0;
- }
+ delete [] crossfade_buffer_out;
+ crossfade_buffer_out = 0;
- if (crossfade_buffer_in) {
- delete [] crossfade_buffer_in;
- crossfade_buffer_in = 0;
- }
+ delete [] crossfade_buffer_in;
+ crossfade_buffer_in = 0;
if (sz) {
crossfade_buffer_out = new Sample[sz];
nframes_t position,
AnchorPoint ap)
: AudioRegion (in->session(), position, length, "foobar"),
- _fade_in (Parameter(FadeInAutomation), 0.0, 2.0, 1.0), // linear (gain coefficient) => -inf..+6dB
- _fade_out (Parameter(FadeOutAutomation), 0.0, 2.0, 1.0) // linear (gain coefficient) => -inf..+6dB
+ _fade_in (Evoral::Parameter(FadeInAutomation)), // linear (gain coefficient) => -inf..+6dB
+ _fade_out (Evoral::Parameter(FadeOutAutomation)) // linear (gain coefficient) => -inf..+6dB
{
_in = in;
_out = out;
-
_anchor_point = ap;
_follow_overlap = false;
- _active = Config->get_xfades_active ();
+ _active = _session.config.get_xfades_active ();
_fixed = true;
initialize ();
Crossfade::Crossfade (boost::shared_ptr<AudioRegion> a, boost::shared_ptr<AudioRegion> b, CrossfadeModel model, bool act)
: AudioRegion (a->session(), 0, 0, "foobar"),
- _fade_in (Parameter(FadeInAutomation), 0.0, 2.0, 1.0), // linear (gain coefficient) => -inf..+6dB
- _fade_out (Parameter(FadeOutAutomation), 0.0, 2.0, 1.0) // linear (gain coefficient) => -inf..+6dB
+ _fade_in (Evoral::Parameter(FadeInAutomation)), // linear (gain coefficient) => -inf..+6dB
+ _fade_out (Evoral::Parameter(FadeOutAutomation)) // linear (gain coefficient) => -inf..+6dB
{
_in_update = false;
_fixed = false;
+ _follow_overlap = false;
if (compute (a, b, model)) {
throw failed_constructor();
_active = act;
initialize ();
-
-
}
Crossfade::Crossfade (const Playlist& playlist, XMLNode& node)
: AudioRegion (playlist.session(), 0, 0, "foobar"),
- _fade_in (Parameter(FadeInAutomation), 0.0, 2.0, 1.0), // linear (gain coefficient) => -inf..+6dB
- _fade_out (Parameter(FadeOutAutomation), 0.0, 2.0, 1.0) // linear (gain coefficient) => -inf..+6dB
+ _fade_in (Evoral::Parameter(FadeInAutomation)), // linear (gain coefficient) => -inf..+6dB
+ _fade_out (Evoral::Parameter(FadeOutAutomation)) // linear (gain coefficient) => -inf..+6dB
{
boost::shared_ptr<Region> r;
_length = 0;
initialize();
+ _active = true;
if (set_state (node)) {
throw failed_constructor();
layer_relation = (int32_t) (_in->layer() - _out->layer());
// Let's make sure the fade isn't too long
- set_length(_length);
+ set_xfade_length(_length);
}
_fade_out.freeze ();
_fade_out.clear ();
- _fade_out.add (0.0, 1.0);
- _fade_out.add ((_length * 0.1), 0.99);
- _fade_out.add ((_length * 0.2), 0.97);
- _fade_out.add ((_length * 0.8), 0.03);
- _fade_out.add ((_length * 0.9), 0.01);
- _fade_out.add (_length, 0.0);
+
+#define EQUAL_POWER_MINUS_3DB
+#ifdef EQUAL_POWER_MINUS_3DB
+
+ _fade_out.add ((_length * 0.000000), 1.000000);
+ _fade_out.add ((_length * 0.166667), 0.948859);
+ _fade_out.add ((_length * 0.333333), 0.851507);
+ _fade_out.add ((_length * 0.500000), 0.707946);
+ _fade_out.add ((_length * 0.666667), 0.518174);
+ _fade_out.add ((_length * 0.833333), 0.282192);
+ _fade_out.add ((_length * 1.000000), 0.000000);
+
+#else // EQUAL_POWER_MINUS_6DB
+
+ _fade_out.add ((_length * 0.000000), 1.000000);
+ _fade_out.add ((_length * 0.166667), 0.833033);
+ _fade_out.add ((_length * 0.333333), 0.666186);
+ _fade_out.add ((_length * 0.500000), 0.499459);
+ _fade_out.add ((_length * 0.666667), 0.332853);
+ _fade_out.add ((_length * 0.833333), 0.166366);
+ _fade_out.add ((_length * 1.000000), 0.000000);
+#endif
+
_fade_out.thaw ();
_fade_in.freeze ();
_fade_in.clear ();
- _fade_in.add (0.0, 0.0);
- _fade_in.add ((_length * 0.1), 0.01);
- _fade_in.add ((_length * 0.2), 0.03);
- _fade_in.add ((_length * 0.8), 0.97);
- _fade_in.add ((_length * 0.9), 0.99);
- _fade_in.add (_length, 1.0);
+
+#define EQUAL_POWER_MINUS_3DB
+#ifdef EQUAL_POWER_MINUS_3DB
+
+ _fade_in.add ((_length * 0.000000), 0.000000);
+ _fade_in.add ((_length * 0.166667), 0.282192);
+ _fade_in.add ((_length * 0.333333), 0.518174);
+ _fade_in.add ((_length * 0.500000), 0.707946);
+ _fade_in.add ((_length * 0.666667), 0.851507);
+ _fade_in.add ((_length * 0.833333), 0.948859);
+ _fade_in.add ((_length * 1.000000), 1.000000);
+
+#else // EQUAL_POWER_MINUS_SIX_DB
+
+ _fade_in.add ((_length * 0.000000), 0.000000);
+ _fade_in.add ((_length * 0.166667), 0.166366);
+ _fade_in.add ((_length * 0.333333), 0.332853);
+ _fade_in.add ((_length * 0.500000), 0.499459);
+ _fade_in.add ((_length * 0.666667), 0.666186);
+ _fade_in.add ((_length * 0.833333), 0.833033);
+ _fade_in.add ((_length * 1.000000), 1.000000);
+
+#endif
+
_fade_in.thaw ();
overlap_type = _in->coverage (_out->position(), _out->last_frame());
}
nframes_t
-Crossfade::read_raw_internal (Sample* buf, nframes_t start, nframes_t cnt) const
+Crossfade::read_raw_internal (Sample* buf, sframes_t start, nframes_t cnt, int channel) const
{
+ // FIXME: Why is this disabled?
#if 0
Sample* mixdown = new Sample[cnt];
float* gain = new float[cnt];
nframes_t
Crossfade::read_at (Sample *buf, Sample *mixdown_buffer,
- float *gain_buffer, nframes_t start, nframes_t cnt, uint32_t chan_n) const
+ float *gain_buffer, sframes_t start, nframes_t cnt, uint32_t chan_n,
+ nframes_t read_frames, nframes_t skip_frames) const
{
nframes_t offset;
nframes_t to_write;
} else {
- to_write = min (_length - (start - _position), cnt);
+ to_write = min (nframes_t(_length - (start - _position)), cnt);
}
} else if (!(_in->opaque())) {
memset (crossfade_buffer_in, 0, sizeof (Sample) * to_write);
}
-
- _out->read_at (crossfade_buffer_out, mixdown_buffer, gain_buffer, start, to_write, chan_n);
- _in->read_at (crossfade_buffer_in, mixdown_buffer, gain_buffer, start, to_write, chan_n);
+
+ _out->read_at (crossfade_buffer_out, mixdown_buffer, gain_buffer, start, to_write, chan_n, read_frames, skip_frames);
+ _in->read_at (crossfade_buffer_in, mixdown_buffer, gain_buffer, start, to_write, chan_n, read_frames, skip_frames);
float* fiv = new float[to_write];
float* fov = new float[to_write];
if (_follow_overlap) {
try {
- compute (_in, _out, Config->get_xfade_model());
+ compute (_in, _out, _session.config.get_xfade_model());
}
catch (NoCrossfadeHere& err) {
_follow_overlap = yn;
if (!yn) {
- set_length (_short_xfade_length);
+ set_xfade_length (_short_xfade_length);
} else {
- set_length (_out->first_frame() + _out->length() - _in->first_frame());
+ set_xfade_length (_out->first_frame() + _out->length() - _in->first_frame());
}
StateChanged (FollowOverlapChanged);
}
nframes_t
-Crossfade::set_length (nframes_t len)
+Crossfade::set_xfade_length (nframes_t len)
{
- nframes_t limit;
+ nframes_t limit = 0;
switch (_anchor_point) {
case StartOfIn: