Add test for DSPLoadCalculator to libardour tests
[ardour.git] / libs / ardour / export_multiplication.cc
index 943ca5a17268490404ddc81f351a715a136f4e0b..46ebcec4005694d8cfb4cb467e64f59019fdd85f 100644 (file)
@@ -1,3 +1,23 @@
+/*
+    Copyright (C) 2008-2012 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.
+
+*/
+
 /* This file is not used at the moment. It includes code related to export a
  * multiplication graph system that can be used together with the ExportMultiplicator
  * class in the gtk2_ardour folder.
@@ -9,48 +29,48 @@ ExportProfileManager::register_all_configs ()
 {
        list<TimespanNodePtr>::iterator tsl_it; // timespan list node iterator
        for (tsl_it = graph.timespans.begin(); tsl_it != graph.timespans.end(); ++tsl_it) {
-         list<GraphNode *>::const_iterator cc_it; // channel config node iterator
-         for (cc_it = (*tsl_it)->get_children().begin(); cc_it != (*tsl_it)->get_children().end(); ++cc_it) {
-           list<GraphNode *>::const_iterator f_it; // format node iterator
-           for (f_it = (*cc_it)->get_children().begin(); f_it != (*cc_it)->get_children().end(); ++f_it) {
-             list<GraphNode *>::const_iterator fn_it; // filename node iterator
-             for (fn_it = (*f_it)->get_children().begin(); fn_it != (*f_it)->get_children().end(); ++fn_it) {
-               /* Finally loop through each timespan in the timespan list */
-       
-               TimespanNodePtr ts_node;
-               if (!(ts_node = boost::dynamic_pointer_cast<TimespanNode> (*tsl_it))) {
-                       throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
-               }
-       
-               TimespanListPtr ts_list = ts_node->data()->timespans;
-               TimespanList::iterator ts_it;
-               for (ts_it = ts_list->begin(); ts_it != ts_list->end(); ++ts_it) {
-                       
-                       TimespanPtr timespan = *ts_it;
-                       
-                       ChannelConfigNode * cc_node;
-                       if (!(cc_node = dynamic_cast<ChannelConfigNode *> (*cc_it))) {
-                               throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
-                       }
-                       ChannelConfigPtr channel_config = cc_node->data()->config;
-                       
-                       FormatNode * f_node;
-                       if (!(f_node = dynamic_cast<FormatNode *> (*f_it))) {
-                               throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
-                       }
-                       FormatPtr format = f_node->data()->format;
-                       
-                       FilenameNode * fn_node;
-                       if (!(fn_node = dynamic_cast<FilenameNode *> (*fn_it))) {
-                               throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
+               list<GraphNode *>::const_iterator cc_it; // channel config node iterator
+               for (cc_it = (*tsl_it)->get_children().begin(); cc_it != (*tsl_it)->get_children().end(); ++cc_it) {
+                       list<GraphNode *>::const_iterator f_it; // format node iterator
+                       for (f_it = (*cc_it)->get_children().begin(); f_it != (*cc_it)->get_children().end(); ++f_it) {
+                               list<GraphNode *>::const_iterator fn_it; // filename node iterator
+                               for (fn_it = (*f_it)->get_children().begin(); fn_it != (*f_it)->get_children().end(); ++fn_it) {
+                                       /* Finally loop through each timespan in the timespan list */
+
+                                       TimespanNodePtr ts_node;
+                                       if (!(ts_node = boost::dynamic_pointer_cast<TimespanNode> (*tsl_it))) {
+                                               throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
+                                       }
+
+                                       TimespanListPtr ts_list = ts_node->data()->timespans;
+                                       TimespanList::iterator ts_it;
+                                       for (ts_it = ts_list->begin(); ts_it != ts_list->end(); ++ts_it) {
+
+                                               TimespanPtr timespan = *ts_it;
+
+                                               ChannelConfigNode * cc_node;
+                                               if (!(cc_node = dynamic_cast<ChannelConfigNode *> (*cc_it))) {
+                                                       throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
+                                               }
+                                               ChannelConfigPtr channel_config = cc_node->data()->config;
+
+                                               FormatNode * f_node;
+                                               if (!(f_node = dynamic_cast<FormatNode *> (*f_it))) {
+                                                       throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
+                                               }
+                                               FormatPtr format = f_node->data()->format;
+
+                                               FilenameNode * fn_node;
+                                               if (!(fn_node = dynamic_cast<FilenameNode *> (*fn_it))) {
+                                                       throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
+                                               }
+                                               FilenamePtr filename = fn_node->data()->filename;
+
+                                               handler->add_export_config (timespan, channel_config, format, filename);
+                                       }
+                               }
                        }
-                       FilenamePtr filename = fn_node->data()->filename;
-                       
-                       handler->add_export_config (timespan, channel_config, format, filename);
                }
-             }
-           }
-         }
        }
 }
 
