continue;
}
-
boost::shared_ptr<AudioRegion> top;
boost::shared_ptr<AudioRegion> bottom;
*/
if (done_start.find (top) == done_start.end() && done_end.find (bottom) == done_end.end ()) {
- /* Top's fade-in will cause an implicit fade-out of bottom */
+ /* Top's fade-in will cause an implicit fade-out of bottom */
+
framecnt_t len = 0;
switch (_session.config.get_xfade_model()) {
case FullCrossfade:
len = _session.config.get_short_xfade_seconds() * _session.frame_rate();
break;
}
-
- top->set_fade_in_length (len);
+
+ switch (_session.config.get_xfade_choice ()) {
+ case ConstantPowerMinus3dB:
+ top->set_fade_in (FadeConstantPowerMinus3dB, len);
+ break;
+ case ConstantPowerMinus6dB:
+ top->set_fade_in (FadeConstantPowerMinus6dB, len);
+ break;
+ case RegionFades:
+ top->set_fade_in_length (len);
+ break;
+ }
top->set_fade_in_active (true);
+ top->set_fade_in_is_xfade (true);
+
done_start.insert (top);
- done_end.insert (bottom);
}
} else if (c == Evoral::OverlapEnd) {
framecnt_t len = 0;
switch (_session.config.get_xfade_model()) {
case FullCrossfade:
- len = bottom->last_frame () - top->first_frame ();
+ len = top->last_frame () - bottom->first_frame ();
break;
case ShortCrossfade:
len = _session.config.get_short_xfade_seconds() * _session.frame_rate();
break;
}
-
- top->set_fade_out_length (len);
+
+ switch (_session.config.get_xfade_choice ()) {
+ case ConstantPowerMinus3dB:
+ top->set_fade_out (FadeConstantPowerMinus3dB, len);
+ break;
+ case ConstantPowerMinus6dB:
+ top->set_fade_out (FadeConstantPowerMinus6dB, len);
+ break;
+ case RegionFades:
+ top->set_fade_out_length (len);
+ break;
+ }
top->set_fade_out_active (true);
+ top->set_fade_out_is_xfade (true);
+
done_end.insert (top);
- done_start.insert (bottom);
}
}
}
, _envelope (new AutomationList(Evoral::Parameter(EnvelopeAutomation)))
, _fade_in_suspended (0)
, _fade_out_suspended (0)
+ , _fade_in_is_xfade (false)
+ , _fade_out_is_xfade (false)
{
init ();
assert (_sources.size() == _master_sources.size());
, _envelope (new AutomationList(Evoral::Parameter(EnvelopeAutomation)))
, _fade_in_suspended (0)
, _fade_out_suspended (0)
+ , _fade_in_is_xfade (false)
+ , _fade_out_is_xfade (false)
{
init ();
assert (_sources.size() == _master_sources.size());
, _envelope (new AutomationList (*other->_envelope, 0, other->_length))
, _fade_in_suspended (0)
, _fade_out_suspended (0)
+ , _fade_in_is_xfade (false)
+ , _fade_out_is_xfade (false)
{
/* don't use init here, because we got fade in/out from the other region
*/
, _envelope (new AutomationList (*other->_envelope, offset, other->_length))
, _fade_in_suspended (0)
, _fade_out_suspended (0)
+ , _fade_in_is_xfade (false)
+ , _fade_out_is_xfade (false)
{
/* don't use init here, because we got fade in/out from the other region
*/
, _envelope (new AutomationList (*other->_envelope))
, _fade_in_suspended (0)
, _fade_out_suspended (0)
+ , _fade_in_is_xfade (false)
+ , _fade_out_is_xfade (false)
{
/* make-a-sort-of-copy-with-different-sources constructor (used by audio filter) */
, _envelope (new AutomationList(Evoral::Parameter(EnvelopeAutomation)))
, _fade_in_suspended (0)
, _fade_out_suspended (0)
+ , _fade_in_is_xfade (false)
+ , _fade_out_is_xfade (false)
{
init ();
_fade_in->fast_simple_add (len * 0.919355, 0.730556);
_fade_in->fast_simple_add (len, 1);
break;
+
+ case FadeConstantPowerMinus3dB:
+ _fade_in->fast_simple_add (0.0, 0.0);
+ _fade_in->fast_simple_add ((len * 0.166667), 0.282192);
+ _fade_in->fast_simple_add ((len * 0.333333), 0.518174);
+ _fade_in->fast_simple_add ((len * 0.500000), 0.707946);
+ _fade_in->fast_simple_add ((len * 0.666667), 0.851507);
+ _fade_in->fast_simple_add ((len * 0.833333), 0.948859);
+ _fade_in->fast_simple_add (len, 1.0);
+ break;
+
+ case FadeConstantPowerMinus6dB:
+ _fade_in->fast_simple_add (0.0, 0.0);
+ _fade_in->fast_simple_add ((len * 0.166667), 0.166366);
+ _fade_in->fast_simple_add ((len * 0.333333), 0.332853);
+ _fade_in->fast_simple_add ((len * 0.500000), 0.499459);
+ _fade_in->fast_simple_add ((len * 0.666667), 0.666186);
+ _fade_in->fast_simple_add ((len * 0.833333), 0.833033);
+ _fade_in->fast_simple_add (len, 1.0);
+ break;
}
_fade_in->thaw ();
switch (shape) {
case FadeFast:
- _fade_out->fast_simple_add (len * 0, 1);
+ _fade_out->fast_simple_add (0.0, 1.0);
_fade_out->fast_simple_add (len * 0.023041, 0.697222);
_fade_out->fast_simple_add (len * 0.0553, 0.483333);
_fade_out->fast_simple_add (len * 0.170507, 0.233333);
_fade_out->fast_simple_add (len * 0.370968, 0.0861111);
_fade_out->fast_simple_add (len * 0.610599, 0.0333333);
- _fade_out->fast_simple_add (len * 1, 0);
+ _fade_out->fast_simple_add (1.0, 0.0);
break;
case FadeLogA:
- _fade_out->fast_simple_add (len * 0, 1);
+ _fade_out->fast_simple_add (0, 1.0);
_fade_out->fast_simple_add (len * 0.228111, 0.988889);
_fade_out->fast_simple_add (len * 0.347926, 0.972222);
_fade_out->fast_simple_add (len * 0.529954, 0.886111);
_fade_out->fast_simple_add (len * 0.753456, 0.658333);
_fade_out->fast_simple_add (len * 0.9262673, 0.308333);
- _fade_out->fast_simple_add (len * 1, 0);
+ _fade_out->fast_simple_add (len, 0.0);
break;
case FadeSlow:
- _fade_out->fast_simple_add (len * 0, 1);
+ _fade_out->fast_simple_add (0.0, 1.0);
_fade_out->fast_simple_add (len * 0.305556, 1);
_fade_out->fast_simple_add (len * 0.548611, 0.991736);
_fade_out->fast_simple_add (len * 0.759259, 0.931129);
_fade_out->fast_simple_add (len * 0.918981, 0.68595);
_fade_out->fast_simple_add (len * 0.976852, 0.22865);
- _fade_out->fast_simple_add (len * 1, 0);
+ _fade_out->fast_simple_add (len, 0.0);
break;
case FadeLogB:
- _fade_out->fast_simple_add (len * 0, 1);
+ _fade_out->fast_simple_add (0.0, 1.0);
_fade_out->fast_simple_add (len * 0.080645, 0.730556);
_fade_out->fast_simple_add (len * 0.277778, 0.289256);
_fade_out->fast_simple_add (len * 0.470046, 0.152778);
_fade_out->fast_simple_add (len * 0.695853, 0.0694444);
- _fade_out->fast_simple_add (len * 1, 0);
+ _fade_out->fast_simple_add (len, 0.0);
break;
case FadeLinear:
- _fade_out->fast_simple_add (len * 0, 1);
- _fade_out->fast_simple_add (len * 1, 0);
+ _fade_out->fast_simple_add (0.0, 1.0);
+ _fade_out->fast_simple_add (len, 0.0);
+ break;
+
+ case FadeConstantPowerMinus3dB:
+ _fade_out->fast_simple_add (0.0, 1.0);
+ _fade_out->fast_simple_add ((len * 0.166667), 0.948859);
+ _fade_out->fast_simple_add ((len * 0.333333), 0.851507);
+ _fade_out->fast_simple_add ((len * 0.500000), 0.707946);
+ _fade_out->fast_simple_add ((len * 0.666667), 0.518174);
+ _fade_out->fast_simple_add ((len * 0.833333), 0.282192);
+ _fade_out->fast_simple_add (len, 0.0);
+ break;
+
+ case FadeConstantPowerMinus6dB:
+ _fade_out->fast_simple_add (0.0, 1.0);
+ _fade_out->fast_simple_add ((len * 0.166667), 0.833033);
+ _fade_out->fast_simple_add ((len * 0.333333), 0.666186);
+ _fade_out->fast_simple_add ((len * 0.500000), 0.499459);
+ _fade_out->fast_simple_add ((len * 0.666667), 0.332853);
+ _fade_out->fast_simple_add ((len * 0.833333), 0.166366);
+ _fade_out->fast_simple_add (len, 0.0);
break;
}
AudioRegion::set_default_fade_in ()
{
_fade_in_suspended = 0;
+ _fade_in_is_xfade = false;
set_fade_in (FadeLinear, 64);
}
AudioRegion::set_default_fade_out ()
{
_fade_out_suspended = 0;
+ _fade_out_is_xfade = false;
set_fade_out (FadeLinear, 64);
}
return Evoral::Range<framepos_t> (first_frame() + _fade_in->back()->when, last_frame() - _fade_out->back()->when);
}
+void
+AudioRegion::set_fade_in_is_xfade (bool yn)
+{
+ _fade_in_is_xfade = yn;
+}
+
+void
+AudioRegion::set_fade_out_is_xfade (bool yn)
+{
+ _fade_out_is_xfade = yn;
+}
+
extern "C" {
int region_read_peaks_from_c (void *arg, uint32_t npeaks, uint32_t start, uint32_t cnt, intptr_t data, uint32_t n_chan, double samples_per_unit)