added RCU handling of Session route list, and major use of shared_ptr<T> everywhere...
[ardour.git] / gtk2_ardour / mixer_ui.cc
index 9573011b379c1e5d2d0fdd885cdb301466d58a3b..c2eb588b2f2744865d085574155f36aff585e3cf 100644 (file)
@@ -24,7 +24,7 @@
 #include <gtkmm/accelmap.h>
 
 #include <pbd/convert.h>
-#include <pbd/lockmonitor.h>
+#include <glibmm/thread.h>
 
 #include <gtkmm2ext/gtk_ui.h>
 #include <gtkmm2ext/utils.h>
@@ -34,7 +34,7 @@
 #include <ardour/session.h>
 #include <ardour/audio_track.h>
 #include <ardour/session_route.h>
-#include <ardour/diskstream.h>
+#include <ardour/audio_diskstream.h>
 #include <ardour/plugin_manager.h>
 
 #include "mixer_ui.h"
@@ -49,6 +49,7 @@
 #include "i18n.h"
 
 using namespace ARDOUR;
+using namespace PBD;
 using namespace Gtk;
 using namespace Glib;
 using namespace Gtkmm2ext;
@@ -85,6 +86,8 @@ Mixer_UI::Mixer_UI (AudioEngine& eng)
        track_display.append_column (_("Visible"), track_columns.visible);
        track_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
        track_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
+       track_display.get_column (0)->set_expand(true);
+       track_display.get_column (1)->set_expand(false);
        track_display.set_name (X_("MixerTrackDisplayList"));
        track_display.get_selection()->set_mode (Gtk::SELECTION_NONE);
        track_display.set_reorderable (true);
@@ -110,11 +113,13 @@ Mixer_UI::Mixer_UI (AudioEngine& eng)
        group_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
        group_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
        group_display.get_column (2)->set_data (X_("colnum"), GUINT_TO_POINTER(2));
+       group_display.get_column (0)->set_expand(true);
+       group_display.get_column (1)->set_expand(false);
+       group_display.get_column (2)->set_expand(false);
        group_display.set_name ("MixerGroupList");
        group_display.get_selection()->set_mode (Gtk::SELECTION_SINGLE);
        group_display.set_reorderable (true);
        group_display.set_headers_visible (true);
-               group_display.set_headers_clickable (false);
        group_display.set_rules_hint (true);
 
        /* name is directly editable */
@@ -178,14 +183,13 @@ Mixer_UI::Mixer_UI (AudioEngine& eng)
 
        rhs_pane1.pack1 (track_display_frame);
        rhs_pane1.pack2 (group_display_frame);
-       rhs_pane1.set_size_request (110, -1);
 
        list_vpacker.pack_start (rhs_pane1, true, true);
 
        global_hpacker.pack_start (scroller, true, true);
        global_hpacker.pack_start (out_packer, false, false);
 
-       list_hpane.pack1(list_vpacker, false, false);
+       list_hpane.add1(list_vpacker);
        list_hpane.add2(global_hpacker);
 
        rhs_pane1.signal_size_allocate().connect (bind (mem_fun(*this, &Mixer_UI::pane_allocation_handler), 
@@ -247,7 +251,7 @@ Mixer_UI::show_window ()
 }
 
 void
-Mixer_UI::add_strip (Route* route)
+Mixer_UI::add_strip (boost::shared_ptr<Route> route)
 {
        ENSURE_GUI_THREAD(bind (mem_fun(*this, &Mixer_UI::add_strip), route));
        
@@ -257,7 +261,7 @@ Mixer_UI::add_strip (Route* route)
                return;
        }
 
-       strip = new MixerStrip (*this, *session, *route);
+       strip = new MixerStrip (*this, *session, route);
        strips.push_back (strip);
 
        strip->set_width (_strip_width);
@@ -306,7 +310,7 @@ void
 Mixer_UI::follow_strip_selection ()
 {
        for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
-               (*i)->set_selected (_selection.selected (&(*i)->route()));
+               (*i)->set_selected (_selection.selected ((*i)->route()));
        }
 }
 
@@ -320,13 +324,13 @@ Mixer_UI::strip_button_release_event (GdkEventButton *ev, MixerStrip *strip)
                   at the same time.
                */
                
