Remove random access interface from MidiBuffer, towards killing fixed/limited event...
[ardour.git] / gtk2_ardour / audio_time_axis.cc
index 284d96b217ee9b3e9e87f46be1e9efbadfb0cd6d..437e0378368a983be49e6385481f9b8529f7e6f5 100644 (file)
 
 #include "ardour_ui.h"
 #include "audio_time_axis.h"
-#include "automation_gain_line.h"
-#include "automation_pan_line.h"
+#include "automation_line.h"
 #include "canvas_impl.h"
 #include "crossfade_view.h"
 #include "enums.h"
-#include "gain_automation_time_axis.h"
+#include "automation_time_axis.h"
 #include "keyboard.h"
-#include "pan_automation_time_axis.h"
 #include "playlist_selector.h"
 #include "prompter.h"
 #include "public_editor.h"
@@ -87,8 +85,7 @@ AudioTimeAxisView::AudioTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
 
        _view = new AudioStreamView (*this);
 
-       create_automation_child (GainAutomation);
-       create_automation_child (PanAutomation);
+       create_automation_child (GainAutomation, false);
 
        ignore_toggle = false;
 
@@ -109,7 +106,7 @@ AudioTimeAxisView::AudioTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
 
        set_state (*xml_node);
        
-       _route->panner().Changed.connect (mem_fun(*this, &AudioTimeAxisView::update_pans));
+       _route->panner().Changed.connect (bind (mem_fun(*this, &AudioTimeAxisView::update_pans), false));
 
        update_control_names ();
 
@@ -209,17 +206,35 @@ AudioTimeAxisView::append_extra_display_menu_items ()
 
        items.push_back (MenuElem (_("Waveform"), *waveform_menu));
 
-
-       Menu *layers_menu = manage(new Menu);
-       MenuList &layers_items = layers_menu->items();
-       layers_menu->set_name("ArdourContextMenu");
-
-       RadioMenuItem::Group layers_group;
+}
        
-       layers_items.push_back(RadioMenuElem (layers_group, _("Overlaid"), bind (mem_fun (*this, &AudioTimeAxisView::set_layer_display), Overlaid)));
-       layers_items.push_back(RadioMenuElem (layers_group, _("Stacked"), bind (mem_fun (*this, &AudioTimeAxisView::set_layer_display), Stacked)));
+Gtk::Menu*
+AudioTimeAxisView::build_mode_menu()
+{
+       using namespace Menu_Helpers;
+
+       Menu* mode_menu = manage (new Menu);
+       MenuList& items = mode_menu->items();
+       mode_menu->set_name ("ArdourContextMenu");
+
+       RadioMenuItem::Group mode_group;
+       items.push_back (RadioMenuElem (mode_group, _("Normal"),
+                               bind (mem_fun (*this, &AudioTimeAxisView::set_track_mode), ARDOUR::Normal)));
+       normal_track_mode_item = dynamic_cast<RadioMenuItem*>(&items.back());
+       items.push_back (RadioMenuElem (mode_group, _("Tape"),
+                               bind (mem_fun (*this, &AudioTimeAxisView::set_track_mode), ARDOUR::Destructive)));
+       destructive_track_mode_item = dynamic_cast<RadioMenuItem*>(&items.back());
+
+       switch (track()->mode()) {
+               case ARDOUR::Destructive:
+                       destructive_track_mode_item->set_active ();
+                       break;
+               case ARDOUR::Normal:
+                       normal_track_mode_item->set_active ();
+                       break;
+       }
 
-       items.push_back (MenuElem (_("Layers"), *layers_menu));
+       return mode_menu;
 }
 
 void
@@ -281,7 +296,7 @@ AudioTimeAxisView::set_waveform_scale (WaveformScale scale)
 }      
 
 void
