diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index a29c1ebeef..bd5198e058 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -4758,8 +4758,7 @@ Editor::get_regions_at (RegionSelection& rs, framepos_t where, const TrackViewLi if ((tr = rtv->track()) && ((pl = tr->playlist()))) { - boost::shared_ptr regions = pl->regions_at ( - (framepos_t) floor ( (double) where * tr->speed())); + boost::shared_ptr regions = pl->regions_at (where); for (RegionList::iterator i = regions->begin(); i != regions->end(); ++i) { RegionView* rv = rtv->view()->find_view (*i); @@ -4791,8 +4790,7 @@ Editor::get_regions_after (RegionSelection& rs, framepos_t where, const TrackVie if ((tr = rtv->track()) && ((pl = tr->playlist()))) { - boost::shared_ptr regions = pl->regions_touched ( - (framepos_t) floor ( (double)where * tr->speed()), max_framepos); + boost::shared_ptr regions = pl->regions_touched (where, max_framepos); for (RegionList::iterator i = regions->begin(); i != regions->end(); ++i) { diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index cacfff699a..ccbdd242e4 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -1426,14 +1426,7 @@ RegionMoveDrag::RegionMoveDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, _copy (c) { DEBUG_TRACE (DEBUG::Drags, "New RegionMoveDrag\n"); - - double speed = 1; - RouteTimeAxisView* rtv = dynamic_cast (&_primary->get_time_axis_view ()); - if (rtv && rtv->is_track()) { - speed = rtv->track()->speed (); - } - - _last_frame_position = static_cast (_primary->region()->position() / speed); + _last_frame_position = _primary->region()->position(); } void @@ -2196,17 +2189,9 @@ TrimDrag::TrimDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, listget_time_axis_view (); - RouteTimeAxisView* tv = dynamic_cast(tvp); - - if (tv && tv->is_track()) { - speed = tv->track()->speed(); - } - - framepos_t const region_start = (framepos_t) (_primary->region()->position() / speed); - framepos_t const region_end = (framepos_t) (_primary->region()->last_frame() / speed); - framecnt_t const region_length = (framecnt_t) (_primary->region()->length() / speed); + framepos_t const region_start = _primary->region()->position(); + framepos_t const region_end = _primary->region()->last_frame(); + framecnt_t const region_length = _primary->region()->length(); framepos_t const pf = adjusted_current_frame (event); @@ -2264,17 +2249,9 @@ void TrimDrag::motion (GdkEvent* event, bool first_move) { RegionView* rv = _primary; - - double speed = 1.0; - TimeAxisView* tvp = &_primary->get_time_axis_view (); - RouteTimeAxisView* tv = dynamic_cast(tvp); pair >::iterator,bool> insert_result; frameoffset_t frame_delta = 0; - if (tv && tv->is_track()) { - speed = tv->track()->speed(); - } - framecnt_t dt = adjusted_current_frame (event) - raw_grab_frame () + _pointer_frame_offset; if (first_move) { @@ -2404,10 +2381,10 @@ TrimDrag::motion (GdkEvent* event, bool first_move) switch (_operation) { case StartTrim: - show_verbose_cursor_time ((framepos_t) (rv->region()->position() / speed)); + show_verbose_cursor_time (rv->region()->position()); break; case EndTrim: - show_verbose_cursor_time ((framepos_t) (rv->region()->last_frame() / speed)); + show_verbose_cursor_time (rv->region()->last_frame()); break; case ContentsTrim: // show_verbose_cursor_time (frame_delta); diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index e17ddfb41e..012cfbd8b9 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -1991,28 +1991,21 @@ Editor::region_view_item_click (AudioRegionView& rv, GdkEventButton* event) */ if (Keyboard::modifier_state_contains (event->state, Keyboard::PrimaryModifier)) { - TimeAxisView* tv = &rv.get_time_axis_view(); - RouteTimeAxisView* rtv = dynamic_cast(tv); - double speed = 1.0; - if (rtv && rtv->is_track()) { - speed = rtv->track()->speed(); - } - framepos_t where = get_preferred_edit_position(); if (where >= 0) { if (Keyboard::modifier_state_equals (event->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::SecondaryModifier))) { - align_region (rv.region(), SyncPoint, (framepos_t) (where * speed)); + align_region (rv.region(), SyncPoint, where); } else if (Keyboard::modifier_state_equals (event->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) { - align_region (rv.region(), End, (framepos_t) (where * speed)); + align_region (rv.region(), End, where); } else { - align_region (rv.region(), Start, (framepos_t) (where * speed)); + align_region (rv.region(), Start, where); } } } @@ -2188,11 +2181,10 @@ Editor::mouse_brush_insert_region (RegionView* rv, framepos_t pos) } boost::shared_ptr playlist = rtv->playlist(); - double speed = rtv->track()->speed(); playlist->clear_changes (); boost::shared_ptr new_region (RegionFactory::create (rv->region(), true)); - playlist->add_region (new_region, (framepos_t) (pos * speed)); + playlist->add_region (new_region, pos); _session->add_command (new StatefulDiffCommand (playlist)); // playlist is frozen, so we have to update manually XXX this is disgusting diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 2683020cbf..d2314e6a5b 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -737,17 +737,6 @@ Editor::build_region_boundary_cache () break; } - float speed = 1.0f; - RouteTimeAxisView *rtav; - - if (ontrack != 0 && (rtav = dynamic_cast(ontrack)) != 0 ) { - if (rtav->track() != 0) { - speed = rtav->track()->speed(); - } - } - - rpos = track_frame_to_session_frame (rpos, speed); - if (rpos < lpos) { lpos = rpos; } @@ -785,24 +774,12 @@ Editor::find_next_region (framepos_t frame, RegionPoint point, int32_t dir, Trac boost::shared_ptr ret; framepos_t rpos = 0; - float track_speed; - framepos_t track_frame; - RouteTimeAxisView *rtav; - for (i = tracks.begin(); i != tracks.end(); ++i) { framecnt_t distance; boost::shared_ptr r; - track_speed = 1.0f; - if ( (rtav = dynamic_cast(*i)) != 0 ) { - if (rtav->track()!=0) - track_speed = rtav->track()->speed(); - } - - track_frame = session_frame_to_track_frame(frame, track_speed); - - if ((r = (*i)->find_next_region (track_frame, point, dir)) == 0) { + if ((r = (*i)->find_next_region (frame, point, dir)) == 0) { continue; } @@ -820,9 +797,6 @@ Editor::find_next_region (framepos_t frame, RegionPoint point, int32_t dir, Trac break; } - // rpos is a "track frame", converting it to "_session frame" - rpos = track_frame_to_session_frame(rpos, track_speed); - if (rpos > frame) { distance = rpos - frame; } else { @@ -990,17 +964,6 @@ Editor::cursor_to_region_point (EditorCursor* cursor, RegionPoint point, int32_t break; } - float speed = 1.0f; - RouteTimeAxisView *rtav; - - if ( ontrack != 0 && (rtav = dynamic_cast(ontrack)) != 0 ) { - if (rtav->track() != 0) { - speed = rtav->track()->speed(); - } - } - - pos = track_frame_to_session_frame(pos, speed); - if (cursor == playhead_cursor) { _session->request_locate (pos); } else { @@ -1181,17 +1144,6 @@ Editor::selected_marker_to_region_point (RegionPoint point, int32_t dir) break; } - float speed = 1.0f; - RouteTimeAxisView *rtav; - - if (ontrack != 0 && (rtav = dynamic_cast(ontrack)) != 0) { - if (rtav->track() != 0) { - speed = rtav->track()->speed(); - } - } - - pos = track_frame_to_session_frame(pos, speed); - loc->move_to (pos); } @@ -2866,9 +2818,6 @@ Editor::separate_regions_between (const TimeSelection& ts) /* XXX need to consider musical time selections here at some point */ - double speed = rtv->track()->speed(); - - for (list::const_iterator t = ts.begin(); t != ts.end(); ++t) { sigc::connection c = rtv->view()->RegionViewAdded.connect ( @@ -2876,8 +2825,7 @@ Editor::separate_regions_between (const TimeSelection& ts) latest_regionviews.clear (); - playlist->partition ((framepos_t)((*t).start * speed), - (framepos_t)((*t).end * speed), false); + playlist->partition ((*t).start, (*t).end, false); c.disconnect (); @@ -3551,19 +3499,8 @@ Editor::trim_region_to_location (const Location& loc, const char* str) return; } - float speed = 1.0; - framepos_t start; - framepos_t end; - - if (tav->track() != 0) { - speed = tav->track()->speed(); - } - - start = session_frame_to_track_frame (loc.start(), speed); - end = session_frame_to_track_frame (loc.end(), speed); - rv->region()->clear_changes (); - rv->region()->trim_to (start, (end - start)); + rv->region()->trim_to (loc.start(), (loc.end() - loc.start())); _session->add_command(new StatefulDiffCommand (rv->region())); } @@ -3605,13 +3542,6 @@ Editor::trim_to_region(bool forward) return; } - float speed = 1.0; - - if (atav->track() != 0) { - speed = atav->track()->speed(); - } - - boost::shared_ptr region = arv->region(); boost::shared_ptr playlist (region->playlist()); @@ -3625,18 +3555,18 @@ Editor::trim_to_region(bool forward) continue; } - region->trim_end((framepos_t) ( (next_region->first_frame() - 1) * speed)); + region->trim_end (next_region->first_frame() - 1); arv->region_changed (PropertyChange (ARDOUR::Properties::length)); } else { next_region = playlist->find_next_region (region->first_frame(), Start, 0); - if(!next_region){ + if (!next_region){ continue; } - region->trim_front((framepos_t) ((next_region->last_frame() + 1) * speed)); + region->trim_front(next_region->last_frame() + 1); arv->region_changed (ARDOUR::bounds_change); } diff --git a/gtk2_ardour/region_view.cc b/gtk2_ardour/region_view.cc index 735e5dd09c..12e43be55c 100644 --- a/gtk2_ardour/region_view.cc +++ b/gtk2_ardour/region_view.cc @@ -847,12 +847,9 @@ RegionView::trim_front (framepos_t new_bound, bool no_overlap) return false; } - RouteTimeAxisView& rtv = dynamic_cast (trackview); - double const speed = rtv.track()->speed (); - framepos_t const pre_trim_first_frame = _region->first_frame(); - _region->trim_front ((framepos_t) (new_bound * speed)); + _region->trim_front (new_bound); if (no_overlap) { // Get the next region on the left of this region and shrink/expand it. @@ -883,12 +880,9 @@ RegionView::trim_end (framepos_t new_bound, bool no_overlap) return false; } - RouteTimeAxisView& rtv = dynamic_cast (trackview); - double const speed = rtv.track()->speed (); - framepos_t const pre_trim_last_frame = _region->last_frame(); - _region->trim_end ((framepos_t) (new_bound * speed)); + _region->trim_end (new_bound); if (no_overlap) { // Get the next region on the right of this region and shrink/expand it. diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index 92bee3a4fe..125c77e3a4 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -301,7 +301,6 @@ RouteTimeAxisView::set_route (boost::shared_ptr rt) } track()->FreezeChange.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::map_frozen, this), gui_context()); - track()->SpeedChanged.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::speed_changed, this), gui_context()); /* pick up the correct freeze state */ map_frozen (); @@ -1047,17 +1046,11 @@ RouteTimeAxisView::reset_samples_per_pixel () void RouteTimeAxisView::set_samples_per_pixel (double fpp) { - double speed = 1.0; - - if (track()) { - speed = track()->speed(); - } - if (_view) { - _view->set_samples_per_pixel (fpp * speed); + _view->set_samples_per_pixel (fpp); } - TimeAxisView::set_samples_per_pixel (fpp * speed); + TimeAxisView::set_samples_per_pixel (fpp); } void @@ -1272,12 +1265,6 @@ RouteTimeAxisView::clear_playlist () _editor.clear_playlist (pl); } -void -RouteTimeAxisView::speed_changed () -{ - Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&RouteTimeAxisView::reset_samples_per_pixel, this)); -} - void RouteTimeAxisView::update_diskstream_display () { @@ -1353,24 +1340,15 @@ RouteTimeAxisView::set_selected_regionviews (RegionSelection& regions) void RouteTimeAxisView::get_selectables (framepos_t start, framepos_t end, double top, double bot, list& results, bool within) { - double speed = 1.0; - - if (track() != 0) { - speed = track()->speed(); - } - - framepos_t const start_adjusted = session_frame_to_track_frame(start, speed); - framepos_t const end_adjusted = session_frame_to_track_frame(end, speed); - if ((_view && ((top < 0.0 && bot < 0.0))) || touched (top, bot)) { - _view->get_selectables (start_adjusted, end_adjusted, top, bot, results, within); + _view->get_selectables (start, end, top, bot, results, within); } /* pick up visible automation tracks */ for (Children::iterator i = children.begin(); i != children.end(); ++i) { if (!(*i)->hidden()) { - (*i)->get_selectables (start_adjusted, end_adjusted, top, bot, results, within); + (*i)->get_selectables (start, end, top, bot, results, within); } } } @@ -1482,19 +1460,10 @@ RouteTimeAxisView::fade_range (TimeSelection& selection) playlist = tr->playlist(); - TimeSelection time (selection); - float const speed = tr->speed(); - if (speed != 1.0f) { - for (TimeSelection::iterator i = time.begin(); i != time.end(); ++i) { - (*i).start = session_frame_to_track_frame((*i).start, speed); - (*i).end = session_frame_to_track_frame((*i).end, speed); - } - } - playlist->clear_changes (); playlist->clear_owned_changes (); - playlist->fade_range (time); + playlist->fade_range (selection); vector cmds; playlist->rdiff (cmds); @@ -1517,23 +1486,14 @@ RouteTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op) playlist = tr->playlist(); - TimeSelection time (selection.time); - float const speed = tr->speed(); - if (speed != 1.0f) { - for (TimeSelection::iterator i = time.begin(); i != time.end(); ++i) { - (*i).start = session_frame_to_track_frame((*i).start, speed); - (*i).end = session_frame_to_track_frame((*i).end, speed); - } - } - playlist->clear_changes (); playlist->clear_owned_changes (); switch (op) { case Delete: - if (playlist->cut (time) != 0) { + if (playlist->cut (selection.time) != 0) { if (Config->get_edit_mode() == Ripple) - playlist->ripple(time.start(), -time.length(), NULL); + playlist->ripple(selection.time.start(), -selection.time.length(), NULL); // no need to exclude any regions from rippling here vector cmds; @@ -1545,10 +1505,10 @@ RouteTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op) break; case Cut: - if ((what_we_got = playlist->cut (time)) != 0) { + if ((what_we_got = playlist->cut (selection.time)) != 0) { _editor.get_cut_buffer().add (what_we_got); if (Config->get_edit_mode() == Ripple) - playlist->ripple(time.start(), -time.length(), NULL); + playlist->ripple(selection.time.start(), -selection.time.length(), NULL); // no need to exclude any regions from rippling here vector cmds; @@ -1559,15 +1519,15 @@ RouteTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op) } break; case Copy: - if ((what_we_got = playlist->copy (time)) != 0) { + if ((what_we_got = playlist->copy (selection.time)) != 0) { _editor.get_cut_buffer().add (what_we_got); } break; case Clear: - if ((what_we_got = playlist->cut (time)) != 0) { + if ((what_we_got = playlist->cut (selection.time)) != 0) { if (Config->get_edit_mode() == Ripple) - playlist->ripple(time.start(), -time.length(), NULL); + playlist->ripple(selection.time.start(), -selection.time.length(), NULL); // no need to exclude any regions from rippling here vector cmds; @@ -1598,11 +1558,6 @@ RouteTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteConte DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("paste to %1\n", pos)); - if (track()->speed() != 1.0f) { - pos = session_frame_to_track_frame (pos, track()->speed()); - DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("modified paste to %1\n", pos)); - } - /* add multi-paste offset if applicable */ std::pair extent = (*p)->get_extent(); const framecnt_t duration = extent.second - extent.first; diff --git a/libs/ardour/ardour/diskstream.h b/libs/ardour/ardour/diskstream.h index cde21b209f..4721a18dca 100644 --- a/libs/ardour/ardour/diskstream.h +++ b/libs/ardour/ardour/diskstream.h @@ -114,8 +114,6 @@ class LIBARDOUR_API Diskstream : public SessionObject, public PublicDiskstream bool hidden() const { return _flags & Hidden; } bool recordable() const { return _flags & Recordable; } bool non_layered() const { return _flags & NonLayered; } - bool reversed() const { return _actual_speed < 0.0f; } - double speed() const { return _visible_speed; } virtual void punch_in() {} virtual void punch_out() {} @@ -176,7 +174,6 @@ class LIBARDOUR_API Diskstream : public SessionObject, public PublicDiskstream } PBD::Signal0 RecordEnableChanged; - PBD::Signal0 SpeedChanged; PBD::Signal0 ReverseChanged; /* Emitted when this diskstream is set to use a different playlist */ PBD::Signal0 PlaylistChanged; @@ -248,7 +245,7 @@ class LIBARDOUR_API Diskstream : public SessionObject, public PublicDiskstream virtual void allocate_temporary_buffers () = 0; - virtual bool realtime_set_speed (double, bool global_change); + virtual bool realtime_set_speed (double); std::list > _last_capture_sources; @@ -287,8 +284,6 @@ class LIBARDOUR_API Diskstream : public SessionObject, public PublicDiskstream boost::shared_ptr _playlist; mutable gint _record_enabled; - double _visible_speed; - double _actual_speed; /* items needed for speed change logic */ bool _buffer_reallocation_required; bool _seek_required; @@ -317,9 +312,7 @@ class LIBARDOUR_API Diskstream : public SessionObject, public PublicDiskstream IOChange input_change_pending; framecnt_t wrap_buffer_size; framecnt_t speed_buffer_size; - - double _speed; - double _target_speed; + bool _reversed; /** The next frame position that we should be reading from in our playlist */ framepos_t file_frame; diff --git a/libs/ardour/ardour/public_diskstream.h b/libs/ardour/ardour/public_diskstream.h index 1fc93a6674..8c677f7e14 100644 --- a/libs/ardour/ardour/public_diskstream.h +++ b/libs/ardour/ardour/public_diskstream.h @@ -56,10 +56,9 @@ public: virtual framecnt_t get_captured_frames (uint32_t n = 0) const = 0; virtual int set_loop (Location *) = 0; virtual void transport_looped (framepos_t) = 0; - virtual bool realtime_set_speed (double, bool) = 0; + virtual bool realtime_set_speed (double) = 0; virtual void transport_stopped_wallclock (struct tm &, time_t, bool) = 0; virtual bool pending_overwrite () const = 0; - virtual double speed () const = 0; virtual void prepare_to_stop (framepos_t,framepos_t) = 0; virtual void set_slaved (bool) = 0; virtual ChanCount n_channels () = 0; diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index d1b64f2e5c..f096e190bd 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -348,7 +348,6 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop void request_overwrite_buffer (Track *); void adjust_playback_buffering(); void adjust_capture_buffering(); - void request_track_speed (Track *, double speed); void request_input_change_handling (); bool locate_pending() const { return static_cast(post_transport_work()&PostTransportLocate); } @@ -1339,7 +1338,6 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop void locate (framepos_t, bool with_roll, bool with_flush, bool with_loop=false, bool force=false, bool with_mmc=true); void start_locate (framepos_t, bool with_roll, bool with_flush, bool with_loop=false, bool force=false); void force_locate (framepos_t frame, bool with_roll = false); - void set_track_speed (Track *, double speed); void set_transport_speed (double speed, framepos_t destination_frame, bool abort = false, bool clear_state = false, bool as_default = false); void stop_transport (bool abort = false, bool clear_state = false); void start_transport (); diff --git a/libs/ardour/ardour/session_event.h b/libs/ardour/ardour/session_event.h index 3f7fc6c092..f5a7414dba 100644 --- a/libs/ardour/ardour/session_event.h +++ b/libs/ardour/ardour/session_event.h @@ -40,7 +40,6 @@ class LIBARDOUR_API SessionEvent { public: enum Type { SetTransportSpeed, - SetTrackSpeed, Locate, LocateRoll, LocateRollLocate, diff --git a/libs/ardour/ardour/track.h b/libs/ardour/ardour/track.h index 5e05ec373c..39326c4652 100644 --- a/libs/ardour/ardour/track.h +++ b/libs/ardour/ardour/track.h @@ -139,10 +139,9 @@ class LIBARDOUR_API Track : public Route, public PublicDiskstream framecnt_t get_captured_frames (uint32_t n = 0) const; int set_loop (Location *); void transport_looped (framepos_t); - bool realtime_set_speed (double, bool); + bool realtime_set_speed (double); void transport_stopped_wallclock (struct tm &, time_t, bool); bool pending_overwrite () const; - double speed () const; void prepare_to_stop (framepos_t, framepos_t); void set_slaved (bool); ChanCount n_channels (); @@ -165,7 +164,6 @@ class LIBARDOUR_API Track : public Route, public PublicDiskstream /* Emitted when our diskstream is set to use a different playlist */ PBD::Signal0 PlaylistChanged; PBD::Signal0 RecordEnableChanged; - PBD::Signal0 SpeedChanged; PBD::Signal0 AlignmentStyleChanged; protected: @@ -227,7 +225,6 @@ private: void diskstream_playlist_changed (); void diskstream_record_enable_changed (); - void diskstream_speed_changed (); void diskstream_alignment_style_changed (); void parameter_changed (std::string const & p); diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 8cdb372da8..2e9ee046d0 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -670,19 +670,6 @@ LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::WaveformSh LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf); LIBARDOUR_API std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf); - -static inline ARDOUR::framepos_t -session_frame_to_track_frame (ARDOUR::framepos_t session_frame, double speed) -{ - return (ARDOUR::framepos_t) ((long double) session_frame * (long double) speed); -} - -static inline ARDOUR::framepos_t -track_frame_to_session_frame (ARDOUR::framepos_t track_frame, double speed) -{ - return (ARDOUR::framepos_t) ((long double) track_frame / (long double) speed); -} - /* for now, break the rules and use "using" to make this "global" */ using ARDOUR::framepos_t; diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc index 4facf5db64..e60578b622 100644 --- a/libs/ardour/audio_diskstream.cc +++ b/libs/ardour/audio_diskstream.cc @@ -192,23 +192,13 @@ AudioDiskstream::non_realtime_input_change () /* now refill channel buffers */ - if (speed() != 1.0f || speed() != -1.0f) { - seek ((framepos_t) (_session.transport_frame() * (double) speed())); - } else { - seek (_session.transport_frame()); - } + seek (_session.transport_frame()); } void AudioDiskstream::non_realtime_locate (framepos_t location) { - /* now refill channel buffers */ - - if (speed() != 1.0f || speed() != -1.0f) { - seek ((framepos_t) (location * (double) speed())); - } else { - seek (location); - } + seek (location); } void @@ -586,10 +576,10 @@ AudioDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t framecnt_t necessary_samples; - /* no varispeed playback if we're recording, because the output .... TBD */ + /* no reverse of varispeed playback if we're recording, because the output .... TBD */ - if (rec_nframes == 0 && _actual_speed != 1.0f) { - necessary_samples = (framecnt_t) ceil ((nframes * fabs (_actual_speed))) + 2; + if (rec_nframes == 0 && _session.transport_speed() != 1.0f) { + necessary_samples = (framecnt_t) ceil ((nframes * fabs (_session.transport_speed()))) + 2; } else { necessary_samples = nframes; } @@ -649,9 +639,9 @@ AudioDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t } } - if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) { + if (rec_nframes == 0 && fabs (_session.transport_speed()) != 1.0f) { - interpolation.set_speed (_target_speed); + interpolation.set_speed (fabs (_session.transport_speed())); int channel = 0; for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++channel) { @@ -666,8 +656,6 @@ AudioDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t } else { playback_distance = nframes; } - - _speed = _target_speed; } if (need_disk_signal) { @@ -720,8 +708,8 @@ AudioDiskstream::calculate_playback_distance (pframes_t nframes) if (record_enabled()) { playback_distance = nframes; - } else if (_actual_speed != 1.0f && _actual_speed != -1.0f) { - interpolation.set_speed (_target_speed); + } else if (fabs (_session.transport_speed()) != 1.0) { + interpolation.set_speed (fabs (_session.transport_speed())); boost::shared_ptr c = channels.reader(); int channel = 0; for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++channel) { @@ -731,7 +719,7 @@ AudioDiskstream::calculate_playback_distance (pframes_t nframes) playback_distance = nframes; } - if (_actual_speed < 0.0) { + if (_session.transport_speed() < 0.0) { return -playback_distance; } else { return playback_distance; @@ -750,8 +738,8 @@ AudioDiskstream::commit (framecnt_t playback_distance) if (!_io || !_io->active()) { return false; } - - if (_actual_speed < 0.0) { + + if (_session.transport_speed() < 0.0) { playback_sample -= playback_distance; } else { playback_sample += playback_distance; @@ -821,7 +809,7 @@ AudioDiskstream::overwrite_existing_buffers () Sample* mixdown_buffer; float* gain_buffer; int ret = -1; - bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f; + bool reversed = _session.transport_speed() < 0.0; overwrite_queued = false; @@ -1074,7 +1062,7 @@ AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer) int32_t ret = 0; framecnt_t to_read; RingBufferNPT::rw_vector vector; - bool const reversed = (_visible_speed * _session.transport_speed()) < 0.0f; + bool const reversed = _session.transport_speed() < 0.0f; framecnt_t total_space; framecnt_t zero_fill; uint32_t chan_n; @@ -1121,7 +1109,7 @@ AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer) the playback buffer is empty. */ - if ((total_space < disk_read_chunk_frames) && fabs (_actual_speed) < 2.0f) { + if ((total_space < disk_read_chunk_frames) && fabs (_session.transport_speed()) < 2.0f) { return 0; } @@ -2026,7 +2014,7 @@ AudioDiskstream::allocate_temporary_buffers () when slaving to MTC, Timecode etc. */ - double const sp = max (fabsf (_actual_speed), 1.2f); + double const sp = max (fabsf (_session.transport_speed()), 1.2f); framecnt_t required_wrap_size = (framecnt_t) ceil (_session.get_block_size() * sp) + 2; if (required_wrap_size > wrap_buffer_size) { diff --git a/libs/ardour/diskstream.cc b/libs/ardour/diskstream.cc index 49d9d62ec4..89f16cffe9 100644 --- a/libs/ardour/diskstream.cc +++ b/libs/ardour/diskstream.cc @@ -64,8 +64,6 @@ Diskstream::Diskstream (Session &sess, const string &name, Flag flag) , i_am_the_modifier (0) , _track (0) , _record_enabled (0) - , _visible_speed (1.0f) - , _actual_speed (1.0f) , _buffer_reallocation_required (false) , _seek_required (false) , capture_start_frame (0) @@ -87,8 +85,6 @@ Diskstream::Diskstream (Session &sess, const string &name, Flag flag) , overwrite_queued (false) , wrap_buffer_size (0) , speed_buffer_size (0) - , _speed (1.0) - , _target_speed (_speed) , file_frame (0) , playback_sample (0) , in_set_state (false) @@ -102,8 +98,6 @@ Diskstream::Diskstream (Session& sess, const XMLNode& /*node*/) , i_am_the_modifier (0) , _track (0) , _record_enabled (0) - , _visible_speed (1.0f) - , _actual_speed (1.0f) , _buffer_reallocation_required (false) , _seek_required (false) , capture_start_frame (0) @@ -125,8 +119,6 @@ Diskstream::Diskstream (Session& sess, const XMLNode& /*node*/) , overwrite_queued (false) , wrap_buffer_size (0) , speed_buffer_size (0) - , _speed (1.0) - , _target_speed (_speed) , file_frame (0) , playback_sample (0) , in_set_state (false) @@ -195,46 +187,18 @@ Diskstream::non_realtime_set_speed () } if (_seek_required) { - if (speed() != 1.0f || speed() != -1.0f) { - seek ((framepos_t) (_session.transport_frame() * (double) speed()), true); - } - else { - seek (_session.transport_frame(), true); - } - + seek (_session.transport_frame(), true); _seek_required = false; } } bool -Diskstream::realtime_set_speed (double sp, bool global) +Diskstream::realtime_set_speed (double new_speed) { - bool changed = false; - double new_speed = sp * _session.transport_speed(); - - if (_visible_speed != sp) { - _visible_speed = sp; - changed = true; - } - - if (new_speed != _actual_speed) { - - framecnt_t required_wrap_size = (framecnt_t) ceil (_session.get_block_size() * - fabs (new_speed)) + 2; - - if (required_wrap_size > wrap_buffer_size) { - _buffer_reallocation_required = true; - } - - _actual_speed = new_speed; - _target_speed = fabs(_actual_speed); - } - - if (changed) { - if (!global) { - _seek_required = true; - } - SpeedChanged (); /* EMIT SIGNAL */ + framecnt_t required_wrap_size = (framecnt_t) ceil (_session.get_block_size() * fabs (new_speed)) + 2; + + if (required_wrap_size > wrap_buffer_size) { + _buffer_reallocation_required = true; } return _buffer_reallocation_required || _seek_required; @@ -465,8 +429,6 @@ Diskstream::get_state () node->add_property("name", _name); id().print (buf, sizeof (buf)); node->add_property("id", buf); - snprintf (buf, sizeof(buf), "%f", _visible_speed); - node->add_property ("speed", buf); node->add_property ("capture-alignment", enum_2_string (_alignment_choice)); if (_extra_xml) { @@ -509,14 +471,6 @@ Diskstream::set_state (const XMLNode& node, int /*version*/) return -1; } - if ((prop = node.property ("speed")) != 0) { - double sp = atof (prop->value().c_str()); - - if (realtime_set_speed (sp, false)) { - non_realtime_set_speed (); - } - } - return 0; } diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index 0f60e3589d..8c6fe39bb2 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -357,7 +357,6 @@ setup_enum_writer () REGISTER (_Session_RecordState); REGISTER_CLASS_ENUM (SessionEvent, SetTransportSpeed); - REGISTER_CLASS_ENUM (SessionEvent, SetTrackSpeed); REGISTER_CLASS_ENUM (SessionEvent, Locate); REGISTER_CLASS_ENUM (SessionEvent, LocateRoll); REGISTER_CLASS_ENUM (SessionEvent, LocateRollLocate); diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc index 3e04876eb4..93379d6bfb 100644 --- a/libs/ardour/midi_diskstream.cc +++ b/libs/ardour/midi_diskstream.cc @@ -199,12 +199,7 @@ MidiDiskstream::non_realtime_input_change () /* now refill channel buffers */ - if (speed() != 1.0f || speed() != -1.0f) { - seek ((framepos_t) (_session.transport_frame() * (double) speed())); - } - else { - seek (_session.transport_frame()); - } + seek (_session.transport_frame()); g_atomic_int_set(const_cast (&_frames_pending_write), 0); g_atomic_int_set(const_cast (&_num_captured_loops), 0); @@ -545,7 +540,7 @@ MidiDiskstream::calculate_playback_distance (pframes_t nframes) /* XXX: should be doing varispeed stuff once it's implemented in ::process() above */ - if (_actual_speed < 0.0) { + if (_session.transport_speed() < 0.0) { return -playback_distance; } else { return playback_distance; @@ -557,7 +552,7 @@ MidiDiskstream::commit (framecnt_t playback_distance) { bool need_butler = false; - if (_actual_speed < 0.0) { + if (_session.transport_speed() < 0.0) { playback_sample -= playback_distance; } else { playback_sample += playback_distance; @@ -768,7 +763,7 @@ MidiDiskstream::do_refill () { int ret = 0; size_t write_space = _playback_buf->write_space(); - bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f; + bool reversed = _session.transport_speed() < 0.0f; if (write_space == 0) { return 0; diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc index 86f427f792..d396782ed4 100644 --- a/libs/ardour/session_process.cc +++ b/libs/ardour/session_process.cc @@ -1125,10 +1125,6 @@ Session::process_event (SessionEvent* ev) overwrite_some_buffers (static_cast(ev->ptr)); break; - case SessionEvent::SetTrackSpeed: - set_track_speed (static_cast (ev->ptr), ev->speed); - break; - case SessionEvent::SetSyncSource: DEBUG_TRACE (DEBUG::Slave, "seen request for new slave\n"); use_sync_source (ev->slave); diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index 9750d91ce8..47a405968c 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -128,14 +128,6 @@ Session::request_transport_speed_nonzero (double speed, bool as_default) request_transport_speed (speed, as_default); } -void -Session::request_track_speed (Track* tr, double speed) -{ - SessionEvent* ev = new SessionEvent (SessionEvent::SetTrackSpeed, SessionEvent::Add, SessionEvent::Immediate, 0, speed); - ev->set_ptr (tr); - queue_event (ev); -} - void Session::request_stop (bool abort, bool clear_state) { @@ -319,7 +311,7 @@ Session::butler_transport_work () finished = true; ptw = post_transport_work(); - DEBUG_TRACE (DEBUG::Transport, string_compose ("Butler transport work, todo = %1\n", enum_2_string (ptw))); + DEBUG_TRACE (DEBUG::Transport, string_compose ("Butler transport work, todo = %1 PH=%2 @ %3\n", enum_2_string (ptw), _transport_frame, g_get_monotonic_time())); if (ptw & PostTransportAdjustPlaybackBuffering) { for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { @@ -446,6 +438,7 @@ void Session::non_realtime_locate () { boost::shared_ptr rl = routes.reader(); + for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) { (*i)->non_realtime_locate (_transport_frame); } @@ -1224,7 +1217,7 @@ Session::set_transport_speed (double speed, framepos_t destination_frame, bool a boost::shared_ptr rl = routes.reader(); for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) { boost::shared_ptr tr = boost::dynamic_pointer_cast (*i); - if (tr && tr->realtime_set_speed (tr->speed(), true)) { + if (tr && tr->realtime_set_speed (_transport_speed)) { todo = PostTransportWork (todo | PostTransportSpeed); } } @@ -1362,7 +1355,7 @@ Session::start_transport () for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) { boost::shared_ptr tr = boost::dynamic_pointer_cast (*i); if (tr) { - tr->realtime_set_speed (tr->speed(), true); + tr->realtime_set_speed (_transport_speed); } } @@ -1456,7 +1449,7 @@ Session::use_sync_source (Slave* new_slave) for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) { boost::shared_ptr tr = boost::dynamic_pointer_cast (*i); if (tr && !tr->hidden()) { - if (tr->realtime_set_speed (tr->speed(), true)) { + if (tr->realtime_set_speed (_transport_speed)) { non_rt_required = true; } tr->set_slaved (_slave != 0); @@ -1548,16 +1541,6 @@ Session::switch_to_sync_source (SyncSource src) request_sync_source (new_slave); } -void -Session::set_track_speed (Track* track, double speed) -{ - if (track->realtime_set_speed (speed, false)) { - add_post_transport_work (PostTransportSpeed); - _butler->schedule_transport_work (); - set_dirty (); - } -} - void Session::unset_play_range () { diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index 1426c3926c..e809334321 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -558,7 +558,6 @@ Track::set_diskstream (boost::shared_ptr ds) ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this)); diskstream_playlist_changed (); ds->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_enable_changed, this)); - ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this)); ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this)); } @@ -574,12 +573,6 @@ Track::diskstream_record_enable_changed () RecordEnableChanged (); /* EMIT SIGNAL */ } -void -Track::diskstream_speed_changed () -{ - SpeedChanged (); /* EMIT SIGNAL */ -} - void Track::diskstream_alignment_style_changed () { @@ -738,9 +731,9 @@ Track::transport_looped (framepos_t p) } bool -Track::realtime_set_speed (double s, bool g) +Track::realtime_set_speed (double s) { - return _diskstream->realtime_set_speed (s, g); + return _diskstream->realtime_set_speed (s); } void @@ -755,12 +748,6 @@ Track::pending_overwrite () const return _diskstream->pending_overwrite (); } -double -Track::speed () const -{ - return _diskstream->speed (); -} - void Track::prepare_to_stop (framepos_t t, framepos_t a) {