* MIDI control lanes: Set Interpolationtype according to Parameter
[ardour.git] / gtk2_ardour / audio_streamview.cc
index 08ac532319ffa6f65d9e160f9da35548b56fa9d7..85812b43d6d49ce90015b1f0cc21340932a8b6cf 100644 (file)
@@ -32,6 +32,7 @@
 #include <ardour/playlist_templates.h>
 #include <ardour/source.h>
 #include <ardour/region_factory.h>
+#include <ardour/profile.h>
 
 #include "audio_streamview.h"
 #include "audio_region_view.h"
@@ -61,18 +62,10 @@ AudioStreamView::AudioStreamView (AudioTimeAxisView& tv)
        crossfades_visible = true;
        _waveform_scale = LinearWaveform;
        _waveform_shape = Traditional;
-       
-       if (tv.is_track())
-               stream_base_color = ARDOUR_UI::config()->canvasvar_AudioTrackBase.get();
-       else
-               stream_base_color = ARDOUR_UI::config()->canvasvar_AudioBusBase.get();
-       
-       canvas_rect->property_fill_color_rgba() = stream_base_color;
-       canvas_rect->property_outline_color_rgba() = RGBA_BLACK;
-
+       color_handler ();
        _amplitude_above_axis = 1.0;
 
-       use_rec_regions = tv.editor.show_waveforms_recording ();
+       use_rec_regions = tv.editor().show_waveforms_recording ();
 }
 
 AudioStreamView::~AudioStreamView ()
@@ -112,7 +105,7 @@ AudioStreamView::set_amplitude_above_axis (gdouble app)
 }
 
 RegionView*
-AudioStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wait_for_waves)
+AudioStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wait_for_waves, bool recording)
 {
        AudioRegionView *region_view = 0;
 
@@ -142,8 +135,13 @@ AudioStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wai
 
        switch (_trackview.audio_track()->mode()) {
        case Normal:
-               region_view = new AudioRegionView (canvas_group, _trackview, region, 
-                                                  _samples_per_unit, region_color);
+               if (recording) {
+                       region_view = new AudioRegionView (canvas_group, _trackview, region, 
+                                                  _samples_per_unit, region_color, recording, TimeAxisViewItem::Visibility(TimeAxisViewItem::ShowFrame | TimeAxisViewItem::HideFrameRight));
+               } else {
+                       region_view = new AudioRegionView (canvas_group, _trackview, region, 
+                                                          _samples_per_unit, region_color);
+               }
                break;
        case Destructive:
                region_view = new TapeAudioRegionView (canvas_group, _trackview, region, 
@@ -157,9 +155,9 @@ AudioStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wai
 
        region_view->init (region_color, wait_for_waves);
        region_view->set_amplitude_above_axis(_amplitude_above_axis);
+       region_view->set_height (child_height ());
        region_views.push_front (region_view);
 
-       
        /* if its the special single-sample length that we use for rec-regions, make it 
           insensitive to events 
        */
@@ -191,7 +189,7 @@ AudioStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wai
        
        /* follow global waveform setting */
 
-       region_view->set_waveform_visible(_trackview.editor.show_waveforms());
+       region_view->set_waveform_visible(_trackview.editor().show_waveforms());
 
        /* catch regionview going away */
        region->GoingAway.connect (bind (mem_fun (*this, &AudioStreamView::remove_region_view), boost::weak_ptr<Region> (r)));
@@ -310,7 +308,7 @@ AudioStreamView::add_crossfade (boost::shared_ptr<Crossfade> crossfade)
        for (list<CrossfadeView *>::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
                if ((*i)->crossfade == crossfade) {
 
-                       if (!crossfades_visible || layer_display == Stacked) {
+                       if (!crossfades_visible || _layer_display == Stacked) {
                                (*i)->hide();
                        } else {
                                (*i)->show ();
@@ -333,7 +331,7 @@ AudioStreamView::add_crossfade (boost::shared_ptr<Crossfade> crossfade)
                }
        }
 
-       CrossfadeView *cv = new CrossfadeView (_trackview.canvas_display,
+       CrossfadeView *cv = new CrossfadeView (_trackview.canvas_display (),
                                               _trackview,
                                                crossfade,
                                               _samples_per_unit,
@@ -342,7 +340,7 @@ AudioStreamView::add_crossfade (boost::shared_ptr<Crossfade> crossfade)
        cv->set_valid (true);
        crossfade->Invalidated.connect (mem_fun (*this, &AudioStreamView::remove_crossfade));
        crossfade_views.push_back (cv);
-       if (!Config->get_xfades_visible() || !crossfades_visible || layer_display == Stacked) {
+       if (!Config->get_xfades_visible() || !crossfades_visible || _layer_display == Stacked) {
                cv->hide ();
        }
 }
@@ -375,7 +373,7 @@ AudioStreamView::redisplay_diskstream ()
 
        for (xi = crossfade_views.begin(); xi != crossfade_views.end(); ++xi) {
                (*xi)->set_valid (false);
-               if ((*xi)->visible() && layer_display != Stacked) {
+               if ((*xi)->visible() && _layer_display != Stacked) {
                        (*xi)->show ();
                }
        }
@@ -388,8 +386,9 @@ AudioStreamView::redisplay_diskstream ()
                        apl->foreach_crossfade (this, &AudioStreamView::add_crossfade);
        }
 
-       RegionViewList  copy;
+       RegionViewList copy;
 
+       /* Place regions */
        for (i = region_views.begin(); i != region_views.end(); ) {
                tmp = i;
                tmp++;
@@ -403,10 +402,8 @@ AudioStreamView::redisplay_diskstream ()
                        (*i)->enable_display(true);
                }
 
-               /* 
-                  sort regionviews by layer so that when we call region_layered ()
-                  the canvas layering works out (in non-stacked mode).
-               */
+               /* Sort regionviews by layer so that when we call region_layered ()
+                  the canvas layering works out (in non-stacked mode). */
 
                if (copy.size() == 0) {
                        copy.push_front((*i));
@@ -429,7 +426,6 @@ AudioStreamView::redisplay_diskstream ()
                }
 
                for (RegionViewList::iterator j = copy.begin(); j != copy.end(); ++j) {
-                 
                        if ((*j)->region()->layer() >= (*i)->region()->layer()) {
                                copy.insert(j, (*i));
                                break;
@@ -437,7 +433,6 @@ AudioStreamView::redisplay_diskstream ()
                }
 
                i = tmp;
-
        }
 
        for (xi = crossfade_views.begin(); xi != crossfade_views.end();) {
@@ -451,13 +446,11 @@ AudioStreamView::redisplay_diskstream ()
 
                xi = tmpx;
        }
-
-       /* now fix canvas layering */
        
-       for (RegionViewList::iterator j = copy.begin(); j != copy.end(); ++j) {
-                       (*j)->enable_display(true);
-                       (*j)->set_y_position_and_height(0, height);
-                       region_layered (*j);
+       /* now fix layering */
+
+       for (RegionViewList::iterator i = copy.begin(); i != copy.end(); ++i) {
+               region_layered (*i);
        }
 }
 
@@ -497,7 +490,7 @@ AudioStreamView::set_waveform_scale (WaveformScale scale)
 void
 AudioStreamView::setup_rec_box ()
 {
-       // cerr << _trackview.name() << " streamview SRB\n";
+       //cerr << _trackview.name() << " streamview SRB region_views.size() = " << region_views.size() << endl;
 
        if (_trackview.session().transport_rolling()) {
 
@@ -506,7 +499,6 @@ AudioStreamView::setup_rec_box ()
                if (!rec_active && 
                    _trackview.session().record_status() == Session::Recording && 
                    _trackview.get_diskstream()->record_enabled()) {
-
                        if (_trackview.audio_track()->mode() == Normal && use_rec_regions && rec_regions.size() == rec_rects.size()) {
 
                                /* add a new region, but don't bother if they set use_rec_regions mid-record */
@@ -543,7 +535,6 @@ AudioStreamView::setup_rec_box ()
                                                                       (RegionFactory::create (sources, start, 1 , "", 0, (Region::Flag)(Region::DefaultFlags | Region::DoNotSaveState), false)));
                                assert(region);
                                region->set_position (_trackview.session().transport_frame(), this);
-
                                rec_regions.push_back (make_pair(region, (RegionView*)0));
                        }
                        
@@ -554,7 +545,7 @@ AudioStreamView::setup_rec_box ()
                        at = _trackview.audio_track(); /* we know what it is already */
                        boost::shared_ptr<AudioDiskstream> ds = at->audio_diskstream();
                        nframes_t frame_pos = ds->current_capture_start ();
-                       gdouble xstart = _trackview.editor.frame_to_pixel (frame_pos);
+                       gdouble xstart = _trackview.editor().frame_to_pixel (frame_pos);
                        gdouble xend;
                        uint32_t fill_color;
 
@@ -578,8 +569,9 @@ AudioStreamView::setup_rec_box ()
                        rec_rect->property_x1() = xstart;
                        rec_rect->property_y1() = 1.0;
                        rec_rect->property_x2() = xend;
-                       rec_rect->property_y2() = (double) _trackview.height - 1;
-                       rec_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_RecordingRect.get();
+                       rec_rect->property_y2() = child_height ();
+                       rec_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_TimeAxisFrame.get();
+                       rec_rect->property_outline_what() = 0x1 | 0x2 | 0x4 | 0x8;
                        rec_rect->property_fill_color_rgba() = fill_color;
                        rec_rect->lower_to_bottom();
                        
@@ -598,11 +590,9 @@ AudioStreamView::setup_rec_box ()
                } else if (rec_active &&
                           (_trackview.session().record_status() != Session::Recording ||
                            !_trackview.get_diskstream()->record_enabled())) {
-
                        screen_update_connection.disconnect();
                        rec_active = false;
                        rec_updating = false;
-
                }
                
        } else {
@@ -688,7 +678,6 @@ void
 AudioStreamView::update_rec_regions ()
 {
        if (use_rec_regions) {
-
                uint32_t n = 0;
 
                for (list<pair<boost::shared_ptr<Region>,RegionView*> >::iterator iter = rec_regions.begin(); iter != rec_regions.end(); n++) {
@@ -726,12 +715,12 @@ AudioStreamView::update_rec_regions ()
 
                                                if (origlen == 1) {
                                                        /* our special initial length */
-                                                       add_region_view_internal (region, false);
+                                                       add_region_view_internal (region, false, true);
                                                }
 
                                                /* also update rect */
                                                ArdourCanvas::SimpleRect * rect = rec_rects[n].rectangle;
-                                               gdouble xend = _trackview.editor.frame_to_pixel (region->position() + region->length());
+                                               gdouble xend = _trackview.editor().frame_to_pixel (region->position() + region->length());
                                                rect->property_x2() = xend;
                                        }
                                }
@@ -751,7 +740,7 @@ AudioStreamView::update_rec_regions ()
                                                
                                                if (origlen == 1) {
                                                        /* our special initial length */
-                                                       add_region_view_internal (region, false);
+                                                       add_region_view_internal (region, false, true);
                                                }
                                                
                                                /* also hide rect */
@@ -767,6 +756,28 @@ AudioStreamView::update_rec_regions ()
        }
 }
 
+void
+AudioStreamView::show_all_fades ()
+{
+       for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
+               AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
+               if (arv) {
+                       arv->set_fade_visibility (true);
+               }
+       }
+}
+
+void
+AudioStreamView::hide_all_fades ()
+{
+       for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
+               AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
+               if (arv) {
+                       arv->set_fade_visibility (false);
+               }
+       }
+}
+
 void
 AudioStreamView::show_all_xfades ()
 {
@@ -795,7 +806,7 @@ void
 AudioStreamView::reveal_xfades_involving (AudioRegionView& rv)
 {
        for (list<CrossfadeView *>::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
-               if ((*i)->crossfade->involves (rv.audio_region()) && (*i)->visible() && layer_display != Stacked) {
+               if ((*i)->crossfade->involves (rv.audio_region()) && (*i)->visible() && _layer_display != Stacked) {
                        (*i)->show ();
                }
        }
@@ -811,20 +822,23 @@ AudioStreamView::color_handler ()
 
        //case cAudioBusBase:
        if (!_trackview.is_track()) {
-               canvas_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_AudioBusBase.get();
+               if (Profile->get_sae() && _trackview.route()->is_master()) {
+                       canvas_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_AudioMasterBusBase.get();
+               } else {
+                       canvas_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_AudioBusBase.get();
+               }
        }
-
 }
 
 void
-AudioStreamView::update_contents_y_position_and_height ()
+AudioStreamView::update_contents_height ()
 {
-       StreamView::update_contents_y_position_and_height ();
+       StreamView::update_contents_height ();
        
        for (CrossfadeViewList::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
-               if (layer_display == Overlaid) {
+               if (_layer_display == Overlaid) {
                        (*i)->show ();
-                       (*i)->set_y_position_and_height (0, height);
+                       (*i)->set_height (height);
                } else {
                        (*i)->hide ();
                }