-AudioTimeAxisView::create_automation_child (ParamID param)
+AudioTimeAxisView::create_automation_child (Parameter param, bool show)
 {
        if (param.type() == GainAutomation) {
 
@@ -291,39 +306,19 @@ AudioTimeAxisView::create_automation_child (ParamID param)
                        return;
                }
 
-               GainAutomationTimeAxisView* gain_track = new GainAutomationTimeAxisView (_session,
-                               _route,
+               boost::shared_ptr<AutomationTimeAxisView> gain_track(new AutomationTimeAxisView (_session,
+                               _route, _route, c,
                                editor,
                                *this,
                                parent_canvas,
-                               _route->describe_parameter(param),
-                               c);
-
-               AutomationLine* line = new AutomationGainLine ("automation gain",
-                               *gain_track,
-                               *gain_track->canvas_display,
-                               c->list());
+                               _route->describe_parameter(param)));
 
-               line->set_line_color (ARDOUR_UI::config()->canvasvar_AutomationLine.get());
-
-               gain_track->add_line (*line);
-
-               add_automation_child(ParamID(GainAutomation), gain_track);
+               add_automation_child(Parameter(GainAutomation), gain_track, show);
 
        } else if (param.type() == PanAutomation) {
-               
-               PanAutomationTimeAxisView* pan_track = new PanAutomationTimeAxisView (_session,
-                                _route,
-                                editor,
-                                *this,
-                                parent_canvas,
-                               _route->describe_parameter(param));
 
                ensure_xml_node ();
-
-               add_automation_child(ParamID(PanAutomation), pan_track);
-               
-               update_pans ();
+               update_pans (show);
 
        } else {
                error << "AudioTimeAxisView: unknown automation child " << param.to_string() << endmsg;
@@ -331,44 +326,27 @@ AudioTimeAxisView::create_automation_child (ParamID param)
 }
 
 void
-AudioTimeAxisView::update_pans ()
+AudioTimeAxisView::update_pans (bool show)
 {
        Panner::iterator p;
-       
-       RouteAutomationNode* ran = automation_track(PanAutomation);
-       if (!ran) {
-               warning << _route << " has no pan automation track" << endmsg;
-               return;
-       }
-
-       AutomationTimeAxisView* pan_track = ran->track;
-       
-       pan_track->clear_lines ();
-       
-       /* we don't draw lines for "greater than stereo" panning.
-        */
-
-       if (_route->n_outputs().n_audio() > 2) {
-               return;
-       }
 
+       uint32_t i = 0;
        for (p = _route->panner().begin(); p != _route->panner().end(); ++p) {
-
-               AutomationLine* line;
-
-               line = new AutomationPanLine ("automation pan", *pan_track,
-                                             *pan_track->canvas_display, 
-                                             (*p)->automation());
-
-               if (p == _route->panner().begin()) {
-                       /* first line is a nice orange */
-                       line->set_line_color (ARDOUR_UI::config()->canvasvar_AutomationLine.get());
-               } else {
-                       /* second line is a nice blue */
-                       line->set_line_color (ARDOUR_UI::config()->canvasvar_AutomationLine.get());
+               boost::shared_ptr<AutomationControl> pan_control = (*p)->pan_control();
+               
+               if (pan_control->parameter().type() == NullAutomation) {
+                       error << "Pan control has NULL automation type!" << endmsg;
+                       continue;
                }
 
-               pan_track->add_line (*line);
+               boost::shared_ptr<AutomationTimeAxisView> pan_track(new AutomationTimeAxisView (_session,
+                                       _route, _route/*FIXME*/, pan_control, 
+                                       editor,
+                                       *this,
+                                       parent_canvas,
+                                       _route->describe_parameter(pan_control->parameter())));
+               add_automation_child(Parameter(PanAutomation, i), pan_track, show);
+               ++i;
        }
 }
                
@@ -498,11 +476,3 @@ AudioTimeAxisView::update_control_names ()
        }
 }
 
-void
-AudioTimeAxisView::set_layer_display (LayerDisplay d)
-{
-       AudioStreamView* asv = audio_view ();
-       if (asv) {
-               asv->set_layer_display (d);
-       }
-}