Clarify "frames" (video, timecode) vs "samples" (audio)
This commit is contained in:
parent
f05f19bdd4
commit
61c7af141d
|
@ -2731,18 +2731,18 @@ Editor::snap_to (framepos_t& start, RoundMode direction, bool for_mark, bool ens
|
|||
void
|
||||
Editor::timecode_snap_to_internal (framepos_t& start, RoundMode direction, bool /*for_mark*/)
|
||||
{
|
||||
const framepos_t one_timecode_second = (framepos_t)(rint(_session->timecode_frames_per_second()) * _session->frames_per_timecode_frame());
|
||||
framepos_t one_timecode_minute = (framepos_t)(rint(_session->timecode_frames_per_second()) * _session->frames_per_timecode_frame() * 60);
|
||||
const framepos_t one_timecode_second = (framepos_t)(rint(_session->timecode_frames_per_second()) * _session->samples_per_timecode_frame());
|
||||
framepos_t one_timecode_minute = (framepos_t)(rint(_session->timecode_frames_per_second()) * _session->samples_per_timecode_frame() * 60);
|
||||
|
||||
switch (_snap_type) {
|
||||
case SnapToTimecodeFrame:
|
||||
if ((direction == RoundUpMaybe || direction == RoundDownMaybe) &&
|
||||
fmod((double)start, (double)_session->frames_per_timecode_frame()) == 0) {
|
||||
fmod((double)start, (double)_session->samples_per_timecode_frame()) == 0) {
|
||||
/* start is already on a whole timecode frame, do nothing */
|
||||
} else if (((direction == 0) && (fmod((double)start, (double)_session->frames_per_timecode_frame()) > (_session->frames_per_timecode_frame() / 2))) || (direction > 0)) {
|
||||
start = (framepos_t) (ceil ((double) start / _session->frames_per_timecode_frame()) * _session->frames_per_timecode_frame());
|
||||
} else if (((direction == 0) && (fmod((double)start, (double)_session->samples_per_timecode_frame()) > (_session->samples_per_timecode_frame() / 2))) || (direction > 0)) {
|
||||
start = (framepos_t) (ceil ((double) start / _session->samples_per_timecode_frame()) * _session->samples_per_timecode_frame());
|
||||
} else {
|
||||
start = (framepos_t) (floor ((double) start / _session->frames_per_timecode_frame()) * _session->frames_per_timecode_frame());
|
||||
start = (framepos_t) (floor ((double) start / _session->samples_per_timecode_frame()) * _session->samples_per_timecode_frame());
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
|
@ -747,26 +747,26 @@ Editor::set_timecode_ruler_scale (framepos_t lower, framepos_t upper)
|
|||
upper = upper + spacer;
|
||||
framecnt_t const range = upper - lower;
|
||||
|
||||
if (range < (2 * _session->frames_per_timecode_frame())) { /* 0 - 2 frames */
|
||||
if (range < (2 * _session->samples_per_timecode_frame())) { /* 0 - 2 frames */
|
||||
timecode_ruler_scale = timecode_show_bits;
|
||||
timecode_mark_modulo = 20;
|
||||
timecode_nmarks = 2 + (2 * _session->config.get_subframes_per_frame());
|
||||
} else if (range <= (fr / 4)) { /* 2 frames - 0.250 second */
|
||||
timecode_ruler_scale = timecode_show_frames;
|
||||
timecode_mark_modulo = 1;
|
||||
timecode_nmarks = 2 + (range / (framepos_t)_session->frames_per_timecode_frame());
|
||||
timecode_nmarks = 2 + (range / (framepos_t)_session->samples_per_timecode_frame());
|
||||
} else if (range <= (fr / 2)) { /* 0.25-0.5 second */
|
||||
timecode_ruler_scale = timecode_show_frames;
|
||||
timecode_mark_modulo = 2;
|
||||
timecode_nmarks = 2 + (range / (framepos_t)_session->frames_per_timecode_frame());
|
||||
timecode_nmarks = 2 + (range / (framepos_t)_session->samples_per_timecode_frame());
|
||||
} else if (range <= fr) { /* 0.5-1 second */
|
||||
timecode_ruler_scale = timecode_show_frames;
|
||||
timecode_mark_modulo = 5;
|
||||
timecode_nmarks = 2 + (range / (framepos_t)_session->frames_per_timecode_frame());
|
||||
timecode_nmarks = 2 + (range / (framepos_t)_session->samples_per_timecode_frame());
|
||||
} else if (range <= 2 * fr) { /* 1-2 seconds */
|
||||
timecode_ruler_scale = timecode_show_frames;
|
||||
timecode_mark_modulo = 10;
|
||||
timecode_nmarks = 2 + (range / (framepos_t)_session->frames_per_timecode_frame());
|
||||
timecode_nmarks = 2 + (range / (framepos_t)_session->samples_per_timecode_frame());
|
||||
} else if (range <= 8 * fr) { /* 2-8 seconds */
|
||||
timecode_ruler_scale = timecode_show_seconds;
|
||||
timecode_mark_modulo = 1;
|
||||
|
|
|
@ -428,7 +428,7 @@ ClockOption::set_state_from_config ()
|
|||
if (!Timecode::parse_timecode_format(_get(), TC)) {
|
||||
_clock.set (0, true);
|
||||
}
|
||||
TC.rate = _session->frames_per_timecode_frame();
|
||||
TC.rate = _session->samples_per_timecode_frame();
|
||||
TC.drop = _session->timecode_drop_frames();
|
||||
_session->timecode_to_sample(TC, when, false, false);
|
||||
if (TC.negative) { when=-when; }
|
||||
|
|
|
@ -450,7 +450,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
|
|||
framecnt_t nominal_frame_rate () const { return _nominal_frame_rate; }
|
||||
framecnt_t frames_per_hour () const { return _frames_per_hour; }
|
||||
|
||||
double frames_per_timecode_frame() const { return _frames_per_timecode_frame; }
|
||||
double samples_per_timecode_frame() const { return _samples_per_timecode_frame; }
|
||||
framecnt_t timecode_frames_per_hour() const { return _timecode_frames_per_hour; }
|
||||
|
||||
MIDI::byte get_mtc_timecode_bits() const {
|
||||
|
@ -1604,7 +1604,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
|
|||
Timecode::Time transmitting_timecode_time;
|
||||
int next_quarter_frame_to_send;
|
||||
|
||||
double _frames_per_timecode_frame; /* has to be floating point because of drop frame */
|
||||
double _samples_per_timecode_frame; /* has to be floating point because of drop frame */
|
||||
framecnt_t _frames_per_hour;
|
||||
framecnt_t _timecode_frames_per_hour;
|
||||
|
||||
|
|
|
@ -45,7 +45,7 @@ using namespace Timecode;
|
|||
LTC_Slave::LTC_Slave (Session& s)
|
||||
: session (s)
|
||||
{
|
||||
frames_per_ltc_frame = session.frames_per_timecode_frame();
|
||||
frames_per_ltc_frame = session.samples_per_timecode_frame();
|
||||
timecode.rate = session.timecode_frames_per_second();
|
||||
timecode.drop = session.timecode_drop_frames();
|
||||
|
||||
|
@ -365,13 +365,13 @@ LTC_Slave::process_ltc(framepos_t const /*now*/)
|
|||
ltc_frame_increment(&frame.ltc, fps_i, tv_standard, 0);
|
||||
ltc_frame_to_time(&stime, &frame.ltc, 0);
|
||||
transport_direction = 1;
|
||||
frame.off_start -= ltc_frame_alignment(session.frames_per_timecode_frame(), tv_standard);
|
||||
frame.off_end -= ltc_frame_alignment(session.frames_per_timecode_frame(), tv_standard);
|
||||
frame.off_start -= ltc_frame_alignment(session.samples_per_timecode_frame(), tv_standard);
|
||||
frame.off_end -= ltc_frame_alignment(session.samples_per_timecode_frame(), tv_standard);
|
||||
} else {
|
||||
ltc_frame_decrement(&frame.ltc, fps_i, tv_standard, 0);
|
||||
int off = frame.off_end - frame.off_start;
|
||||
frame.off_start += off - ltc_frame_alignment(session.frames_per_timecode_frame(), tv_standard);
|
||||
frame.off_end += off - ltc_frame_alignment(session.frames_per_timecode_frame(), tv_standard);
|
||||
frame.off_start += off - ltc_frame_alignment(session.samples_per_timecode_frame(), tv_standard);
|
||||
frame.off_end += off - ltc_frame_alignment(session.samples_per_timecode_frame(), tv_standard);
|
||||
transport_direction = -1;
|
||||
}
|
||||
|
||||
|
|
|
@ -1769,7 +1769,7 @@ LuaBindings::common (lua_State* L)
|
|||
.addFunction ("transport_speed", &Session::transport_speed)
|
||||
.addFunction ("frame_rate", &Session::frame_rate)
|
||||
.addFunction ("nominal_frame_rate", &Session::nominal_frame_rate)
|
||||
.addFunction ("frames_per_timecode_frame", &Session::frames_per_timecode_frame)
|
||||
.addFunction ("samples_per_timecode_frame", &Session::samples_per_timecode_frame)
|
||||
.addFunction ("timecode_frames_per_hour", &Session::timecode_frames_per_hour)
|
||||
.addFunction ("timecode_frames_per_second", &Session::timecode_frames_per_second)
|
||||
.addFunction ("timecode_drop_frames", &Session::timecode_drop_frames)
|
||||
|
|
|
@ -65,7 +65,7 @@ MTC_Slave::MTC_Slave (Session& s, MidiPort& p)
|
|||
busy_guard1 = busy_guard2 = 0;
|
||||
|
||||
last_mtc_fps_byte = session.get_mtc_timecode_bits ();
|
||||
quarter_frame_duration = (double(session.frames_per_timecode_frame()) / 4.0);
|
||||
quarter_frame_duration = (double(session.samples_per_timecode_frame()) / 4.0);
|
||||
|
||||
mtc_timecode = session.config.get_timecode_format();
|
||||
a3e_timecode = session.config.get_timecode_format();
|
||||
|
@ -448,7 +448,7 @@ MTC_Slave::update_mtc_time (const MIDI::byte *msg, bool was_full, framepos_t now
|
|||
long int mtc_off = (long) rint(7.0 * qtr);
|
||||
|
||||
DEBUG_TRACE (DEBUG::MTC, string_compose ("new mtc_frame: %1 | MTC-FpT: %2 A3-FpT:%3\n",
|
||||
mtc_frame, (4.0*qtr), session.frames_per_timecode_frame()));
|
||||
mtc_frame, (4.0*qtr), session.samples_per_timecode_frame()));
|
||||
|
||||
switch (port->self_parser().mtc_running()) {
|
||||
case MTC_Backward:
|
||||
|
|
|
@ -257,7 +257,7 @@ Session::Session (AudioEngine &eng,
|
|||
, step_speed (0)
|
||||
, outbound_mtc_timecode_frame (0)
|
||||
, next_quarter_frame_to_send (-1)
|
||||
, _frames_per_timecode_frame (0)
|
||||
, _samples_per_timecode_frame (0)
|
||||
, _frames_per_hour (0)
|
||||
, _timecode_frames_per_hour (0)
|
||||
, last_timecode_valid (false)
|
||||
|
|
|
@ -275,7 +275,7 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end
|
|||
/* LTC TV standard offset */
|
||||
if (current_speed != 0) {
|
||||
/* ditto - send "NOW" if not rolling */
|
||||
cycle_start_frame -= ltc_frame_alignment(frames_per_timecode_frame(), TV_STANDARD(cur_timecode));
|
||||
cycle_start_frame -= ltc_frame_alignment(samples_per_timecode_frame(), TV_STANDARD(cur_timecode));
|
||||
}
|
||||
|
||||
/* cycle-start may become negative due to latency compensation */
|
||||
|
@ -448,7 +448,7 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end
|
|||
|
||||
|
||||
// (4) check if alignment matches
|
||||
const double fptcf = frames_per_timecode_frame();
|
||||
const double fptcf = samples_per_timecode_frame();
|
||||
|
||||
/* maximum difference of bit alignment in audio-samples.
|
||||
*
|
||||
|
|
|
@ -426,13 +426,13 @@ Session::send_full_time_code (framepos_t const t, MIDI::pframes_t nframes)
|
|||
// or a new full timecode will be queued next cycle.
|
||||
while (outbound_mtc_timecode_frame < t) {
|
||||
Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
|
||||
outbound_mtc_timecode_frame += _frames_per_timecode_frame;
|
||||
outbound_mtc_timecode_frame += _samples_per_timecode_frame;
|
||||
}
|
||||
|
||||
double const quarter_frame_duration = ((framecnt_t) _frames_per_timecode_frame) / 4.0;
|
||||
double const quarter_frame_duration = ((framecnt_t) _samples_per_timecode_frame) / 4.0;
|
||||
if (ceil((t - mtc_tc) / quarter_frame_duration) > 0) {
|
||||
Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
|
||||
outbound_mtc_timecode_frame += _frames_per_timecode_frame;
|
||||
outbound_mtc_timecode_frame += _samples_per_timecode_frame;
|
||||
}
|
||||
|
||||
DEBUG_TRACE (DEBUG::MTC, string_compose ("Full MTC TC %1 (off %2)\n", outbound_mtc_timecode_frame, mtc_offset));
|
||||
|
@ -443,7 +443,7 @@ Session::send_full_time_code (framepos_t const t, MIDI::pframes_t nframes)
|
|||
if (((mtc_timecode_bits >> 5) != MIDI::MTC_25_FPS) && (transmitting_timecode_time.frames % 2)) {
|
||||
// start MTC quarter frame transmission on an even frame
|
||||
Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
|
||||
outbound_mtc_timecode_frame += _frames_per_timecode_frame;
|
||||
outbound_mtc_timecode_frame += _samples_per_timecode_frame;
|
||||
}
|
||||
|
||||
next_quarter_frame_to_send = 0;
|
||||
|
@ -507,7 +507,7 @@ Session::send_midi_time_code_for_cycle (framepos_t start_frame, framepos_t end_f
|
|||
assert (next_quarter_frame_to_send <= 7);
|
||||
|
||||
/* Duration of one quarter frame */
|
||||
double const quarter_frame_duration = _frames_per_timecode_frame / 4.0;
|
||||
double const quarter_frame_duration = _samples_per_timecode_frame / 4.0;
|
||||
|
||||
DEBUG_TRACE (DEBUG::MTC, string_compose ("TF %1 SF %2 MT %3 QF %4 QD %5\n",
|
||||
_transport_frame, start_frame, outbound_mtc_timecode_frame,
|
||||
|
@ -592,7 +592,7 @@ Session::send_midi_time_code_for_cycle (framepos_t start_frame, framepos_t end_f
|
|||
Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
|
||||
Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
|
||||
// Increment timing of first quarter frame
|
||||
outbound_mtc_timecode_frame += 2.0 * _frames_per_timecode_frame;
|
||||
outbound_mtc_timecode_frame += 2.0 * _samples_per_timecode_frame;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -67,11 +67,11 @@ void
|
|||
Session::sync_time_vars ()
|
||||
{
|
||||
_current_frame_rate = (framecnt_t) round (_nominal_frame_rate * (1.0 + (config.get_video_pullup()/100.0)));
|
||||
_frames_per_timecode_frame = (double) _current_frame_rate / (double) timecode_frames_per_second();
|
||||
_samples_per_timecode_frame = (double) _current_frame_rate / (double) timecode_frames_per_second();
|
||||
if (timecode_drop_frames()) {
|
||||
_frames_per_hour = (int32_t)(107892 * _frames_per_timecode_frame);
|
||||
_frames_per_hour = (int32_t)(107892 * _samples_per_timecode_frame);
|
||||
} else {
|
||||
_frames_per_hour = (int32_t)(3600 * rint(timecode_frames_per_second()) * _frames_per_timecode_frame);
|
||||
_frames_per_hour = (int32_t)(3600 * rint(timecode_frames_per_second()) * _samples_per_timecode_frame);
|
||||
}
|
||||
_timecode_frames_per_hour = rint(timecode_frames_per_second() * 3600.0);
|
||||
|
||||
|
|
|
@ -653,7 +653,7 @@ timecode_to_sample(
|
|||
bool offset_is_negative, int64_t offset_samples
|
||||
)
|
||||
{
|
||||
const double frames_per_timecode_frame = (double) sample_frame_rate / (double) timecode.rate;
|
||||
const double samples_per_timecode_frame = (double) sample_frame_rate / (double) timecode.rate;
|
||||
|
||||
if (timecode.drop) {
|
||||
// The drop frame format was created to better approximate the 30000/1001 = 29.97002997002997....
|
||||
|
@ -711,7 +711,7 @@ timecode_to_sample(
|
|||
} else {
|
||||
/*
|
||||
Non drop is easy.. just note the use of
|
||||
rint(timecode.rate) * frames_per_timecode_frame
|
||||
rint(timecode.rate) * samples_per_timecode_frame
|
||||
(frames per Timecode second), which is larger than
|
||||
frame_rate() in the non-integer Timecode rate case.
|
||||
*/
|
||||
|
@ -720,14 +720,14 @@ timecode_to_sample(
|
|||
(
|
||||
((timecode.hours * 60 * 60) + (timecode.minutes * 60) + timecode.seconds)
|
||||
*
|
||||
(rint(timecode.rate) * frames_per_timecode_frame)
|
||||
(rint(timecode.rate) * samples_per_timecode_frame)
|
||||
)
|
||||
+ (timecode.frames * frames_per_timecode_frame)
|
||||
+ (timecode.frames * samples_per_timecode_frame)
|
||||
);
|
||||
}
|
||||
|
||||
if (use_subframes) {
|
||||
sample += (int64_t) rint(((double)timecode.subframes * frames_per_timecode_frame) / (double)subframes_per_frame);
|
||||
sample += (int64_t) rint(((double)timecode.subframes * samples_per_timecode_frame) / (double)subframes_per_frame);
|
||||
}
|
||||
|
||||
if (use_offset) {
|
||||
|
@ -812,14 +812,14 @@ sample_to_timecode (
|
|||
double timecode_frames_left_exact;
|
||||
double timecode_frames_fraction;
|
||||
int64_t timecode_frames_left;
|
||||
const double frames_per_timecode_frame = sample_frame_rate / timecode_frames_per_second;
|
||||
const int64_t frames_per_hour = (int64_t)(3600. * rint(timecode_frames_per_second) * frames_per_timecode_frame);
|
||||
const double samples_per_timecode_frame = sample_frame_rate / timecode_frames_per_second;
|
||||
const int64_t frames_per_hour = (int64_t)(3600. * rint(timecode_frames_per_second) * samples_per_timecode_frame);
|
||||
|
||||
timecode.hours = offset_sample / frames_per_hour;
|
||||
|
||||
// Extract whole hours. Do this to prevent rounding errors with
|
||||
// high sample numbers in the calculations that follow.
|
||||
timecode_frames_left_exact = (double)(offset_sample % frames_per_hour) / frames_per_timecode_frame;
|
||||
timecode_frames_left_exact = (double)(offset_sample % frames_per_hour) / samples_per_timecode_frame;
|
||||
timecode_frames_fraction = timecode_frames_left_exact - floor( timecode_frames_left_exact );
|
||||
|
||||
timecode.subframes = (int32_t) rint(timecode_frames_fraction * subframes_per_frame);
|
||||
|
|
Loading…
Reference in New Issue
Block a user