Fixed some valgrind errors from using uninitialized variables in
[ardour.git] / gtk2_ardour / streamview.cc
index 67f6a2a0703a953f6dd6db920f5ec704cf647d50..bceaf09f99a5e21063e34ea26b5e6bf1da836842 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "streamview.h"
 #include "regionview.h"
+#include "taperegionview.h"
 #include "audio_time_axis.h"
 #include "canvas-waveview.h"
 #include "canvas-simplerect.h"
@@ -22,8 +23,9 @@
 #include "ardour_ui.h"
 #include "crossfade_view.h"
 #include "rgb_macros.h"
-//#include "extra_bind.h"
 #include "gui_thread.h"
+#include "utils.h"
+#include "color.h"
 
 using namespace ARDOUR;
 using namespace Editing;
@@ -45,25 +47,19 @@ StreamView::StreamView (AudioTimeAxisView& tv)
        }
 
        /* set_position() will position the group */
-       
-       canvas_group = gnome_canvas_item_new (GNOME_CANVAS_GROUP(_trackview.canvas_display),
-                                           gnome_canvas_group_get_type (),
-                                           NULL);
-
-       canvas_rect = gnome_canvas_item_new (GNOME_CANVAS_GROUP(canvas_group),
-                                          gnome_canvas_simplerect_get_type(),
-                                          "x1", 0.0,
-                                          "y1", 0.0,
-                                          "x2", 1000000.0,
-                                          "y2", (double) tv.height,
-                                          "outline_color_rgba", color_map[cAudioTrackOutline],
-                                          /* outline ends and bottom */
-                                          "outline_what", (guint32) (0x1|0x2|0x8),
-                                          "fill_color_rgba", stream_base_color,
-                                          NULL);
-
-       gtk_signal_connect (GTK_OBJECT(canvas_rect), "event",
-                           (GtkSignalFunc) PublicEditor::canvas_stream_view_event, &_trackview);
+
+       canvas_group = new ArdourCanvas::Group(*_trackview.canvas_display);
+
+       canvas_rect = new ArdourCanvas::SimpleRect (*canvas_group);
+       canvas_rect->property_x1() = 0.0;
+       canvas_rect->property_y1() = 0.0;
+       canvas_rect->property_x2() = 1000000.0;
+       canvas_rect->property_y2() = (double) tv.height;
+       canvas_rect->property_outline_color_rgba() = color_map[cAudioTrackOutline];
+       canvas_rect->property_outline_what() = (guint32) (0x1|0x2|0x8);  // outline ends and bottom 
+       canvas_rect->property_fill_color_rgba() = stream_base_color;
+
+       canvas_rect->signal_event().connect (bind (mem_fun (_trackview.editor, &PublicEditor::canvas_stream_view_event), canvas_rect, &_trackview));
 
        _samples_per_unit = _trackview.editor.get_current_zoom();
        _amplitude_above_axis = 1.0;
@@ -72,20 +68,21 @@ StreamView::StreamView (AudioTimeAxisView& tv)
                _trackview.audio_track()->diskstream_changed.connect (mem_fun (*this, &StreamView::diskstream_changed));
                _trackview.session().TransportStateChange.connect (mem_fun (*this, &StreamView::transport_changed));
                _trackview.get_diskstream()->record_enable_changed.connect (mem_fun (*this, &StreamView::rec_enable_changed));
-               _trackview.session().RecordEnabled.connect (mem_fun (*this, &StreamView::sess_rec_enable_changed));
-               _trackview.session().RecordDisabled.connect (mem_fun (*this, &StreamView::sess_rec_enable_changed));
+               _trackview.session().RecordStateChanged.connect (mem_fun (*this, &StreamView::sess_rec_enable_changed));
        } 
 
        rec_updating = false;
        rec_active = false;
        use_rec_regions = tv.editor.show_waveforms_recording ();
        last_rec_peak_frame = 0;
+
+       ColorChanged.connect (mem_fun (*this, &StreamView::color_handler));
 }
 
 StreamView::~StreamView ()
 {
        undisplay_diskstream ();
-       gtk_object_destroy (GTK_OBJECT(canvas_group));
+       delete canvas_group;
 }
 
 void
