minor fixes/changes based on comparison with existing bindings
[ardour.git] / gtk2_ardour / audio_region_view.cc
index 5873a71ccef7f8a8d54eea69e959f85879ea296c..d4e846aec50174c6a8f5e9a637159ce8ce4bb2cc 100644 (file)
 
 #include <gtkmm2ext/gtk_ui.h>
 
-#include <ardour/playlist.h>
-#include <ardour/audioregion.h>
-#include <ardour/audiosource.h>
-#include <ardour/audio_diskstream.h>
-#include <ardour/profile.h>
+#include "ardour/playlist.h"
+#include "ardour/audioregion.h"
+#include "ardour/audiosource.h"
+#include "ardour/audio_diskstream.h"
+#include "ardour/profile.h"
 
-#include <pbd/memento_command.h>
-#include <pbd/stacktrace.h>
+#include "pbd/memento_command.h"
+#include "pbd/stacktrace.h"
+
+#include "evoral/Curve.hpp"
 
 #include "streamview.h"
 #include "audio_region_view.h"
@@ -54,6 +56,7 @@
 
 #define MUTED_ALPHA 10
 
+using namespace std;
 using namespace sigc;
 using namespace ARDOUR;
 using namespace PBD;
@@ -63,7 +66,7 @@ using namespace ArdourCanvas;
 static const int32_t sync_mark_width = 9;
 
 AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &tv, boost::shared_ptr<AudioRegion> r, double spu,
-                                 Gdk::Color& basic_color)
+                                 Gdk::Color const & basic_color)
        : RegionView (parent, tv, r, spu, basic_color)
        , sync_mark(0)
        , zero_line(0)
@@ -78,9 +81,10 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView
 {
 }
 
+
 AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &tv, boost::shared_ptr<AudioRegion> r, double spu, 
-                                 Gdk::Color& basic_color, TimeAxisViewItem::Visibility visibility)
-       : RegionView (parent, tv, r, spu, basic_color, visibility)
+                                 Gdk::Color const & basic_color, bool recording, TimeAxisViewItem::Visibility visibility)
+       : RegionView (parent, tv, r, spu, basic_color, recording, visibility)
        , sync_mark(0)
        , zero_line(0)
        , fade_in_shape(0)
@@ -96,7 +100,8 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView
 
 
 AudioRegionView::AudioRegionView (const AudioRegionView& other)
-       : RegionView (other)
+       : sigc::trackable(other)
+       , RegionView (other)
        , zero_line(0)
        , fade_in_shape(0)
        , fade_out_shape(0)
@@ -117,13 +122,35 @@ AudioRegionView::AudioRegionView (const AudioRegionView& other)
        init (c, false);
 }
 
+AudioRegionView::AudioRegionView (const AudioRegionView& other, boost::shared_ptr<AudioRegion> other_region)
+       : RegionView (other, boost::shared_ptr<Region> (other_region))
+       , zero_line(0)
+       , fade_in_shape(0)
+       , fade_out_shape(0)
+       , fade_in_handle(0)
+       , fade_out_handle(0)
+       , gain_line(0)
+       , _amplitude_above_axis(1.0)
+       , _flags(0)
+       , fade_color(0)
+
+{
+       Gdk::Color c;
+       int r,g,b,a;
+
+       UINT_TO_RGBA (other.fill_color, &r, &g, &b, &a);
+       c.set_rgb_p (r/255.0, g/255.0, b/255.0);
+
+       init (c, true);
+}
+
 void
-AudioRegionView::init (Gdk::Color& basic_color, bool wfd)
+AudioRegionView::init (Gdk::Color const & basic_color, bool wfd)
 {
        // FIXME: Some redundancy here with RegionView::init.  Need to figure out
        // where order is important and where it isn't...
        
-       RegionView::init(basic_color, false);
+       RegionView::init (basic_color, wfd);
        
        XMLNode *node;
 
@@ -138,12 +165,12 @@ AudioRegionView::init (Gdk::Color& basic_color, bool wfd)
                store_flags ();
        }
 
