22 #include "libardour-config.h"
47 Session::bbt_time (
framepos_t when, Timecode::BBT_Time& bbt)
49 _tempo_map->bbt_time (when, bbt);
55 Session::timecode_frames_per_second()
const
57 return Timecode::timecode_to_frames_per_second (config.get_timecode_format());
61 Session::timecode_drop_frames()
const
63 return Timecode::timecode_has_drop_frames(config.get_timecode_format());
67 Session::sync_time_vars ()
69 _current_frame_rate = (
framecnt_t) round (_base_frame_rate * (1.0 + (config.get_video_pullup()/100.0)));
70 _frames_per_timecode_frame = (double) _current_frame_rate / (
double) timecode_frames_per_second();
71 if (timecode_drop_frames()) {
72 _frames_per_hour = (int32_t)(107892 * _frames_per_timecode_frame);
74 _frames_per_hour = (int32_t)(3600 * rint(timecode_frames_per_second()) * _frames_per_timecode_frame);
76 _timecode_frames_per_hour = rint(timecode_frames_per_second() * 3600.0);
78 last_timecode_valid =
false;
80 switch ((
int) ceil (timecode_frames_per_second())) {
82 mtc_timecode_bits = 0;
86 mtc_timecode_bits = 0x20;
91 if (timecode_drop_frames()) {
92 mtc_timecode_bits = 0x40;
94 mtc_timecode_bits = 0x60;
98 ltc_tx_parse_offset();
102 Session::timecode_to_sample( Timecode::Time& timecode,
framepos_t& sample,
bool use_offset,
bool use_subframes )
const
104 timecode.rate = timecode_frames_per_second();
106 Timecode::timecode_to_sample(
107 timecode, sample, use_offset, use_subframes,
109 config.get_subframes_per_frame(),
110 config.get_timecode_offset_negative(), config.get_timecode_offset()
116 Session::sample_to_timecode (
framepos_t sample, Timecode::Time& timecode,
bool use_offset,
bool use_subframes )
const
118 Timecode::sample_to_timecode (
119 sample, timecode, use_offset, use_subframes,
121 timecode_frames_per_second(),
122 timecode_drop_frames(),
123 double(_current_frame_rate),
125 config.get_subframes_per_frame(),
126 config.get_timecode_offset_negative(), config.get_timecode_offset()
131 Session::timecode_time (
framepos_t when, Timecode::Time& timecode)
133 if (last_timecode_valid && when == last_timecode_when) {
134 timecode = last_timecode;
138 this->sample_to_timecode( when, timecode,
true ,
false );
140 last_timecode_when = when;
141 last_timecode = timecode;
142 last_timecode_valid =
true;
146 Session::timecode_time_subframes (
framepos_t when, Timecode::Time& timecode)
148 if (last_timecode_valid && when == last_timecode_when) {
149 timecode = last_timecode;
153 this->sample_to_timecode( when, timecode,
true ,
true );
155 last_timecode_when = when;
156 last_timecode = timecode;
157 last_timecode_valid =
true;
161 Session::timecode_duration (
framecnt_t when, Timecode::Time& timecode)
const
163 this->sample_to_timecode( when, timecode,
false ,
true );
167 Session::timecode_duration_string (
char* buf,
size_t len,
framepos_t when)
const
169 Timecode::Time timecode;
171 timecode_duration (when, timecode);
172 snprintf (buf, len,
"%02" PRIu32
":%02" PRIu32
":%02" PRIu32
":%02" PRIu32, timecode.hours, timecode.minutes, timecode.seconds, timecode.frames);
176 Session::timecode_time (Timecode::Time &t)
179 timecode_time (_transport_frame, t);
185 bool slave = synced_to_engine();
189 if (slave && _transport_frame != pos && post_transport_work() == 0) {
190 request_locate (pos,
false);
200 return _transport_frame == pos && post_transport_work() == 0;
227 switch (position.
type) {
229 return _tempo_map->frame_time (position.
bbt);
232 case AnyTime::Timecode:
234 secs = position.
timecode.hours * 60 * 60;
235 secs += position.
timecode.minutes * 60;
237 secs += position.
timecode.frames / timecode_frames_per_second();
238 if (config.get_timecode_offset_negative()) {
239 return (
framecnt_t) floor (secs * frame_rate()) - config.get_timecode_offset();
241 return (
framecnt_t) floor (secs * frame_rate()) + config.get_timecode_offset();
245 case AnyTime::Seconds:
249 case AnyTime::Frames:
262 switch (duration.
type) {
267 case AnyTime::Timecode:
269 secs = duration.
timecode.hours * 60 * 60;
270 secs += duration.
timecode.minutes * 60;
272 secs += duration.
timecode.frames / timecode_frames_per_second();
273 if (config.get_timecode_offset_negative()) {
274 return (
framecnt_t) floor (secs * frame_rate()) - config.get_timecode_offset();
276 return (
framecnt_t) floor (secs * frame_rate()) + config.get_timecode_offset();
280 case AnyTime::Seconds:
284 case AnyTime::Frames:
LIBPBD_API Transmitter error
std::ostream & endmsg(std::ostream &ostr)
LIBARDOUR_API PBD::PropertyDescriptor< framepos_t > position
std::string string_compose(const std::string &fmt, const T1 &o1)