@@ -100,7 +97,8 @@ int
 StreamView::set_position (gdouble x, gdouble y)
 
 {
-       gnome_canvas_item_set (canvas_group, "x", x, "y", y, NULL);
+       canvas_group->property_x() = x;
+       canvas_group->property_y() = y;
        return 0;
 }
 
@@ -113,7 +111,7 @@ StreamView::set_height (gdouble h)
                return -1;
        }
 
-       gtk_object_set (GTK_OBJECT(canvas_rect), "y2", h, NULL);
+       canvas_rect->property_y2() = h;
 
        for (AudioRegionViewList::iterator i = region_views.begin(); i != region_views.end(); ++i) {
                (*i)->set_height (h);
@@ -125,7 +123,7 @@ StreamView::set_height (gdouble h)
 
        for (vector<RecBoxInfo>::iterator i = rec_rects.begin(); i != rec_rects.end(); ++i) {
                RecBoxInfo &recbox = (*i);
-               gtk_object_set (GTK_OBJECT( recbox.rectangle ), "y2", h - 1, NULL);
+               recbox.rectangle->property_y2() = h - 1.0;
        }
 
        return 0;
@@ -156,8 +154,8 @@ StreamView::set_samples_per_unit (gdouble spp)
                gdouble xstart = _trackview.editor.frame_to_pixel ( recbox.start );
                gdouble xend = _trackview.editor.frame_to_pixel ( recbox.start + recbox.length );
 
-               gnome_canvas_item_set (recbox.rectangle, "x1", xstart, NULL);
-               gnome_canvas_item_set (recbox.rectangle, "x2", xend, NULL);
+               recbox.rectangle->property_x1() = xstart;
+               recbox.rectangle->property_x2() = xend;
        }
 
        return 0;
@@ -212,15 +210,19 @@ StreamView::add_region_view_internal (Region *r, bool wait_for_waves)
                        return;
                }
        }
+       
+       switch (_trackview.audio_track()->mode()) {
+       case Normal:
+               region_view = new AudioRegionView (canvas_group, _trackview, *region, 
+                                                  _samples_per_unit, region_color);
+               break;
+       case Destructive:
+               region_view = new TapeAudioRegionView (canvas_group, _trackview, *region, 
+                                                      _samples_per_unit, region_color);
+               break;
+       }
 
-       region_view = new AudioRegionView (GNOME_CANVAS_GROUP(canvas_group),
-                                          _trackview,
-                                          *region,
-                                          _samples_per_unit,
-                                          _amplitude_above_axis, 
-                                          region_color, 
-                                          wait_for_waves);
-
+       region_view->init (_amplitude_above_axis, region_color, wait_for_waves);
        region_views.push_front (region_view);
        
        /* follow global waveform setting */
@@ -273,7 +275,7 @@ StreamView::remove_rec_region (Region *r)
 {
        ENSURE_GUI_THREAD(bind (mem_fun (*this, &StreamView::remove_rec_region), r));
        
-       if (!Gtkmm2ext::UI::instance()->caller_is_gui_thread()) {
+       if (!Gtkmm2ext::UI::instance()->caller_is_ui_thread()) {
                fatal << "region deleted from non-GUI thread!" << endmsg;
                /*NOTREACHED*/
        } 
@@ -295,6 +297,7 @@ StreamView::remove_rec_region (Region *r)
 void
 StreamView::undisplay_diskstream ()
 {
+       
        for (AudioRegionViewList::iterator i = region_views.begin(); i != region_views.end(); ++i) {
                delete *i;
        }
@@ -329,7 +332,7 @@ StreamView::playlist_modified ()
        }
 
        for (list<CrossfadeView *>::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
-               gnome_canvas_item_raise_to_top ((*i)->get_canvas_group());
+               (*i)->get_canvas_group()->raise_to_top();
        }
 }
 
@@ -393,7 +396,7 @@ StreamView::add_crossfade (Crossfade *crossfade)
                }
        }
 
