second half of "bomb out if playlist construction from XML fails"

git-svn-id: svn://localhost/ardour2/branches/3.0@9759 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2011-06-22 20:06:10 +00:00
parent 2801e91fe2
commit 9687e8a667
7 changed files with 81 additions and 50 deletions

View File

@ -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 ();

View File

@ -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) {

View File

@ -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);

View File

@ -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--;

View File

@ -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));
}
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;
pl->set_region_ownership ();
if (pl && !hidden) {
PlaylistCreated (pl, unused);
} 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;
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 ((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;
}

View File

@ -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 ();
}

View File

@ -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) {