merged with 1697 revision of trunk (which is post-rc1 but pre-rc2
[ardour.git] / libs / ardour / session_time.cc
1
2 /*
3   Copyright (C) 1999-2002 Paul Davis 
4
5   This program is free software; you can redistribute it and/or modify
6   it under the terms of the GNU General Public License as published by
7   the Free Software Foundation; either version 2 of the License, or
8   (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14
15   You should have received a copy of the GNU General Public License
16   along with this program; if not, write to the Free Software
17   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18
19 */
20
21 #include <iostream>
22 #include <cmath>
23 #include <unistd.h>
24
25 #include <ardour/timestamps.h>
26
27 #include <pbd/error.h>
28 #include <pbd/enumwriter.h>
29 #include <pbd/stacktrace.h>
30
31 #include <ardour/ardour.h>
32 #include <ardour/configuration.h>
33 #include <ardour/audioengine.h>
34 #include <ardour/session.h>
35 #include <ardour/tempo.h>
36
37 #include "i18n.h"
38
39 using namespace ARDOUR;
40 using namespace PBD;
41
42 /* BBT TIME*/
43
44 void
45 Session::bbt_time (nframes_t when, BBT_Time& bbt)
46 {
47         _tempo_map->bbt_time (when, bbt);
48 }
49
50 /* SMPTE TIME */
51 float
52 Session::smpte_frames_per_second() const
53 {
54         switch (Config->get_smpte_format()) {
55                 case smpte_23976: 
56                         return 23.976;
57
58                         break;
59                 case smpte_24: 
60                         return 24;
61
62                         break;
63                 case smpte_24976: 
64                         return 24.976;
65
66                         break;
67                 case smpte_25: 
68                         return 25;
69
70                         break;
71                 case smpte_2997: 
72                         return 29.97;
73
74                         break;
75                 case smpte_2997drop: 
76                         return 29.97;
77
78                         break;
79                 case smpte_30: 
80                         return 30;
81
82                         break;
83                 case smpte_30drop: 
84                         return 30;
85
86                         break;
87                 case smpte_5994: 
88                         return 59.94;
89
90                         break;
91                 case smpte_60: 
92                         return 60;
93
94                         break;
95                 default:
96                   cerr << "Editor received unexpected smpte type" << endl;
97         }
98         return 30.0;
99 }
100 bool
101 Session::smpte_drop_frames() const
102 {
103         switch (Config->get_smpte_format()) {
104                 case smpte_23976: 
105                         return false;
106
107                         break;
108                 case smpte_24: 
109                         return false;
110
111                         break;
112                 case smpte_24976: 
113                         return false;
114
115                         break;
116                 case smpte_25: 
117                         return false;
118
119                         break;
120                 case smpte_2997: 
121                         return false;
122
123                         break;
124                 case smpte_2997drop: 
125                         return true;
126
127                         break;
128                 case smpte_30: 
129                         return false;
130
131                         break;
132                 case smpte_30drop: 
133                         return true;
134
135                         break;
136                 case smpte_5994: 
137                         return false;
138
139                         break;
140                 case smpte_60: 
141                         return false;
142
143                         break;
144                 default:
145                         cerr << "Editor received unexpected smpte type" << endl;
146         }
147         return false;
148 }
149 void
150 Session::sync_time_vars ()
151 {
152         _current_frame_rate = (nframes_t) round (_base_frame_rate * (1.0 + (Config->get_video_pullup()/100.0)));
153         _frames_per_smpte_frame = (double) _current_frame_rate / (double) smpte_frames_per_second();
154         if (smpte_drop_frames()) {
155           _frames_per_hour = (long)(107892 * _frames_per_smpte_frame);
156         } else {
157           _frames_per_hour = (long)(3600 * rint(smpte_frames_per_second()) * _frames_per_smpte_frame);
158         }
159         _smpte_frames_per_hour = (nframes_t)rint(smpte_frames_per_second() * 3600.0);
160
161 }
162
163 int
164 Session::set_smpte_format (SmpteFormat format)
165 {
166
167         Config->set_smpte_format (format);
168
169         last_smpte_valid = false;
170         // smpte type bits are the middle two in the upper nibble
171         switch ((int) ceil (smpte_frames_per_second())) {
172         case 24:
173                 mtc_smpte_bits = 0;
174                 break;
175
176         case 25:
177                 mtc_smpte_bits = 0x20;
178                 break;
179
180         case 30:
181         default:
182                 if (smpte_drop_frames()) {
183                         mtc_smpte_bits = 0x40;
184                 } else {
185                         mtc_smpte_bits =  0x60;
186                 }
187                 break;
188         };
189
190         return 0;
191 }
192
193 void
194 Session::set_smpte_offset (nframes_t off)
195 {
196         _smpte_offset = off;
197         last_smpte_valid = false;
198
199         SMPTEOffsetChanged (); /* EMIT SIGNAL */
200 }
201
202 void
203 Session::set_smpte_offset_negative (bool neg)
204 {
205         _smpte_offset_negative = neg;
206         last_smpte_valid = false;
207
208         SMPTEOffsetChanged (); /* EMIT SIGNAL */
209 }
210
211 void
212 Session::smpte_to_sample( SMPTE::Time& smpte, nframes_t& sample, bool use_offset, bool use_subframes ) const
213 {
214
215         if (smpte.drop) {
216                 // The drop frame format was created to better approximate the 30000/1001 = 29.97002997002997....
217                 // framerate of NTSC color TV. The used frame rate of drop frame is 29.97, which drifts by about
218                 // 0.108 frame per hour, or about 1.3 frames per 12 hours. This is not perfect, but a lot better
219                 // than using 30 non drop, which will drift with about 1.8 frame per minute.
220                 // Using 29.97, drop frame real time can be accurate only every 10th minute (10 minutes of 29.97 fps
221                 // is exactly 17982 frames). One minute is 1798.2 frames, but we count 30 frames per second
222                 // (30 * 60 = 1800). This means that at the first minute boundary (at the end of 0:0:59:29) we
223                 // are 1.8 frames too late relative to real time. By dropping 2 frames (jumping to 0:1:0:2) we are
224                 // approx. 0.2 frames too early. This adds up with 0.2 too early for each minute until we are 1.8
225                 // frames too early at 0:9:0:2 (9 * 0.2 = 1.8). The 10th minute brings us 1.8 frames later again
226                 // (at end of 0:9:59:29), which sums up to 0 (we are back to zero at 0:10:0:0 :-).
227                 // 
228                 // In table form:
229                 // 
230                 // SMPTE value    frames offset   subframes offset   seconds (rounded)  44100 sample (rounded)
231                 //  0:00:00:00        0.0             0                     0.000                0 (accurate)
232                 //  0:00:59:29        1.8           144                    60.027          2647177
233                 //  0:01:00:02       -0.2           -16                    60.060          2648648
234                 //  0:01:59:29        1.6           128                   120.020          5292883
235                 //  0:02:00:02       -0.4           -32                   120.053          5294354
236                 //  0:02:59:29        1.4           112                   180.013          7938588
237                 //  0:03:00:02       -0.6           -48                   180.047          7940060
238                 //  0:03:59:29        1.2            96                   240.007         10584294
239                 //  0:04:00:02       -0.8           -64                   240.040         10585766
240                 //  0:04:59:29        1.0            80                   300.000         13230000
241                 //  0:05:00:02       -1.0           -80                   300.033         13231471
242                 //  0:05:59:29        0.8            64                   359.993         15875706
243                 //  0:06:00:02       -1.2           -96                   360.027         15877177
244                 //  0:06:59:29        0.6            48                   419.987         18521411
245                 //  0:07:00:02       -1.4          -112                   420.020         18522883
246                 //  0:07:59:29        0.4            32                   478.980         21167117
247                 //  0:08:00:02       -1.6          -128                   480.013         21168589
248                 //  0:08:59:29        0.2            16                   539.973         23812823
249                 //  0:09:00:02       -1.8          -144                   540.007         23814294
250                 //  0:09:59:29        0.0+            0+                  599.967         26458529
251                 //  0:10:00:00        0.0             0                   600.000         26460000 (accurate)
252                 //
253                 //  Per Sigmond <per@sigmond.no>
254
255                 // Samples inside time dividable by 10 minutes (real time accurate)
256                 nframes_t base_samples = (nframes_t) (((smpte.hours * 107892) + ((smpte.minutes / 10) * 17982)) * _frames_per_smpte_frame);
257
258                 // Samples inside time exceeding the nearest 10 minutes (always offset, see above)
259                 long exceeding_df_minutes = smpte.minutes % 10;
260                 long exceeding_df_seconds = (exceeding_df_minutes * 60) + smpte.seconds;
261                 long exceeding_df_frames = (30 * exceeding_df_seconds) + smpte.frames - (2 * exceeding_df_minutes);
262                 nframes_t exceeding_samples = (nframes_t) rint(exceeding_df_frames * _frames_per_smpte_frame);
263                 sample = base_samples + exceeding_samples;
264         } else {
265                 /* 
266                    Non drop is easy.. just note the use of 
267                    rint(smpte.rate) * _frames_per_smpte_frame
268                    (frames per SMPTE second), which is larger than  
269                    frame_rate() in the non-integer SMPTE rate case.
270                 */
271
272                 sample = (nframes_t)rint((((smpte.hours * 60 * 60) + (smpte.minutes * 60) + smpte.seconds) * (rint(smpte.rate) * _frames_per_smpte_frame)) + (smpte.frames * _frames_per_smpte_frame));
273         }
274   
275         if (use_subframes) {
276                 sample += (long) (((double)smpte.subframes * _frames_per_smpte_frame) / Config->get_subframes_per_frame());
277         }
278   
279         if (use_offset) {
280                 if (smpte_offset_negative()) {
281                         if (sample >= smpte_offset()) {
282                                 sample -= smpte_offset();
283                         } else {
284                                 /* Prevent song-time from becoming negative */
285                                 sample = 0;
286                         }
287                 } else {
288                         if (smpte.negative) {
289                                 if (sample <= smpte_offset()) {
290                                         sample = smpte_offset() - sample;
291                                 } else {
292                                         sample = 0;
293                                 }
294                         } else {
295                                 sample += smpte_offset();
296                         }
297                 }
298         }
299
300 }
301
302
303 void
304 Session::sample_to_smpte( nframes_t sample, SMPTE::Time& smpte, bool use_offset, bool use_subframes ) const
305 {
306         nframes_t offset_sample;
307
308         if (!use_offset) {
309                 offset_sample = sample;
310                 smpte.negative = false;
311         } else {
312                 if (_smpte_offset_negative) {
313                         offset_sample =  sample + _smpte_offset;
314                         smpte.negative = false;
315                 } else {
316                         if (sample < _smpte_offset) {
317                                 offset_sample = (_smpte_offset - sample);
318                                 smpte.negative = true;
319                         } else {
320                                 offset_sample =  sample - _smpte_offset;
321                                 smpte.negative = false;
322                         }
323                 }
324         }
325   
326         double smpte_frames_left_exact;
327         double smpte_frames_fraction;
328         unsigned long smpte_frames_left;
329   
330         // Extract whole hours. Do this to prevent rounding errors with
331         // high sample numbers in the calculations that follow.
332         smpte.hours = offset_sample / _frames_per_hour;
333         offset_sample = offset_sample % _frames_per_hour;
334
335         // Calculate exact number of (exceeding) smpte frames and fractional frames
336         smpte_frames_left_exact = (double) offset_sample / _frames_per_smpte_frame;
337         smpte_frames_fraction = smpte_frames_left_exact - floor( smpte_frames_left_exact );
338         smpte.subframes = (long) rint(smpte_frames_fraction * Config->get_subframes_per_frame());
339   
340         // XXX Not sure if this is necessary anymore...
341         if (smpte.subframes == Config->get_subframes_per_frame()) {
342                 // This can happen with 24 fps (and 29.97 fps ?)
343                 smpte_frames_left_exact = ceil( smpte_frames_left_exact );
344                 smpte.subframes = 0;
345         }
346
347         // Extract hour-exceeding frames for minute, second and frame calculations
348         smpte_frames_left = ((long) floor( smpte_frames_left_exact ));
349
350         if (smpte_drop_frames()) {
351                 // See long explanation in smpte_to_sample()...
352
353                 // Number of 10 minute chunks
354                 smpte.minutes = (smpte_frames_left / 17982) * 10; // exactly 17982 frames in 10 minutes
355                 // frames exceeding the nearest 10 minute barrier
356                 long exceeding_df_frames = smpte_frames_left % 17982;
357
358                 // Find minutes exceeding the nearest 10 minute barrier
359                 if (exceeding_df_frames >= 1800) { // nothing to do if we are inside the first minute (0-1799)
360                         exceeding_df_frames -= 1800; // take away first minute (different number of frames than the others)
361                         long extra_minutes_minus_1 = exceeding_df_frames / 1798; // how many minutes after the first one
362                         exceeding_df_frames -= extra_minutes_minus_1 * 1798; // take away the (extra) minutes just found
363                         smpte.minutes += extra_minutes_minus_1 + 1; // update with exceeding minutes
364                 }
365     
366                 // Adjust frame numbering for dropped frames (frame 0 and 1 skipped at start of every minute except every 10th)
367                 if (smpte.minutes % 10) {
368                         // Every minute except every 10th
369                         if (exceeding_df_frames < 28) {
370                                 // First second, frames 0 and 1 are skipped
371                                 smpte.seconds = 0;
372                                 smpte.frames = exceeding_df_frames + 2;
373                         } else {
374                                 // All other seconds, all 30 frames are counted
375                                 exceeding_df_frames -= 28;
376                                 smpte.seconds = (exceeding_df_frames / 30) + 1;
377                                 smpte.frames = exceeding_df_frames % 30;
378                         }
379                 } else {
380                         // Every 10th minute, all 30 frames counted in all seconds
381                         smpte.seconds = exceeding_df_frames / 30;
382                         smpte.frames = exceeding_df_frames % 30;
383                 }
384         } else {
385                 // Non drop is easy
386                 smpte.minutes = smpte_frames_left / ((long) rint (smpte_frames_per_second ()) * 60);
387                 smpte_frames_left = smpte_frames_left % ((long) rint (smpte_frames_per_second ()) * 60);
388                 smpte.seconds = smpte_frames_left / (long) rint(smpte_frames_per_second ());
389                 smpte.frames = smpte_frames_left % (long) rint(smpte_frames_per_second ());
390         }
391
392         if (!use_subframes) {
393                 smpte.subframes = 0;
394         }
395         /* set frame rate and drop frame */
396         smpte.rate = smpte_frames_per_second ();
397         smpte.drop = smpte_drop_frames();
398 }
399
400 void
401 Session::smpte_time (nframes_t when, SMPTE::Time& smpte)
402 {
403         if (last_smpte_valid && when == last_smpte_when) {
404                 smpte = last_smpte;
405                 return;
406         }
407
408         sample_to_smpte( when, smpte, true /* use_offset */, false /* use_subframes */ );
409
410         last_smpte_when = when;
411         last_smpte = smpte;
412         last_smpte_valid = true;
413 }
414
415 void
416 Session::smpte_time_subframes (nframes_t when, SMPTE::Time& smpte)
417 {
418         if (last_smpte_valid && when == last_smpte_when) {
419                 smpte = last_smpte;
420                 return;
421         }
422   
423         sample_to_smpte( when, smpte, true /* use_offset */, true /* use_subframes */ );
424
425         last_smpte_when = when;
426         last_smpte = smpte;
427         last_smpte_valid = true;
428 }
429
430 void
431 Session::smpte_duration (nframes_t when, SMPTE::Time& smpte) const
432 {
433         sample_to_smpte( when, smpte, false /* use_offset */, true /* use_subframes */ );
434 }
435
436 void
437 Session::smpte_duration_string (char* buf, nframes_t when) const
438 {
439         SMPTE::Time smpte;
440
441         smpte_duration (when, smpte);
442         snprintf (buf, sizeof (buf), "%02" PRIu32 ":%02" PRIu32 ":%02" PRIu32 ":%02" PRIu32, smpte.hours, smpte.minutes, smpte.seconds, smpte.frames);
443 }
444
445 void
446 Session::smpte_time (SMPTE::Time &t)
447
448 {
449         smpte_time (_transport_frame, t);
450 }
451
452 int
453 Session::jack_sync_callback (jack_transport_state_t state,
454                              jack_position_t* pos)
455 {
456         bool slave = synced_to_jack();
457
458         switch (state) {
459         case JackTransportStopped:
460                 if (slave && _transport_frame != pos->frame && post_transport_work == 0) {
461                         request_locate (pos->frame, false);
462                         // cerr << "SYNC: stopped, locate to " << pos->frame << " from " << _transport_frame << endl;
463                         return false;
464                 } else {
465                         return true;
466                 }
467                 
468         case JackTransportStarting:
469                 // cerr << "SYNC: starting @ " << pos->frame << " a@ " << _transport_frame << " our work = " <<  post_transport_work << " pos matches ? " << (_transport_frame == pos->frame) << endl;
470                 if (slave) {
471                         return _transport_frame == pos->frame && post_transport_work == 0;
472                 } else {
473                         return true;
474                 }
475                 break;
476
477         case JackTransportRolling:
478                 // cerr << "SYNC: rolling slave = " << slave << endl;
479                 if (slave) {
480                         start_transport ();
481                 }
482                 break;
483
484         default:
485                 error << string_compose (_("Unknown JACK transport state %1 in sync callback"), state)
486                       << endmsg;
487         } 
488
489         return true;
490 }
491
492 void
493 Session::jack_timebase_callback (jack_transport_state_t state,
494                                  nframes_t nframes,
495                                  jack_position_t* pos,
496                                  int new_position)
497 {
498         BBT_Time bbt;
499
500         /* frame info */
501
502         pos->frame = _transport_frame;
503         pos->valid = JackPositionTimecode;
504
505         /* BBT info */
506         
507         if (_tempo_map) {
508
509                 TempoMap::Metric metric (_tempo_map->metric_at (_transport_frame));
510                 _tempo_map->bbt_time_with_metric (_transport_frame, bbt, metric);
511                 
512                 pos->bar = bbt.bars;
513                 pos->beat = bbt.beats;
514                 pos->tick = bbt.ticks;
515
516                 // XXX still need to set bar_start_tick
517
518                 pos->beats_per_bar = metric.meter().beats_per_bar();
519                 pos->beat_type = metric.meter().note_divisor();
520                 pos->ticks_per_beat = Meter::ticks_per_beat;
521                 pos->beats_per_minute = metric.tempo().beats_per_minute();
522
523                 pos->valid = jack_position_bits_t (pos->valid | JackPositionBBT);
524         }
525
526 #ifdef HAVE_JACK_VIDEO_SUPPORT
527         //poke audio video ratio so Ardour can track Video Sync
528         pos->audio_frames_per_video_frame = frame_rate() / smpte_frames_per_second();
529         pos->valid = jack_position_bits_t (pos->valid | JackAudioVideoRatio);
530 #endif
531
532 #if 0
533         /* SMPTE info */
534
535         t.smpte_offset = _smpte_offset;
536         t.smpte_frame_rate = smpte_frames_per_second();
537
538         if (_transport_speed) {
539
540                 if (play_loop) {
541
542                         Location* location = _locations.auto_loop_location();
543
544                         if (location) {
545
546                                 t.transport_state = JackTransportLooping;
547                                 t.loop_start = location->start();
548                                 t.loop_end = location->end();
549                                 t.valid = jack_transport_bits_t (t.valid | JackTransportLoop);
550
551                         } else {
552
553                                 t.loop_start = 0;
554                                 t.loop_end = 0;
555                                 t.transport_state = JackTransportRolling;
556
557                         }
558
559                 } else {
560
561                         t.loop_start = 0;
562                         t.loop_end = 0;
563                         t.transport_state = JackTransportRolling;
564
565                 }
566
567         } 
568
569 #endif          
570 }
571
572 nframes_t
573 Session::convert_to_frames_at (nframes_t position, AnyTime& any)
574 {
575         double secs;
576         
577         switch (any.type) {
578         case AnyTime::BBT:
579                 return _tempo_map->frame_time ( any.bbt);
580                 break;
581
582         case AnyTime::SMPTE:
583                 /* XXX need to handle negative values */
584                 secs = any.smpte.hours * 60 * 60;
585                 secs += any.smpte.minutes * 60;
586                 secs += any.smpte.seconds;
587                 secs += any.smpte.frames / smpte_frames_per_second();
588                 if (_smpte_offset_negative) 
589                 {
590                         return (nframes_t) floor (secs * frame_rate()) - _smpte_offset;
591                 }
592                 else
593                 {
594                         return (nframes_t) floor (secs * frame_rate()) + _smpte_offset;
595                 }
596                 break;
597
598         case AnyTime::Seconds:
599                 return (nframes_t) floor (any.seconds * frame_rate());
600                 break;
601
602         case AnyTime::Frames:
603                 return any.frames;
604                 break;
605         }
606
607         return any.frames;
608 }