-       if (trackview.editor.new_regionviews_display_gain()) {
+       if (trackview.editor().new_regionviews_display_gain()) {
                _flags |= EnvelopeVisible;
        }
 
        compute_colors (basic_color);
-
+       
        create_waves ();
 
        fade_in_shape = new ArdourCanvas::Polygon (*group);
@@ -154,12 +181,10 @@ AudioRegionView::init (Gdk::Color& basic_color, bool wfd)
        fade_out_shape->property_fill_color_rgba() = fade_color;
        fade_out_shape->set_data ("regionview", this);
 
-
        {
                uint32_t r,g,b,a;
                UINT_TO_RGBA(fill_color,&r,&g,&b,&a);
        
-
                fade_in_handle = new ArdourCanvas::SimpleRect (*group);
                fade_in_handle->property_fill_color_rgba() = RGBA_TO_UINT(r,g,b,0);
                fade_in_handle->property_outline_pixels() = 0;
@@ -175,12 +200,15 @@ AudioRegionView::init (Gdk::Color& basic_color, bool wfd)
 
        setup_fade_handle_positions ();
 
-       string line_name = _region->name();
-       line_name += ':';
-       line_name += "gain";
+       if (!trackview.session().config.get_show_region_fades()) {
+               set_fade_visibility (false);
+       }
+
+       const string line_name = _region->name() + ":gain";
 
        if (!Profile->get_sae()) {
-               gain_line = new AudioRegionGainLine (line_name, trackview.session(), *this, *group, audio_region()->envelope());
+               gain_line = new AudioRegionGainLine (line_name, trackview.session(), *this, *group,
+                               audio_region()->envelope());
        }
 
        if (!(_flags & EnvelopeVisible)) {
@@ -191,7 +219,7 @@ AudioRegionView::init (Gdk::Color& basic_color, bool wfd)
 
        gain_line->reset ();
 
-       set_y_position_and_height (0, trackview.height);
+       set_height (trackview.current_height());
 
        region_muted ();
        region_sync_changed ();
@@ -226,9 +254,7 @@ AudioRegionView::~AudioRegionView ()
 
        /* all waveviews etc will be destroyed when the group is destroyed */
 
-       if (gain_line) {
-               delete gain_line;
-       }
+       delete gain_line;
 }
 
 boost::shared_ptr<ARDOUR::AudioRegion>
@@ -242,6 +268,7 @@ void
 AudioRegionView::region_changed (Change what_changed)
 {
        ENSURE_GUI_THREAD (bind (mem_fun(*this, &AudioRegionView::region_changed), what_changed));
+       //cerr << "AudioRegionView::region_changed() called" << endl;
 
        RegionView::region_changed(what_changed);
 
@@ -348,6 +375,8 @@ AudioRegionView::region_renamed ()
 void
 AudioRegionView::region_resized (Change what_changed)
 {
+       AudioGhostRegion* agr;
+
        RegionView::region_resized(what_changed);
 
        if (what_changed & Change (StartChanged|LengthChanged)) {
@@ -357,10 +386,12 @@ AudioRegionView::region_resized (Change what_changed)
                }
                
                for (vector<GhostRegion*>::iterator i = ghosts.begin(); i != ghosts.end(); ++i) {
+                       if((agr = dynamic_cast<AudioGhostRegion*>(*i)) != 0) {
 
-                       for (vector<WaveView*>::iterator w = (*i)->waves.begin(); w != (*i)->waves.end(); ++w) {
-                               (*w)->property_region_start() = _region->start();
-                       }
+                               for (vector<WaveView*>::iterator w = agr->waves.begin(); w != agr->waves.end(); ++w) {
+                                       (*w)->property_region_start() = _region->start();
+                               }
+                       }
                }
        }
 }
@@ -384,8 +415,10 @@ AudioRegionView::reset_width_dependent_items (double pixel_width)
                                fade_in_handle->hide();
                                fade_out_handle->hide();
                        } else {
-                               fade_in_handle->show();
-                               fade_out_handle->show();
+                               if (trackview.session().config.get_show_region_fades()) {
+                                       fade_in_handle->show();
+                                       fade_out_handle->show();
+                               }
                        }
                }
        }