-       CrossfadeView *cv = new CrossfadeView (GNOME_CANVAS_GROUP(_trackview.canvas_display),
+       CrossfadeView *cv = new CrossfadeView (_trackview.canvas_display,
                                               _trackview,
                                               *crossfade,
                                               _samples_per_unit,
@@ -436,6 +439,7 @@ StreamView::redisplay_diskstream ()
        list<AudioRegionView *>::iterator i, tmp;
        list<CrossfadeView*>::iterator xi, tmpx;
 
+       
        for (i = region_views.begin(); i != region_views.end(); ++i) {
                (*i)->set_valid (false);
        }
@@ -459,7 +463,7 @@ StreamView::redisplay_diskstream ()
                if (!(*i)->is_valid()) {
                        delete *i;
                        region_views.erase (i);
-               }
+               } 
 
                i = tmp;
        }
@@ -531,6 +535,7 @@ StreamView::set_selected_regionviews (AudioRegionSelection& regions)
 {
        bool selected;
 
+       // cerr << _trackview.name() << " (selected = " << regions.size() << ")" << endl;
        for (list<AudioRegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
                
                selected = false;
@@ -541,6 +546,7 @@ StreamView::set_selected_regionviews (AudioRegionSelection& regions)
                        }
                }
                
+               // cerr << "\tregion " << (*i)->region.name() << " selected = " << selected << endl;
                (*i)->set_selected (selected, this);
        }
 }
@@ -576,13 +582,13 @@ StreamView::set_waveform_shape (WaveformShape shape)
 void
 StreamView::region_layered (AudioRegionView* rv)
 {
-       gnome_canvas_item_lower_to_bottom (rv->get_canvas_group());
+       rv->get_canvas_group()->lower_to_bottom();
 
        /* don't ever leave it at the bottom, since then it doesn't
           get events - the  parent group does instead ...
        */
        
-       gnome_canvas_item_raise (rv->get_canvas_group(), rv->region.layer() + 1);
+       rv->get_canvas_group()->raise (rv->region.layer() + 1);
 }
 
 void
@@ -612,11 +618,12 @@ StreamView::setup_rec_box ()
 
                // cerr << "\trolling\n";
 
