13
0

fixes for crossfade views, crossfades and undo/redo. added default crossfade settings to ardour.rc.in

git-svn-id: svn://localhost/ardour2/trunk@994 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2006-10-20 16:09:42 +00:00
parent 2592a320d4
commit 3e8be2ca62
9 changed files with 88 additions and 57 deletions

View File

@ -21,6 +21,9 @@
<Option name="stop-recording-on-xrun" value="no"/>
<Option name="stop-at-session-end" value="no"/>
<Option name="auto-xfade" value="yes"/>
<Option name="crossfades-active" value="1"/>
<Option name="crossfades-visible" value="1"/>
<Option name="xfade-model" value="0"/>
<Option name="no-new-session-dialog" value="yes"/>
<Option name="timecode-source-is-synced" value="yes"/>
<Option name="auditioner-left-out" value="%JACK_INPUT%1"/>

View File

@ -288,7 +288,7 @@ AudioStreamView::add_crossfade (Crossfade *crossfade)
crossfade->Invalidated.connect (mem_fun (*this, &AudioStreamView::remove_crossfade));
crossfade_views.push_back (cv);
if (!crossfades_visible) {
if (!Config->get_crossfades_visible() || !crossfades_visible) {
cv->hide ();
}
}

View File

@ -127,6 +127,10 @@ CrossfadeView::crossfade_changed (Change what_changed)
set_duration (crossfade.overlap_length(), this);
need_redraw_curves = true;
}
if (what_changed & Crossfade::FollowOverlapChanged) {
need_redraw_curves = true;
}
if (what_changed & Crossfade::ActiveChanged) {
/* calls redraw_curves */
@ -142,9 +146,15 @@ CrossfadeView::redraw_curves ()
Points* points;
int32_t npoints;
float* vec;
double h;
if (!crossfade.following_overlap()) {
/* curves should not be visible */
fade_in->hide ();
fade_out->hide ();
return;
}
/*
At "height - 3.0" the bottom of the crossfade touches the name highlight or the bottom of the track (if the
track is either Small or Smaller.

View File

@ -45,7 +45,7 @@ class AudioPlaylist : public ARDOUR::Playlist
AudioPlaylist (const AudioPlaylist&, string name, bool hidden = false);
AudioPlaylist (const AudioPlaylist&, nframes_t start, nframes_t cnt, string name, bool hidden = false);
void clear ();
void clear (bool with_signals=true);
nframes_t read (Sample *dst, Sample *mixdown, float *gain_buffer, nframes_t start, nframes_t cnt, uint32_t chan_n=0);

View File

@ -108,6 +108,8 @@ class Crossfade : public PBD::StatefulDestructible
nframes_t overlap_length() const;
nframes_t position() const { return _position; }
void invalidate();
sigc::signal<void,Crossfade*> Invalidated;
sigc::signal<void,Change> StateChanged;
@ -135,6 +137,7 @@ class Crossfade : public PBD::StatefulDestructible
static void set_short_xfade_length (nframes_t n);
static Change ActiveChanged;
static Change FollowOverlapChanged;
private:
friend struct CrossfadeComparePtr;

View File

@ -55,7 +55,7 @@ class Playlist : public PBD::StatefulDestructible {
Playlist (const Playlist&, string name, bool hidden = false);
Playlist (const Playlist&, nframes_t start, nframes_t cnt, string name, bool hidden = false);
virtual void clear ();
virtual void clear (bool with_signals=true);
virtual void dump () const;
void ref();
@ -171,6 +171,8 @@ class Playlist : public PBD::StatefulDestructible {
mutable gint block_notifications;
mutable gint ignore_state_changes;
mutable Glib::Mutex region_lock;
std::set<boost::shared_ptr<Region> > pending_adds;
std::set<boost::shared_ptr<Region> > pending_removes;
RegionList pending_bounds;
bool pending_modified;
bool pending_length;

View File

@ -237,9 +237,9 @@ AudioPlaylist::remove_dependents (boost::shared_ptr<Region> region)
tmp = i;
tmp++;
if ((*i)->involves (r)) {
/* do not delete crossfades */
_crossfades.erase (i);
delete *i;
}
i = tmp;
@ -488,9 +488,7 @@ AudioPlaylist::set_state (const XMLNode& node)
XMLNodeList nlist;
XMLNodeConstIterator niter;
if (!in_set_state) {
Playlist::set_state (node);
}
Playlist::set_state (node);
nlist = node.children();
@ -502,10 +500,12 @@ AudioPlaylist::set_state (const XMLNode& node)
continue;
}
Crossfade *xfade;
try {
xfade = new Crossfade (*((const Playlist *)this), *child);
Crossfade* xfade = new Crossfade (*((const Playlist *)this), *child);
_crossfades.push_back (xfade);
xfade->Invalidated.connect (mem_fun (*this, &AudioPlaylist::crossfade_invalidated));
xfade->StateChanged.connect (mem_fun (*this, &AudioPlaylist::crossfade_changed));
NewCrossfade(xfade);
}
catch (failed_constructor& err) {
@ -514,44 +514,28 @@ AudioPlaylist::set_state (const XMLNode& node)
// << endl;
continue;
}
Crossfades::iterator ci;
for (ci = _crossfades.begin(); ci != _crossfades.end(); ++ci) {
if (*(*ci) == *xfade) {
break;
}
}
if (ci == _crossfades.end()) {
_crossfades.push_back (xfade);
xfade->Invalidated.connect (mem_fun (*this, &AudioPlaylist::crossfade_invalidated));
xfade->StateChanged.connect (mem_fun (*this, &AudioPlaylist::crossfade_changed));
NewCrossfade(xfade);
} else {
/* adjust the current state of the existing crossfade */
(*ci)->set_state (*child);
/* drop the new one */
delete xfade;
}
}
return 0;
}
void
AudioPlaylist::clear ()
AudioPlaylist::clear (bool with_signals)
{
for (Crossfades::iterator i = _crossfades.begin(); i != _crossfades.end(); ++i) {
for (Crossfades::iterator i = _crossfades.begin(); i != _crossfades.end(); ) {
Crossfades::iterator tmp;
tmp = i;
++tmp;
delete *i;
i = tmp;
}
_crossfades.clear ();
Playlist::clear ();
Playlist::clear (with_signals);
}
XMLNode&

View File

@ -37,6 +37,7 @@ using namespace PBD;
nframes_t Crossfade::_short_xfade_length = 0;
Change Crossfade::ActiveChanged = new_change();
Change Crossfade::FollowOverlapChanged = new_change();
/* XXX if and when we ever implement parallel processing of the process()
callback, these will need to be handled on a per-thread basis.
@ -82,8 +83,16 @@ Crossfade::Crossfade (boost::shared_ptr<AudioRegion> in, boost::shared_ptr<Audio
_length = length;
_position = position;
_anchor_point = ap;
_follow_overlap = false;
_active = true;
switch (Config->get_xfade_model()) {
case ShortCrossfade:
_follow_overlap = false;
break;
default:
_follow_overlap = true;
}
_active = Config->get_crossfades_active ();
_fixed = true;
initialize ();
@ -188,6 +197,7 @@ Crossfade::Crossfade (const Crossfade &orig, boost::shared_ptr<AudioRegion> newi
Crossfade::~Crossfade ()
{
Invalidated (this);
}
void
@ -795,6 +805,8 @@ Crossfade::set_follow_overlap (bool yn)
} else {
set_length (_out->first_frame() + _out->length() - _in->first_frame());
}
StateChanged (FollowOverlapChanged);
}
nframes_t
@ -847,3 +859,9 @@ Crossfade::set_short_xfade_length (nframes_t n)
{
_short_xfade_length = n;
}
void
Crossfade::invalidate ()
{
Invalidated (this); /* EMIT SIGNAL */
}

