fix some more incorrect casts to CanvasNote rather than CanvasNoteEvent (fixes crashe...
[ardour.git] / gtk2_ardour / midi_streamview.cc
index 0b47e1bb207b25877bb83746a0fcd2cbbaa08fdc..723b52220210e0b3e28e972af24e6a5632135a94 100644 (file)
@@ -35,6 +35,7 @@
 
 #include "ardour_ui.h"
 #include "canvas-simplerect.h"
+#include "global_signals.h"
 #include "gui_thread.h"
 #include "lineset.h"
 #include "midi_region_view.h"
@@ -201,7 +202,7 @@ MidiStreamView::display_region(MidiRegionView* region_view, bool load_model)
                        source->model()->highest_note());
 
        // Display region contents
-       region_view->set_height(height);
+       region_view->set_height (child_height());
        region_view->display_model(source->model());
 }
 
@@ -294,7 +295,7 @@ void
 MidiStreamView::update_contents_height ()
 {
        StreamView::update_contents_height();
-       _note_lines->property_y2() = height;
+       _note_lines->property_y2() = child_height ();
 
         apply_note_range (lowest_note(), highest_note(), true);
 }
@@ -312,7 +313,7 @@ MidiStreamView::draw_note_lines()
 
        _note_lines->clear();
        
-       if(height < 140){
+       if (child_height() < 140){
                return;
        }
 
@@ -364,13 +365,13 @@ MidiStreamView::apply_note_range(uint8_t lowest, uint8_t highest, bool to_region
        _highest_note = highest;
        _lowest_note = lowest;
        
-       int range = _highest_note - _lowest_note;  
-       int pixels_per_note = floor (height/range);
+       int const range = _highest_note - _lowest_note;  
+       int const pixels_per_note = floor (child_height () / range);
        
        /* do not grow note height beyond 10 pixels */
        if (pixels_per_note > 10) {
                
-               int available_note_range = floor ((height)/10);
+               int const available_note_range = floor (child_height() / 10);
                int additional_notes = available_note_range - range;
                
                /* distribute additional notes to higher and lower ranges, clamp at 0 and 127 */
@@ -434,19 +435,18 @@ MidiStreamView::setup_rec_box ()
 
                                sources.push_back (_trackview.midi_track()->write_source());
 
-                               _trackview.midi_track()->write_source()->ViewDataRangeReady.connect 
-                                       (rec_data_ready_connections, 
-                                         invalidator (*this),
-                                        ui_bind (&MidiStreamView::rec_data_range_ready, this, _1, _2, boost::weak_ptr<Source>(_trackview.midi_track()->write_source())),
-                                        gui_context());
-
                                // handle multi
 
-                               nframes_t start = 0;
+                               framepos_t start = 0;
                                if (rec_regions.size() > 0) {
                                        start = rec_regions.back().first->start()
                                                        + _trackview.track()->get_captured_frames(rec_regions.size()-1);
                                }
+
+                               if (!rec_regions.empty()) {
+                                       MidiRegionView* mrv = dynamic_cast<MidiRegionView*> (rec_regions.back().second);
+                                       mrv->end_write ();
+                               }
                                
                                PropertyList plist; 
                                
@@ -459,26 +459,31 @@ MidiStreamView::setup_rec_box ()
                                                                      (RegionFactory::create (sources, plist, false)));
 
                                assert(region);
-                               region->block_property_changes ();
-                               region->set_position (_trackview.session()->transport_frame(), this);
-                               rec_regions.push_back (make_pair(region, (RegionView*)0));
+                               region->set_start (_trackview.track()->current_capture_start() - _trackview.track()->get_capture_start_frame (0), this);
+                               region->set_position (_trackview.track()->current_capture_start(), this);
+                               RegionView* rv = add_region_view_internal (region, false);
+                               MidiRegionView* mrv = dynamic_cast<MidiRegionView*> (rv);
+                               mrv->begin_write ();
+
+                               rec_regions.push_back (make_pair (region, rv));
 
                                // rec regions are destroyed in setup_rec_box
 
                                /* we add the region later */
+
+                               setup_new_rec_layer_time (region);
                        }
 
                        /* start a new rec box */
 
                        boost::shared_ptr<MidiTrack> mt = _trackview.midi_track(); /* we know what it is already */
-                       nframes_t frame_pos = mt->current_capture_start ();
-                       gdouble xstart = _trackview.editor().frame_to_pixel (frame_pos);
-                       gdouble xend;
+                       framepos_t const frame_pos = mt->current_capture_start ();
+                       gdouble const xstart = _trackview.editor().frame_to_pixel (frame_pos);
+                       gdouble const xend = xstart;
                        uint32_t fill_color;
 
                        assert(_trackview.midi_track()->mode() == Normal);
 
-                       xend = xstart;
                        fill_color = ARDOUR_UI::config()->canvasvar_RecordingRect.get();
 
                        ArdourCanvas::SimpleRect * rec_rect = new Gnome::Canvas::SimpleRect (*_canvas_group);
@@ -553,166 +558,6 @@ MidiStreamView::setup_rec_box ()
        }
 }
 
-void
-MidiStreamView::update_rec_regions (boost::shared_ptr<MidiModel> data, nframes_t start, nframes_t dur)
-{
-       ENSURE_GUI_THREAD (*this, &MidiStreamView::update_rec_regions, data, start, dur)
-
-       if (Config->get_show_waveforms_while_recording ()) {
-
-               uint32_t n = 0;
-               bool     update_range = false;
-
-               for (list<pair<boost::shared_ptr<Region>,RegionView*> >::iterator iter = rec_regions.begin();
-                               iter != rec_regions.end(); n++) {
-
-                       list<pair<boost::shared_ptr<Region>,RegionView*> >::iterator tmp = iter;
-                       ++tmp;
-
-                       if (!canvas_item_visible (rec_rects[n].rectangle)) {
-                               /* rect already hidden, this region is done */
-                               iter = tmp;
-                               continue;
-                       }
-
-                       boost::shared_ptr<MidiRegion> region = boost::dynamic_pointer_cast<MidiRegion>(iter->first);
-                       if (!region) {
-                               iter = tmp;
-                               continue;
-                       }
-
-                       nframes_t origlen = region->length();
-
-                       if (region == rec_regions.back().first && rec_active) {
-
-                               if (start >= region->midi_source(0)->timeline_position()) {
-
-                                       nframes_t nlen = start + dur - region->position();
-
-                                       if (nlen != region->length()) {
-
-                                               region->suspend_property_changes ();
-                                               region->set_position (_trackview.track()->get_capture_start_frame(n), this);
-                                               region->set_length (start + dur - region->position(), this);
-                                               region->resume_property_changes ();
-
-                                               if (origlen == 1) {
-                                                       /* our special initial length */
-                                                       iter->second = add_region_view_internal (region, false);
-                                                       ((MidiRegionView*)iter->second)->begin_write();
-                                               }
-
-                                               /* also update rect */
-                                               ArdourCanvas::SimpleRect * rect = rec_rects[n].rectangle;
-                                               gdouble xend = _trackview.editor().frame_to_pixel (region->position() + region->length());
-                                               rect->property_x2() = xend;
-
-                                               ARDOUR::BeatsFramesConverter tconv(_trackview.session()->tempo_map(), region->position());
-                                               const MidiModel::TimeType start_beats = tconv.from(start);
-
-                                               /* draw events */
-                                               MidiRegionView* mrv = (MidiRegionView*)iter->second;
-
-                                               for (MidiModel::Notes::const_iterator i = data->note_lower_bound(start_beats);
-                                                               i != data->notes().end(); ++i) {
-
-                                                       const boost::shared_ptr<MidiRegionView::NoteType>& note = *i;
-
-                                                        cerr << "New note arrived, length = " << note->length()
-                                                             << " num " << note->note()
-                                                             << endl;
-
-                                                        if (note->length() == 0) {
-                                                                /* we got NoteOn but not NoteOff (yet)
-                                                                 */
-                                                                continue;
-                                                        }
-                                                        
-                                                       nframes_t note_start_frames = tconv.to(note->time());
-                                                       nframes_t note_end_frames   = tconv.to(note->end_time());
-
-
-                                                       if (note->length() > 0 && note_end_frames + region->position() > start) {
-                                                               mrv->resolve_note(note->note(), note_end_frames);
-                                                        }
-
-                                                       if (note_start_frames + region->position() < start) {
-                                                               continue;
-                                                       }
-
-                                                       if (note_start_frames + region->position() > start + dur) {
-                                                               break;
-                                                       }
-
-                                                       if (note->note() < _lowest_note) {
-                                                               _lowest_note = note->note();
-                                                               update_range = true;
-                                                       } else if (note->note() > _highest_note) {
-                                                               _highest_note = note->note();
-                                                               update_range = true;
-                                                       }
-
-                                                       mrv->add_note (note, !update_range);
-                                               }
-
-                                               mrv->extend_active_notes();
-                                       }
-                               }
-
-                       } else {
-
-                               nframes_t nlen = _trackview.track()->get_captured_frames(n);
-
-                               if (nlen != region->length()) {
-
-                                       if (region->source_length(0) >= region->position() + nlen) {
-
-                                               region->suspend_property_changes ();
-                                               region->set_position (_trackview.track()->get_capture_start_frame(n), this);
-                                               region->set_length (nlen, this);
-                                               region->resume_property_changes ();
-
-                                               if (origlen == 1) {
-                                                       /* our special initial length */
-                                                       iter->second = add_region_view_internal (region, false);
-                                               }
-
-                                               /* also hide rect */
-                                               ArdourCanvas::Item * rect = rec_rects[n].rectangle;
-                                               rect->hide();
-
-                                       }
-                               }
-                       }
-
-                       iter = tmp;
-               }
-
-               if (update_range)
-                       update_contents_height();
-       }
-}
-
-void
-MidiStreamView::rec_data_range_ready (nframes_t start, nframes_t cnt, boost::weak_ptr<Source> weak_src)
-{
-       // this is called from the butler thread for now
-
-       ENSURE_GUI_THREAD (*this, &MidiStreamView::rec_data_range_ready, start, cnt, weak_src)
-
-       boost::shared_ptr<SMFSource> src (boost::dynamic_pointer_cast<SMFSource>(weak_src.lock()));
-
-       if (!src) {
-               return;
-       }
-
-       if (start + cnt > last_rec_data_frame) {
-               last_rec_data_frame = start + cnt;
-       }
-
-       this->update_rec_regions (src->model(), start, cnt);
-}
-
 void
 MidiStreamView::color_handler ()
 {
@@ -753,3 +598,20 @@ MidiStreamView::note_range_adjustment_changed()
        apply_note_range(lowest, highest, true);
 }
 
+void
+MidiStreamView::update_rec_box ()
+{
+       StreamView::update_rec_box ();
+
+       if (rec_regions.empty()) {
+               return;
+       }
+
+       /* Update the region being recorded to reflect where we currently are */
+       boost::shared_ptr<ARDOUR::Region> region = rec_regions.back().first;
+       region->set_length (_trackview.track()->current_capture_end () - _trackview.track()->current_capture_start(), this);
+
+       MidiRegionView* mrv = dynamic_cast<MidiRegionView*> (rec_regions.back().second);
+       mrv->extend_active_notes ();
+}
+