@@ -408,68 +441,69 @@ AudioRegionView::region_muted ()
 }
 
 void
-AudioRegionView::set_y_position_and_height (double y, double h)
+AudioRegionView::setup_fade_handle_positions()
 {
-       //RegionView::set_y_position_and_height(y, h - 1);
-       RegionView::set_height (h);
+       /* position of fade handle offset from the top of the region view */
+       double const handle_pos = 2;
+       /* height of fade handles */
+       double const handle_height = 5;
+
+       if (fade_in_handle) {
+               fade_in_handle->property_y1() = handle_pos;
+               fade_in_handle->property_y2() = handle_pos + handle_height;
+       }
        
-       const uint32_t wcnt = waves.size();
+       if (fade_out_handle) {
+               fade_out_handle->property_y1() = handle_pos;
+               fade_out_handle->property_y2() = handle_pos + handle_height;
+       }
+}
+
+void
+AudioRegionView::set_height (gdouble height)
+{
+       RegionView::set_height (height);
 
-       _y_position = y;
-       _height = h;
+       uint32_t wcnt = waves.size();
 
-       for (uint32_t n = 0; n < wcnt; ++n) {
-               double ht;
+       // FIXME: ick
+       height -= 2;
+       
+       _height = height;
+
+       for (uint32_t n=0; n < wcnt; ++n) {
+               gdouble ht;
 
-               if (h <= NAME_HIGHLIGHT_THRESH) {
-                       ht = ((_height - 2 * wcnt) / (double) wcnt);
+               if ((height) < NAME_HIGHLIGHT_THRESH) {
+                       ht = ((height-2*wcnt) / (double) wcnt);
                } else {
-                       ht = (((_height - 2 * wcnt) - NAME_HIGHLIGHT_SIZE) / (double) wcnt);
+                       ht = (((height-2*wcnt) - NAME_HIGHLIGHT_SIZE) / (double) wcnt);
                }
                
-               double const yoff = n * (ht + 1);
+               gdouble yoff = n * (ht+1);
                
                waves[n]->property_height() = ht;
-               waves[n]->property_y() = _y_position + yoff + 2;
+               waves[n]->property_y() = yoff + 2;
        }
 
        if (gain_line) {
-               if ((_height / wcnt) < NAME_HIGHLIGHT_SIZE) {
+               if ((height/wcnt) < NAME_HIGHLIGHT_THRESH) {
                        gain_line->hide ();
                } else {
                        if (_flags & EnvelopeVisible) {
                                gain_line->show ();
                        }
                }
-               gain_line->set_y_position_and_height ((uint32_t) _y_position, (uint32_t) rint (_height - NAME_HIGHLIGHT_SIZE));
+               gain_line->set_height ((uint32_t) rint (height - NAME_HIGHLIGHT_SIZE));
        }
 
-       setup_fade_handle_positions ();
        manage_zero_line ();
        reset_fade_shapes ();
-       
-       if (name_text) {
-               name_text->raise_to_top();
-       }
-}
 
-void
-AudioRegionView::setup_fade_handle_positions()
-{
-       /* position of fade handle offset from the top of the region view */
-       double const handle_pos = 2;
-       /* height of fade handles */
-       double const handle_height = 5;
-
-       if (fade_in_handle) {
-               fade_in_handle->property_y1() = _y_position + handle_pos;
-               fade_in_handle->property_y2() = _y_position + handle_pos + handle_height;
-       }
-       
-       if (fade_out_handle) {
-               fade_out_handle->property_y1() = _y_position + handle_pos;
-               fade_out_handle->property_y2() = _y_position + handle_pos + handle_height;
+       if (name_pixbuf) {
+               name_pixbuf->raise_to_top();
        }
+
 }
 
 void
@@ -480,7 +514,7 @@ AudioRegionView::manage_zero_line ()
        }
 
        if (_height >= 100) {
-               double const wave_midpoint = _y_position + (_height - NAME_HIGHLIGHT_SIZE) / 2.0;
+               double const wave_midpoint = (_height - NAME_HIGHLIGHT_SIZE) / 2.0;
                zero_line->property_y1() = wave_midpoint;
                zero_line->property_y2() = wave_midpoint;
                zero_line->show();
@@ -541,14 +575,16 @@ AudioRegionView::reset_fade_in_shape_width (nframes_t width)
                return;
        }
 
-       fade_in_shape->show();
+       if (trackview.session().config.get_show_region_fades()) {
+               fade_in_shape->show();
+       }
 
        float curve[npoints];
        audio_region()->fade_in()->curve().get_vector (0, audio_region()->fade_in()->back()->when, curve, npoints);
 
        points = get_canvas_points ("fade in shape", npoints+3);
 
-       if (_height > NAME_HIGHLIGHT_THRESH) {
+       if (_height >= NAME_HIGHLIGHT_THRESH) {
                h = _height - NAME_HIGHLIGHT_SIZE;
        } else {
                h = _height;
@@ -561,16 +597,16 @@ AudioRegionView::reset_fade_in_shape_width (nframes_t width)
 
        for (pi = 0, pc = 0; pc < npoints; ++pc) {
                (*points)[pi].set_x(1 + (pc * xdelta));
-               (*points)[pi++].set_y(_y_position + 2 + (h - (curve[pc] * h)));
+               (*points)[pi++].set_y(2 + (h - (curve[pc] * h)));
        }
        
        /* fold back */
 
        (*points)[pi].set_x(pwidth);
-       (*points)[pi++].set_y(_y_position + 2);
+       (*points)[pi++].set_y(2);
 
        (*points)[pi].set_x(1);
-       (*points)[pi++].set_y(_y_position + 2);
+       (*points)[pi++].set_y(2);
 
        /* connect the dots ... */
 
@@ -578,6 +614,9 @@ AudioRegionView::reset_fade_in_shape_width (nframes_t width)
        
        fade_in_shape->property_points() = *points;
        delete points;
+       
+       /* ensure trim handle stays on top */
+       frame_handle_start->raise_to_top();
 }
 
 void
@@ -627,12 +666,14 @@ AudioRegionView::reset_fade_out_shape_width (nframes_t width)
                return;
        } 
        
-       fade_out_shape->show();
+       if (trackview.session().config.get_show_region_fades()) {
+               fade_out_shape->show();
+       }
 
        float curve[npoints];
        audio_region()->fade_out()->curve().get_vector (0, audio_region()->fade_out()->back()->when, curve, npoints);
 
-       if (_height > NAME_HIGHLIGHT_THRESH) {
+       if (_height >= NAME_HIGHLIGHT_THRESH) {
                h = _height - NAME_HIGHLIGHT_SIZE;
        } else {
                h = _height;
@@ -647,16 +688,16 @@ AudioRegionView::reset_fade_out_shape_width (nframes_t width)
 
        for (pi = 0, pc = 0; pc < npoints; ++pc) {
                (*points)[pi].set_x(_pixel_width - 1 - pwidth + (pc*xdelta));
-               (*points)[pi++].set_y(_y_position + 2 + (h - (curve[pc] * h)));
+               (*points)[pi++].set_y(2 + (h - (curve[pc] * h)));
        }
        
        /* fold back */
 
        (*points)[pi].set_x(_pixel_width);
-       (*points)[pi++].set_y(_y_position + h);
+       (*points)[pi++].set_y(h);
 
        (*points)[pi].set_x(_pixel_width);
-       (*points)[pi++].set_y(_y_position + 2);
+       (*points)[pi++].set_y(2);
 
        /* connect the dots ... */
 
@@ -664,6 +705,9 @@ AudioRegionView::reset_fade_out_shape_width (nframes_t width)
 
        fade_out_shape->property_points() = *points;
        delete points;
+       
+       /* ensure trim handle stays on top */
+       frame_handle_end->raise_to_top();
 }
 
 void
@@ -693,9 +737,9 @@ AudioRegionView::set_amplitude_above_axis (gdouble spp)
 }
 
 void
-AudioRegionView::compute_colors (Gdk::Color& basic_color)
+AudioRegionView::compute_colors (Gdk::Color const & basic_color)
 {
-       RegionView::compute_colors(basic_color);
+       RegionView::compute_colors (basic_color);
        
        uint32_t r, g, b, a;
 
@@ -797,20 +841,24 @@ AudioRegionView::set_envelope_visible (bool yn)
 void
 AudioRegionView::create_waves ()
 {
+       // cerr << "AudioRegionView::create_waves() called on " << this << endl;//DEBUG
        RouteTimeAxisView& atv (*(dynamic_cast<RouteTimeAxisView*>(&trackview))); // ick
 
        if (!atv.get_diskstream()) {
                return;
        }
 
-       uint32_t nchans = atv.get_diskstream()->n_channels().n_audio();
+       ChanCount nchans = atv.get_diskstream()->n_channels();
+
+       // cerr << "creating waves for " << _region->name() << " with wfd = " << wait_for_data
+       //              << " and channels = " << nchans.n_audio() << endl;
        
        /* in tmp_waves, set up null pointers for each channel so the vector is allocated */
-       for (uint32_t n = 0; n < nchans; ++n) {
+       for (uint32_t n = 0; n < nchans.n_audio(); ++n) {
                tmp_waves.push_back (0);
        }
 
-       for (uint32_t n = 0; n < nchans; ++n) {
+       for (uint32_t n = 0; n < nchans.n_audio(); ++n) {
                
                if (n >= audio_region()->n_channels()) {
                        break;
@@ -818,32 +866,40 @@ AudioRegionView::create_waves ()
                
                wave_caches.push_back (WaveView::create_cache ());
 
+               // cerr << "\tchannel " << n << endl;
+
                if (wait_for_data) {
                        if (audio_region()->audio_source(n)->peaks_ready (bind (mem_fun(*this, &AudioRegionView::peaks_ready_handler), n), data_ready_connection)) {
+                               // cerr << "\tData is ready\n";
                                create_one_wave (n, true);
                        } else {
+                               // cerr << "\tdata is not ready\n";
                                // we'll get a PeaksReady signal from the source in the future
                                // and will call create_one_wave(n) then.
                        }
+                       
                } else {
+                       // cerr << "\tdon't delay, display today!\n";
                        create_one_wave (n, true);
                }
+
        }
 }
 
 void
-AudioRegionView::create_one_wave (uint32_t which, bool direct)
+AudioRegionView::create_one_wave (uint32_t which, bool /*direct*/)
 {
+       //cerr << "AudioRegionView::create_one_wave() called which: " << which << " this: " << this << endl;//DEBUG
        RouteTimeAxisView& atv (*(dynamic_cast<RouteTimeAxisView*>(&trackview))); // ick
        uint32_t nchans = atv.get_diskstream()->n_channels().n_audio();
        uint32_t n;
        uint32_t nwaves = std::min (nchans, audio_region()->n_channels());
        gdouble ht;
 
-       if (trackview.height < NAME_HIGHLIGHT_SIZE) {
-               ht = ((trackview.height) / (double) nchans);
+       if (trackview.current_height() < NAME_HIGHLIGHT_THRESH) {
+               ht = ((trackview.current_height()) / (double) nchans);
        } else {
-               ht = ((trackview.height - NAME_HIGHLIGHT_SIZE) / (double) nchans);
+               ht = ((trackview.current_height() - NAME_HIGHLIGHT_SIZE) / (double) nchans);
        }
 
        gdouble yoff = which * ht;
@@ -862,7 +918,15 @@ AudioRegionView::create_one_wave (uint32_t which, bool direct)
        wave->property_height() =  (double) ht;
        wave->property_samples_per_unit() =  samples_per_unit;
        wave->property_amplitude_above_axis() =  _amplitude_above_axis;
-       wave->property_wave_color() = _region->muted() ? UINT_RGBA_CHANGE_A(ARDOUR_UI::config()->canvasvar_WaveForm.get(), MUTED_ALPHA) : ARDOUR_UI::config()->canvasvar_WaveForm.get();
+
+       if (_recregion) {
+               wave->property_wave_color() = _region->muted() ? UINT_RGBA_CHANGE_A(ARDOUR_UI::config()->canvasvar_RecWaveForm.get(), MUTED_ALPHA) : ARDOUR_UI::config()->canvasvar_RecWaveForm.get();
+               wave->property_fill_color() = ARDOUR_UI::config()->canvasvar_RecWaveFormFill.get();
+       } else {
+               wave->property_wave_color() = _region->muted() ? UINT_RGBA_CHANGE_A(ARDOUR_UI::config()->canvasvar_WaveForm.get(), MUTED_ALPHA) : ARDOUR_UI::config()->canvasvar_WaveForm.get();
+               wave->property_fill_color() = ARDOUR_UI::config()->canvasvar_WaveFormFill.get();
+       }
+
        wave->property_clip_color() = ARDOUR_UI::config()->canvasvar_WaveFormClip.get();
        wave->property_zero_color() = ARDOUR_UI::config()->canvasvar_ZeroLine.get();
        wave->property_region_start() = _region->start();
@@ -903,7 +967,7 @@ AudioRegionView::create_one_wave (uint32_t which, bool direct)
                /* all waves created, don't hook into peaks ready anymore */
                data_ready_connection.disconnect ();            
 
-               if(0)
+#if 0
                if (!zero_line) {
                        zero_line = new ArdourCanvas::SimpleLine (*group);
                        zero_line->property_x1() = (gdouble) 1.0;
@@ -911,6 +975,7 @@ AudioRegionView::create_one_wave (uint32_t which, bool direct)
                        zero_line->property_color_rgba() = (guint) ARDOUR_UI::config()->canvasvar_ZeroLine.get();
                        manage_zero_line ();
                }
+#endif
        }
 }
 
@@ -918,6 +983,7 @@ void
 AudioRegionView::peaks_ready_handler (uint32_t which)
 {
        Gtkmm2ext::UI::instance()->call_slot (bind (mem_fun(*this, &AudioRegionView::create_one_wave), which, false));
+       // cerr << "AudioRegionView::peaks_ready_handler() called on " << which << " this: " << this << endl;
 }
 
 void
@@ -938,7 +1004,7 @@ AudioRegionView::add_gain_point_event (ArdourCanvas::Item *item, GdkEvent *ev)
 
        item->w2i (x, y);
 
-       nframes_t fx = trackview.editor.pixel_to_frame (x);
+       nframes_t fx = trackview.editor().pixel_to_frame (x);
 
        if (fx > _region->length()) {
                return;
@@ -946,11 +1012,11 @@ AudioRegionView::add_gain_point_event (ArdourCanvas::Item *item, GdkEvent *ev)
 
        /* compute vertical fractional position */
 
-       y = 1.0 - ((y - _y_position) / (_height - NAME_HIGHLIGHT_SIZE));
-       
+       y = 1.0 - (y / (_height - NAME_HIGHLIGHT_SIZE));
+
        /* map using gain line */
 
-       gain_line->view_to_model_y (y);
+       gain_line->view_to_model_coord (x, y);
 
        trackview.session().begin_reversible_command (_("add gain control point"));
        XMLNode &before = audio_region()->envelope()->get_state();
@@ -970,7 +1036,7 @@ AudioRegionView::add_gain_point_event (ArdourCanvas::Item *item, GdkEvent *ev)
 }
 
 void
-AudioRegionView::remove_gain_point_event (ArdourCanvas::Item *item, GdkEvent *ev)
+AudioRegionView::remove_gain_point_event (ArdourCanvas::Item *item, GdkEvent */*ev*/)
 {
        ControlPoint *cp = reinterpret_cast<ControlPoint *> (item->get_data ("control_point"));
        audio_region()->envelope()->erase (cp->model());
@@ -1063,7 +1129,7 @@ AudioRegionView::set_waveform_shape (WaveformShape shape)
 void
 AudioRegionView::set_waveform_scale (WaveformScale scale)
 {
-       bool yn = (scale == LogWaveform);
+       bool yn = (scale == Logarithmic);
 
        if (yn != (bool) (_flags & WaveformLogScaled)) {
                for (vector<WaveView *>::iterator wave = waves.begin(); wave != waves.end() ; ++wave) {
@@ -1081,13 +1147,13 @@ AudioRegionView::set_waveform_scale (WaveformScale scale)
 
 
 GhostRegion*
-AudioRegionView::add_ghost (AutomationTimeAxisView& atv)
+AudioRegionView::add_ghost (TimeAxisView& tv)
 {
        RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*>(&trackview);
        assert(rtv);
 
        double unit_position = _region->position () / samples_per_unit;
-       GhostRegion* ghost = new GhostRegion (atv, unit_position);
+       AudioGhostRegion* ghost = new AudioGhostRegion (tv, trackview, unit_position);
        uint32_t nchans;
        
        nchans = rtv->get_diskstream()->n_channels().n_audio();
@@ -1110,9 +1176,7 @@ AudioRegionView::add_ghost (AutomationTimeAxisView& atv)
                wave->property_x() =  0.0;
                wave->property_samples_per_unit() =  samples_per_unit;
                wave->property_amplitude_above_axis() =  _amplitude_above_axis;
-               wave->property_wave_color() = ARDOUR_UI::config()->canvasvar_GhostTrackWave.get();
-               wave->property_clip_color() = ARDOUR_UI::config()->canvasvar_GhostTrackWaveClip.get();
-               wave->property_zero_color() = ARDOUR_UI::config()->canvasvar_GhostTrackZeroLine.get();
+
                wave->property_region_start() = _region->start();
 
                ghost->waves.push_back(wave);
@@ -1120,6 +1184,7 @@ AudioRegionView::add_ghost (AutomationTimeAxisView& atv)
 
        ghost->set_height ();
        ghost->set_duration (_region->length() / samples_per_unit);
+       ghost->set_colors();
        ghosts.push_back (ghost);
 
        ghost->GoingAway.connect (mem_fun(*this, &AudioRegionView::remove_ghost));
@@ -1172,7 +1237,7 @@ AudioRegionView::envelope_active_changed ()
 void
 AudioRegionView::set_waveview_data_src()
 {
-
+       AudioGhostRegion* agr;
        double unit_length= _region->length() / samples_per_unit;
 
        for (uint32_t n = 0; n < waves.size(); ++n) {
@@ -1184,8 +1249,10 @@ AudioRegionView::set_waveview_data_src()
                
                (*i)->set_duration (unit_length);
                
-               for (vector<WaveView*>::iterator w = (*i)->waves.begin(); w != (*i)->waves.end(); ++w) {
-                       (*w)->property_data_src() = _region.get();
+               if((agr = dynamic_cast<AudioGhostRegion*>(*i)) != 0) {
+                       for (vector<WaveView*>::iterator w = agr->waves.begin(); w != agr->waves.end(); ++w) {
+                               (*w)->property_data_src() = _region.get();
+                       }
                }
        }
 
@@ -1222,27 +1289,74 @@ AudioRegionView::set_frame_color ()
        uint32_t r,g,b,a;
        
        if (_selected && should_show_selection) {
-               frame->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_WaveForm.get();
+               UINT_TO_RGBA(ARDOUR_UI::config()->canvasvar_SelectedFrameBase.get(), &r, &g, &b, &a);
+               frame->property_fill_color_rgba() = RGBA_TO_UINT(r, g, b, fill_opacity ? fill_opacity : a);
 
-               UINT_TO_RGBA(ARDOUR_UI::config()->canvasvar_FrameBase.get(), &r, &g, &b, &a);
                for (vector<ArdourCanvas::WaveView*>::iterator w = waves.begin(); w != waves.end(); ++w) {
                        if (_region->muted()) {
-                               (*w)->property_wave_color() = RGBA_TO_UINT(r, g, b, MUTED_ALPHA);
+                               (*w)->property_wave_color() = UINT_RGBA_CHANGE_A(ARDOUR_UI::config()->canvasvar_SelectedWaveForm.get(), MUTED_ALPHA);
                        } else {
-                               (*w)->property_wave_color() = RGBA_TO_UINT(r, g, b, fill_opacity ? fill_opacity : a);// Lets still use the theme's opacity value if Opaque is not set
+                               (*w)->property_wave_color() = ARDOUR_UI::config()->canvasvar_SelectedWaveForm.get();
+                               (*w)->property_fill_color() = ARDOUR_UI::config()->canvasvar_SelectedWaveFormFill.get();
                        }
                }
        } else {
-               UINT_TO_RGBA(ARDOUR_UI::config()->canvasvar_FrameBase.get(), &r, &g, &b, &a);
-               frame->property_fill_color_rgba() = RGBA_TO_UINT(r, g, b, fill_opacity ? fill_opacity : a);
-
-               for (vector<ArdourCanvas::WaveView*>::iterator w = waves.begin(); w != waves.end(); ++w) {
-                       if (_region->muted()) {
-                               (*w)->property_wave_color() = UINT_RGBA_CHANGE_A(ARDOUR_UI::config()->canvasvar_WaveForm.get(), MUTED_ALPHA);
-                       } else {
-                               (*w)->property_wave_color() = ARDOUR_UI::config()->canvasvar_WaveForm.get();
-                               (*w)->property_fill_color() = ARDOUR_UI::config()->canvasvar_WaveFormFill.get();
+               if (_recregion) {
+                       UINT_TO_RGBA(ARDOUR_UI::config()->canvasvar_RecordingRect.get(), &r, &g, &b, &a);
+                       frame->property_fill_color_rgba() = RGBA_TO_UINT(r, g, b, a);
+
+                       for (vector<ArdourCanvas::WaveView*>::iterator w = waves.begin(); w != waves.end(); ++w) {
+                               if (_region->muted()) {
+                                       (*w)->property_wave_color() = UINT_RGBA_CHANGE_A(ARDOUR_UI::config()->canvasvar_RecWaveForm.get(), MUTED_ALPHA);
+                               } else {
+                                       (*w)->property_wave_color() = ARDOUR_UI::config()->canvasvar_RecWaveForm.get();
+                                       (*w)->property_fill_color() = ARDOUR_UI::config()->canvasvar_RecWaveFormFill.get();
+                               }
                        }
+               } else {
+                       UINT_TO_RGBA(ARDOUR_UI::config()->canvasvar_FrameBase.get(), &r, &g, &b, &a);
+                       frame->property_fill_color_rgba() = RGBA_TO_UINT(r, g, b, fill_opacity ? fill_opacity : a);
+
+                       for (vector<ArdourCanvas::WaveView*>::iterator w = waves.begin(); w != waves.end(); ++w) {
+                               if (_region->muted()) {
+                                       (*w)->property_wave_color() = UINT_RGBA_CHANGE_A(ARDOUR_UI::config()->canvasvar_WaveForm.get(), MUTED_ALPHA);
+                               } else {
+                                       (*w)->property_wave_color() = ARDOUR_UI::config()->canvasvar_WaveForm.get();
+                                       (*w)->property_fill_color() = ARDOUR_UI::config()->canvasvar_WaveFormFill.get();
+                               }
+                       }
+               }
+       }
+}
+
+void
+AudioRegionView::set_fade_visibility (bool yn)
+{
+       if (yn) {
+               if (fade_in_shape) {
+                       fade_in_shape->show();
+               }
+               if (fade_out_shape) {
+                       fade_out_shape->show ();
+               } 
+               if (fade_in_handle) {
+                       fade_in_handle->show ();
+               } 
+               if (fade_out_handle) {
+                       fade_out_handle->show ();
+               }
+       } else {
+               if (fade_in_shape) {
+                       fade_in_shape->hide();
+               }
+               if (fade_out_shape) {
+                       fade_out_shape->hide ();
+               } 
+               if (fade_in_handle) {
+                       fade_in_handle->hide ();
+               } 
+               if (fade_out_handle) {
+                       fade_out_handle->hide ();
                }
        }
 }