summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2010-03-02 19:12:01 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2010-03-02 19:12:01 +0000
commit3a85e71031bc26d67d66db985da2159415f84fdb (patch)
tree1c7fbe946684325bcd8980e713e0268844032bae /libs
parent17088ee3ea5af1e6174b098bb5bcfdaec6ebf9b0 (diff)
(1) stop using mangled names in history state, use demangled ones instead (2) fix region split so that the generated regions have the right start points in the source(s)
git-svn-id: svn://localhost/ardour2/branches/3.0@6721 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/playlist.cc4
-rw-r--r--libs/ardour/session_command.cc21
-rw-r--r--libs/pbd/pbd/demangle.h48
-rw-r--r--libs/pbd/pbd/memento_command.h3
-rw-r--r--libs/pbd/property_factory.cc53
-rw-r--r--libs/pbd/stateful_diff_command.cc3
-rw-r--r--libs/pbd/wscript1
7 files changed, 65 insertions, 68 deletions
diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc
index eb21cdcde6..7e6371a366 100644
--- a/libs/ardour/playlist.cc
+++ b/libs/ardour/playlist.cc
@@ -1345,7 +1345,7 @@ Playlist::_split_region (boost::shared_ptr<Region> region, framepos_t playlist_p
{
PropertyList plist;
- plist.add (Properties::start, 0);
+ plist.add (Properties::start, region->start());
plist.add (Properties::length, before);
plist.add (Properties::name, before_name);
plist.add (Properties::left_of_split, true);
@@ -1358,7 +1358,7 @@ Playlist::_split_region (boost::shared_ptr<Region> region, framepos_t playlist_p
{
PropertyList plist;
- plist.add (Properties::start, before);
+ plist.add (Properties::start, region->start() + before);
plist.add (Properties::length, after);
plist.add (Properties::name, after_name);
plist.add (Properties::right_of_split, true);
diff --git a/libs/ardour/session_command.cc b/libs/ardour/session_command.cc
index 3ff68a06fb..17ffa1e26d 100644
--- a/libs/ardour/session_command.cc
+++ b/libs/ardour/session_command.cc
@@ -86,45 +86,46 @@ Session::memento_command_factory(XMLNode *n)
/* create command */
string obj_T = n->property ("type-name")->value();
- if (obj_T == typeid (AudioRegion).name() || obj_T == typeid (MidiRegion).name() || obj_T == typeid (Region).name()) {
+ if (obj_T == "ARDOUR::AudioRegion" || obj_T == "ARDOUR::MidiRegion" || obj_T == "ARDOUR::Region") {
boost::shared_ptr<Region> r = RegionFactory::region_by_id (id);
if (r) {
return new MementoCommand<Region>(*r, before, after);
}
- } else if (obj_T == typeid (AudioSource).name() || obj_T == typeid (MidiSource).name()) {
+ } else if (obj_T == "ARDOUR::AudioSource" || obj_T == "ARDOUR::MidiSource") {
if (sources.count(id))
return new MementoCommand<Source>(*sources[id], before, after);
- } else if (obj_T == typeid (Location).name()) {
+ } else if (obj_T == "ARDOUR::Location") {
Location* loc = _locations.get_location_by_id(id);
if (loc) {
return new MementoCommand<Location>(*loc, before, after);
}
- } else if (obj_T == typeid (Locations).name()) {
+ } else if (obj_T == "ARDOUR::Locations") {
return new MementoCommand<Locations>(_locations, before, after);
- } else if (obj_T == typeid (TempoMap).name()) {
+ } else if (obj_T == "ARDOUR::TempoMap") {
return new MementoCommand<TempoMap>(*_tempo_map, before, after);
- } else if (obj_T == typeid (Playlist).name() || obj_T == typeid (AudioPlaylist).name() || obj_T == typeid (MidiPlaylist).name()) {
+ } else if (obj_T == "ARDOUR::Playlist" || obj_T == "ARDOUR::AudioPlaylist" || obj_T == "ARDOUR::MidiPlaylist") {
if (boost::shared_ptr<Playlist> pl = playlists->by_name(child->property("name")->value())) {
return new MementoCommand<Playlist>(*(pl.get()), before, after);
}
- } else if (obj_T == typeid (Route).name() || obj_T == typeid (AudioTrack).name() || obj_T == typeid(MidiTrack).name()) {
+ } else if (obj_T == "ARDOUR::Route" || obj_T == "ARDOUR::AudioTrack" || obj_T == "ARDOUR::MidiTrack") {
if (boost::shared_ptr<Route> r = route_by_id(id)) {
return new MementoCommand<Route>(*r, before, after);
} else {
error << string_compose (X_("Route %1 not found in session"), id) << endmsg;
}
- } else if (obj_T == typeid (Evoral::Curve).name() || obj_T == typeid (AutomationList).name()) {
+ } else if (obj_T == "Evoral::Curve" || obj_T == "ARDOUR::AutomationList") {
std::map<PBD::ID, AutomationList*>::iterator i = automation_lists.find(id);
if (i != automation_lists.end()) {
return new MementoCommand<AutomationList>(*i->second, before, after);
}
+ cerr << "Alist not found\n";
} else if (registry.count(id)) { // For Editor and AutomationLine which are off-limits herea
return new MementoCommand<PBD::StatefulDestructible>(*registry[id], before, after);
}
@@ -141,13 +142,13 @@ Session::stateful_diff_command_factory (XMLNode* n)
PBD::ID const id (n->property("obj-id")->value ());
string const obj_T = n->property ("type-name")->value ();
- if ((obj_T == typeid (AudioRegion).name() || obj_T == typeid (MidiRegion).name())) {
+ if ((obj_T == "ARDOUR::AudioRegion" || obj_T == "ARDOUR::MidiRegion")) {
boost::shared_ptr<Region> r = RegionFactory::region_by_id (id);
if (r) {
return new StatefulDiffCommand (r, *n);
}
- } else if (obj_T == typeid (AudioPlaylist).name() || obj_T == typeid (MidiPlaylist).name()) {
+ } else if (obj_T == "ARDOUR::AudioPlaylist" || obj_T == "ARDOUR::MidiPlaylist") {
boost::shared_ptr<Playlist> p = playlists->by_id (id);
if (p) {
return new StatefulDiffCommand (p, *n);
diff --git a/libs/pbd/pbd/demangle.h b/libs/pbd/pbd/demangle.h
new file mode 100644
index 0000000000..adace5d46f
--- /dev/null
+++ b/libs/pbd/pbd/demangle.h
@@ -0,0 +1,48 @@
+/*
+ Copyright (C) 2009 Paul Davis
+ Author: Sakari Bergen
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __libpbd_demangle_h__
+#define __libpbd_demangle_h__
+
+#include <string>
+#include <cstdlib>
+
+#ifdef __GNUC__
+#include <cxxabi.h>
+#endif
+
+namespace PBD
+{
+ template<typename T>
+ std::string demangled_name (T const & obj)
+ {
+#ifdef __GNUC__
+ int status;
+ char * res = abi::__cxa_demangle (typeid(obj).name(), 0, 0, &status);
+ if (status == 0) {
+ std::string s(res);
+ free (res);
+ return s;
+ }
+#endif
+ return typeid(obj).name();
+ }
+} // namespace
+
+#endif // __libpbd_demangle_h__
diff --git a/libs/pbd/pbd/memento_command.h b/libs/pbd/pbd/memento_command.h
index 8c3d1a1870..5a385841a6 100644
--- a/libs/pbd/pbd/memento_command.h
+++ b/libs/pbd/pbd/memento_command.h
@@ -26,6 +26,7 @@
#include "pbd/command.h"
#include "pbd/stacktrace.h"
#include "pbd/xml++.h"
+#include "pbd/demangle.h"
#include <sigc++/slot.h>
#include <typeinfo>
@@ -80,7 +81,7 @@ public:
XMLNode* node = new XMLNode(name);
node->add_property("obj_id", obj.id().to_s());
- node->add_property("type_name", typeid(obj).name());
+ node->add_property("type_name", demangled_name (obj));
if (before) {
node->add_child_copy(*before);
diff --git a/libs/pbd/property_factory.cc b/libs/pbd/property_factory.cc
deleted file mode 100644
index af0a91a0bf..0000000000
--- a/libs/pbd/property_factory.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- Copyright (C) 2010 Paul Davis
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include <stdint.h>
-#include <cstdio>
-
-#include "pbd/properties.h"
-#include "pbd/xml++.h"
-
-#include "i18n.h"
-
-using namespace PBD;
-
-PropertyBase*
-PropertyFactory::create (const XMLNode& node)
-{
- const XMLProperty* prop_type = node.property (X_("property-type"));
- const XMLProperty* prop_id = node.property (X_("id"));
- const XMLProperty* prop_val = node.property (X_("val"));
-
- if (!prop_type || !prop_id || !prop_val) {
- return 0;
- }
-
- PropertyID id;
- sscanf (prop_id->value().c_str(), "%u", &id);
-
- if (prop_type->value() == typeid (Property<bool>).name()) {
-
- PropertyDescriptor<bool> pd (id);
- Property<bool>* p = new Property<bool> (pd);
- p->set (p->from_string (prop_val->value()));
- return p;
- }
-
- return 0;
-}
diff --git a/libs/pbd/stateful_diff_command.cc b/libs/pbd/stateful_diff_command.cc
index 0c7b8cc3f2..bfd9f33440 100644
--- a/libs/pbd/stateful_diff_command.cc
+++ b/libs/pbd/stateful_diff_command.cc
@@ -21,6 +21,7 @@
#include "pbd/stateful_diff_command.h"
#include "pbd/property_list.h"
+#include "pbd/demangle.h"
#include "i18n.h"
using namespace std;
@@ -105,7 +106,7 @@ StatefulDiffCommand::get_state ()
XMLNode* node = new XMLNode (X_("StatefulDiffCommand"));
node->add_property ("obj-id", s->id().to_s());
- node->add_property ("type-name", typeid(*s.get()).name());
+ node->add_property ("type-name", demangled_name (*s.get()));
XMLNode* before = new XMLNode (X_("Undo"));
XMLNode* after = new XMLNode (X_("Do"));
diff --git a/libs/pbd/wscript b/libs/pbd/wscript
index 08c0f2670b..6e10fe9fba 100644
--- a/libs/pbd/wscript
+++ b/libs/pbd/wscript
@@ -75,7 +75,6 @@ def build(bld):
mountpoint.cc
pathscanner.cc
pool.cc
- property_factory.cc
property_list.cc
pthread_utils.cc
receiver.cc