X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Faudioregion.cc;h=248da959367a24ddbecf7bdde47429e0a29203c6;hb=1db2be2fef7a70f5200bcd96a701f612bbd7ec52;hp=9cbbdcfe4e271d2ba57a2107c92285e0c663c5f9;hpb=37bc04f2305d9f8cf812db8dedfc97815c1c6dca;p=ardour.git diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc index 9cbbdcfe4e..248da95936 100644 --- a/libs/ardour/audioregion.cc +++ b/libs/ardour/audioregion.cc @@ -37,7 +37,6 @@ #include "evoral/Curve.hpp" #include "ardour/audioregion.h" -#include "ardour/debug.h" #include "ardour/session.h" #include "ardour/dB.h" #include "ardour/playlist.h" @@ -62,6 +61,10 @@ namespace ARDOUR { PBD::PropertyDescriptor fade_in_active; PBD::PropertyDescriptor fade_out_active; PBD::PropertyDescriptor scale_amplitude; + PBD::PropertyDescriptor fade_out_is_xfade; + PBD::PropertyDescriptor fade_out_is_short; + PBD::PropertyDescriptor fade_in_is_xfade; + PBD::PropertyDescriptor fade_in_is_short; } } @@ -75,14 +78,14 @@ reverse_curve (boost::shared_ptr dst, boost::shared_ptrback()->when; for (Evoral::ControlList::const_iterator it = src->begin(); it!=src->end(); it++) { - dst->add ( len - (*it)->when, (*it)->value ); + dst->add (len - (*it)->when, (*it)->value); } } static void generate_inverse_power_curve (boost::shared_ptr dst, boost::shared_ptr src) { - //calc inverse curve using sum of squares + // calc inverse curve using sum of squares for (Evoral::ControlList::const_iterator it = src->begin(); it!=src->end(); ++it ) { float value = (*it)->value; value = 1 - powf(value,2); @@ -91,18 +94,6 @@ generate_inverse_power_curve (boost::shared_ptr dst, boost: } } -/* -static void -generate_inverse_coefficient_curve (boost::shared_ptr dst, boost::shared_ptr src) -{ - //calc inverse gain coefficient curve - for (Evoral::ControlList::const_iterator it = src->begin(); it!=src->end(); ++it ) { - float value = 1.0 - (*it)->value; - dst->fast_simple_add ( (*it)->when, value ); - } -} -*/ - static void generate_db_fade (boost::shared_ptr dst, double len, int num_steps, float dB_drop) { @@ -165,6 +156,14 @@ AudioRegion::make_property_quarks () DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for fade-out-active = %1\n", Properties::fade_out_active.property_id)); Properties::scale_amplitude.property_id = g_quark_from_static_string (X_("scale-amplitude")); DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for scale-amplitude = %1\n", Properties::scale_amplitude.property_id)); + Properties::fade_out_is_xfade.property_id = g_quark_from_static_string (X_("fade-out-is-xfade")); + DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for fade-out-is-xfade = %1\n", Properties::fade_out_is_xfade.property_id)); + Properties::fade_out_is_short.property_id = g_quark_from_static_string (X_("fade-out-is-short")); + DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for fade-out-is-short = %1\n", Properties::fade_out_is_short.property_id)); + Properties::fade_in_is_xfade.property_id = g_quark_from_static_string (X_("fade-in-is-xfade")); + DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for fade-in-is-xfade = %1\n", Properties::fade_in_is_xfade.property_id)); + Properties::fade_in_is_short.property_id = g_quark_from_static_string (X_("fade-in-is-short")); + DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for fade-in-is-short = %1\n", Properties::fade_in_is_short.property_id)); } void @@ -178,6 +177,10 @@ AudioRegion::register_properties () add_property (_fade_in_active); add_property (_fade_out_active); add_property (_scale_amplitude); + add_property (_fade_out_is_xfade); + add_property (_fade_out_is_short); + add_property (_fade_in_is_xfade); + add_property (_fade_in_is_short); } #define AUDIOREGION_STATE_DEFAULT \ @@ -186,7 +189,11 @@ AudioRegion::register_properties () , _default_fade_out (Properties::default_fade_out, true) \ , _fade_in_active (Properties::fade_in_active, true) \ , _fade_out_active (Properties::fade_out_active, true) \ - , _scale_amplitude (Properties::scale_amplitude, 1.0) + , _scale_amplitude (Properties::scale_amplitude, 1.0) \ + , _fade_in_is_xfade (Properties::fade_in_is_xfade, false) \ + , _fade_out_is_xfade (Properties::fade_out_is_xfade, false) \ + , _fade_in_is_short (Properties::fade_in_is_short, false) \ + , _fade_out_is_short (Properties::fade_out_is_short, false) #define AUDIOREGION_COPY_STATE(other) \ _envelope_active (Properties::envelope_active, other->_envelope_active) \ @@ -194,7 +201,11 @@ AudioRegion::register_properties () , _default_fade_out (Properties::default_fade_out, other->_default_fade_out) \ , _fade_in_active (Properties::fade_in_active, other->_fade_in_active) \ , _fade_out_active (Properties::fade_out_active, other->_fade_out_active) \ - , _scale_amplitude (Properties::scale_amplitude, other->_scale_amplitude) + , _scale_amplitude (Properties::scale_amplitude, other->_scale_amplitude) \ + , _fade_in_is_xfade (Properties::fade_in_is_xfade, other->_fade_in_is_xfade) \ + , _fade_out_is_xfade (Properties::fade_out_is_xfade, other->_fade_out_is_xfade) \ + , _fade_in_is_short (Properties::fade_in_is_short, other->_fade_in_is_short) \ + , _fade_out_is_short (Properties::fade_out_is_short, other->_fade_out_is_short) /* a Session will reset these to its chosen defaults by calling AudioRegion::set_default_fade() */ void @@ -224,8 +235,6 @@ AudioRegion::AudioRegion (Session& s, framepos_t start, framecnt_t len, std::str , _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()); @@ -243,8 +252,6 @@ AudioRegion::AudioRegion (const SourceList& srcs) , _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()); @@ -264,8 +271,6 @@ AudioRegion::AudioRegion (boost::shared_ptr other) , _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 */ @@ -292,8 +297,6 @@ AudioRegion::AudioRegion (boost::shared_ptr other, framecnt_t , _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 */ @@ -317,8 +320,6 @@ AudioRegion::AudioRegion (boost::shared_ptr other, const Sour , _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) */ @@ -342,8 +343,6 @@ AudioRegion::AudioRegion (SourceList& srcs) , _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 (); @@ -704,7 +703,7 @@ AudioRegion::read_at (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, } - /* MIX THE REGION BODY FROM mixdown_buffer INTO buf */ + /* MIX OR COPY THE REGION BODY FROM mixdown_buffer INTO buf */ framecnt_t const N = to_read - fade_in_limit - fade_out_limit; if (N > 0) { @@ -807,7 +806,6 @@ AudioRegion::state () } child = node.add_child (X_("FadeIn")); - child->add_property ("is-xfade", (_fade_in_is_xfade ? "yes" : "no")); if (_default_fade_in) { child->add_property ("default", "yes"); @@ -821,7 +819,6 @@ AudioRegion::state () } child = node.add_child (X_("FadeOut")); - child->add_property ("is-xfade", (_fade_out_is_xfade ? "yes" : "no")); if (_default_fade_out) { child->add_property ("default", "yes"); @@ -900,12 +897,6 @@ AudioRegion::_set_state (const XMLNode& node, int version, PropertyChange& what_ } } - if ((prop = child->property ("is-xfade")) != 0) { - _fade_in_is_xfade = string_is_affirmative (prop->value()); - } else { - _fade_in_is_xfade = false; - } - if ((prop = child->property ("active")) != 0) { if (string_is_affirmative (prop->value())) { set_fade_in_active (true); @@ -914,6 +905,12 @@ AudioRegion::_set_state (const XMLNode& node, int version, PropertyChange& what_ } } + /* legacy a3 */ + + if ((prop = child->property ("is-xfade")) != 0) { + _fade_in_is_xfade = string_is_affirmative (prop->value()); + } + } else if (child->name() == "FadeOut") { _fade_out->clear (); @@ -926,14 +923,8 @@ AudioRegion::_set_state (const XMLNode& node, int version, PropertyChange& what_ _fade_out->set_state (*grandchild, version); } } - - if ((prop = child->property ("is-xfade")) != 0) { - _fade_out_is_xfade = string_is_affirmative (prop->value()); - } else { - _fade_out_is_xfade = false; - } - - if ((prop = child->property ("active")) != 0) { + + if ((prop = child->property ("active")) != 0) { if (string_is_affirmative (prop->value())) { set_fade_out_active (true); } else { @@ -941,6 +932,12 @@ AudioRegion::_set_state (const XMLNode& node, int version, PropertyChange& what_ } } + /* legacy a3 */ + + if ((prop = child->property ("is-xfade")) != 0) { + _fade_out_is_xfade = string_is_affirmative (prop->value()); + } + } else if (child->name() == "InvFadeIn") { XMLNode* grandchild = child->child ("AutomationList"); if (grandchild) { @@ -1164,7 +1161,7 @@ AudioRegion::set_fade_in_length (framecnt_t len) if (_session.config.get_xfade_model() == FullCrossfade && _session.config.get_auto_xfade() && - _fade_in_is_xfade) { + _fade_in_is_xfade && !_fade_in_is_short) { /* trim a single other region below us to the new start of the fade. @@ -1203,7 +1200,7 @@ AudioRegion::set_fade_out_length (framecnt_t len) if (_session.config.get_xfade_model() == FullCrossfade && _session.config.get_auto_xfade() && - _fade_out_is_xfade) { + _fade_out_is_xfade && !_fade_out_is_short) { /* trim a single other region below us to the new start of the fade. @@ -1257,6 +1254,7 @@ AudioRegion::set_default_fade_in () { _fade_in_suspended = 0; _fade_in_is_xfade = false; + _fade_in_is_short = true; set_fade_in (FadeLinear, 64); } @@ -1265,6 +1263,7 @@ AudioRegion::set_default_fade_out () { _fade_out_suspended = 0; _fade_out_is_xfade = false; + _fade_out_is_short = true; set_fade_out (FadeLinear, 64); } @@ -1836,13 +1835,46 @@ AudioRegion::body_range () const void AudioRegion::set_fade_in_is_xfade (bool yn) { + if (yn == _fade_in_is_xfade) { + return; + } + _fade_in_is_xfade = yn; + send_change (PropertyChange (Properties::fade_in_is_xfade)); } void AudioRegion::set_fade_out_is_xfade (bool yn) { + if (yn == _fade_out_is_xfade) { + return; + } + _fade_out_is_xfade = yn; + send_change (PropertyChange (Properties::fade_out_is_xfade)); +} + +void +AudioRegion::set_fade_in_is_short (bool yn) +{ + if (yn == _fade_in_is_short) { + return; + } + + _fade_in_is_short = yn; + send_change (PropertyChange (Properties::fade_in_is_short)); + +} + +void +AudioRegion::set_fade_out_is_short (bool yn) +{ + if (yn == _fade_out_is_short) { + return; + } + + _fade_out_is_short = yn; + send_change (PropertyChange (Properties::fade_out_is_short)); } boost::shared_ptr