using namespace ARDOUR;
using namespace PBD;
+struct EditorOrderRouteSorter {
+ bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
+ return a->order_key () < b->order_key ();
+ }
+};
+
PortExportChannelSelector::PortExportChannelSelector (ARDOUR::Session * session, ProfileManagerPtr manager) :
ExportChannelSelector (session, manager),
channels_label (_("Channels:"), Gtk::ALIGN_LEFT),
split_checkbox.set_active (state->config->get_split());
channels_spinbutton.set_value (state->config->get_n_chans());
+ /* when loading presets, config is ready set here (shared ptr)
+ * fill_route_list () -> update_channel_count () -> set_channel_count () -> update_config()
+ * will call config->clear_channels(); and clear the config
+ */
+ channel_view.set_config (ChannelConfigPtr ());
fill_route_list ();
channel_view.set_config (state->config);
}
channel_view.add_route (master);
}
+ routes.sort (EditorOrderRouteSorter ());
+
for (RouteList::iterator it = routes.begin(); it != routes.end(); ++it) {
if ((*it)->is_master () || (*it)->is_monitor ()) {
continue;
PortExportChannelSelector::RouteCols::get_channel (uint32_t channel)
{
if (channel > n_channels) {
- std::cout << "Invalid channel cout for get_channel!" << std::endl;
+ std::cout << "Invalid channel count for get_channel!" << std::endl;
}
std::list<Channel>::iterator it = channels.begin();
if (config == c) { return; }
config = c;
+ if (!config) { return; }
uint32_t i = 1;
ExportChannelConfiguration::ChannelList chan_list = config->get_channels();
factory.reset (new RegionExportChannelFactory (_session, region, track, type));
state->config->set_region_processing_type (type);
- for (size_t chan = 0; chan < region_chans; ++chan) {
+ const size_t cc = type == RegionExportChannelFactory::Processed ? track_chans : region_chans;
+ for (size_t chan = 0; chan < cc; ++chan) {
state->config->register_channel (factory->create (chan));
}
TrackExportChannelSelector::TrackExportChannelSelector (ARDOUR::Session * session, ProfileManagerPtr manager)
: ExportChannelSelector(session, manager)
- , region_contents_button(source_group, _("Export region contents"))
- , track_output_button(source_group, _("Export track output"))
+ , track_output_button(_("Apply track/bus processing"))
+ , select_tracks_button (_("Select all tracks"))
+ , select_busses_button (_("Select all busses"))
+ , select_none_button (_("Deselect all"))
{
pack_start(main_layout);
// Options
- options_box.pack_start(region_contents_button);
options_box.pack_start(track_output_button);
+ options_box.pack_start (select_tracks_button);
+ options_box.pack_start (select_busses_button);
+ options_box.pack_start (select_none_button);
main_layout.pack_start(options_box, false, false);
// Track scroller
column->pack_start (*text_renderer, false);
column->add_attribute (text_renderer->property_text(), track_cols.label);
+ select_tracks_button.signal_clicked().connect (sigc::mem_fun (*this, &TrackExportChannelSelector::select_tracks));
+ select_busses_button.signal_clicked().connect (sigc::mem_fun (*this, &TrackExportChannelSelector::select_busses));
+ select_none_button.signal_clicked().connect (sigc::mem_fun (*this, &TrackExportChannelSelector::select_none));
+
+ track_output_button.signal_clicked().connect (sigc::mem_fun (*this, &TrackExportChannelSelector::track_outputs_selected));
+
fill_list();
show_all_children ();
update_config();
}
+void
+TrackExportChannelSelector::select_tracks ()
+{
+ for (Gtk::ListStore::Children::iterator it = track_list->children().begin(); it != track_list->children().end(); ++it) {
+ Gtk::TreeModel::Row row = *it;
+ boost::shared_ptr<Route> route = row[track_cols.route];
+ if (boost::dynamic_pointer_cast<Track> (route)) {
+ // it's a track
+ row[track_cols.selected] = true;
+ }
+ }
+ update_config();
+}
+
+void
+TrackExportChannelSelector::select_busses ()
+{
+ for (Gtk::ListStore::Children::iterator it = track_list->children().begin(); it != track_list->children().end(); ++it) {
+ Gtk::TreeModel::Row row = *it;
+ boost::shared_ptr<Route> route = row[track_cols.route];
+ if (!boost::dynamic_pointer_cast<Track> (route)) {
+ // it's not a track, must be a bus
+ row[track_cols.selected] = true;
+ }
+ }
+ update_config();
+}
+
+void
+TrackExportChannelSelector::select_none ()
+{
+ for (Gtk::ListStore::Children::iterator it = track_list->children().begin(); it != track_list->children().end(); ++it) {
+ Gtk::TreeModel::Row row = *it;
+ row[track_cols.selected] = false;
+ }
+ update_config();
+}
+
+void
+TrackExportChannelSelector::track_outputs_selected ()
+{
+ update_config();
+}
+
void
TrackExportChannelSelector::fill_list()
{
if ((*it)->is_master () || (*it)->is_monitor ()) {
continue;
}
+ if (!(*it)->active ()) {
+ // don't include inactive busses
+ continue;
+ }
+
// not monitor or master bus
add_track (*it);
}
}
for (RouteList::iterator it = routes.begin(); it != routes.end(); ++it) {
if (boost::dynamic_pointer_cast<AudioTrack>(*it)) {
+ if (!(*it)->active ()) {
+ // don't include inactive tracks
+ continue;
+ }
add_track (*it);
}
}
Gtk::TreeModel::iterator iter = track_list->append();
Gtk::TreeModel::Row row = *iter;
- row[track_cols.selected] = true;
+ row[track_cols.selected] = false;
row[track_cols.label] = route->name();
row[track_cols.route] = route;
row[track_cols.order_key] = route->order_key();
}
state->config->set_name (route->name());
+
}
CriticalSelectionChanged ();