mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-23 07:06:23 +01:00
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:
parent
0a9cef7720
commit
43798a7c25
5 changed files with 42 additions and 16 deletions
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 */
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue