X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=gtk2_ardour%2Faudio_streamview.cc;h=a69f398ef45d0ac96c14196c04d44cb4f0d55967;hb=b426e7d5e4c2b2c0071ded015c193f78f16ead78;hp=65efd9654c39cce1199bcda758c37e973f7429dc;hpb=88f13bbe33f8cb24fc571eb65538ad8896d272e0;p=ardour.git diff --git a/gtk2_ardour/audio_streamview.cc b/gtk2_ardour/audio_streamview.cc index 65efd9654c..a69f398ef4 100644 --- a/gtk2_ardour/audio_streamview.cc +++ b/gtk2_ardour/audio_streamview.cc @@ -61,7 +61,7 @@ using namespace Editing; AudioStreamView::AudioStreamView (AudioTimeAxisView& tv) : StreamView (tv) { - crossfades_visible = true; + crossfades_visible = tv.session()->config.get_xfades_visible (); color_handler (); _amplitude_above_axis = 1.0; @@ -70,6 +70,9 @@ AudioStreamView::AudioStreamView (AudioTimeAxisView& tv) AudioStreamView::~AudioStreamView () { + for (CrossfadeViewList::iterator xi = crossfade_views.begin(); xi != crossfade_views.end(); ++xi) { + delete xi->second; + } } int @@ -121,7 +124,10 @@ AudioStreamView::create_region_view (boost::shared_ptr r, bool wait_for_ if (recording) { region_view = new AudioRegionView (_canvas_group, _trackview, region, _samples_per_unit, region_color, recording, TimeAxisViewItem::Visibility( - TimeAxisViewItem::ShowFrame | TimeAxisViewItem::HideFrameRight)); + TimeAxisViewItem::ShowFrame | + TimeAxisViewItem::HideFrameRight | + TimeAxisViewItem::HideFrameLeft | + TimeAxisViewItem::HideFrameTB)); } else { region_view = new AudioRegionView (_canvas_group, _trackview, region, _samples_per_unit, region_color); @@ -160,6 +166,7 @@ RegionView* AudioStreamView::add_region_view_internal (boost::shared_ptr r, bool wait_for_waves, bool recording) { RegionView *region_view = create_region_view (r, wait_for_waves, recording); + if (region_view == 0) { return 0; } @@ -187,6 +194,12 @@ AudioStreamView::add_region_view_internal (boost::shared_ptr r, bool wai region_views.push_front (region_view); + if (_trackview.editor().internal_editing()) { + region_view->hide_rect (); + } else { + region_view->show_rect (); + } + /* catch region going away */ r->DropReferences.connect (*this, invalidator (*this), boost::bind (&AudioStreamView::remove_region_view, this, boost::weak_ptr (r)), gui_context()); @@ -325,7 +338,7 @@ AudioStreamView::add_crossfade (boost::weak_ptr wc) cv->set_valid (true); crossfade->Invalidated.connect (*this, invalidator (*this), ui_bind (&AudioStreamView::remove_crossfade, this, _1), gui_context()); crossfade_views[cv->crossfade] = cv; - if (!_trackview.session()->config.get_xfades_visible() || !crossfades_visible) { + if (!crossfades_visible) { cv->hide (); } @@ -459,22 +472,22 @@ AudioStreamView::setup_rec_box () if (src) { sources.push_back (src); src->PeakRangeReady.connect (rec_data_ready_connections, - invalidator (*this), - ui_bind (&AudioStreamView::rec_peak_range_ready, this, _1, _2, boost::weak_ptr(src)), - gui_context()); + invalidator (*this), + ui_bind (&AudioStreamView::rec_peak_range_ready, this, _1, _2, boost::weak_ptr(src)), + 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); } - PropertyList plist; - + PropertyList plist; + plist.add (Properties::start, start); plist.add (Properties::length, 1); plist.add (Properties::name, string()); @@ -484,9 +497,8 @@ AudioStreamView::setup_rec_box () boost::dynamic_pointer_cast(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_position (_trackview.session()->transport_frame()); + rec_regions.push_back (make_pair(region, (RegionView*) 0)); } /* start a new rec box */ @@ -494,7 +506,7 @@ AudioStreamView::setup_rec_box () boost::shared_ptr at; at = _trackview.audio_track(); /* we know what it is already */ - nframes_t frame_pos = at->current_capture_start (); + framepos_t const frame_pos = at->current_capture_start (); gdouble xstart = _trackview.editor().frame_to_pixel (frame_pos); gdouble xend; uint32_t fill_color; @@ -521,8 +533,8 @@ AudioStreamView::setup_rec_box () rec_rect->property_y1() = 1.0; rec_rect->property_x2() = xend; rec_rect->property_y2() = child_height (); + rec_rect->property_outline_what() = 0x0; 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(); @@ -597,7 +609,7 @@ AudioStreamView::foreach_crossfadeview (void (CrossfadeView::*pmf)(void)) } void -AudioStreamView::rec_peak_range_ready (nframes_t start, nframes_t cnt, boost::weak_ptr weak_src) +AudioStreamView::rec_peak_range_ready (framepos_t start, framecnt_t cnt, boost::weak_ptr weak_src) { ENSURE_GUI_THREAD (*this, &AudioStreamView::rec_peak_range_ready, start, cnt, weak_src) @@ -616,73 +628,80 @@ AudioStreamView::rec_peak_range_ready (nframes_t start, nframes_t cnt, boost::we rec_data_ready_map[src] = true; if (rec_data_ready_map.size() == _trackview.track()->n_channels().n_audio()) { - this->update_rec_regions (); + update_rec_regions (start, cnt); rec_data_ready_map.clear(); } } void -AudioStreamView::update_rec_regions () +AudioStreamView::update_rec_regions (framepos_t start, framecnt_t cnt) { - if (Config->get_show_waveforms_while_recording ()) { - uint32_t n = 0; + if (!Config->get_show_waveforms_while_recording ()) { + return; + } - for (list,RegionView*> >::iterator iter = rec_regions.begin(); - iter != rec_regions.end(); n++) { + uint32_t n = 0; - list,RegionView*> >::iterator tmp = iter; - ++tmp; + for (list,RegionView*> >::iterator iter = rec_regions.begin(); iter != rec_regions.end(); n++) { - if (!canvas_item_visible (rec_rects[n].rectangle)) { - /* rect already hidden, this region is done */ - iter = tmp; - continue; - } + list,RegionView*> >::iterator tmp = iter; + ++tmp; - boost::shared_ptr region = boost::dynamic_pointer_cast(iter->first); - if (!region) { - iter = tmp; - continue; - } + assert (n < rec_rects.size()); - nframes_t origlen = region->length(); + if (!canvas_item_visible (rec_rects[n].rectangle)) { + /* rect already hidden, this region is done */ + iter = tmp; + continue; + } - if (region == rec_regions.back().first && rec_active) { + boost::shared_ptr region = boost::dynamic_pointer_cast(iter->first); - if (last_rec_data_frame > region->start()) { + if (!region) { + iter = tmp; + continue; + } - nframes_t nlen = last_rec_data_frame - region->start(); + framecnt_t origlen = region->length(); - if (nlen != region->length()) { + if (region == rec_regions.back().first && rec_active) { - 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 (last_rec_data_frame > region->start()) { - if (origlen == 1) { - /* our special initial length */ - add_region_view_internal (region, false, true); - } + framecnt_t nlen = last_rec_data_frame - region->start(); + + if (nlen != region->length()) { - /* 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; + region->suspend_property_changes (); + region->set_position (_trackview.track()->get_capture_start_frame(n)); + region->set_length (nlen); + region->resume_property_changes (); + + if (origlen == 1) { + /* our special initial length */ + add_region_view_internal (region, false, true); + setup_new_rec_layer_time (region); } + + check_record_layers (region, (region->position() - region->start() + start + cnt)); + + /* 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; } } else { - nframes_t nlen = _trackview.track()->get_captured_frames(n); + framecnt_t nlen = _trackview.track()->get_captured_frames(n); if (nlen != region->length()) { if (region->source_length(0) >= region->start() + nlen) { region->suspend_property_changes (); - region->set_position (_trackview.track()->get_capture_start_frame(n), this); - region->set_length (nlen, this); + region->set_position (_trackview.track()->get_capture_start_frame(n)); + region->set_length (nlen); region->resume_property_changes (); if (origlen == 1) { @@ -697,9 +716,9 @@ AudioStreamView::update_rec_regions () } } } - - iter = tmp; } + + iter = tmp; } } @@ -790,8 +809,6 @@ AudioStreamView::update_contents_height () void AudioStreamView::update_content_height (CrossfadeView* cv) { - cv->show (); - if (_layer_display == Overlaid) { cv->set_y (0); @@ -824,3 +841,14 @@ AudioStreamView::parameter_changed (string const & p) set_waveform_shape (Config->get_waveform_shape ()); } } + +void +AudioStreamView::horizontal_position_changed () +{ + /* we only `draw' the bit of the curve that is visible, so we need to update here */ + + for (CrossfadeViewList::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) { + i->second->horizontal_position_changed (); + } +} +