@@ -61,7 +81,7 @@ ExportProfileManager::create_empty_config ()
        timespan->data()->timespans->push_back (handler->add_timespan());
 
        ChannelConfigNodePtr channel_config = ChannelConfigNode::create (new ChannelConfigState(handler->add_channel_config()));
-       
+
        FormatNodePtr format;
        load_formats ();
        if (!format_list.empty()) {
@@ -69,15 +89,15 @@ ExportProfileManager::create_empty_config ()
        } else {
                format = FormatNode::create (new FormatState (handler->add_format ()));
        }
-       
+
        FilenameNodePtr filename = FilenameNode::create (new FilenameState (handler->add_filename()));
-       
+
        /* Bring everything together */
-       
+
        timespan->add_child (channel_config.get(), 0);
        channel_config->add_child (format.get(), 0);
        format->add_child (filename.get(), 0);
-       
+
        graph.timespans.push_back (timespan);
        graph.channel_configs.push_back (channel_config);
        graph.formats.push_back (format);
@@ -98,7 +118,7 @@ ExportProfileManager::GraphNode::~GraphNode ()
        while (!children.empty()) {
                remove_child (children.front());
        }
-       
+
        while (!parents.empty()) {
                parents.front()->remove_child (this);
        }
@@ -130,7 +150,7 @@ ExportProfileManager::GraphNode::add_child (GraphNode * child, GraphNode * left_
        } else {
                children.push_back (child);
        }
-       
+
        child->add_parent (this);
 }
 
@@ -142,7 +162,7 @@ ExportProfileManager::GraphNode::is_ancestor_of (GraphNode const * node) const
                        return true;
                }
        }
-       
+
        return false;
 }
 
@@ -154,7 +174,7 @@ ExportProfileManager::GraphNode::is_descendant_of (GraphNode const * node) const
                        return true;
                }
        }
-       
+
        return false;
 }
 
@@ -162,7 +182,7 @@ void
 ExportProfileManager::GraphNode::select (bool value)
 {
        if (_selected == value) { return; }
-       
+
        _selected = value;
        SelectChanged (value);
 }
@@ -187,7 +207,7 @@ ExportProfileManager::GraphNode::remove_child (GraphNode * child)
                        break;
                }
        }
-       
+
        child->remove_parent (this);
 }
 
@@ -199,19 +219,19 @@ ExportProfileManager::split_node (GraphNode * node, float position)
                split_timespan (ts_node->self_ptr(), position);
                return;
        }
-       
+
        ChannelConfigNode * cc_node;
        if ((cc_node = dynamic_cast<ChannelConfigNode *> (node))) {
                split_channel_config (cc_node->self_ptr(), position);
                return;
        }
-       
+
        FormatNode * f_node;
        if ((f_node = dynamic_cast<FormatNode *> (node))) {
                split_format (f_node->self_ptr(), position);
                return;
        }
