X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Faudio_region_view.cc;h=79081eb284ce27a9299af0ce0cd19ee5c5f66c4f;hb=2dc3c8b3650266eba09cf7fe53c39c6728d4d5b6;hp=d3a82dba12b684d7cfca2b5afa98629f6d62129c;hpb=b074ff0dd511ab1a7bf6ff385bc445e7e326fce6;p=ardour.git diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc index d3a82dba12..79081eb284 100644 --- a/gtk2_ardour/audio_region_view.cc +++ b/gtk2_ardour/audio_region_view.cc @@ -25,8 +25,6 @@ #include -#include - #include "ardour/playlist.h" #include "ardour/audioregion.h" #include "ardour/audiosource.h" @@ -38,6 +36,10 @@ #include "evoral/Curve.hpp" +#include "gtkmm2ext/gtk_ui.h" +#include "gtkmm2ext/utils.h" +#include "gtkmm2ext/colors.h" + #include "canvas/rectangle.h" #include "canvas/polygon.h" #include "canvas/poly_line.h" @@ -45,12 +47,13 @@ #include "canvas/text.h" #include "canvas/xfade_curve.h" #include "canvas/debug.h" -#include "canvas/utils.h" -#include "canvas/colors.h" + +#include "waveview/debug.h" #include "streamview.h" #include "audio_region_view.h" #include "audio_time_axis.h" +#include "enums_convert.h" #include "public_editor.h" #include "audio_region_editor.h" #include "audio_streamview.h" @@ -62,7 +65,7 @@ #include "gui_thread.h" #include "ui_config.h" -#include "i18n.h" +#include "pbd/i18n.h" #define MUTED_ALPHA 48 @@ -183,7 +186,7 @@ AudioRegionView::init (bool wfd) // needs to be created first, RegionView::init() calls set_height() pending_peak_data = new ArdourCanvas::Rectangle (group); CANVAS_DEBUG_NAME (pending_peak_data, string_compose ("pending peak rectangle for %1", region()->name())); - pending_peak_data->set_outline_color (ArdourCanvas::rgba_to_color (0, 0, 0, 0.0)); + pending_peak_data->set_outline_color (Gtkmm2ext::rgba_to_color (0, 0, 0, 0.0)); pending_peak_data->set_pattern (pending_peak_pattern); pending_peak_data->set_data ("regionview", this); pending_peak_data->hide (); @@ -197,28 +200,28 @@ AudioRegionView::init (bool wfd) if (!_recregion) { fade_in_handle = new ArdourCanvas::Rectangle (group); CANVAS_DEBUG_NAME (fade_in_handle, string_compose ("fade in handle for %1", region()->name())); - fade_in_handle->set_outline_color (ArdourCanvas::rgba_to_color (0, 0, 0, 1.0)); + fade_in_handle->set_outline_color (Gtkmm2ext::rgba_to_color (0, 0, 0, 1.0)); fade_in_handle->set_fill_color (UIConfiguration::instance().color ("inactive fade handle")); fade_in_handle->set_data ("regionview", this); fade_in_handle->hide (); fade_out_handle = new ArdourCanvas::Rectangle (group); CANVAS_DEBUG_NAME (fade_out_handle, string_compose ("fade out handle for %1", region()->name())); - fade_out_handle->set_outline_color (ArdourCanvas::rgba_to_color (0, 0, 0, 1.0)); + fade_out_handle->set_outline_color (Gtkmm2ext::rgba_to_color (0, 0, 0, 1.0)); fade_out_handle->set_fill_color (UIConfiguration::instance().color ("inactive fade handle")); fade_out_handle->set_data ("regionview", this); fade_out_handle->hide (); fade_in_trim_handle = new ArdourCanvas::Rectangle (group); CANVAS_DEBUG_NAME (fade_in_handle, string_compose ("fade in trim handle for %1", region()->name())); - fade_in_trim_handle->set_outline_color (ArdourCanvas::rgba_to_color (0, 0, 0, 1.0)); + fade_in_trim_handle->set_outline_color (Gtkmm2ext::rgba_to_color (0, 0, 0, 1.0)); fade_in_trim_handle->set_fill_color (UIConfiguration::instance().color ("inactive fade handle")); fade_in_trim_handle->set_data ("regionview", this); fade_in_trim_handle->hide (); fade_out_trim_handle = new ArdourCanvas::Rectangle (group); CANVAS_DEBUG_NAME (fade_out_handle, string_compose ("fade out trim handle for %1", region()->name())); - fade_out_trim_handle->set_outline_color (ArdourCanvas::rgba_to_color (0, 0, 0, 1.0)); + fade_out_trim_handle->set_outline_color (Gtkmm2ext::rgba_to_color (0, 0, 0, 1.0)); fade_out_trim_handle->set_fill_color (UIConfiguration::instance().color ("inactive fade handle")); fade_out_trim_handle->set_data ("regionview", this); fade_out_trim_handle->hide (); @@ -232,25 +235,23 @@ AudioRegionView::init (bool wfd) const string line_name = _region->name() + ":gain"; - if (!Profile->get_sae()) { - gain_line.reset (new AudioRegionGainLine (line_name, *this, *group, audio_region()->envelope())); - } + gain_line.reset (new AudioRegionGainLine (line_name, *this, *group, audio_region()->envelope())); update_envelope_visibility (); gain_line->reset (); - set_height (trackview.current_height()); // XXX not correct for Layered mode, but set_height() will fix later. + /* streamview will call set_height() */ + //set_height (trackview.current_height()); // XXX not correct for Layered mode, but set_height() will fix later. region_muted (); region_sync_changed (); region_resized (ARDOUR::bounds_change); + /* region_resized sets ghost region duration */ - for (vector::iterator i = ghosts.begin(); i != ghosts.end(); ++i) { - (*i)->set_duration (_region->length() / samples_per_pixel); - } + /* region_locked is a synonym for region_renamed () which is called in region_muted() above */ + //region_locked (); - region_locked (); envelope_active_changed (); fade_in_active_changed (); fade_out_active_changed (); @@ -277,15 +278,6 @@ AudioRegionView::init (bool wfd) setup_waveform_visibility (); - pending_peak_data->raise_to_top (); - - if (frame_handle_start) { - frame_handle_start->raise_to_top (); - } - if (frame_handle_end) { - frame_handle_end->raise_to_top (); - } - /* XXX sync mark drag? */ } @@ -300,7 +292,7 @@ AudioRegionView::~AudioRegionView () } _data_ready_connections.clear (); - for (list >::iterator i = feature_lines.begin(); i != feature_lines.end(); ++i) { + for (list >::iterator i = feature_lines.begin(); i != feature_lines.end(); ++i) { delete ((*i).second); } @@ -389,6 +381,7 @@ AudioRegionView::region_scale_amplitude_changed () for (uint32_t n = 0; n < waves.size(); ++n) { waves[n]->gain_changed (); } + region_renamed (); } void @@ -396,7 +389,7 @@ AudioRegionView::region_renamed () { std::string str = RegionView::make_name (); - if (audio_region()->speed_mismatch (trackview.session()->frame_rate())) { + if (audio_region()->speed_mismatch (trackview.session()->sample_rate())) { str = string ("*") + str; } @@ -404,6 +397,14 @@ AudioRegionView::region_renamed () str = string ("!") + str; } + + boost::shared_ptr ar (audio_region()); + if (ar->scale_amplitude() != 1.0) { + char tmp[32]; + snprintf (tmp, 32, " (%.1fdB)", accurate_coefficient_to_dB (ar->scale_amplitude())); + str += tmp; + } + set_item_name (str, this); set_name_text (str); } @@ -428,18 +429,19 @@ AudioRegionView::region_resized (const PropertyChange& what_changed) for (vector::iterator i = ghosts.begin(); i != ghosts.end(); ++i) { if ((agr = dynamic_cast(*i)) != 0) { - for (vector::iterator w = agr->waves.begin(); w != agr->waves.end(); ++w) { + for (vector::iterator w = agr->waves.begin(); w != agr->waves.end(); ++w) { (*w)->region_resized (); } } } - /* hide transient lines that extend beyond the region end */ - - list >::iterator l; + /* hide transient lines that extend beyond the region */ + list >::iterator l; + samplepos_t first = _region->first_sample(); + samplepos_t last = _region->last_sample(); for (l = feature_lines.begin(); l != feature_lines.end(); ++l) { - if (l->first > _region->length() - 1) { + if (l->first < first || l->first >= last) { l->second->hide(); } else { l->second->show(); @@ -451,6 +453,10 @@ AudioRegionView::region_resized (const PropertyChange& what_changed) void AudioRegionView::reset_width_dependent_items (double pixel_width) { + if (pixel_width == _width) { + return; + } + RegionView::reset_width_dependent_items(pixel_width); assert(_pixel_width == pixel_width); @@ -465,25 +471,34 @@ AudioRegionView::reset_width_dependent_items (double pixel_width) if (end_xfade_rect) { end_xfade_rect->set_outline (false); } } - AnalysisFeatureList analysis_features = _region->transients(); - AnalysisFeatureList::const_iterator i; - - list >::iterator l; + reset_fade_shapes (); - for (i = analysis_features.begin(), l = feature_lines.begin(); i != analysis_features.end() && l != feature_lines.end(); ++i, ++l) { + /* Update feature lines */ + AnalysisFeatureList analysis_features; + _region->transients (analysis_features); - float x_pos = trackview.editor().sample_to_pixel (*i); + if (feature_lines.size () != analysis_features.size ()) { + cerr << "postponed freature line update.\n"; // XXX + // AudioRegionView::transients_changed () will pick up on this + return; + } - (*l).second->set (ArdourCanvas::Duple (x_pos, 2.0), - ArdourCanvas::Duple (x_pos, _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1)); + samplepos_t position = _region->position(); + AnalysisFeatureList::const_iterator i; + list >::iterator l; + double y1; + if (_height >= NAME_HIGHLIGHT_THRESH) { + y1 = _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1; + } else { + y1 = _height - 1; + } + for (i = analysis_features.begin(), l = feature_lines.begin(); i != analysis_features.end() && l != feature_lines.end(); ++i, ++l) { + float x_pos = trackview.editor().sample_to_pixel ((*i) - position); (*l).first = *i; - (*l).second->set (ArdourCanvas::Duple (x_pos, 2.0), - ArdourCanvas::Duple (x_pos, _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1)); + ArdourCanvas::Duple (x_pos, y1)); } - - reset_fade_shapes (); } void @@ -523,6 +538,10 @@ AudioRegionView::setup_fade_handle_positions() void AudioRegionView::set_height (gdouble height) { + if (height == _height) { + return; + } + RegionView::set_height (height); pending_peak_data->set_y1 (height); @@ -560,20 +579,19 @@ AudioRegionView::set_height (gdouble height) reset_fade_shapes (); - /* Update hights for any active feature lines */ - list >::iterator l; - + /* Update heights for any feature lines */ + samplepos_t position = _region->position(); + list >::iterator l; + double y1; + if (_height >= NAME_HIGHLIGHT_THRESH) { + y1 = _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1; + } else { + y1 = _height - 1; + } for (l = feature_lines.begin(); l != feature_lines.end(); ++l) { - - float pos_x = trackview.editor().sample_to_pixel((*l).first); - - if (height >= NAME_HIGHLIGHT_THRESH) { - (*l).second->set (ArdourCanvas::Duple (pos_x, 2.0), - ArdourCanvas::Duple (pos_x, _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1)); - } else { - (*l).second->set (ArdourCanvas::Duple (pos_x, 2.0), - ArdourCanvas::Duple (pos_x, _height - 1)); - } + float pos_x = trackview.editor().sample_to_pixel((*l).first - position); + (*l).second->set (ArdourCanvas::Duple (pos_x, 2.0), + ArdourCanvas::Duple (pos_x, y1)); } if (name_text) { @@ -593,20 +611,20 @@ AudioRegionView::reset_fade_shapes () void AudioRegionView::reset_fade_in_shape () { - reset_fade_in_shape_width (audio_region(), (framecnt_t) audio_region()->fade_in()->back()->when); + reset_fade_in_shape_width (audio_region(), (samplecnt_t) audio_region()->fade_in()->back()->when); } void -AudioRegionView::reset_fade_in_shape_width (boost::shared_ptr ar, framecnt_t width, bool drag_active) +AudioRegionView::reset_fade_in_shape_width (boost::shared_ptr ar, samplecnt_t width, bool drag_active) { trim_fade_in_drag_active = drag_active; if (fade_in_handle == 0) { return; } - /* smallest size for a fade is 64 frames */ + /* smallest size for a fade is 64 samples */ - width = std::max ((framecnt_t) 64, width); + width = std::max ((samplecnt_t) 64, width); /* round here to prevent little visual glitches with sub-pixel placement */ double const pwidth = floor (width / samples_per_pixel); @@ -664,33 +682,33 @@ AudioRegionView::reset_fade_in_shape_width (boost::shared_ptr ar, f redraw_start_xfade_to (ar, width, points, effective_height, handle_left); /* ensure trim handle stays on top */ - if (frame_handle_start) { - frame_handle_start->raise_to_top(); + if (sample_handle_start) { + sample_handle_start->raise_to_top(); } } void AudioRegionView::reset_fade_out_shape () { - reset_fade_out_shape_width (audio_region(), (framecnt_t) audio_region()->fade_out()->back()->when); + reset_fade_out_shape_width (audio_region(), (samplecnt_t) audio_region()->fade_out()->back()->when); } void -AudioRegionView::reset_fade_out_shape_width (boost::shared_ptr ar, framecnt_t width, bool drag_active) +AudioRegionView::reset_fade_out_shape_width (boost::shared_ptr ar, samplecnt_t width, bool drag_active) { trim_fade_out_drag_active = drag_active; if (fade_out_handle == 0) { return; } - /* smallest size for a fade is 64 frames */ + /* smallest size for a fade is 64 samples */ - width = std::max ((framecnt_t) 64, width); + width = std::max ((samplecnt_t) 64, width); double const pwidth = floor(trackview.editor().sample_to_pixel (width)); - /* the right edge should be right on the region frame is the pixel + /* the right edge should be right on the region sample is the pixel * width is zero. Hence the additional + 1.0 at the end. */ @@ -750,18 +768,18 @@ AudioRegionView::reset_fade_out_shape_width (boost::shared_ptr ar, redraw_end_xfade_to (ar, width, points, effective_height, handle_right, pwidth); /* ensure trim handle stays on top */ - if (frame_handle_end) { - frame_handle_end->raise_to_top(); + if (sample_handle_end) { + sample_handle_end->raise_to_top(); } } -framepos_t +samplepos_t AudioRegionView::get_fade_in_shape_width () { return audio_region()->fade_in()->back()->when; } -framepos_t +samplepos_t AudioRegionView::get_fade_out_shape_width () { return audio_region()->fade_out()->back()->when; @@ -782,7 +800,7 @@ AudioRegionView::redraw_start_xfade () } void -AudioRegionView::redraw_start_xfade_to (boost::shared_ptr ar, framecnt_t /*width*/, Points& points, double effective_height, +AudioRegionView::redraw_start_xfade_to (boost::shared_ptr ar, samplecnt_t /*width*/, Points& points, double effective_height, double rect_width) { if (points.size() < 2) { @@ -871,8 +889,8 @@ AudioRegionView::redraw_end_xfade () } void -AudioRegionView::redraw_end_xfade_to (boost::shared_ptr ar, framecnt_t width, Points& points, double effective_height, - double rect_edge, double rect_width) +AudioRegionView::redraw_end_xfade_to (boost::shared_ptr ar, samplecnt_t width, Points& points, double effective_height, + double rect_edge, double rect_width) { if (points.size() < 2) { return; @@ -1123,7 +1141,7 @@ AudioRegionView::delete_waves () } _data_ready_connections.clear (); - for (vector::iterator w = waves.begin(); w != waves.end(); ++w) { + for (vector::iterator w = waves.begin(); w != waves.end(); ++w) { group->remove(*w); } waves.clear(); @@ -1216,12 +1234,12 @@ AudioRegionView::create_one_wave (uint32_t which, bool /*direct*/) } /* first waveview starts at 1.0, not 0.0 since that will overlap the - * frame + * sample */ gdouble yoff = which * ht; - WaveView *wave = new WaveView (group, audio_region ()); + ArdourWaveView::WaveView *wave = new ArdourWaveView::WaveView (group, audio_region ()); CANVAS_DEBUG_NAME (wave, string_compose ("wave view for chn %1 of %2", which, get_item_name())); wave->set_channel (which); @@ -1236,15 +1254,15 @@ AudioRegionView::create_one_wave (uint32_t which, bool /*direct*/) switch (UIConfiguration::instance().get_waveform_shape()) { case Rectified: - wave->set_shape (WaveView::Rectified); + wave->set_shape (ArdourWaveView::WaveView::Rectified); break; default: - wave->set_shape (WaveView::Normal); + wave->set_shape (ArdourWaveView::WaveView::Normal); } wave->set_logscaled (UIConfiguration::instance().get_waveform_scale() == Logarithmic); - vector v; + vector v; v.push_back (wave); set_some_waveform_colors (v); @@ -1283,11 +1301,10 @@ AudioRegionView::create_one_wave (uint32_t which, bool /*direct*/) pending_peak_data->hide (); /* Restore stacked coverage */ - std::string str = trackview.gui_property ("layer-display"); - if (!str.empty()) { - LayerDisplay layer_display; - update_coverage_frames (LayerDisplay (string_2_enum (str, layer_display))); - } + LayerDisplay layer_display; + if (trackview.get_gui_property ("layer-display", layer_display)) { + update_coverage_samples (layer_display); + } } /* channel wave created, don't hook into peaks ready anymore */ @@ -1309,20 +1326,33 @@ AudioRegionView::add_gain_point_event (ArdourCanvas::Item *item, GdkEvent *ev, b return; } - double x, y; + uint32_t before_p, after_p; + double mx = ev->button.x; + double my = ev->button.y; - /* don't create points that can't be seen */ + item->canvas_to_item (mx, my); - update_envelope_visibility (); + samplecnt_t const sample_within_region = (samplecnt_t) floor (mx * samples_per_pixel); - x = ev->button.x; - y = ev->button.y; + if (!gain_line->control_points_adjacent (sample_within_region, before_p, after_p)) { + /* no adjacent points */ + return; + } + + /*y is in item sample */ + double const bx = gain_line->nth (before_p)->get_x(); + double const ax = gain_line->nth (after_p)->get_x(); + double const click_ratio = (ax - mx) / (ax - bx); - item->canvas_to_item (x, y); - framepos_t rpos = region ()->position (); - framepos_t fx = trackview.editor().pixel_to_sample (x) + rpos; - trackview.editor ().snap_to_with_modifier (fx, ev); - fx -= rpos; + double y = ((gain_line->nth (before_p)->get_y() * click_ratio) + (gain_line->nth (after_p)->get_y() * (1 - click_ratio))); + + /* don't create points that can't be seen */ + + update_envelope_visibility (); + samplepos_t rpos = region ()->position (); + MusicSample snap_pos (trackview.editor().pixel_to_sample (mx) + rpos, 0); + trackview.editor ().snap_to_with_modifier (snap_pos, ev); + samplepos_t fx = snap_pos.sample - rpos; if (fx > _region->length()) { return; @@ -1330,11 +1360,11 @@ AudioRegionView::add_gain_point_event (ArdourCanvas::Item *item, GdkEvent *ev, b /* compute vertical fractional position */ - y = 1.0 - (y / (_height - NAME_HIGHLIGHT_SIZE)); + y = 1.0 - (y / (gain_line->height())); /* map using gain line */ - gain_line->view_to_model_coord (x, y); + gain_line->view_to_model_coord (mx, y); /* XXX STATEFUL: can't convert to stateful diff until we can represent automation data with it. @@ -1367,6 +1397,8 @@ AudioRegionView::add_gain_point_event (ArdourCanvas::Item *item, GdkEvent *ev, b trackview.editor ().commit_reversible_command (); trackview.session ()->set_dirty (); + } else { + delete region_memento; } } @@ -1381,7 +1413,10 @@ GhostRegion* AudioRegionView::add_ghost (TimeAxisView& tv) { RouteTimeAxisView* rtv = dynamic_cast(&trackview); - assert(rtv); + + if (!rtv) { + return 0; + } double unit_position = _region->position () / samples_per_pixel; AudioGhostRegion* ghost = new AudioGhostRegion (*this, tv, trackview, unit_position); @@ -1395,7 +1430,7 @@ AudioRegionView::add_ghost (TimeAxisView& tv) break; } - WaveView *wave = new WaveView (ghost->group, audio_region()); + ArdourWaveView::WaveView *wave = new ArdourWaveView::WaveView (ghost->group, audio_region()); CANVAS_DEBUG_NAME (wave, string_compose ("ghost wave for %1", get_item_name())); wave->set_channel (n); @@ -1515,12 +1550,12 @@ AudioRegionView::set_waveform_colors () } void -AudioRegionView::set_some_waveform_colors (vector& waves_to_color) +AudioRegionView::set_some_waveform_colors (vector& waves_to_color) { - ArdourCanvas::Color fill; - ArdourCanvas::Color outline; - ArdourCanvas::Color clip = UIConfiguration::instance().color ("clipped waveform"); - ArdourCanvas::Color zero = UIConfiguration::instance().color ("zero line"); + Gtkmm2ext::Color fill; + Gtkmm2ext::Color outline; + Gtkmm2ext::Color clip = UIConfiguration::instance().color ("clipped waveform"); + Gtkmm2ext::Color zero = UIConfiguration::instance().color ("zero line"); if (_selected) { if (_region->muted()) { @@ -1547,7 +1582,7 @@ AudioRegionView::set_some_waveform_colors (vector& wave } } - for (vector::iterator w = waves_to_color.begin(); w != waves_to_color.end(); ++w) { + for (vector::iterator w = waves_to_color.begin(); w != waves_to_color.end(); ++w) { (*w)->set_fill_color (fill); (*w)->set_outline_color (outline); (*w)->set_clip_color (clip); @@ -1556,13 +1591,13 @@ AudioRegionView::set_some_waveform_colors (vector& wave } void -AudioRegionView::set_frame_color () +AudioRegionView::set_sample_color () { - if (!frame) { + if (!sample) { return; } - RegionView::set_frame_color (); + RegionView::set_sample_color (); set_waveform_colors (); } @@ -1590,14 +1625,16 @@ AudioRegionView::set_fade_visibility (bool yn) } void -AudioRegionView::update_coverage_frames (LayerDisplay d) +AudioRegionView::update_coverage_samples (LayerDisplay d) { - RegionView::update_coverage_frames (d); + RegionView::update_coverage_samples (d); - if (fade_in_handle) { fade_in_handle->raise_to_top (); } - if (fade_out_handle) { fade_out_handle->raise_to_top (); } - if (fade_in_trim_handle) { fade_in_trim_handle->raise_to_top (); } - if (fade_out_trim_handle) { fade_out_trim_handle->raise_to_top (); } + if (d == Stacked) { + if (fade_in_handle) { fade_in_handle->raise_to_top (); } + if (fade_out_handle) { fade_out_handle->raise_to_top (); } + if (fade_in_trim_handle) { fade_in_trim_handle->raise_to_top (); } + if (fade_out_trim_handle) { fade_out_trim_handle->raise_to_top (); } + } } void @@ -1614,15 +1651,26 @@ AudioRegionView::show_region_editor () void AudioRegionView::transients_changed () { - AnalysisFeatureList analysis_features = _region->transients(); + AnalysisFeatureList analysis_features; + _region->transients (analysis_features); + samplepos_t position = _region->position(); + samplepos_t first = _region->first_sample(); + samplepos_t last = _region->last_sample(); - while (feature_lines.size() < analysis_features.size()) { + double y1; + if (_height >= NAME_HIGHLIGHT_THRESH) { + y1 = _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1; + } else { + y1 = _height - 1; + } + while (feature_lines.size() < analysis_features.size()) { ArdourCanvas::Line* canvas_item = new ArdourCanvas::Line(group); CANVAS_DEBUG_NAME (canvas_item, string_compose ("transient group for %1", region()->name())); + canvas_item->set_outline_color (UIConfiguration::instance().color ("zero line")); // also in Editor::leave_handler() canvas_item->set (ArdourCanvas::Duple (-1.0, 2.0), - ArdourCanvas::Duple (1.0, _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1)); + ArdourCanvas::Duple (1.0, y1)); canvas_item->raise_to_top (); canvas_item->show (); @@ -1640,28 +1688,34 @@ AudioRegionView::transients_changed () } AnalysisFeatureList::const_iterator i; - list >::iterator l; + list >::iterator l; for (i = analysis_features.begin(), l = feature_lines.begin(); i != analysis_features.end() && l != feature_lines.end(); ++i, ++l) { float *pos = new float; - *pos = trackview.editor().sample_to_pixel (*i); + *pos = trackview.editor().sample_to_pixel (*i - position); (*l).second->set ( ArdourCanvas::Duple (*pos, 2.0), - ArdourCanvas::Duple (*pos, _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1) + ArdourCanvas::Duple (*pos, y1) ); - (*l).second->set_data ("position", pos); + (*l).second->set_data ("position", pos); // is this *modified* (drag?), if not use *i (*l).first = *i; + + if (l->first < first || l->first >= last) { + l->second->hide(); + } else { + l->second->show(); + } } } void AudioRegionView::update_transient(float /*old_pos*/, float new_pos) { - /* Find frame at old pos, calulate new frame then update region transients*/ - list >::iterator l; + /* Find sample at old pos, calulate new sample then update region transients*/ + list >::iterator l; for (l = feature_lines.begin(); l != feature_lines.end(); ++l) { @@ -1670,31 +1724,30 @@ AudioRegionView::update_transient(float /*old_pos*/, float new_pos) float* pos = (float*) (*l).second->get_data ("position"); if (rint(new_pos) == rint(*pos)) { - - framepos_t old_frame = (*l).first; - framepos_t new_frame = trackview.editor().pixel_to_sample (new_pos); - - _region->update_transient (old_frame, new_frame); - - break; + samplepos_t position = _region->position(); + samplepos_t old_sample = (*l).first; + samplepos_t new_sample = trackview.editor().pixel_to_sample (new_pos) + position; + _region->update_transient (old_sample, new_sample); + break; } } } void -AudioRegionView::remove_transient(float pos) +AudioRegionView::remove_transient (float pos) { - /* Find frame at old pos, calulate new frame then update region transients*/ - list >::iterator l; + /* this is called from Editor::remove_transient () with pos == get_data ("position") + * which is the item's x-coordinate inside the ARV. + * + * Find sample at old pos, calulate new sample then update region transients + */ + list >::iterator l; for (l = feature_lines.begin(); l != feature_lines.end(); ++l) { - - /* Line has been updated in drag so we compare to new_pos */ float *line_pos = (float*) (*l).second->get_data ("position"); - if (rint(pos) == rint(*line_pos)) { - _region->remove_transient ((*l).first); - break; + _region->remove_transient ((*l).first); + break; } } }