summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2011-05-16 13:06:55 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2011-05-16 13:06:55 +0000
commit43798a7c259660b53cd3edc7feca17cf41faf13b (patch)
treedb0b5ea102b3636680b9a9ecfaf90a1f3f0be2be /libs/ardour
parent0a9cef7720ed9bd83442d284d18831437b80a482 (diff)
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
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/audio_playlist_source.h1
-rw-r--r--libs/ardour/ardour/playlist.h3
-rw-r--r--libs/ardour/audio_playlist_source.cc20
-rw-r--r--libs/ardour/playlist.cc23
4 files changed, 34 insertions, 13 deletions
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<Region>) 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<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);
- _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<Playlist*>(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<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;
+}
+