-       
+
        FilenameNode * fn_node;
        if ((fn_node = dynamic_cast<FilenameNode *> (node))) {
                split_filename (fn_node->self_ptr(), position);
@@ -227,19 +247,19 @@ ExportProfileManager::remove_node (GraphNode * node)
                remove_timespan (ts_node->self_ptr());
                return;
        }
-       
+
        ChannelConfigNode * cc_node;
        if ((cc_node = dynamic_cast<ChannelConfigNode *> (node))) {
                remove_channel_config (cc_node->self_ptr());
                return;
        }
-       
+
        FormatNode * f_node;
        if ((f_node = dynamic_cast<FormatNode *> (node))) {
                remove_format (f_node->self_ptr());
                return;
        }
-       
+
        FilenameNode * fn_node;
        if ((fn_node = dynamic_cast<FilenameNode *> (node))) {
                remove_filename (fn_node->self_ptr());
@@ -258,7 +278,7 @@ ExportProfileManager::purge_graph ()
                        graph.timespans.erase (tmp);
                }
        }
-       
+
        for (list<ChannelConfigNodePtr>::iterator it = graph.channel_configs.begin(); it != graph.channel_configs.end(); ) {
                list<ChannelConfigNodePtr>::iterator tmp = it;
                ++it;
@@ -267,7 +287,7 @@ ExportProfileManager::purge_graph ()
                        graph.channel_configs.erase (tmp);
                }
        }
-       
+
        for (list<FormatNodePtr>::iterator it = graph.formats.begin(); it != graph.formats.end(); ) {
                list<FormatNodePtr>::iterator tmp = it;
                ++it;
@@ -276,7 +296,7 @@ ExportProfileManager::purge_graph ()
                        graph.formats.erase (tmp);
                }
        }
-       
+
        for (list<FilenameNodePtr>::iterator it = graph.filenames.begin(); it != graph.filenames.end(); ) {
                list<FilenameNodePtr>::iterator tmp = it;
                ++it;
@@ -285,7 +305,7 @@ ExportProfileManager::purge_graph ()
                        graph.filenames.erase (tmp);
                }
        }
-       
+
        GraphChanged();
 }
 
@@ -300,9 +320,9 @@ ExportProfileManager::insert_after (list<T> & the_list, T const & position, T co
                        return;
                }
        }
-       
+
        std::cerr << "invalid position given to ExportProfileManager::insert_after (aborting)" << std::endl;
-       
+
        abort();
 }
 
@@ -330,12 +350,12 @@ ExportProfileManager::end_of_common_child_range (list<GraphNode *> const & the_l
 {
        if ((*beginning)->get_children().size() != 1) { return beginning; }
        GraphNode * child = (*beginning)->get_children().front();
-       
+
        list<GraphNode *>::const_iterator it = beginning;
        while (it != the_list.end() && (*it)->get_children().size() == 1 && (*it)->get_children().front() == child) {
                ++it;
        }
-       
+
        return --it;
 }
 
@@ -345,7 +365,7 @@ ExportProfileManager::split_node_at_position (GraphNode * old_node, GraphNode *
        list<GraphNode *> const & node_parents = old_node->get_parents();
        uint32_t split_index = (int) (node_parents.size() * position + 0.5);
        split_index = std::max ((uint32_t) 1, std::min (split_index, node_parents.size() - 1));
-       
+
        list<GraphNode *>::const_iterator it = node_parents.begin();
        for (uint32_t index = 1; it != node_parents.end(); ++index) {
                if (index > split_index) {
@@ -362,14 +382,14 @@ void
 ExportProfileManager::split_timespan (TimespanNodePtr node, float)
 {
        TimespanNodePtr new_timespan = duplicate_timespan_node (node);
-       insert_after (graph.timespans, node, new_timespan);     
-       
+       insert_after (graph.timespans, node, new_timespan);
+
        /* Note: Since a timespan selector allows all combinations of ranges
         * there is no reason for a channel configuration to have two parents
         */
-       
+
        duplicate_timespan_children (node->self_ptr(), new_timespan);
-       
+
        GraphChanged();
 }
 
@@ -378,16 +398,16 @@ ExportProfileManager::split_channel_config (ChannelConfigNodePtr node, float)
 {
        ChannelConfigNodePtr new_config = duplicate_channel_config_node (node);
        insert_after (graph.channel_configs, node, new_config);
-       
+
        /* Channel configs have only one parent, see above! */
        node->get_parents().front()->add_child (new_config.get(), node.get());
-       
+
        if (node->get_children().size() == 1) {
                new_config->add_child (node->first_child(), 0);
        } else {
                duplicate_channel_config_children (node, new_config);
        }
-       
+
        GraphChanged();
 }
 
@@ -404,13 +424,13 @@ ExportProfileManager::split_format (FormatNodePtr node, float position)
                node->sort_parents (graph.channel_configs);
                split_node_at_position (node.get(), new_format.get(), position);
        }
-       
+
        if (node->get_children().size() == 1) {
                new_format->add_child (node->first_child(), 0);
        } else {
                duplicate_format_children (node, new_format);
        }
-       
+
        GraphChanged();
 }
 
@@ -428,7 +448,7 @@ ExportProfileManager::split_filename (FilenameNodePtr node, float position)
                node->sort_parents (graph.formats);
                split_node_at_position (node.get(), new_filename.get(), position);
        }
-       
+
        GraphChanged();
 }
 
