| @@ -30,6 +30,9 @@ switched between Bar Beat Tick and Wallclock displays */ | |||
| const float CLOCK_UPDATE_FREQ = 0.06f; | |||
| /* TODO: frames per second? */ | |||
| class Clock : public Fl_Widget | |||
| { | |||
| nframes_t _when; | |||
| @@ -52,10 +55,10 @@ class Clock : public Fl_Widget | |||
| public: | |||
| enum { BBT, HMS }; | |||
| enum { HMS = 0, BBT, Timecode, Sample, TYPE_MAX }; | |||
| static void | |||
| frame_to_HMS ( char *dst, int n, nframes_t frame ) | |||
| frame_to_Timecode ( char *dst, int n, nframes_t frame ) | |||
| { | |||
| float S = (double)frame / timeline->sample_rate(); | |||
| @@ -66,6 +69,30 @@ public: | |||
| snprintf( dst, n, "%02d:%02d:%02.0f:%02d", H, M, S, HS ); | |||
| } | |||
| static void | |||
| frame_to_HMS ( char *dst, int n, nframes_t frame ) | |||
| { | |||
| float S = (double)frame / timeline->sample_rate(); | |||
| int M = S / 60; S -= M * 60; | |||
| int H = M / 60; M -= H * 60; | |||
| snprintf( dst, n, "%02d:%02d:%05.3f", H, M, S ); | |||
| } | |||
| static void | |||
| frame_to_Sample ( char *dst, int n, nframes_t frame ) | |||
| { | |||
| snprintf( dst, n, "%lu", (unsigned long)frame ); | |||
| } | |||
| static void | |||
| frame_to_BBT ( char *dst, int n, nframes_t frame ) | |||
| { | |||
| snprintf( dst, n, "unimplemented" ); | |||
| } | |||
| Clock ( int X, int Y, int W, int H, const char *L=0 ) | |||
| : Fl_Widget( X, Y, W, H, L ) | |||
| @@ -104,6 +131,8 @@ public: | |||
| { | |||
| draw_box(); | |||
| fl_push_clip( x(), y(), w(), h() ); | |||
| char buf[15]; | |||
| *buf = '\0'; | |||
| @@ -113,7 +142,13 @@ public: | |||
| frame_to_HMS( buf, sizeof( buf ), _when ); | |||
| break; | |||
| case BBT: | |||
| // frame_to_BBT( _buf, sizeof( buf ), frame ); | |||
| frame_to_BBT( buf, sizeof( buf ), _when ); | |||
| break; | |||
| case Timecode: | |||
| frame_to_Timecode( buf, sizeof( buf ), _when ); | |||
| break; | |||
| case Sample: | |||
| frame_to_Sample( buf, sizeof( buf ), _when ); | |||
| break; | |||
| default: | |||
| printf( "error: invalid clock type\n" ); | |||
| @@ -140,14 +175,50 @@ public: | |||
| fl_draw( buf, dx, dy, dw, dh - 9, FL_ALIGN_CENTER ); | |||
| fl_font( FL_HELVETICA, 9 ); | |||
| fl_color( FL_RED ); | |||
| const char *s = type() == HMS ? "HMS" : "BBT"; | |||
| const char *types[] = { "HMS", "BBT", "Timecode", "Sample" }; | |||
| fl_color( FL_CYAN ); | |||
| switch ( type() ) | |||
| { | |||
| case Timecode: | |||
| snprintf( buf, sizeof( buf ), "%.1f", 30.0 ); | |||
| fl_draw( buf, dx, dy, dw, dh, FL_ALIGN_BOTTOM ); | |||
| break; | |||
| case Sample: | |||
| snprintf( buf, sizeof( buf ), "%lu", (unsigned long)timeline->sample_rate() ); | |||
| fl_draw( buf, dx, dy, dw, dh, FL_ALIGN_BOTTOM ); | |||
| break; | |||
| default: | |||
| break; | |||
| } | |||
| const char *s = types[ type() ]; | |||
| fl_color( FL_RED ); | |||
| fl_draw( s, dx + 4, dy, dw, dh, (Fl_Align)( FL_ALIGN_LEFT | FL_ALIGN_BOTTOM ) ); | |||
| if ( label() ) | |||
| fl_draw( label(), dx, dy, dw, dh, (Fl_Align)( FL_ALIGN_RIGHT | FL_ALIGN_BOTTOM ) ); | |||
| fl_pop_clip(); | |||
| } | |||
| int handle ( int m ) | |||
| { | |||
| if ( m == FL_PUSH ) | |||
| { | |||
| int t = type() + 1; | |||
| if ( t >= TYPE_MAX ) | |||
| t = 0; | |||
| type( t ); | |||
| redraw(); | |||
| } | |||
| } | |||
| }; | |||