From 43798a7c259660b53cd3edc7feca17cf41faf13b Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 16 May 2011 13:06:55 +0000 Subject: 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 --- gtk2_ardour/route_time_axis.cc | 11 ++++++++--- libs/ardour/ardour/audio_playlist_source.h | 1 - libs/ardour/ardour/playlist.h | 3 ++- libs/ardour/audio_playlist_source.cc | 20 ++++++++++++-------- libs/ardour/playlist.cc | 23 ++++++++++++++++++++--- 5 files changed, 42 insertions(+), 16 deletions(-) diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index 449718d15a..81dbefcd29 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -2479,9 +2479,10 @@ RouteTimeAxisView::create_gain_automation_child (const Evoral::Parameter& param, } 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()); + *max_level = max (*max_level, rv->region()->max_source_level()); } void @@ -2494,7 +2495,11 @@ RouteTimeAxisView::join_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)); - track()->playlist()->join (selected_regions, "foshizzle"); + _view->foreach_selected_regionview (sigc::bind (sigc::ptr_fun (add_region_to_list), &selected_regions, &max_level)); + + 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); } diff --git a/libs/ardour/ardour/audio_playlist_source.h b/libs/ardour/ardour/audio_playlist_source.h index 868e8c743e..d6047de1fc 100644 --- a/libs/ardour/ardour/audio_playlist_source.h +++ b/libs/ardour/ardour/audio_playlist_source.h @@ -65,7 +65,6 @@ class AudioPlaylistSource : public AudioSource { framecnt_t _playlist_length; uint32_t _playlist_channel; std::string _peak_path; - uint32_t _level; /* how recursive is this? */ }; } /* namespace */ diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h index e23ba264fc..3234e4c108 100644 --- a/libs/ardour/ardour/playlist.h +++ b/libs/ardour/ardour/playlist.h @@ -151,7 +151,8 @@ public: const RegionListProperty& region_list () const { return regions; } 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_to_read (framepos_t start, framepos_t end); uint32_t region_use_count (boost::shared_ptr) const; diff --git a/libs/ardour/audio_playlist_source.cc b/libs/ardour/audio_playlist_source.cc index 7d1e528ee6..e8fabef7b1 100644 --- a/libs/ardour/audio_playlist_source.cc +++ b/libs/ardour/audio_playlist_source.cc @@ -158,7 +158,7 @@ AudioPlaylistSource::set_state (const XMLNode& node, int /* version */) _peak_path = prop->value (); - _level = _playlist->max_source_level (); + _level = _playlist->max_source_level () + 1; ensure_buffers_for_level (_level); return 0; @@ -167,6 +167,8 @@ AudioPlaylistSource::set_state (const XMLNode& node, int /* version */) framecnt_t AudioPlaylistSource::read_unlocked (Sample* dst, framepos_t start, framecnt_t cnt) const { + Sample* sbuf; + gain_t* gbuf; framecnt_t to_read; framecnt_t to_zero; pair 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); - _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) { 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 */ - cerr << "looking for peakfile " << _peak_path << endl; - - if (!Glib::file_test (_peak_path, Glib::FILE_TEST_EXISTS)) { /* the 2nd argument here will be passed in to ::peak_path, and is irrelevant since our peak file path is fixed and not dependent on anything. */ - cerr << "build it!\n"; return initialize_peakfile (false, string()); - } else { - cerr << "exists!\n"; } return 0; diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index 5d77310ccb..fd9af56e80 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -1756,12 +1756,12 @@ Playlist::regions_at (framepos_t frame) } uint32_t -Playlist::count_regions_at (framepos_t frame) +Playlist::count_regions_at (framepos_t frame) const { - RegionLock rlock (this); + RegionLock rlock (const_cast(this)); 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)) { cnt++; } @@ -3166,3 +3166,20 @@ Playlist::max_source_level () const return lvl; } + + +uint32_t +Playlist::count_joined_regions () const +{ + RegionLock rlock (const_cast (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; +} + -- cgit v1.2.3