@@ -446,35 +466,35 @@ ExportProfileManager::duplicate_timespan_children (TimespanNodePtr source, Times
                throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
        }
        node_insertion_point = node_insertion_ptr->self_ptr();
-       
+
        /* Keep track of common children */
-       
+
        list<GraphNode *>::const_iterator common_children_begin = source_children.begin();
        list<GraphNode *>::const_iterator common_children_end = end_of_common_child_range (source_children, source_children.begin());
        GraphNode * common_child = 0;
-       
+
        for (list<GraphNode *>::const_iterator it = source_children.begin(); it != source_children.end(); ++it) {
                /* Duplicate node */
-       
+
                ChannelConfigNode *  node;
                ChannelConfigNodePtr new_node;
-               
+
                if (!(node = dynamic_cast<ChannelConfigNode *> (*it))) {
                        throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
                }
-               
+
                new_node = duplicate_channel_config_node (node->self_ptr());
-               
+
                /* Insert in gaph's list and update insertion position */
-               
+
                insert_after (graph.channel_configs, node_insertion_point, new_node);
                node_insertion_point = new_node;
-               
+
                /* Handle children */
-               
+
                target->add_child (new_node.get(), child_insertion_point);
                child_insertion_point = new_node.get();
-               
+
                if (one_grandchild) {
                        new_node->add_child (node->first_child(), 0);
                } else {
@@ -483,7 +503,7 @@ ExportProfileManager::duplicate_timespan_children (TimespanNodePtr source, Times
                                common_children_begin = it;
                                common_children_end = end_of_common_child_range (source_children, it);
                        }
-               
+
                        if (it == common_children_begin) { // At beginning => do duplication
                                GraphNode * grand_child_ins_pt = common_child;
                                if (!grand_child_ins_pt) {
@@ -514,33 +534,33 @@ ExportProfileManager::duplicate_channel_config_children (ChannelConfigNodePtr so
        node_insertion_point = node_insertion_ptr->self_ptr();
 
        /* Keep track of common children */
-       
+
        list<GraphNode *>::const_iterator common_children_begin = source_children.begin();
        list<GraphNode *>::const_iterator common_children_end = end_of_common_child_range (source_children, source_children.begin());
        GraphNode * common_child = 0;
 
        for (list<GraphNode *>::const_iterator it = source_children.begin(); it != source_children.end(); ++it) {
                /* Duplicate node */
-       
+
                FormatNode *  node;
                FormatNodePtr new_node;
-               
+
                if (!(node = dynamic_cast<FormatNode *> (*it))) {
                        throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
                }
-               
+
                new_node = duplicate_format_node (node->self_ptr());
-               
+
                /* Insert in gaph's list and update insertion position */
-               
+
                insert_after (graph.formats, node_insertion_point, new_node);
                node_insertion_point = new_node;
-               
+
                /* Handle children */
-               
+
                target->add_child (new_node.get(), child_insertion_point);
                child_insertion_point = new_node.get();
-               
+
                if (one_grandchild) {
                        new_node->add_child (node->first_child(), 0);
                } else {
@@ -549,7 +569,7 @@ ExportProfileManager::duplicate_channel_config_children (ChannelConfigNodePtr so
                                common_children_begin = it;
                                common_children_end = end_of_common_child_range (source_children, it);
                        }
-               
+
                        if (it == common_children_begin) { // At beginning => do duplication
                                GraphNode * grand_child_ins_pt = common_child;
                                if (!grand_child_ins_pt) {
@@ -579,23 +599,23 @@ ExportProfileManager::duplicate_format_children (FormatNodePtr source, FormatNod
 
        for (list<GraphNode *>::const_iterator it = source->get_children().begin(); it != source->get_children().end(); ++it) {
                /* Duplicate node */
-               
+
                FilenameNode *  node;
                FilenameNodePtr new_node;
-               
+
                if (!(node = dynamic_cast<FilenameNode *> (*it))) {
                        throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
                }
-               
+
                new_node = duplicate_filename_node (node->self_ptr());
-               
+
                /* Insert in gaph's list and update insertion position */
-               
+
                insert_after (graph.filenames, node_insertion_point, new_node);
                node_insertion_point = new_node;
-               
+
                /* Handle children */
-               
+
                target->add_child (new_node.get(), child_insertion_point);
                child_insertion_point = new_node.get();
        }
@@ -607,14 +627,14 @@ ExportProfileManager::duplicate_timespan_node (TimespanNodePtr node)
        TimespanStatePtr state = node->data();
        TimespanStatePtr new_state (new TimespanState ());
        TimespanNodePtr  new_node = TimespanNode::create (new_state);
-       
+
        for (TimespanList::iterator it = state->timespans->begin(); it != state->timespans->end(); ++it) {
                new_state->timespans->push_back (handler->add_timespan_copy (*it));
        }
-       
+
        new_state->time_format = state->time_format;
        new_state->marker_format = state->marker_format;
-       
+
        return new_node;
 }
 
@@ -624,7 +644,7 @@ ExportProfileManager::duplicate_channel_config_node (ChannelConfigNodePtr node)
        ChannelConfigStatePtr state = node->data();
        ChannelConfigStatePtr new_state (new ChannelConfigState (handler->add_channel_config_copy (state->config)));
        ChannelConfigNodePtr  new_node = ChannelConfigNode::create (new_state);
-       
+
        return new_node;
 }
 
@@ -634,7 +654,7 @@ ExportProfileManager::duplicate_format_node (FormatNodePtr node)
        FormatStatePtr state = node->data();
        FormatStatePtr new_state (new FormatState (handler->add_format_copy (state->format)));
        FormatNodePtr  new_node = FormatNode::create (new_state);
-       
+
        return new_node;
 }
 
@@ -644,7 +664,7 @@ ExportProfileManager::duplicate_filename_node (FilenameNodePtr node)
        FilenameStatePtr state = node->data();
        FilenameStatePtr new_state (new FilenameState (handler->add_filename_copy (state->filename)));
        FilenameNodePtr  new_node = FilenameNode::create (new_state);
-       
+
        return new_node;
 }
 
@@ -674,4 +694,4 @@ ExportProfileManager::remove_filename (FilenameNodePtr node)
 {
        remove_by_element (graph.filenames, node);
        purge_graph ();
-}
\ No newline at end of file
+}