| @@ -18,6 +18,7 @@ | |||||
| /*******************************************************************************/ | /*******************************************************************************/ | ||||
| #include "Engine.H" | #include "Engine.H" | ||||
| #include "Transport.H" | |||||
| #include "Timeline.H" // for process() | #include "Timeline.H" // for process() | ||||
| @@ -69,7 +70,7 @@ Engine::sync ( jack_transport_state_t state, jack_position_t *pos ) | |||||
| cycle */ | cycle */ | ||||
| request_locate( pos->frame ); | request_locate( pos->frame ); | ||||
| return 1; | return 1; | ||||
| case JackTransportStarting: /* this means JACK is polling slow-sync clients */ | |||||
| case JackTransportStarting: /* this means JACK is polling slow-sync clients */ | |||||
| { | { | ||||
| if ( ! seeking ) | if ( ! seeking ) | ||||
| { | { | ||||
| @@ -101,12 +102,9 @@ Engine::sync ( jack_transport_state_t state, jack_position_t *pos ) | |||||
| int | int | ||||
| Engine::process ( nframes_t nframes ) | Engine::process ( nframes_t nframes ) | ||||
| { | { | ||||
| jack_position_t pos; | |||||
| jack_transport_state_t ts; | |||||
| transport.poll(); | |||||
| ts = jack_transport_query( _client, &pos ); | |||||
| if ( ts != JackTransportRolling ) | |||||
| if ( ! transport.rolling ) | |||||
| return 0; | return 0; | ||||
| if ( ! trylock() ) | if ( ! trylock() ) | ||||
| @@ -50,6 +50,7 @@ class Engine : public Mutex | |||||
| private: | private: | ||||
| friend class Port; | friend class Port; | ||||
| friend class Transport; | |||||
| jack_client_t * client ( void ) { return _client; } | jack_client_t * client ( void ) { return _client; } | ||||
| public: | public: | ||||
| @@ -14,6 +14,7 @@ SRCS= \ | |||||
| Port.C \ | Port.C \ | ||||
| Disk_Stream.C \ | Disk_Stream.C \ | ||||
| Engine.C \ | Engine.C \ | ||||
| Transport.C \ | |||||
| Loggable.C \ | Loggable.C \ | ||||
| OBJS=$(SRCS:.C=.o) | OBJS=$(SRCS:.C=.o) | ||||
| @@ -29,9 +29,13 @@ | |||||
| #include "Track_Header.H" | #include "Track_Header.H" | ||||
| const float UPDATE_FREQ = 0.02f; | |||||
| #include "Disk_Stream.H" | #include "Disk_Stream.H" | ||||
| #include "Transport.H" | |||||
| void | void | ||||
| Timeline::cb_scroll ( Fl_Widget *w, void *v ) | Timeline::cb_scroll ( Fl_Widget *w, void *v ) | ||||
| { | { | ||||
| @@ -178,6 +182,7 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : Fl_Overlay_Wi | |||||
| } | } | ||||
| /* make sure scrollbars are on top */ | /* make sure scrollbars are on top */ | ||||
| add( vscroll ); | add( vscroll ); | ||||
| add( hscroll ); | add( hscroll ); | ||||
| @@ -187,6 +192,9 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : Fl_Overlay_Wi | |||||
| redraw(); | redraw(); | ||||
| end(); | end(); | ||||
| Fl::add_timeout( UPDATE_FREQ, update_cb, this ); | |||||
| } | } | ||||
| @@ -446,9 +454,43 @@ Timeline::draw ( void ) | |||||
| } | } | ||||
| void | |||||
| Timeline::draw_playhead ( void ) | |||||
| { | |||||
| int x = ( ts_to_x( transport.frame ) - ts_to_x( xoffset ) ) + tracks->x() + Track_Header::width(); | |||||
| if ( x < 0 || x > tracks->w() ) | |||||
| return; | |||||
| fl_color( FL_RED ); | |||||
| fl_line( x, rulers->y() + rulers->h(), x, rulers->y() + rulers->h() + tracks->h() ); | |||||
| } | |||||
| void | |||||
| Timeline::redraw_playhead ( void ) | |||||
| { | |||||
| redraw_overlay(); | |||||
| } | |||||
| /** called so many times a second to redraw the playhead etc. */ | |||||
| void | |||||
| Timeline::update_cb ( void *arg ) | |||||
| { | |||||
| Fl::repeat_timeout( UPDATE_FREQ, update_cb, arg ); | |||||
| Timeline *tl = (Timeline *)arg; | |||||
| tl->redraw_playhead(); | |||||
| } | |||||
| void | void | ||||
| Timeline::draw_overlay ( void ) | Timeline::draw_overlay ( void ) | ||||
| { | { | ||||
| draw_playhead(); | |||||
| if ( ! ( _selection.w && _selection.h ) ) | if ( ! ( _selection.w && _selection.h ) ) | ||||
| return; | return; | ||||
| @@ -138,9 +138,12 @@ public: | |||||
| void draw_measure_lines ( int X, int Y, int W, int H, Fl_Color color ); | void draw_measure_lines ( int X, int Y, int W, int H, Fl_Color color ); | ||||
| void xposition ( int X ); | void xposition ( int X ); | ||||
| void yposition ( int Y ); | void yposition ( int Y ); | ||||
| void draw_playhead ( void ); | |||||
| void redraw_playhead ( void ); | |||||
| void draw ( void ); | void draw ( void ); | ||||
| void draw_overlay ( void ); | void draw_overlay ( void ); | ||||
| int handle ( int m ); | int handle ( int m ); | ||||
| static void update_cb ( void *arg ); | |||||
| void select( const Rectangle &r ); | void select( const Rectangle &r ); | ||||
| @@ -0,0 +1,33 @@ | |||||
| /*******************************************************************************/ | |||||
| /* Copyright (C) 2008 Jonathan Moore Liles */ | |||||
| /* */ | |||||
| /* This program is free software; you can redistribute it and/or modify it */ | |||||
| /* under the terms of the GNU General Public License as published by the */ | |||||
| /* Free Software Foundation; either version 2 of the License, or (at your */ | |||||
| /* option) any later version. */ | |||||
| /* */ | |||||
| /* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||||
| /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||||
| /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||||
| /* more details. */ | |||||
| /* */ | |||||
| /* You should have received a copy of the GNU General Public License along */ | |||||
| /* with This program; see the file COPYING. If not,write to the Free Software */ | |||||
| /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||||
| /*******************************************************************************/ | |||||
| #include "Transport.H" | |||||
| #include "Engine.H" | |||||
| Transport transport; | |||||
| void | |||||
| Transport::poll ( void ) | |||||
| { | |||||
| jack_transport_state_t ts; | |||||
| ts = jack_transport_query( engine->client(), this ); | |||||
| rolling = ts == JackTransportRolling; | |||||
| } | |||||
| @@ -0,0 +1,32 @@ | |||||
| /*******************************************************************************/ | |||||
| /* Copyright (C) 2008 Jonathan Moore Liles */ | |||||
| /* */ | |||||
| /* This program is free software; you can redistribute it and/or modify it */ | |||||
| /* under the terms of the GNU General Public License as published by the */ | |||||
| /* Free Software Foundation; either version 2 of the License, or (at your */ | |||||
| /* option) any later version. */ | |||||
| /* */ | |||||
| /* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||||
| /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||||
| /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||||
| /* more details. */ | |||||
| /* */ | |||||
| /* You should have received a copy of the GNU General Public License along */ | |||||
| /* with This program; see the file COPYING. If not,write to the Free Software */ | |||||
| /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||||
| /*******************************************************************************/ | |||||
| #pragma once | |||||
| #include <jack/transport.h> | |||||
| #include "types.h" | |||||
| struct Transport : public jack_position_t | |||||
| { | |||||
| bool rolling; | |||||
| void poll ( void ); | |||||
| }; | |||||
| extern Transport transport; | |||||