-               if (_selection.selected (&strip->route())) {
-                       _selection.remove (&strip->route());
+               if (_selection.selected (strip->route())) {
+                       _selection.remove (strip->route());
                } else {
                        if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) {
-                               _selection.add (&strip->route());
+                               _selection.add (strip->route());
                        } else {
-                               _selection.set (&strip->route());
+                               _selection.set (strip->route());
                        }
                }
        }
@@ -440,7 +444,7 @@ Mixer_UI::set_all_strips_visibility (bool yn)
                        continue;
                }
                
-               if (strip->route().master() || strip->route().control()) {
+               if (strip->route()->master() || strip->route()->control()) {
                        continue;
                }
 
@@ -468,11 +472,11 @@ Mixer_UI::set_all_audio_visibility (int tracks, bool yn)
                        continue;
                }
 
-               if (strip->route().master() || strip->route().control()) {
+               if (strip->route()->master() || strip->route()->control()) {
                        continue;
                }
 
-               AudioTrack* at = dynamic_cast<AudioTrack*> (&strip->route());
+               AudioTrack* at = strip->audio_track();
 
                switch (tracks) {
                case 0:
@@ -566,11 +570,11 @@ Mixer_UI::redisplay_track_list ()
 
                if (visible) {
                        strip->set_marked_for_display (true);
-                       strip->route().set_order_key (N_("signal"), order);
+                       strip->route()->set_order_key (N_("signal"), order);
 
                        if (strip->packed()) {
 
-                               if (strip->route().master() || strip->route().control()) {
+                               if (strip->route()->master() || strip->route()->control()) {
                                        out_packer.reorder_child (*strip, -1);
                                } else {
                                        strip_packer.reorder_child (*strip, -1); /* put at end */
@@ -578,7 +582,7 @@ Mixer_UI::redisplay_track_list ()
 
                        } else {
 
-                               if (strip->route().master() || strip->route().control()) {
+                               if (strip->route()->master() || strip->route()->control()) {
                                        out_packer.pack_start (*strip, false, false);
                                } else {
                                        strip_packer.pack_start (*strip, false, false);
@@ -589,7 +593,7 @@ Mixer_UI::redisplay_track_list ()
 
                } else {
 
-                       if (strip->route().master() || strip->route().control()) {
+                       if (strip->route()->master() || strip->route()->control()) {
                                /* do nothing, these cannot be hidden */
                        } else {
                                strip_packer.remove (*strip);
@@ -600,7 +604,7 @@ Mixer_UI::redisplay_track_list ()
 }
 
 struct SignalOrderRouteSorter {
-    bool operator() (Route* a, Route* b) {
+    bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
            /* use of ">" forces the correct sort order */
            return a->order_key ("signal") < b->order_key ("signal");
     }
@@ -609,16 +613,17 @@ struct SignalOrderRouteSorter {
 void
 Mixer_UI::initial_track_display ()
 {
-       Session::RouteList routes = session->get_routes();
+       boost::shared_ptr<Session::RouteList> routes = session->get_routes();
+       Session::RouteList copy (*routes);
        SignalOrderRouteSorter sorter;
 
-       routes.sort (sorter);
+       copy.sort (sorter);
        
        no_track_list_redisplay = true;
 
        track_model->clear ();
 
-       for (Session::RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
+       for (Session::RouteList::iterator i = copy.begin(); i != copy.end(); ++i) {
                add_strip (*i);
        }
 
@@ -666,7 +671,7 @@ Mixer_UI::track_display_button_press (GdkEventButton* ev)
                        MixerStrip* strip = (*iter)[track_columns.strip];
                        if (strip) {
 
-                               if (!strip->route().master() && !strip->route().control()) {
+                               if (!strip->route()->master() && !strip->route()->control()) {
                                        bool visible = (*iter)[track_columns.visible];
                                        (*iter)[track_columns.visible] = !visible;
                                }
@@ -711,7 +716,7 @@ Mixer_UI::strip_name_changed (void* src, MixerStrip* mx)
        
        for (i = rows.begin(); i != rows.end(); ++i) {
                if ((*i)[track_columns.strip] == mx) {
-                       (*i)[track_columns.text] = mx->route().name();
+                       (*i)[track_columns.text] = mx->route()->name();
                        return;
                }
        }