sane naming scheme for combined regions; fix deadlock when nesting to more than one level

git-svn-id: svn://localhost/ardour2/branches/3.0@9519 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2011-05-16 13:06:55 +00:00
parent 0a9cef7720
commit 43798a7c25
5 changed files with 42 additions and 16 deletions

View file

@ -2479,9 +2479,10 @@ RouteTimeAxisView::create_gain_automation_child (const Evoral::Parameter& param,
} }
static static
void add_region_to_list (RegionView* rv, Playlist::RegionList* l) void add_region_to_list (RegionView* rv, Playlist::RegionList* l, uint32_t* max_level)
{ {
l->push_back (rv->region()); l->push_back (rv->region());
*max_level = max (*max_level, rv->region()->max_source_level());
} }
void void
@ -2494,7 +2495,11 @@ RouteTimeAxisView::join_regions ()
} }
Playlist::RegionList selected_regions; Playlist::RegionList selected_regions;
uint32_t max_level = 0;
_view->foreach_selected_regionview (sigc::bind (sigc::ptr_fun (add_region_to_list), &selected_regions)); _view->foreach_selected_regionview (sigc::bind (sigc::ptr_fun (add_region_to_list), &selected_regions, &max_level));
track()->playlist()->join (selected_regions, "foshizzle");
uint32_t num_joined_regions = track()->playlist()->count_joined_regions();
string name = string_compose (_("%1 combine-%2 (%3)"), track()->playlist()->name(), num_joined_regions+1, max_level+1);
track()->playlist()->join (selected_regions, name);
} }

View file

@ -65,7 +65,6 @@ class AudioPlaylistSource : public AudioSource {
framecnt_t _playlist_length; framecnt_t _playlist_length;
uint32_t _playlist_channel; uint32_t _playlist_channel;
std::string _peak_path; std::string _peak_path;
uint32_t _level; /* how recursive is this? */
}; };
} /* namespace */ } /* namespace */

View file

@ -151,7 +151,8 @@ public:
const RegionListProperty& region_list () const { return regions; } const RegionListProperty& region_list () const { return regions; }
RegionList* regions_at (framepos_t frame); RegionList* regions_at (framepos_t frame);
uint32_t count_regions_at (framepos_t); uint32_t count_regions_at (framepos_t) const;
uint32_t count_joined_regions () const;
RegionList* regions_touched (framepos_t start, framepos_t end); RegionList* regions_touched (framepos_t start, framepos_t end);
RegionList* regions_to_read (framepos_t start, framepos_t end); RegionList* regions_to_read (framepos_t start, framepos_t end);
uint32_t region_use_count (boost::shared_ptr<Region>) const; uint32_t region_use_count (boost::shared_ptr<Region>) const;

View file

@ -158,7 +158,7 @@ AudioPlaylistSource::set_state (const XMLNode& node, int /* version */)
_peak_path = prop->value (); _peak_path = prop->value ();
_level = _playlist->max_source_level (); _level = _playlist->max_source_level () + 1;
ensure_buffers_for_level (_level); ensure_buffers_for_level (_level);
return 0; return 0;
@ -167,6 +167,8 @@ AudioPlaylistSource::set_state (const XMLNode& node, int /* version */)
framecnt_t framecnt_t
AudioPlaylistSource::read_unlocked (Sample* dst, framepos_t start, framecnt_t cnt) const AudioPlaylistSource::read_unlocked (Sample* dst, framepos_t start, framecnt_t cnt) const
{ {
Sample* sbuf;
gain_t* gbuf;
framecnt_t to_read; framecnt_t to_read;
framecnt_t to_zero; framecnt_t to_zero;
pair<framepos_t,framepos_t> extent = _playlist->get_extent(); pair<framepos_t,framepos_t> extent = _playlist->get_extent();
@ -185,10 +187,18 @@ AudioPlaylistSource::read_unlocked (Sample* dst, framepos_t start, framecnt_t cn
} }
{ {
/* Don't need to hold the lock for the actual read, and
actually, we cannot, but we do want to interlock
with any changes to the list of buffers caused
by creating new nested playlists/sources
*/
Glib::Mutex::Lock lm (_level_buffer_lock); Glib::Mutex::Lock lm (_level_buffer_lock);
_playlist->read (dst, _mixdown_buffers[_level-1], _gain_buffers[_level-1], start+_playlist_offset, to_read, _playlist_channel); sbuf = _mixdown_buffers[_level-1];
gbuf = _gain_buffers[_level-1];
} }
_playlist->read (dst, sbuf, gbuf, start+_playlist_offset, to_read, _playlist_channel);
if (to_zero) { if (to_zero) {
memset (dst+to_read, 0, sizeof (Sample) * to_zero); memset (dst+to_read, 0, sizeof (Sample) * to_zero);
} }
@ -246,19 +256,13 @@ AudioPlaylistSource::setup_peakfile ()
/* the peak data is setup once and once only /* the peak data is setup once and once only
*/ */
cerr << "looking for peakfile " << _peak_path << endl;
if (!Glib::file_test (_peak_path, Glib::FILE_TEST_EXISTS)) { if (!Glib::file_test (_peak_path, Glib::FILE_TEST_EXISTS)) {
/* the 2nd argument here will be passed /* the 2nd argument here will be passed
in to ::peak_path, and is irrelevant in to ::peak_path, and is irrelevant
since our peak file path is fixed and since our peak file path is fixed and
not dependent on anything. not dependent on anything.
*/ */
cerr << "build it!\n";
return initialize_peakfile (false, string()); return initialize_peakfile (false, string());
} else {
cerr << "exists!\n";
} }
return 0; return 0;

View file

@ -1756,12 +1756,12 @@ Playlist::regions_at (framepos_t frame)
} }
uint32_t uint32_t
Playlist::count_regions_at (framepos_t frame) Playlist::count_regions_at (framepos_t frame) const
{ {
RegionLock rlock (this); RegionLock rlock (const_cast<Playlist*>(this));
uint32_t cnt = 0; uint32_t cnt = 0;
for (RegionList::iterator i = regions.begin(); i != regions.end(); ++i) { for (RegionList::const_iterator i = regions.begin(); i != regions.end(); ++i) {
if ((*i)->covers (frame)) { if ((*i)->covers (frame)) {
cnt++; cnt++;
} }
@ -3166,3 +3166,20 @@ Playlist::max_source_level () const
return lvl; return lvl;
} }
uint32_t
Playlist::count_joined_regions () const
{
RegionLock rlock (const_cast<Playlist *> (this));
uint32_t cnt = 0;
for (RegionList::const_iterator i = regions.begin(); i != regions.end(); ++i) {
if ((*i)->max_source_level() > 0) {
cnt++;
}
}
return cnt;
}