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; }
virtual void non_realtime_locate (framepos_t);
- void non_realtime_set_speed ();
- bool realtime_set_speed (double sp, bool global);
+ void non_realtime_speed_change ();
+ bool realtime_speed_change ();
virtual void punch_in() {}
virtual void punch_out() {}
bool overwrite_queued;
IOChange input_change_pending;
framecnt_t wrap_buffer_size;
- framecnt_t speed_buffer_size;
MonitorChoice _monitoring_choice;
int _do_refill_with_alloc (bool partial_fill);
void request_overwrite_buffer (boost::shared_ptr<Route>);
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<bool>(post_transport_work()&PostTransportLocate); }
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 for_loop_enabled=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 ();
public:
enum Type {
SetTransportSpeed,
- SetTrackSpeed,
Locate,
LocateRoll,
LocateRollLocate,
int internal_playback_seek (framecnt_t);
void non_realtime_locate (framepos_t);
void realtime_handle_transport_stopped ();
- void non_realtime_set_speed ();
+ void non_realtime_speed_change ();
int overwrite_existing_buffers ();
framecnt_t get_captured_frames (uint32_t n = 0) const;
int set_loop (ARDOUR::Location *);
void transport_looped (framepos_t);
- bool realtime_set_speed (double, bool);
+ bool realtime_speed_change ();
void transport_stopped_wallclock (struct tm &, time_t, bool);
bool pending_overwrite () const;
void prepare_to_stop (framepos_t, framepos_t);
: Processor (s, str)
, _flags (f)
, i_am_the_modifier (false)
- , _actual_speed (0.0)
- , _target_speed (0.0)
, _buffer_reallocation_required (false)
, _seek_required (false)
, _slaved (false)
}
void
-DiskIOProcessor::non_realtime_set_speed ()
+DiskIOProcessor::non_realtime_speed_change ()
{
if (_buffer_reallocation_required) {
_buffer_reallocation_required = false;
}
bool
-DiskIOProcessor::realtime_set_speed (double new_speed, bool global)
+DiskIOProcessor::realtime_speed_change ()
{
- bool changed = false;
+ const framecnt_t required_wrap_size = (framecnt_t) ceil (_session.get_block_size() * fabs (_session.transport_speed())) + 2;
+ bool _buffer_reallocation_required;
- DEBUG_TRACE (DEBUG::Transport, string_compose ("%1 will run at %2\n", name(), new_speed));
-
- if (_target_speed != new_speed) {
- _target_speed = new_speed;
- changed = true;
-
- 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;
- }
- }
-
- if (changed) {
- if (!global) {
- _seek_required = true;
- }
- SpeedChanged (); /* EMIT SIGNAL */
+ if (required_wrap_size > wrap_buffer_size) {
+ _buffer_reallocation_required = true;
+ } else {
+ _buffer_reallocation_required = false;
}
- return _buffer_reallocation_required || _seek_required;
+ return _buffer_reallocation_required;
}
int
_flags = Flag (string_2_enum (prop->value(), _flags));
}
- 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;
}
void
DiskReader::realtime_handle_transport_stopped ()
{
- realtime_set_speed (0.0f, true);
+ realtime_speed_change ();
}
void
uint32_t n;
boost::shared_ptr<ChannelList> c = channels.reader();
ChannelList::iterator chan;
- framecnt_t playback_distance = 0;
const bool need_disk_signal = result_required || _monitoring_choice == MonitorDisk || _monitoring_choice == MonitorCue;
+ frameoffset_t playback_distance = nframes;
_need_butler = false;
- playback_distance = calculate_playback_distance (nframes);
+
+
+ if (speed != 1.0f && speed != -1.0f) {
+ interpolation.set_speed (speed);
+ midi_interpolation.set_speed (speed);
+ playback_distance = midi_interpolation.distance (nframes);
+ }
+
+ if (speed < 0.0) {
+ playback_distance = -playback_distance;
+ }
if (!need_disk_signal) {
if (playback_distance <= (framecnt_t) chaninfo->rw_vector.len[0]) {
- if (fabsf (_actual_speed) != 1.0f) {
+ if (fabsf (speed) != 1.0f) {
(void) interpolation.interpolate (
n, nframes,
chaninfo->rw_vector.buf[0],
/* We have enough samples, but not in one lump.
*/
- if (fabsf (_actual_speed) != 1.0f) {
+ if (fabsf (speed) != 1.0f) {
interpolation.interpolate (n, chaninfo->rw_vector.len[0],
chaninfo->rw_vector.buf[0],
outgoing);
get_playback (mbuf, playback_distance);
/* vari-speed */
- if (_actual_speed != 0.0 && fabsf (_actual_speed) != 1.0f) {
+ if (speed != 0.0 && fabsf (speed) != 1.0f) {
MidiBuffer& mbuf (bufs.get_midi (0));
for (MidiBuffer::iterator i = mbuf.begin(); i != mbuf.end(); ++i) {
MidiBuffer::TimeType *tme = i.timeptr();
}
}
- if (_actual_speed < 0.0) {
+ if (speed < 0.0) {
playback_sample -= playback_distance;
} else {
playback_sample += playback_distance;
bufs.set_count (cnt);
}
-frameoffset_t
-DiskReader::calculate_playback_distance (pframes_t nframes)
-{
- frameoffset_t playback_distance = nframes;
-
- if (_target_speed != 1.0f && _target_speed != -1.0f) {
- interpolation.set_speed (_target_speed);
- midi_interpolation.set_speed (_target_speed);
- playback_distance = midi_interpolation.distance (nframes);
- }
-
- _actual_speed = _target_speed;
-
- if (_actual_speed < 0.0) {
- return -playback_distance;
- } else {
- return playback_distance;
- }
-}
-
void
DiskReader::set_pending_overwrite (bool yn)
{
/* AUDIO */
- bool reversed = (_target_speed * _session.transport_speed()) < 0.0f;
+ const bool reversed = _session.transport_speed() < 0.0f;
/* assume all are the same size */
framecnt_t size = c->front()->buf->bufsize();
int32_t ret = 0;
framecnt_t to_read;
RingBufferNPT<Sample>::rw_vector vector;
- bool const reversed = (_target_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;
the playback buffer is empty.
*/
- DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: space to refill %2 vs. chunk %3 (speed = %4)\n", name(), total_space, _chunk_frames, _actual_speed));
- if ((total_space < _chunk_frames) && fabs (_actual_speed) < 2.0f) {
+ DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: space to refill %2 vs. chunk %3 (speed = %4)\n", name(), total_space, _chunk_frames, _session.transport_speed()));
+ if ((total_space < _chunk_frames) && fabs (_session.transport_speed()) < 2.0f) {
return 0;
}
}
size_t write_space = _midi_buf->write_space();
- bool reversed = (_target_speed * _session.transport_speed()) < 0.0f;
+ const bool reversed = _session.transport_speed() < 0.0f;
DEBUG_TRACE (DEBUG::DiskIO, string_compose ("MIDI refill, write space = %1 file frame = %2\n", write_space, file_frame));
void
DiskWriter::realtime_handle_transport_stopped ()
{
- realtime_set_speed (0.0f, true);
+ realtime_speed_change ();
}
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);
overwrite_some_buffers (static_cast<Track*>(ev->ptr));
break;
- case SessionEvent::SetTrackSpeed:
- set_track_speed (static_cast<Track*> (ev->ptr), ev->speed);
- break;
-
case SessionEvent::SetSyncSource:
DEBUG_TRACE (DEBUG::Slave, "seen request for new slave\n");
use_sync_source (ev->slave);
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)
{
for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
if (tr) {
- tr->non_realtime_set_speed ();
+ tr->non_realtime_speed_change ();
}
}
}
boost::shared_ptr<RouteList> rl = routes.reader();
for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
- if (tr && tr->realtime_set_speed (_transport_speed, true)) {
+ if (tr && tr->realtime_speed_change()) {
todo = PostTransportWork (todo | PostTransportSpeed);
}
}
for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
if (tr) {
- tr->realtime_set_speed (_transport_speed, true);
+ tr->realtime_speed_change ();
}
}
for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
if (tr && !tr->hidden()) {
- if (tr->realtime_set_speed (_transport_speed, true)) {
+ if (tr->realtime_speed_change()) {
non_rt_required = true;
}
tr->set_slaved (_slave != 0);
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 ()
{
}
void
-Track::non_realtime_set_speed ()
+Track::non_realtime_speed_change ()
{
- _disk_reader->non_realtime_set_speed ();
+ _disk_reader->non_realtime_speed_change ();
}
int
}
bool
-Track::realtime_set_speed (double s, bool g)
+Track::realtime_speed_change ()
{
- if (_disk_reader->realtime_set_speed (s, g)) {
+ if (_disk_reader->realtime_speed_change ()) {
return -1;
}
- return _disk_writer->realtime_set_speed (s, g);
+ return _disk_writer->realtime_speed_change ();
}
void