View File

@ -331,6 +331,7 @@ void
Playlist::notify_region_removed (boost::shared_ptr<Region> r)
{
if (holding_state ()) {
pending_removes.insert (r);
pending_modified = true;
pending_length = true;
} else {
@ -350,6 +351,7 @@ Playlist::notify_region_added (boost::shared_ptr<Region> r)
*/
if (holding_state()) {
pending_adds.insert (r);
pending_modified = true;
pending_length = true;
} else {
@ -372,9 +374,8 @@ Playlist::notify_length_changed ()
void
Playlist::flush_notifications ()
{
RegionList::iterator r;
RegionList::iterator a;
set<boost::shared_ptr<Region> > dependent_checks_needed;
set<boost::shared_ptr<Region> >::iterator s;
uint32_t n = 0;
if (in_flush) {
@ -405,8 +406,18 @@ Playlist::flush_notifications ()
/* don't increment n again - its the same list */
}
for (set<boost::shared_ptr<Region> >::iterator x = dependent_checks_needed.begin(); x != dependent_checks_needed.end(); ++x) {
check_dependents (*x, false);
for (s = pending_adds.begin(); s != pending_adds.end(); ++s) {
dependent_checks_needed.insert (*s);
n++;
}
for (s = dependent_checks_needed.begin(); s != dependent_checks_needed.end(); ++s) {
check_dependents (*s, false);
}
for (s = pending_removes.begin(); s != pending_removes.end(); ++s) {
remove_dependents (*s);
n++;
}
if ((freeze_length != _get_maximum_extent()) || pending_length) {
@ -424,6 +435,8 @@ Playlist::flush_notifications ()
Modified (); /* EMIT SIGNAL */
}
pending_adds.clear ();
pending_removes.clear ();
pending_bounds.clear ();
in_flush = false;
@ -543,7 +556,7 @@ Playlist::remove_region_internal (boost::shared_ptr<Region>region, bool delay_so
RegionList::iterator i;
nframes_t old_length = 0;
// cerr << "removing region " << region->name() << endl;
cerr << "removing region " << region->name() << " holding = " << holding_state() << endl;
if (!holding_state()) {
old_length = _get_maximum_extent();
@ -1155,20 +1168,21 @@ Playlist::region_changed (Change what_changed, boost::shared_ptr<Region> region)
}
void
Playlist::clear ()
Playlist::clear (bool with_signals)
{
RegionList::iterator i;
RegionList tmp;
{
RegionLock rl (this);
tmp = regions;
for (RegionList::iterator i = regions.begin(); i != regions.end(); ++i) {
pending_removes.insert (*i);
}
regions.clear ();
}
for (i = tmp.begin(); i != tmp.end(); ++i) {
notify_region_removed (*i);
if (with_signals) {
LengthChanged ();
Modified ();
}
}
/***********************************************************************
@ -1331,10 +1345,7 @@ Playlist::set_state (const XMLNode& node)
}
}
{
RegionLock rl (this);
regions.clear ();
}
clear (false);
nlist = node.children();