+
+RegionExportChannelSelector::RegionExportChannelSelector (ARDOUR::Session * _session,
+ ProfileManagerPtr manager,
+ ARDOUR::AudioRegion const & region,
+ ARDOUR::AudioTrack & track) :
+ ExportChannelSelector (_session, manager),
+ region (region),
+ track (track),
+ region_chans (region.n_channels()),
+ track_chans (track.n_outputs().n_audio()),
+
+ raw_button (type_group),
+ fades_button (type_group),
+ processed_button (type_group)
+{
+ pack_start (vbox);
+
+ raw_button.set_label (string_compose (_("Region contents without fades nor region gain (channels: %1)"), region_chans));
+ raw_button.signal_toggled ().connect (sigc::mem_fun (*this, &RegionExportChannelSelector::handle_selection));
+ vbox.pack_start (raw_button);
+
+ fades_button.set_label (string_compose (_("Region contents with fades and region gain (channels: %1)"), region_chans));
+ fades_button.signal_toggled ().connect (sigc::mem_fun (*this, &RegionExportChannelSelector::handle_selection));
+ vbox.pack_start (fades_button);
+
+ processed_button.set_label (string_compose (_("Track output (channels: %1)"), track_chans));
+ processed_button.signal_toggled ().connect (sigc::mem_fun (*this, &RegionExportChannelSelector::handle_selection));
+ vbox.pack_start (processed_button);
+
+ sync_with_manager();
+ vbox.show_all_children ();
+ show_all_children ();
+}
+
+void
+RegionExportChannelSelector::sync_with_manager ()
+{
+ state = manager->get_channel_configs().front();
+ handle_selection ();
+}
+
+void
+RegionExportChannelSelector::handle_selection ()
+{
+ if (!state) {
+ return;
+ }
+
+ state->config->clear_channels ();
+
+ if (raw_button.get_active ()) {
+ factory.reset (new RegionExportChannelFactory (_session, region, track, RegionExportChannelFactory::Raw));
+ } else if (fades_button.get_active ()) {
+ factory.reset (new RegionExportChannelFactory (_session, region, track, RegionExportChannelFactory::Fades));
+ } else if (processed_button.get_active ()) {
+ factory.reset (new RegionExportChannelFactory(_session, region, track, RegionExportChannelFactory::Processed));
+ } else {
+ CriticalSelectionChanged ();
+ return;
+ }
+
+ for (size_t chan = 0; chan < region_chans; ++chan) {
+ state->config->register_channel (factory->create (chan));
+ }
+
+ CriticalSelectionChanged ();
+}
+
+TrackExportChannelSelector::TrackExportChannelSelector (ARDOUR::Session * session, ProfileManagerPtr manager)
+ : ExportChannelSelector(session, manager)
+{
+ track_scroller.add (track_view);
+ track_scroller.set_size_request (-1, 130);
+ track_scroller.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
+ pack_start(track_scroller);
+
+ // Track list
+ track_list = Gtk::ListStore::create (track_cols);
+ track_view.set_model (track_list);
+ track_view.set_headers_visible (true);
+
+ track_view.append_column_editable (_("Track"), track_cols.selected);
+ Gtk::CellRendererToggle *toggle = dynamic_cast<Gtk::CellRendererToggle *>(track_view.get_column_cell_renderer (0));
+ toggle->signal_toggled().connect (sigc::hide (sigc::mem_fun (*this, &TrackExportChannelSelector::update_config)));
+
+ Gtk::CellRendererText* text_renderer = Gtk::manage (new Gtk::CellRendererText);
+ text_renderer->property_editable() = false;
+
+ Gtk::TreeView::Column* column = track_view.get_column (0);
+ column->pack_start (*text_renderer);
+ column->add_attribute (text_renderer->property_text(), track_cols.label);
+
+ fill_list();
+
+ show_all_children ();
+}
+
+void
+TrackExportChannelSelector::sync_with_manager ()
+{
+ // TODO implement properly
+ update_config();
+}
+
+void
+TrackExportChannelSelector::fill_list()
+{
+ track_list->clear();
+ RouteList routes = *_session->get_routes();
+
+ for (RouteList::iterator it = routes.begin(); it != routes.end(); ++it) {
+ Route * route = it->get();
+ if(dynamic_cast<AudioTrack *>(route)) {
+ add_track(route);
+ }
+ }
+}
+
+void
+TrackExportChannelSelector::add_track(Route * route)
+{
+ Gtk::TreeModel::iterator iter = track_list->append();
+ Gtk::TreeModel::Row row = *iter;
+
+ row[track_cols.selected] = true;
+ row[track_cols.label] = route->name();
+ row[track_cols.track] = route;
+}
+
+void
+TrackExportChannelSelector::update_config()
+{
+ manager->clear_channel_configs();
+
+ for (Gtk::ListStore::Children::iterator it = track_list->children().begin(); it != track_list->children().end(); ++it) {
+ Gtk::TreeModel::Row row = *it;
+
+ if (!row[track_cols.selected]) {
+ continue;
+ }
+
+ ExportProfileManager::ChannelConfigStatePtr state = manager->add_channel_config();
+
+ Route * track = row[track_cols.track];
+
+ /* Output of track code. TODO make this an option also
+ uint32_t outs = track->n_ports().n_audio();
+ for (uint32_t i = 0; i < outs; ++i) {
+ AudioPort * port = track->audio (i);
+ if(port) {
+ ExportChannelPtr channel (new PortExportChannel ());
+ PortExportChannel * pec = static_cast<PortExportChannel *> (channel.get());
+ pec->add_port(port);
+ state->config->register_channel(channel);
+ }
+ }
+ */
+
+ std::list<ExportChannelPtr> list;
+ RouteExportChannel::create_from_route (list, *track);
+ state->config->register_channels (list);
+ state->config->set_name(track->name());
+ }
+
+ CriticalSelectionChanged ();
+}