enough with umpteen "i18n.h" files. Consolidate on pbd/i18n.h
[ardour.git] / libs / ardour / audio_track_importer.cc
index f822cfb8328bdfd0bad9a102971fec6f1b55191d..dd77cb370e4cce491e9a17a425f0801d6df6bd07 100644 (file)
 #include "ardour/audio_diskstream.h"
 #include "ardour/session.h"
 
-#include "pbd/failed_constructor.h"
+#include "pbd/controllable.h"
 #include "pbd/convert.h"
+#include "pbd/failed_constructor.h"
 
 #include <sstream>
 #include <algorithm>
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
+using namespace std;
 using namespace PBD;
 using namespace ARDOUR;
 
 /*** AudioTrackImportHandler ***/
 
 AudioTrackImportHandler::AudioTrackImportHandler (XMLTree const & source, Session & session, AudioPlaylistImportHandler & pl_handler) :
-  ElementImportHandler (source, session),
-  pl_handler (pl_handler)
+  ElementImportHandler (source, session)
 {
        XMLNode const * root = source.root();
        XMLNode const * routes;
-       
+
        if (!(routes = root->child ("Routes"))) {
                throw failed_constructor();
        }
-       
+
        XMLNodeList const & route_list = routes->children();
        for (XMLNodeList::const_iterator it = route_list.begin(); it != route_list.end(); ++it) {
-               const XMLProperty* type = (*it)->property("default-type");
+               XMLProperty const * type = (*it)->property("default-type");
                if ( (!type || type->value() == "audio") &&  ((*it)->property ("diskstream") != 0 || (*it)->property ("diskstream-id") != 0)) {
                        try {
                                elements.push_back (ElementPtr ( new AudioTrackImporter (source, session, *this, **it, pl_handler)));
@@ -85,22 +86,22 @@ AudioTrackImporter::AudioTrackImporter (XMLTree const & source,
        if (!parse_route_xml ()) {
                throw failed_constructor();
        }
-       
+
        if (!parse_io ()) {
                throw failed_constructor();
        }
-       
-       XMLNodeList const & controllables = node.children ("Controllable");
+
+       XMLNodeList const & controllables = node.children (Controllable::xml_node_name);
        for (XMLNodeList::const_iterator it = controllables.begin(); it != controllables.end(); ++it) {
                parse_controllable (**it);
        }
-       
+
        XMLNode * remote_control = xml_track.child ("RemoteControl");
        if (remote_control && (prop = remote_control->property ("id"))) {
                uint32_t control_id = session.ntracks() + session.nbusses() + 1;
                prop->set_value (to_string (control_id, std::dec));
        }
-       
+
        xml_track.remove_nodes_and_delete ("Extra");
 }
 
@@ -135,12 +136,12 @@ AudioTrackImporter::parse_route_xml ()
                        std::cerr << string_compose (X_("AudioTrackImporter: did not recognise XML-property \"%1\""), prop) << endmsg;
                }
        }
-       
+
        if (!ds_ok) {
                error << X_("AudioTrackImporter: did not find necessary XML-property \"diskstream-id\"") << endmsg;
                return false;
        }
-       
+
        return true;
 }
 
@@ -154,7 +155,7 @@ AudioTrackImporter::parse_io ()
        if (!(io = xml_track.child ("IO"))) {
                return false;
        }
-       
+
        XMLPropertyList const & props = io->properties();
 
        for (XMLPropertyList::const_iterator it = props.begin(); it != props.end(); ++it) {
@@ -185,32 +186,32 @@ AudioTrackImporter::parse_io ()
                        std::cerr << string_compose (X_("AudioTrackImporter: did not recognise XML-property \"%1\""), prop) << endmsg;
                }
        }
-       
+
        if (!name_ok) {
                error << X_("AudioTrackImporter: did not find necessary XML-property \"name\"") << endmsg;
                return false;
        }
-       
+
        if (!id_ok) {
                error << X_("AudioTrackImporter: did not find necessary XML-property \"id\"") << endmsg;
                return false;
        }
-       
-       XMLNodeList const & controllables = io->children ("Controllable");
+
+       XMLNodeList const & controllables = io->children (Controllable::xml_node_name);
        for (XMLNodeList::const_iterator it = controllables.begin(); it != controllables.end(); ++it) {
                parse_controllable (**it);
        }
-       
+
        XMLNodeList const & processors = io->children ("Processor");
        for (XMLNodeList::const_iterator it = processors.begin(); it != processors.end(); ++it) {
                parse_processor (**it);
        }
-       
+
        XMLNodeList const & automations = io->children ("Automation");
        for (XMLNodeList::const_iterator it = automations.begin(); it != automations.end(); ++it) {
                parse_automation (**it);
        }
-       
+
        return true;
 }
 
@@ -221,13 +222,14 @@ AudioTrackImporter::get_info () const
        return name;
 }
 
