summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/audio_playlist.cc8
-rw-r--r--libs/ardour/audio_playlist_source.cc5
-rw-r--r--libs/ardour/audiosource.cc3
-rw-r--r--libs/ardour/midi_playlist.cc8
-rw-r--r--libs/ardour/playlist_factory.cc105
-rw-r--r--libs/ardour/playlist_source.cc2
-rw-r--r--libs/ardour/smf_source.cc4
7 files changed, 83 insertions, 52 deletions
diff --git a/libs/ardour/audio_playlist.cc b/libs/ardour/audio_playlist.cc
index 12b2e4062a..0c9fd4f314 100644
--- a/libs/ardour/audio_playlist.cc
+++ b/libs/ardour/audio_playlist.cc
@@ -109,7 +109,9 @@ AudioPlaylist::AudioPlaylist (Session& session, const XMLNode& node, bool hidden
add_property (_crossfades);
in_set_state++;
- set_state (node, Stateful::loading_state_version);
+ if (set_state (node, Stateful::loading_state_version)) {
+ throw failed_constructor();
+ }
in_set_state--;
}
@@ -728,7 +730,9 @@ AudioPlaylist::set_state (const XMLNode& node, int version)
in_set_state++;
- Playlist::set_state (node, version);
+ if (Playlist::set_state (node, version)) {
+ return -1;
+ }
freeze ();
diff --git a/libs/ardour/audio_playlist_source.cc b/libs/ardour/audio_playlist_source.cc
index ab98b85010..6cfee5834b 100644
--- a/libs/ardour/audio_playlist_source.cc
+++ b/libs/ardour/audio_playlist_source.cc
@@ -72,6 +72,8 @@ AudioPlaylistSource::AudioPlaylistSource (Session& s, const XMLNode& node)
if (set_state (node, Stateful::loading_state_version, false)) {
throw failed_constructor ();
}
+
+ AudioSource::_length = _playlist_length;
}
AudioPlaylistSource::~AudioPlaylistSource ()
@@ -113,6 +115,9 @@ AudioPlaylistSource::set_state (const XMLNode& node, int version, bool with_desc
const XMLProperty* prop;
pair<framepos_t,framepos_t> extent = _playlist->get_extent();
+
+ cerr << "APS " << id() << " playlist ID " << _playlist->id() << " has " << _playlist->n_regions() << " playlist extents = " << extent.first << " .. " << extent.second << endl;
+
AudioSource::_length = extent.second - extent.first;
if ((prop = node.property (X_("channel"))) == 0) {
diff --git a/libs/ardour/audiosource.cc b/libs/ardour/audiosource.cc
index aeb5f12bae..e674ea0723 100644
--- a/libs/ardour/audiosource.cc
+++ b/libs/ardour/audiosource.cc
@@ -669,8 +669,7 @@ AudioSource::build_peaks_from_scratch ()
framecnt_t frames_to_read = min (bufsize, cnt);
framecnt_t frames_read;
-
-
+
if ((frames_read = read_unlocked (buf, current_frame, frames_to_read)) != frames_to_read) {
error << string_compose(_("%1: could not write read raw data for peak computation (%2)"), _name, strerror (errno)) << endmsg;
done_with_peakfile_writes (false);
diff --git a/libs/ardour/midi_playlist.cc b/libs/ardour/midi_playlist.cc
index aa58ea2446..5b0af9aa40 100644
--- a/libs/ardour/midi_playlist.cc
+++ b/libs/ardour/midi_playlist.cc
@@ -52,7 +52,9 @@ MidiPlaylist::MidiPlaylist (Session& session, const XMLNode& node, bool hidden)
#endif
in_set_state++;
- set_state (node, Stateful::loading_state_version);
+ if (set_state (node, Stateful::loading_state_version)) {
+ throw failed_constructor ();
+ }
in_set_state--;
}
@@ -326,7 +328,9 @@ MidiPlaylist::set_state (const XMLNode& node, int version)
in_set_state++;
freeze ();
- Playlist::set_state (node, version);
+ if (Playlist::set_state (node, version)) {
+ return -1;
+ }
thaw();
in_set_state--;
diff --git a/libs/ardour/playlist_factory.cc b/libs/ardour/playlist_factory.cc
index f7556cc961..5c3d93a0a0 100644
--- a/libs/ardour/playlist_factory.cc
+++ b/libs/ardour/playlist_factory.cc
@@ -40,18 +40,23 @@ PlaylistFactory::create (Session& s, const XMLNode& node, bool hidden, bool unus
boost::shared_ptr<Playlist> pl;
- if (!type || type->value() == "audio") {
- pl = boost::shared_ptr<Playlist> (new AudioPlaylist (s, node, hidden));
- } else if (type->value() == "midi") {
- pl = boost::shared_ptr<Playlist> (new MidiPlaylist (s, node, hidden));
- }
-
- pl->set_region_ownership ();
-
- if (pl && !hidden) {
- PlaylistCreated (pl, unused);
+ try {
+ if (!type || type->value() == "audio") {
+ pl = boost::shared_ptr<Playlist> (new AudioPlaylist (s, node, hidden));
+ } else if (type->value() == "midi") {
+ pl = boost::shared_ptr<Playlist> (new MidiPlaylist (s, node, hidden));
+ }
+
+ pl->set_region_ownership ();
+
+ if (pl && !hidden) {
+ PlaylistCreated (pl, unused);
+ }
+ return pl;
+
+ } catch (...) {
+ return boost::shared_ptr<Playlist> ();
}
- return pl;
}
boost::shared_ptr<Playlist>
@@ -59,16 +64,20 @@ PlaylistFactory::create (DataType type, Session& s, string name, bool hidden)
{
boost::shared_ptr<Playlist> pl;
- if (type == DataType::AUDIO)
- pl = boost::shared_ptr<Playlist> (new AudioPlaylist (s, name, hidden));
- else if (type == DataType::MIDI)
- pl = boost::shared_ptr<Playlist> (new MidiPlaylist (s, name, hidden));
-
- if (pl && !hidden) {
- PlaylistCreated (pl, false);
+ try {
+ if (type == DataType::AUDIO)
+ pl = boost::shared_ptr<Playlist> (new AudioPlaylist (s, name, hidden));
+ else if (type == DataType::MIDI)
+ pl = boost::shared_ptr<Playlist> (new MidiPlaylist (s, name, hidden));
+
+ if (pl && !hidden) {
+ PlaylistCreated (pl, false);
+ }
+
+ return pl;
+ } catch (...) {
+ return boost::shared_ptr<Playlist> ();
}
-
- return pl;
}
boost::shared_ptr<Playlist>
@@ -77,20 +86,26 @@ PlaylistFactory::create (boost::shared_ptr<const Playlist> old, string name, boo
boost::shared_ptr<Playlist> pl;
boost::shared_ptr<const AudioPlaylist> apl;
boost::shared_ptr<const MidiPlaylist> mpl;
-
- if ((apl = boost::dynamic_pointer_cast<const AudioPlaylist> (old)) != 0) {
- pl = boost::shared_ptr<Playlist> (new AudioPlaylist (apl, name, hidden));
- pl->set_region_ownership ();
- } else if ((mpl = boost::dynamic_pointer_cast<const MidiPlaylist> (old)) != 0) {
- pl = boost::shared_ptr<Playlist> (new MidiPlaylist (mpl, name, hidden));
- pl->set_region_ownership ();
+
+ try {
+
+ if ((apl = boost::dynamic_pointer_cast<const AudioPlaylist> (old)) != 0) {
+ pl = boost::shared_ptr<Playlist> (new AudioPlaylist (apl, name, hidden));
+ pl->set_region_ownership ();
+ } else if ((mpl = boost::dynamic_pointer_cast<const MidiPlaylist> (old)) != 0) {
+ pl = boost::shared_ptr<Playlist> (new MidiPlaylist (mpl, name, hidden));
+ pl->set_region_ownership ();
+ }
+
+ if (pl && !hidden) {
+ PlaylistCreated (pl, false);
+ }
+
+ return pl;
+ } catch (...) {
+ return boost::shared_ptr<Playlist> ();
}
-
- if (pl && !hidden) {
- PlaylistCreated (pl, false);
- }
-
- return pl;
+
}
boost::shared_ptr<Playlist>
@@ -100,15 +115,19 @@ PlaylistFactory::create (boost::shared_ptr<const Playlist> old, framepos_t start
boost::shared_ptr<const AudioPlaylist> apl;
boost::shared_ptr<const MidiPlaylist> mpl;
- if ((apl = boost::dynamic_pointer_cast<const AudioPlaylist> (old)) != 0) {
- pl = boost::shared_ptr<Playlist> (new AudioPlaylist (apl, start, cnt, name, hidden));
- pl->set_region_ownership ();
- } else if ((mpl = boost::dynamic_pointer_cast<const MidiPlaylist> (old)) != 0) {
- pl = boost::shared_ptr<Playlist> (new MidiPlaylist (mpl, start, cnt, name, hidden));
- pl->set_region_ownership ();
+ try {
+ if ((apl = boost::dynamic_pointer_cast<const AudioPlaylist> (old)) != 0) {
+ pl = boost::shared_ptr<Playlist> (new AudioPlaylist (apl, start, cnt, name, hidden));
+ pl->set_region_ownership ();
+ } else if ((mpl = boost::dynamic_pointer_cast<const MidiPlaylist> (old)) != 0) {
+ pl = boost::shared_ptr<Playlist> (new MidiPlaylist (mpl, start, cnt, name, hidden));
+ pl->set_region_ownership ();
+ }
+
+ /* this factory method does NOT notify others */
+
+ return pl;
+ } catch (...) {
+ return boost::shared_ptr<Playlist> ();
}
-
- /* this factory method does NOT notify others */
-
- return pl;
}
diff --git a/libs/ardour/playlist_source.cc b/libs/ardour/playlist_source.cc
index c49f51c70e..f68033c815 100644
--- a/libs/ardour/playlist_source.cc
+++ b/libs/ardour/playlist_source.cc
@@ -118,7 +118,7 @@ PlaylistSource::set_state (const XMLNode& node, int version)
}
if (!_playlist) {
- error << _("No playlist node in PlaylistSource XML!") << endmsg;
+ error << _("Could not construct playlist for PlaylistSource from session data!") << endmsg;
throw failed_constructor ();
}
diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc
index 35693bd6de..f379d0946d 100644
--- a/libs/ardour/smf_source.cc
+++ b/libs/ardour/smf_source.cc
@@ -296,9 +296,9 @@ SMFSource::append_event_unlocked_beats (const Evoral::Event<double>& ev)
return;
}
- /* printf("SMFSource: %s - append_event_unlocked_beats ID = %d time = %lf, size = %u, data = ",
+ /*printf("SMFSource: %s - append_event_unlocked_beats ID = %d time = %lf, size = %u, data = ",
name().c_str(), ev.id(), ev.time(), ev.size());
- for (size_t i = 0; i < ev.size(); ++i) printf("%X ", ev.buffer()[i]); printf("\n");*/
+ for (size_t i = 0; i < ev.size(); ++i) printf("%X ", ev.buffer()[i]); printf("\n");*/
assert(ev.time() >= 0);
if (ev.time() < _last_ev_time_beats) {