speed = get_diskstream()->speed();
}
- jack_nframes_t start_adjusted = (jack_nframes_t) (start * speed);
- jack_nframes_t end_adjusted = (jack_nframes_t) (end * speed);
-
+ jack_nframes_t start_adjusted = session_frame_to_track_frame(start, speed);
+ jack_nframes_t end_adjusted = session_frame_to_track_frame(start, speed);
+
if (view && touched (top, bot)) {
view->get_selectables (start_adjusted, end_adjusted, results);
}
float speed = ds->speed();
if (speed != 1.0f) {
for (TimeSelection::iterator i = time.begin(); i != time.end(); ++i) {
- (*i).start = (jack_nframes_t)floor( (float) (*i).start * speed);
- (*i).end = (jack_nframes_t)floor( (float) (*i).end * speed);
+ (*i).start = session_frame_to_track_frame((*i).start, speed);
+ (*i).end = session_frame_to_track_frame((*i).end, speed);
}
}
}
if (get_diskstream()->speed() != 1.0f)
- pos = (jack_nframes_t) floor( (float) pos * get_diskstream()->speed() );
+ pos = session_frame_to_track_frame(pos, get_diskstream()->speed() );
_session.add_undo (playlist->get_memento());
playlist->paste (**p, pos, times);
}
}
- rpos = (jack_nframes_t) floor ( (float) rpos / speed );
+ rpos = track_frame_to_session_frame(rpos, speed);
if (region_boundary_cache.empty() || rpos != region_boundary_cache.back()) {
if (snap_type == SnapToRegionBoundary) {
track_speed = atav->get_diskstream()->speed();
}
- track_frame = (jack_nframes_t) floor ( (float) frame * track_speed );
+ track_frame = session_frame_to_track_frame(frame, track_speed);
if ((r = (*i)->find_next_region (track_frame, point, dir)) == 0) {
continue;
rpos = r->adjust_to_sync (r->first_frame());
break;
}
- // rpos is a "track frame", converting it to "time frame"
- rpos = (jack_nframes_t) floor ( (float) rpos / track_speed );
+ // 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;
}
}
- pos = (jack_nframes_t) floor ( (float) pos / speed );
-
+ pos = track_frame_to_session_frame(pos, speed);
if (cursor == playhead_cursor) {
session->request_locate (pos);
begin_reversible_command (_("trim to edit"));
session->add_undo (region.playlist()->get_memento());
- region.trim_end ( (jack_nframes_t) floor( (float)edit_cursor->current_frame * speed), this);
+ region.trim_end( session_frame_to_track_frame(edit_cursor->current_frame, speed), this);
session->add_redo_no_execute (region.playlist()->get_memento());
commit_reversible_command ();
}
begin_reversible_command (_("trim to edit"));
session->add_undo (region.playlist()->get_memento());
- region.trim_front ( (jack_nframes_t) floor( (float)edit_cursor->current_frame * speed), this);
+ region.trim_end( session_frame_to_track_frame(edit_cursor->current_frame, speed), this);
session->add_redo_no_execute (region.playlist()->get_memento());
commit_reversible_command ();
}
void punch_out ();
bool reversed() const { return _actual_speed < 0.0f; }
- float speed() const { return _visible_speed; }
- void set_speed (float);
+ double speed() const { return _visible_speed; }
+ void set_speed (double);
float peak_power(uint32_t n=0) {
float x = channels[n].peak_power;
atomic_t _record_enabled;
bool rec_monitoring_off_for_roll;
AudioPlaylist* _playlist;
- float _visible_speed;
- float _actual_speed;
+ double _visible_speed;
+ double _actual_speed;
/* items needed for speed change logic */
bool _buffer_reallocation_required;
bool _seek_required;
int ports_created ();
- bool realtime_set_speed (float, bool global_change);
+ bool realtime_set_speed (double, bool global_change);
void non_realtime_set_speed ();
std::list<Region*> _last_capture_regions;
};
};
+
+static inline jack_nframes_t
+session_frame_to_track_frame (jack_nframes_t session_frame, double speed)
+{
+ return (jack_nframes_t)( (double)session_frame * speed );
+}
+
+
+static inline jack_nframes_t
+track_frame_to_session_frame (jack_nframes_t track_frame, double speed)
+{
+ return (jack_nframes_t)( (double)track_frame / speed );
+}
+
+
#endif /* __ardour_types_h__ */
}
void
-DiskStream::set_speed (float sp)
+DiskStream::set_speed (double sp)
{
_session.request_diskstream_speed (*this, sp);
}
bool
-DiskStream::realtime_set_speed (float sp, bool global)
+DiskStream::realtime_set_speed (double sp, bool global)
{
bool changed = false;
- float new_speed = sp * _session.transport_speed();
+ double new_speed = sp * _session.transport_speed();
if (_visible_speed != sp) {
_visible_speed = sp;
}
if ((prop = node.property ("speed")) != 0) {
- float sp = atof (prop->value().c_str());
+ double sp = atof (prop->value().c_str());
if (realtime_set_speed (sp, false)) {
non_realtime_set_speed ();
when slaving to MTC, SMPTE etc.
*/
- float sp = max (fabsf (_actual_speed), 1.2f);
+ double sp = max (fabsf (_actual_speed), 1.2f);
jack_nframes_t required_wrap_size = (jack_nframes_t) floor (_session.get_block_size() * sp) + 1;
if (required_wrap_size > wrap_buffer_size) {
while (port_index < parameter_count()) {
if (LADSPA_IS_PORT_AUDIO (port_descriptor(port_index))) {
if (LADSPA_IS_PORT_INPUT (port_descriptor(port_index))) {
- connect_port (port_index, bufs[min((uint32_t) in_index,nbufs)]);
+ connect_port (port_index, bufs[min((uint32_t) in_index,nbufs)] + offset);
//cerr << this << ' ' << name() << " @ " << offset << " inport " << in_index << " = buf "
//<< min((uint32_t)in_index,nbufs) << " = " << &bufs[min((uint32_t)in_index,nbufs)][offset] << endl;
in_index++;
} else if (LADSPA_IS_PORT_OUTPUT (port_descriptor (port_index))) {
- connect_port (port_index, bufs[min((uint32_t) out_index,nbufs)]);
+ connect_port (port_index, bufs[min((uint32_t) out_index,nbufs)] + offset);
//cerr << this << ' ' << name() << " @ " << offset << " outport " << out_index << " = buf "
//<< min((uint32_t)out_index,nbufs) << " = " << &bufs[min((uint32_t)out_index,nbufs)][offset] << endl;
out_index++;