+/** @return true if everything is ok */
 bool
 AudioTrackImporter::_prepare_move ()
 {
        /* Copy dependent playlists */
 
        pl_handler.playlists_by_diskstream (old_ds_id, playlists);
-       
+
        for (PlaylistList::iterator it = playlists.begin(); it != playlists.end(); ++it) {
                if (!(*it)->prepare_move ()) {
                        playlists.clear ();
@@ -235,19 +237,33 @@ AudioTrackImporter::_prepare_move ()
                }
                (*it)->set_diskstream (new_ds_id);
        }
-       
+
        /* Rename */
-       
+
        while (session.route_by_name (name) || !track_handler.check_name (name)) {
-               std::pair<bool, string> rename_pair = Rename (_("A playlist with this name already exists, please rename it."), name);
+               std::pair<bool, string> rename_pair = *Rename (_("A playlist with this name already exists, please rename it."), name);
                if (!rename_pair.first) {
                        return false;
                }
                name = rename_pair.second;
        }
-       xml_track.child ("IO")->property ("name")->set_value (name);
+
+       XMLNode* c = xml_track.child ("IO");
+       if (!c) {
+               error << _("badly-formed XML in imported track") << endmsg;
+               return false;
+       }
+
+       XMLProperty * p = c->property ("name");
+       if (!p) {
+               error << _("badly-formed XML in imported track") << endmsg;
+               return false;
+       }
+
+       p->set_value (name);
+
        track_handler.add_name (name);
-       
+
        return true;
 }
 
@@ -260,24 +276,27 @@ AudioTrackImporter::_cancel_move ()
 
 void
 AudioTrackImporter::_move ()
-{      
+{
        /* Add diskstream */
-       
+
        boost::shared_ptr<XMLSharedNodeList> ds_node_list;
        string xpath = "/Session/DiskStreams/AudioDiskstream[@id='" + old_ds_id.to_s() + "']";
-       ds_node_list = source.root()->find (xpath);
-       
+       ds_node_list = source.find (xpath);
+
        if (ds_node_list->size() != 1) {
                error << string_compose (_("Error Importing Audio track %1"), name) << endmsg;
                return;
        }
-       
+
        boost::shared_ptr<XMLNode> ds_node = ds_node_list->front();
-       ds_node->property ("id")->set_value (new_ds_id.to_s());
-       
+       XMLProperty * p = ds_node->property (X_("id"));
+       assert (p);
+       p->set_value (new_ds_id.to_s());
+
        boost::shared_ptr<Diskstream> new_ds (new AudioDiskstream (session, *ds_node));
        new_ds->set_name (name);
-       session.add_diskstream (new_ds);
+       new_ds->do_refill_with_alloc ();
+       new_ds->set_block_size (session.get_block_size ());
 
        /* Import playlists */
 
@@ -289,7 +308,7 @@ AudioTrackImporter::_move ()
 
        XMLNode routes ("Routes");
        routes.add_child_copy (xml_track);
-       session.load_routes (routes);
+       session.load_routes (routes, 3000);
 }
 
 bool
@@ -299,7 +318,7 @@ AudioTrackImporter::parse_processor (XMLNode & node)
        if (automation) {
                parse_automation (*automation);
        }
-       
+
        return true;
 }
 
@@ -307,7 +326,7 @@ bool
 AudioTrackImporter::parse_controllable (XMLNode & node)
 {
        XMLProperty * prop;
-       
+
        if ((prop = node.property ("id"))) {
                PBD::ID new_id;
                prop->set_value (new_id.to_s());
@@ -325,12 +344,12 @@ AudioTrackImporter::parse_automation (XMLNode & node)
        XMLNodeList const & lists = node.children ("AutomationList");
        for (XMLNodeList::const_iterator it = lists.begin(); it != lists.end(); ++it) {
                XMLProperty * prop;
-               
+
                if ((prop = (*it)->property ("id"))) {
                        PBD::ID id;
                        prop->set_value (id.to_s());
                }
-               
+
                if (!(*it)->name().compare ("events")) {
                        rate_convert_events (**it);
                }
@@ -351,14 +370,14 @@ AudioTrackImporter::rate_convert_events (XMLNode & node)
        if (content_node->content().empty()) {
                return false;
        }
-       
+
        std::stringstream str (content_node->content());
        std::ostringstream new_content;
-       
-       nframes_t x;
+
+       framecnt_t x;
        double y;
        bool ok = true;
-       
+
        while (str) {
                str >> x;
                if (!str) {
@@ -369,10 +388,10 @@ AudioTrackImporter::rate_convert_events (XMLNode & node)
                        ok = false;
                        break;
                }
-               
+
                new_content << rate_convert_samples (x) << ' ' << y;
        }
-       
+
        if (!ok) {
                error << X_("AudioTrackImporter: error in rate converting automation events") << endmsg;
                return false;