summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2006-08-17 02:12:20 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2006-08-17 02:12:20 +0000
commit3c3a204ad32cfa167efa193b472a7b8103734613 (patch)
treef5318153b3883d3de930385392582dbb6da4148f /gtk2_ardour
parent199dce57f35014189f21c76fff32e0752bcc8c15 (diff)
further optimizations for multiple-track-at-once addition. as in "whoah!"
git-svn-id: svn://localhost/ardour2/trunk@836 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/ardour_ui.cc34
-rw-r--r--gtk2_ardour/ardour_ui.h4
-rw-r--r--gtk2_ardour/ardour_ui_ed.cc2
-rw-r--r--gtk2_ardour/editor.h2
-rw-r--r--gtk2_ardour/editor_audio_import.cc4
-rw-r--r--gtk2_ardour/editor_route_list.cc108
-rw-r--r--gtk2_ardour/mixer_ui.cc62
-rw-r--r--gtk2_ardour/mixer_ui.h2
-rw-r--r--gtk2_ardour/route_params_ui.cc35
-rw-r--r--gtk2_ardour/route_params_ui.h2
-rw-r--r--gtk2_ardour/route_ui.cc1
11 files changed, 132 insertions, 124 deletions
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc
index 345f715d39..66374ff417 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -874,21 +874,21 @@ ARDOUR_UI::session_add_midi_track ()
}
void
-ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many)
+ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many)
{
- boost::shared_ptr<Route> route;
- vector<boost::shared_ptr<AudioTrack> > routes;
+ list<boost::shared_ptr<AudioTrack> > tracks;
+ Session::RouteList routes;
if (session == 0) {
- warning << _("You cannot add a track without a session already loaded.") << endmsg;
+ warning << _("You cannot add a track or bus without a session already loaded.") << endmsg;
return;
}
try {
- if (disk) {
- routes = session->new_audio_track (input_channels, output_channels, mode, how_many);
+ if (track) {
+ tracks = session->new_audio_track (input_channels, output_channels, mode, how_many);
- if (routes.size() != how_many) {
+ if (tracks.size() != how_many) {
if (how_many == 1) {
error << _("could not create a new audio track") << endmsg;
} else {
@@ -897,8 +897,15 @@ ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t o
}
} else {
- if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
- error << _("could not create new audio bus") << endmsg;
+
+ routes = session->new_audio_route (input_channels, output_channels, how_many);
+
+ if (routes.size() != how_many) {
+ if (how_many == 1) {
+ error << _("could not create a new audio track") << endmsg;
+ } else {
+ error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
+ }
}
}
@@ -2086,14 +2093,7 @@ ARDOUR_UI::add_route ()
if (track) {
session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count);
} else {
- while (count) {
- session_add_audio_bus (input_chan, output_chan);
- }
- --count;
-
- while (Main::events_pending()) {
- Main::iteration ();
- }
+ session_add_audio_bus (input_chan, output_chan, count);
}
}
diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h
index ebb5c76838..cafa335bf2 100644
--- a/gtk2_ardour/ardour_ui.h
+++ b/gtk2_ardour/ardour_ui.h
@@ -193,8 +193,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI
session_add_audio_route (true, input_channels, output_channels, mode, how_many);
}
- void session_add_audio_bus (int input_channels, int32_t output_channels) {
- session_add_audio_route (false, input_channels, output_channels, ARDOUR::Normal, 1);
+ void session_add_audio_bus (int input_channels, int32_t output_channels, uint32_t how_many) {
+ session_add_audio_route (false, input_channels, output_channels, ARDOUR::Normal, how_many);
}
void session_add_midi_track ();
diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc
index 3d8e99ad6e..7b461b1d5c 100644
--- a/gtk2_ardour/ardour_ui_ed.cc
+++ b/gtk2_ardour/ardour_ui_ed.cc
@@ -196,7 +196,7 @@ ARDOUR_UI::install_actions ()
act = ActionManager::register_action (common_actions, X_("AddAudioTrack"), _("Add Audio Track"), bind (mem_fun(*this, &ARDOUR_UI::session_add_audio_track), 1, 1, ARDOUR::Normal, 1));
ActionManager::session_sensitive_actions.push_back (act);
- act = ActionManager::register_action (common_actions, X_("AddAudioBus"), _("Add Audio Bus"), bind (mem_fun(*this, &ARDOUR_UI::session_add_audio_bus), 1, 1));
+ act = ActionManager::register_action (common_actions, X_("AddAudioBus"), _("Add Audio Bus"), bind (mem_fun(*this, &ARDOUR_UI::session_add_audio_bus), 1, 1, 1));
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_action (common_actions, X_("Save"), _("Save"), bind (mem_fun(*this, &ARDOUR_UI::save_state), string("")));
ActionManager::session_sensitive_actions.push_back (act);
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index 5ddb2b0d2e..dd62a4dd75 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -466,7 +466,7 @@ class Editor : public PublicEditor
void add_crossfade_context_items (AudioStreamView*, ARDOUR::Crossfade*, Gtk::Menu_Helpers::MenuList&, bool many);
void add_selection_context_items (Gtk::Menu_Helpers::MenuList&);
- void handle_new_route (boost::shared_ptr<ARDOUR::Route>);
+ void handle_new_route (ARDOUR::Session::RouteList&);
void remove_route (TimeAxisView *);
bool route_removal;
diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc
index 4128348e3a..71e28c9a1d 100644
--- a/gtk2_ardour/editor_audio_import.cc
+++ b/gtk2_ardour/editor_audio_import.cc
@@ -332,7 +332,7 @@ Editor::finish_bringing_in_audio (AudioRegion& region, uint32_t in_chans, uint32
case ImportAsTrack:
{
- vector<boost::shared_ptr<AudioTrack> > at (session->new_audio_track (in_chans, out_chans, Normal, 1));
+ list<boost::shared_ptr<AudioTrack> > at (session->new_audio_track (in_chans, out_chans, Normal, 1));
if (!at.empty()) {
copy = new AudioRegion (region);
at.front()->diskstream()->playlist()->add_region (*copy, pos);
@@ -342,7 +342,7 @@ Editor::finish_bringing_in_audio (AudioRegion& region, uint32_t in_chans, uint32
case ImportAsTapeTrack:
{
- vector<boost::shared_ptr<AudioTrack> > at (session->new_audio_track (in_chans, out_chans, Destructive));
+ list<boost::shared_ptr<AudioTrack> > at (session->new_audio_track (in_chans, out_chans, Destructive));
if (!at.empty()) {
copy = new AudioRegion (region);
at.front()->diskstream()->playlist()->add_region (*copy, pos);
diff --git a/gtk2_ardour/editor_route_list.cc b/gtk2_ardour/editor_route_list.cc
index c93cf9aba2..573dec0fd5 100644
--- a/gtk2_ardour/editor_route_list.cc
+++ b/gtk2_ardour/editor_route_list.cc
@@ -39,72 +39,76 @@ using namespace PBD;
using namespace Gtk;
void
-Editor::handle_new_route (boost::shared_ptr<Route> route)
+Editor::handle_new_route (Session::RouteList& routes)
{
- ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::handle_new_route), route));
+ ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::handle_new_route), routes));
TimeAxisView *tv;
AudioTimeAxisView *atv;
TreeModel::Row parent;
TreeModel::Row row;
- if (route->hidden()) {
- return;
- }
-
- tv = new AudioTimeAxisView (*this, *session, route, track_canvas);
+ for (Session::RouteList::iterator x = routes.begin(); x != routes.end(); ++x) {
+ boost::shared_ptr<Route> route = (*x);
+ if (route->hidden()) {
+ return;
+ }
+
+ tv = new AudioTimeAxisView (*this, *session, route, track_canvas);
+
#if 0
- if (route_display_model->children().size() == 0) {
+ if (route_display_model->children().size() == 0) {
+
+ /* set up basic entries */
+
+ TreeModel::Row row;
+
+ row = *(route_display_model->append()); // path = "0"
+ row[route_display_columns.text] = _("Busses");
+ row[route_display_columns.tv] = 0;
+ row = *(route_display_model->append()); // path = "1"
+ row[route_display_columns.text] = _("Tracks");
+ row[route_display_columns.tv] = 0;
+
+ }
- /* set up basic entries */
-
- TreeModel::Row row;
+ if (dynamic_cast<AudioTrack*>(route.get()) != 0) {
+ TreeModel::iterator iter = route_display_model->get_iter ("1"); // audio tracks
+ parent = *iter;
+ } else {
+ TreeModel::iterator iter = route_display_model->get_iter ("0"); // busses
+ parent = *iter;
+ }
- row = *(route_display_model->append()); // path = "0"
- row[route_display_columns.text] = _("Busses");
- row[route_display_columns.tv] = 0;
- row = *(route_display_model->append()); // path = "1"
- row[route_display_columns.text] = _("Tracks");
- row[route_display_columns.tv] = 0;
-
- }
-
- if (dynamic_cast<AudioTrack*>(route.get()) != 0) {
- TreeModel::iterator iter = route_display_model->get_iter ("1"); // audio tracks
- parent = *iter;
- } else {
- TreeModel::iterator iter = route_display_model->get_iter ("0"); // busses
- parent = *iter;
- }
-
-
- row = *(route_display_model->append (parent.children()));
+
+ row = *(route_display_model->append (parent.children()));
#else
- row = *(route_display_model->append ());
+ row = *(route_display_model->append ());
#endif
-
- row[route_display_columns.text] = route->name();
- row[route_display_columns.visible] = tv->marked_for_display();
- row[route_display_columns.tv] = tv;
-
- track_views.push_back (tv);
-
- ignore_route_list_reorder = true;
-
- if ((atv = dynamic_cast<AudioTimeAxisView*> (tv)) != 0) {
- /* added a new fresh one at the end */
- if (atv->route()->order_key(N_("editor")) == -1) {
- atv->route()->set_order_key (N_("editor"), route_display_model->children().size()-1);
+
+ row[route_display_columns.text] = route->name();
+ row[route_display_columns.visible] = tv->marked_for_display();
+ row[route_display_columns.tv] = tv;
+
+ track_views.push_back (tv);
+
+ ignore_route_list_reorder = true;
+
+ if ((atv = dynamic_cast<AudioTimeAxisView*> (tv)) != 0) {
+ /* added a new fresh one at the end */
+ if (atv->route()->order_key(N_("editor")) == -1) {
+ atv->route()->set_order_key (N_("editor"), route_display_model->children().size()-1);
+ }
}
+
+ ignore_route_list_reorder = false;
+
+ route->gui_changed.connect (mem_fun(*this, &Editor::handle_gui_changes));
+
+ tv->GoingAway.connect (bind (mem_fun(*this, &Editor::remove_route), tv));
}
- ignore_route_list_reorder = false;
-
- route->gui_changed.connect (mem_fun(*this, &Editor::handle_gui_changes));
-
- tv->GoingAway.connect (bind (mem_fun(*this, &Editor::remove_route), tv));
-
editor_mixer_button.set_sensitive(true);
}
@@ -491,9 +495,7 @@ Editor::initial_route_list_display ()
route_display_model->clear ();
- for (Session::RouteList::iterator i = r.begin(); i != r.end(); ++i) {
- handle_new_route (*i);
- }
+ handle_new_route (r);
no_route_list_redisplay = false;
diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc
index c2eb588b2f..84fade5472 100644
--- a/gtk2_ardour/mixer_ui.cc
+++ b/gtk2_ardour/mixer_ui.cc
@@ -251,38 +251,42 @@ Mixer_UI::show_window ()
}
void
-Mixer_UI::add_strip (boost::shared_ptr<Route> route)
+Mixer_UI::add_strip (Session::RouteList& routes)
{
- ENSURE_GUI_THREAD(bind (mem_fun(*this, &Mixer_UI::add_strip), route));
+ ENSURE_GUI_THREAD(bind (mem_fun(*this, &Mixer_UI::add_strip), routes));
MixerStrip* strip;
- if (route->hidden()) {
- return;
- }
-
- strip = new MixerStrip (*this, *session, route);
- strips.push_back (strip);
-
- strip->set_width (_strip_width);
- show_strip (strip);
-
- no_track_list_redisplay = true;
-
- TreeModel::Row row = *(track_model->append());
- row[track_columns.text] = route->name();
-
- row[track_columns.visible] = true;
- row[track_columns.route] = route;
- row[track_columns.strip] = strip;
-
- no_track_list_redisplay = false;
- redisplay_track_list ();
-
- route->name_changed.connect (bind (mem_fun(*this, &Mixer_UI::strip_name_changed), strip));
- strip->GoingAway.connect (bind (mem_fun(*this, &Mixer_UI::remove_strip), strip));
+ for (Session::RouteList::iterator x = routes.begin(); x != routes.end(); ++x) {
+ boost::shared_ptr<Route> route = (*x);
- strip->signal_button_release_event().connect (bind (mem_fun(*this, &Mixer_UI::strip_button_release_event), strip));
+ if (route->hidden()) {
+ return;
+ }
+
+ strip = new MixerStrip (*this, *session, route);
+ strips.push_back (strip);
+
+ strip->set_width (_strip_width);
+ show_strip (strip);
+
+ no_track_list_redisplay = true;
+
+ TreeModel::Row row = *(track_model->append());
+ row[track_columns.text] = route->name();
+
+ row[track_columns.visible] = true;
+ row[track_columns.route] = route;
+ row[track_columns.strip] = strip;
+
+ no_track_list_redisplay = false;
+ redisplay_track_list ();
+
+ route->name_changed.connect (bind (mem_fun(*this, &Mixer_UI::strip_name_changed), strip));
+ strip->GoingAway.connect (bind (mem_fun(*this, &Mixer_UI::remove_strip), strip));
+
+ strip->signal_button_release_event().connect (bind (mem_fun(*this, &Mixer_UI::strip_button_release_event), strip));
+ }
}
void
@@ -623,9 +627,7 @@ Mixer_UI::initial_track_display ()
track_model->clear ();
- for (Session::RouteList::iterator i = copy.begin(); i != copy.end(); ++i) {
- add_strip (*i);
- }
+ add_strip (copy);
no_track_list_redisplay = false;
diff --git a/gtk2_ardour/mixer_ui.h b/gtk2_ardour/mixer_ui.h
index 6fe4120427..77021dc8fe 100644
--- a/gtk2_ardour/mixer_ui.h
+++ b/gtk2_ardour/mixer_ui.h
@@ -111,7 +111,7 @@ class Mixer_UI : public Gtk::Window
bool strip_scroller_button_release (GdkEventButton*);
- void add_strip (boost::shared_ptr<ARDOUR::Route>);
+ void add_strip (ARDOUR::Session::RouteList&);
void remove_strip (MixerStrip *);
void hide_all_strips (bool with_select);
diff --git a/gtk2_ardour/route_params_ui.cc b/gtk2_ardour/route_params_ui.cc
index 8d8efad8a2..c23ed272e1 100644
--- a/gtk2_ardour/route_params_ui.cc
+++ b/gtk2_ardour/route_params_ui.cc
@@ -159,22 +159,26 @@ RouteParams_UI::~RouteParams_UI ()
}
void
-RouteParams_UI::add_route (boost::shared_ptr<Route> route)
+RouteParams_UI::add_routes (Session::RouteList& routes)
{
- ENSURE_GUI_THREAD(bind (mem_fun(*this, &RouteParams_UI::add_route), route));
+ ENSURE_GUI_THREAD(bind (mem_fun(*this, &RouteParams_UI::add_routes), routes));
- if (route->hidden()) {
- return;
- }
-
- TreeModel::Row row = *(route_display_model->append());
- row[route_display_columns.text] = route->name();
- row[route_display_columns.route] = route;
+ for (Session::RouteList::iterator x = routes.begin(); x != routes.end(); ++x) {
+ boost::shared_ptr<Route> route = (*x);
- //route_select_list.rows().back().select ();
-
- route->name_changed.connect (bind (mem_fun(*this, &RouteParams_UI::route_name_changed), route));
- route->GoingAway.connect (bind (mem_fun(*this, &RouteParams_UI::route_removed), route));
+ if (route->hidden()) {
+ return;
+ }
+
+ TreeModel::Row row = *(route_display_model->append());
+ row[route_display_columns.text] = route->name();
+ row[route_display_columns.route] = route;
+
+ //route_select_list.rows().back().select ();
+
+ route->name_changed.connect (bind (mem_fun(*this, &RouteParams_UI::route_name_changed), route));
+ route->GoingAway.connect (bind (mem_fun(*this, &RouteParams_UI::route_removed), route));
+ }
}
@@ -355,9 +359,10 @@ RouteParams_UI::set_session (Session *sess)
route_display_model->clear();
if (session) {
- session->foreach_route (this, &RouteParams_UI::add_route);
+ boost::shared_ptr<Session::RouteList> r = session->get_routes();
+ add_routes (*r);
session->going_away.connect (mem_fun(*this, &ArdourDialog::session_gone));
- session->RouteAdded.connect (mem_fun(*this, &RouteParams_UI::add_route));
+ session->RouteAdded.connect (mem_fun(*this, &RouteParams_UI::add_routes));
start_updating ();
} else {
stop_updating ();
diff --git a/gtk2_ardour/route_params_ui.h b/gtk2_ardour/route_params_ui.h
index 5f487d6e5c..eff31023f7 100644
--- a/gtk2_ardour/route_params_ui.h
+++ b/gtk2_ardour/route_params_ui.h
@@ -159,7 +159,7 @@ class RouteParams_UI : public ArdourDialog
Glib::RefPtr<Gtk::ListStore> route_display_model;
- void add_route (boost::shared_ptr<ARDOUR::Route>);
+ void add_routes (ARDOUR::Session::RouteList&);
void route_name_changed (void *src, boost::shared_ptr<ARDOUR::Route> route);
void route_removed (boost::shared_ptr<ARDOUR::Route> route);
diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc
index b2fdcaf7d4..2b95ff9cfb 100644
--- a/gtk2_ardour/route_ui.cc
+++ b/gtk2_ardour/route_ui.cc
@@ -733,7 +733,6 @@ void
RouteUI::route_removed ()
{
ENSURE_GUI_THREAD(mem_fun (*this, &RouteUI::route_removed));
- cerr << "Route UI @ " << this << " destroyed by impending end of route\n";
delete this;
}