-               if (!rec_active
-                   && _trackview.session().record_status() == Session::Recording
-                   && _trackview.get_diskstream()->record_enabled()) {
+               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()) {
 
-                       if (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 */
 
                                AudioRegion::SourceList sources;
@@ -658,17 +665,32 @@ StreamView::setup_rec_box ()
                        DiskStream& ds = at->disk_stream();
                        jack_nframes_t frame_pos = ds.current_capture_start ();
                        gdouble xstart = _trackview.editor.frame_to_pixel (frame_pos);
-                       gdouble xend = xstart;
+                       gdouble xend;
+                       uint32_t fill_color;
+
+                       switch (_trackview.audio_track()->mode()) {
+                       case Normal:
+                               xend = xstart;
+                               fill_color = color_map[cRecordingRectFill];
+                               break;
+
+                       case Destructive:
+                               xend = xstart + 2;
+                               fill_color = color_map[cRecordingRectFill];
+                               /* make the recording rect translucent to allow
+                                  the user to see the peak data coming in, etc.
+                               */
+                               fill_color = UINT_RGBA_CHANGE_A (fill_color, 120);
+                               break;
+                       }
                        
-                       GnomeCanvasItem * rec_rect = gnome_canvas_item_new (GNOME_CANVAS_GROUP(canvas_group),
-                                                                       gnome_canvas_simplerect_get_type(),
-                                                                       "x1", xstart,
-                                                                       "y1", 1.0,
-                                                                       "x2", xend,
-                                                                       "y2", (double) _trackview.height - 1,
-                                                                       "outline_color_rgba", color_map[cRecordingRectOutline],
-                                                                       "fill_color_rgba",  color_map[cRecordingRectFill],
-                                                                       NULL);
+                       ArdourCanvas::SimpleRect * rec_rect = new Gnome::Canvas::SimpleRect (*canvas_group);
+                       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() = color_map[cRecordingRectOutline];
+                       rec_rect->property_fill_color_rgba() = fill_color;
                        
                        RecBoxInfo recbox;
                        recbox.rectangle = rec_rect;
@@ -732,7 +754,7 @@ StreamView::setup_rec_box ()
                        /* transport stopped, clear boxes */
                        for (vector<RecBoxInfo>::iterator iter=rec_rects.begin(); iter != rec_rects.end(); ++iter) {
                                RecBoxInfo &rect = (*iter);
-                               gtk_object_destroy (GTK_OBJECT(rect.rectangle));
+                               delete rect.rectangle;
                        }
                        
                        rec_rects.clear();
@@ -745,21 +767,32 @@ StreamView::setup_rec_box ()
 void
 StreamView::update_rec_box ()
 {
-       /* only update the last box */
        if (rec_active && rec_rects.size() > 0) {
+               /* only update the last box */
                RecBoxInfo & rect = rec_rects.back();
                jack_nframes_t at = _trackview.get_diskstream()->current_capture_end();
+               double xstart;
+               double xend;
                
-               rect.length = at - rect.start;
-
-               gdouble xstart = _trackview.editor.frame_to_pixel ( rect.start );
-               gdouble xend = _trackview.editor.frame_to_pixel ( at );
-
-               gnome_canvas_item_set (rect.rectangle, "x1", xstart, NULL);
-               gnome_canvas_item_set (rect.rectangle, "x2", xend, NULL);
+               switch (_trackview.audio_track()->mode()) {
+               case Normal:
+                       rect.length = at - rect.start;
+                       xstart = _trackview.editor.frame_to_pixel (rect.start);
+                       xend = _trackview.editor.frame_to_pixel (at);
+                       break;
+                       
+               case Destructive:
+                       rect.length = 2;
+                       xstart = _trackview.editor.frame_to_pixel (_trackview.get_diskstream()->current_capture_start());
+                       xend = _trackview.editor.frame_to_pixel (at);
+                       break;
+               }
+               
+               rect.rectangle->property_x1() = xstart;
+               rect.rectangle->property_x2() = xend;
        }
 }
-
+       
 AudioRegionView*
 StreamView::find_view (const AudioRegion& region)
 {
@@ -821,7 +854,7 @@ StreamView::update_rec_regions ()
                        tmp = iter;
                        ++tmp;
 
-                       if ((GTK_OBJECT_FLAGS(GTK_OBJECT(rec_rects[n].rectangle)) & GNOME_CANVAS_ITEM_VISIBLE) == 0) {
+                       if (!canvas_item_visible (rec_rects[n].rectangle)) {
                                /* rect already hidden, this region is done */
                                iter = tmp;
                                continue;
@@ -849,9 +882,9 @@ StreamView::update_rec_regions ()
                                                }
 
                                                /* also update rect */
-                                               GnomeCanvasItem * rect = rec_rects[n].rectangle;
+                                               ArdourCanvas::SimpleRect * rect = rec_rects[n].rectangle;
                                                gdouble xend = _trackview.editor.frame_to_pixel (region->position() + region->length());
-                                               gnome_canvas_item_set (rect, "x2", xend, NULL);
+                                               rect->property_x2() = xend;
                                        }
                                }
 
@@ -874,8 +907,8 @@ StreamView::update_rec_regions ()
                                                }
                                                
                                                /* also hide rect */
-                                               GnomeCanvasItem * rect = rec_rects[n].rectangle;
-                                               gnome_canvas_item_hide (rect);
+                                               ArdourCanvas::Item * rect = rec_rects[n].rectangle;
+                                               rect->hide();
 
                                        }
                                }
@@ -919,3 +952,26 @@ StreamView::reveal_xfades_involving (AudioRegionView& rv)
                }
        }
 }
+
+void
+StreamView::color_handler (ColorID id, uint32_t val)
+{
+       switch (id) {
+       case cAudioTrackBase:
+               if (_trackview.is_audio_track()) {
+                       canvas_rect->property_fill_color_rgba() = val;
+               } 
+               break;
+       case cAudioBusBase:
+               if (!_trackview.is_audio_track()) {
+                       canvas_rect->property_fill_color_rgba() = val;
+               }
+               break;
+       case cAudioTrackOutline:
+               canvas_rect->property_outline_color_rgba() = val;
+               break;
+
+       default:
+               break;
+       }
+}