diff options
author | Carl Hetherington <carl@carlh.net> | 2012-06-16 17:20:10 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2012-06-16 17:20:10 +0000 |
commit | 5ac22e9095d5f851b5238029e3f813bc86fe2280 (patch) | |
tree | 51460c63aa9ace692dedceb01494f2a92d4bc364 /libs/ardour/audioregion.cc | |
parent | 9429401f11ffa0ee1729dbdc5e14e87cf06e2dc1 (diff) |
Add new SharedStatefulProperty which manages a shared_ptr to
some Stateful object, and a subclass to use this for
AutomationList. SharedStatefulProperty will manage undo / redo
using full copies of the XML state, like MementoCommand,
but does it within the Property undo system.
git-svn-id: svn://localhost/ardour2/branches/3.0@12740 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/audioregion.cc')
-rw-r--r-- | libs/ardour/audioregion.cc | 110 |
1 files changed, 57 insertions, 53 deletions
diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc index 50a38b7bad..4b85819d6e 100644 --- a/libs/ardour/audioregion.cc +++ b/libs/ardour/audioregion.cc @@ -65,6 +65,11 @@ namespace ARDOUR { PBD::PropertyDescriptor<bool> fade_out_is_short; PBD::PropertyDescriptor<bool> fade_in_is_xfade; PBD::PropertyDescriptor<bool> fade_in_is_short; + PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > fade_in; + PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > inverse_fade_in; + PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > fade_out; + PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > inverse_fade_out; + PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > envelope; } } @@ -164,6 +169,16 @@ AudioRegion::make_property_quarks () 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)); + Properties::fade_in.property_id = g_quark_from_static_string (X_("FadeIn")); + DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for FadeIn = %1\n", Properties::fade_in.property_id)); + Properties::inverse_fade_in.property_id = g_quark_from_static_string (X_("InverseFadeIn")); + DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for InverseFadeIn = %1\n", Properties::inverse_fade_in.property_id)); + Properties::fade_out.property_id = g_quark_from_static_string (X_("FadeOut")); + DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for FadeOut = %1\n", Properties::fade_out.property_id)); + Properties::inverse_fade_out.property_id = g_quark_from_static_string (X_("InverseFadeOut")); + DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for InverseFadeOut = %1\n", Properties::inverse_fade_out.property_id)); + Properties::envelope.property_id = g_quark_from_static_string (X_("Envelope")); + DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for Envelope = %1\n", Properties::envelope.property_id)); } void @@ -181,6 +196,11 @@ AudioRegion::register_properties () add_property (_fade_out_is_short); add_property (_fade_in_is_xfade); add_property (_fade_in_is_short); + add_property (_fade_in); + add_property (_inverse_fade_in); + add_property (_fade_out); + add_property (_inverse_fade_out); + add_property (_envelope); } #define AUDIOREGION_STATE_DEFAULT \ @@ -193,7 +213,11 @@ AudioRegion::register_properties () , _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) + , _fade_out_is_short (Properties::fade_out_is_short, false) \ + , _fade_in (Properties::fade_in, boost::shared_ptr<AutomationList> (new AutomationList (Evoral::Parameter (FadeInAutomation)))) \ + , _inverse_fade_in (Properties::inverse_fade_in, boost::shared_ptr<AutomationList> (new AutomationList (Evoral::Parameter (FadeInAutomation)))) \ + , _fade_out (Properties::fade_out, boost::shared_ptr<AutomationList> (new AutomationList (Evoral::Parameter (FadeOutAutomation)))) \ + , _inverse_fade_out (Properties::inverse_fade_out, boost::shared_ptr<AutomationList> (new AutomationList (Evoral::Parameter (FadeOutAutomation)))) #define AUDIOREGION_COPY_STATE(other) \ _envelope_active (Properties::envelope_active, other->_envelope_active) \ @@ -205,7 +229,11 @@ AudioRegion::register_properties () , _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) + , _fade_out_is_short (Properties::fade_out_is_short, other->_fade_out_is_short) \ + , _fade_in (Properties::fade_in, boost::shared_ptr<AutomationList> (new AutomationList (*other->_fade_in.val()))) \ + , _inverse_fade_in (Properties::fade_in, boost::shared_ptr<AutomationList> (new AutomationList (*other->_inverse_fade_in.val()))) \ + , _fade_out (Properties::fade_in, boost::shared_ptr<AutomationList> (new AutomationList (*other->_fade_out.val()))) \ + , _inverse_fade_out (Properties::fade_in, boost::shared_ptr<AutomationList> (new AutomationList (*other->_inverse_fade_out.val()))) /* a Session will reset these to its chosen defaults by calling AudioRegion::set_default_fade() */ void @@ -227,12 +255,8 @@ AudioRegion::init () AudioRegion::AudioRegion (Session& s, framepos_t start, framecnt_t len, std::string name) : Region (s, start, len, name, DataType::AUDIO) , AUDIOREGION_STATE_DEFAULT + , _envelope (Properties::envelope, boost::shared_ptr<AutomationList> (new AutomationList (Evoral::Parameter(EnvelopeAutomation)))) , _automatable (s) - , _fade_in (new AutomationList(Evoral::Parameter(FadeInAutomation))) - , _inverse_fade_in (new AutomationList(Evoral::Parameter(FadeInAutomation))) - , _fade_out (new AutomationList(Evoral::Parameter(FadeOutAutomation))) - , _inverse_fade_out (new AutomationList(Evoral::Parameter(FadeOutAutomation))) - , _envelope (new AutomationList(Evoral::Parameter(EnvelopeAutomation))) , _fade_in_suspended (0) , _fade_out_suspended (0) { @@ -244,12 +268,8 @@ AudioRegion::AudioRegion (Session& s, framepos_t start, framecnt_t len, std::str AudioRegion::AudioRegion (const SourceList& srcs) : Region (srcs) , AUDIOREGION_STATE_DEFAULT + , _envelope (Properties::envelope, boost::shared_ptr<AutomationList> (new AutomationList (Evoral::Parameter(EnvelopeAutomation)))) , _automatable(srcs[0]->session()) - , _fade_in (new AutomationList(Evoral::Parameter(FadeInAutomation))) - , _inverse_fade_in (new AutomationList(Evoral::Parameter(FadeInAutomation))) - , _fade_out (new AutomationList(Evoral::Parameter(FadeOutAutomation))) - , _inverse_fade_out (new AutomationList(Evoral::Parameter(FadeOutAutomation))) - , _envelope (new AutomationList(Evoral::Parameter(EnvelopeAutomation))) , _fade_in_suspended (0) , _fade_out_suspended (0) { @@ -260,15 +280,11 @@ AudioRegion::AudioRegion (const SourceList& srcs) AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other) : Region (other) , AUDIOREGION_COPY_STATE (other) - , _automatable (other->session()) - , _fade_in (new AutomationList (*other->_fade_in)) - , _inverse_fade_in (new AutomationList(*other->_inverse_fade_in)) - , _fade_out (new AutomationList (*other->_fade_out)) - , _inverse_fade_out (new AutomationList (*other->_inverse_fade_out)) /* As far as I can see, the _envelope's times are relative to region position, and have nothing to do with sources (and hence _start). So when we copy the envelope, we just use the supplied offset. */ - , _envelope (new AutomationList (*other->_envelope, 0, other->_length)) + , _envelope (Properties::envelope, boost::shared_ptr<AutomationList> (new AutomationList (*other->_envelope.val(), 0, other->_length))) + , _automatable (other->session()) , _fade_in_suspended (0) , _fade_out_suspended (0) { @@ -286,15 +302,11 @@ AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other) AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, framecnt_t offset) : Region (other, offset) , AUDIOREGION_COPY_STATE (other) - , _automatable (other->session()) - , _fade_in (new AutomationList (*other->_fade_in)) - , _inverse_fade_in (new AutomationList(*other->_inverse_fade_in)) - , _fade_out (new AutomationList (*other->_fade_out)) - , _inverse_fade_out (new AutomationList (*other->_inverse_fade_out)) /* As far as I can see, the _envelope's times are relative to region position, and have nothing to do with sources (and hence _start). So when we copy the envelope, we just use the supplied offset. */ - , _envelope (new AutomationList (*other->_envelope, offset, other->_length)) + , _envelope (Properties::envelope, boost::shared_ptr<AutomationList> (new AutomationList (*other->_envelope.val(), offset, other->_length))) + , _automatable (other->session()) , _fade_in_suspended (0) , _fade_out_suspended (0) { @@ -312,12 +324,8 @@ AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, framecnt_t AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, const SourceList& srcs) : Region (boost::static_pointer_cast<const Region>(other), srcs) , AUDIOREGION_COPY_STATE (other) + , _envelope (Properties::envelope, boost::shared_ptr<AutomationList> (new AutomationList (*other->_envelope.val()))) , _automatable (other->session()) - , _fade_in (new AutomationList (*other->_fade_in)) - , _inverse_fade_in (new AutomationList(*other->_inverse_fade_in)) - , _fade_out (new AutomationList (*other->_fade_out)) - , _inverse_fade_out (new AutomationList (*other->_inverse_fade_out)) - , _envelope (new AutomationList (*other->_envelope)) , _fade_in_suspended (0) , _fade_out_suspended (0) { @@ -335,12 +343,8 @@ AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, const Sour AudioRegion::AudioRegion (SourceList& srcs) : Region (srcs) , AUDIOREGION_STATE_DEFAULT + , _envelope (Properties::envelope, boost::shared_ptr<AutomationList> (new AutomationList(Evoral::Parameter(EnvelopeAutomation)))) , _automatable(srcs[0]->session()) - , _fade_in (new AutomationList(Evoral::Parameter(FadeInAutomation))) - , _inverse_fade_in (new AutomationList(Evoral::Parameter(FadeInAutomation))) - , _fade_out (new AutomationList(Evoral::Parameter(FadeOutAutomation))) - , _inverse_fade_out (new AutomationList(Evoral::Parameter(FadeOutAutomation))) - , _envelope (new AutomationList(Evoral::Parameter(EnvelopeAutomation))) , _fade_in_suspended (0) , _fade_out_suspended (0) { @@ -988,7 +992,7 @@ void AudioRegion::set_fade_in (boost::shared_ptr<AutomationList> f) { _fade_in->freeze (); - *_fade_in = *f; + *(_fade_in.val()) = *f; _fade_in->thaw (); _default_fade_in = false; @@ -1010,23 +1014,23 @@ AudioRegion::set_fade_in (FadeShape shape, framecnt_t len) case FadeLinear: _fade_in->fast_simple_add (0.0, 0.0); _fade_in->fast_simple_add (len, 1.0); - reverse_curve (_inverse_fade_in, _fade_in); + reverse_curve (_inverse_fade_in.val(), _fade_in.val()); break; case FadeFast: - generate_db_fade (_fade_in, len, 10, -60); - reverse_curve (c1, _fade_in); + generate_db_fade (_fade_in.val(), len, 10, -60); + reverse_curve (c1, _fade_in.val()); _fade_in->copy_events (*c1); - generate_inverse_power_curve (_inverse_fade_in, _fade_in); + generate_inverse_power_curve (_inverse_fade_in.val(), _fade_in.val()); break; case FadeSlow: generate_db_fade (c1, len, 10, -1); // start off with a slow fade generate_db_fade (c2, len, 10, -80); // end with a fast fade - merge_curves (_fade_in, c1, c2); - reverse_curve (c3, _fade_in); + merge_curves (_fade_in.val(), c1, c2); + reverse_curve (c3, _fade_in.val()); _fade_in->copy_events (*c3); - generate_inverse_power_curve (_inverse_fade_in, _fade_in); + generate_inverse_power_curve (_inverse_fade_in.val(), _fade_in.val()); break; case FadeConstantPower: @@ -1035,7 +1039,7 @@ AudioRegion::set_fade_in (FadeShape shape, framecnt_t len) _fade_in->fast_simple_add (len*dist, sin (dist*M_PI/2)); } _fade_in->fast_simple_add (len, 1.0); - reverse_curve (_inverse_fade_in, _fade_in); + reverse_curve (_inverse_fade_in.val(), _fade_in.val()); break; case FadeSymmetric: @@ -1053,9 +1057,9 @@ AudioRegion::set_fade_in (FadeShape shape, framecnt_t len) _fade_in->fast_simple_add (len* (breakpoint+((1.0-breakpoint)*(double)i/(double)num_steps)), coeff); } _fade_in->fast_simple_add (len, VERY_SMALL_SIGNAL); - reverse_curve (c3, _fade_in); + reverse_curve (c3, _fade_in.val()); _fade_in->copy_events (*c3); - reverse_curve (_inverse_fade_in, _fade_in ); + reverse_curve (_inverse_fade_in.val(), _fade_in.val()); break; } @@ -1068,7 +1072,7 @@ void AudioRegion::set_fade_out (boost::shared_ptr<AutomationList> f) { _fade_out->freeze (); - *_fade_out = *f; + *(_fade_out.val()) = *f; _fade_out->thaw (); _default_fade_out = false; @@ -1089,19 +1093,19 @@ AudioRegion::set_fade_out (FadeShape shape, framecnt_t len) case FadeLinear: _fade_out->fast_simple_add (0.0, 1.0); _fade_out->fast_simple_add (len, VERY_SMALL_SIGNAL); - reverse_curve (_inverse_fade_out, _fade_out); + reverse_curve (_inverse_fade_out.val(), _fade_out.val()); break; case FadeFast: - generate_db_fade (_fade_out, len, 10, -60); - generate_inverse_power_curve (_inverse_fade_out, _fade_out); + generate_db_fade (_fade_out.val(), len, 10, -60); + generate_inverse_power_curve (_inverse_fade_out.val(), _fade_out.val()); break; case FadeSlow: generate_db_fade (c1, len, 10, -1); //start off with a slow fade generate_db_fade (c2, len, 10, -80); //end with a fast fade - merge_curves (_fade_out, c1, c2); - generate_inverse_power_curve (_inverse_fade_out, _fade_out); + merge_curves (_fade_out.val(), c1, c2); + generate_inverse_power_curve (_inverse_fade_out.val(), _fade_out.val()); break; case FadeConstantPower: @@ -1113,7 +1117,7 @@ AudioRegion::set_fade_out (FadeShape shape, framecnt_t len) _fade_out->fast_simple_add ((len * dist), cos(dist*M_PI/2)); } _fade_out->fast_simple_add (len, VERY_SMALL_SIGNAL); - reverse_curve (_inverse_fade_out, _fade_out); + reverse_curve (_inverse_fade_out.val(), _fade_out.val()); break; case FadeSymmetric: @@ -1132,7 +1136,7 @@ AudioRegion::set_fade_out (FadeShape shape, framecnt_t len) _fade_out->fast_simple_add (len* (breakpoint+((1.0-breakpoint)*(double)i/(double)num_steps)), coeff); } _fade_out->fast_simple_add (len, VERY_SMALL_SIGNAL); - reverse_curve (_inverse_fade_out, _fade_out); + reverse_curve (_inverse_fade_out.val(), _fade_out.val()); break; } |