| @@ -33,21 +33,30 @@ Engine::Engine ( ) | |||||
| _buffers_dropped = 0; | _buffers_dropped = 0; | ||||
| } | } | ||||
| /*******************/ | |||||
| /* Static Wrappers */ | |||||
| /*******************/ | |||||
| /* static wrapper */ | |||||
| int | int | ||||
| Engine::process ( nframes_t nframes, void *arg ) | Engine::process ( nframes_t nframes, void *arg ) | ||||
| { | { | ||||
| return ((Engine*)arg)->process( nframes ); | return ((Engine*)arg)->process( nframes ); | ||||
| } | } | ||||
| /* static wrapper */ | |||||
| int | int | ||||
| Engine::sync ( jack_transport_state_t state, jack_position_t *pos, void *arg ) | Engine::sync ( jack_transport_state_t state, jack_position_t *pos, void *arg ) | ||||
| { | { | ||||
| return ((Engine*)arg)->sync( state, pos ); | return ((Engine*)arg)->sync( state, pos ); | ||||
| } | } | ||||
| int | |||||
| Engine::xrun ( void *arg ) | |||||
| { | |||||
| return ((Engine*)arg)->xrun( arg ); | |||||
| } | |||||
| void | void | ||||
| Engine::request_locate ( nframes_t frame ) | Engine::request_locate ( nframes_t frame ) | ||||
| { | { | ||||
| @@ -55,6 +64,16 @@ Engine::request_locate ( nframes_t frame ) | |||||
| timeline->seek( frame ); | timeline->seek( frame ); | ||||
| } | } | ||||
| /* THREAD: RT */ | |||||
| /** This is the jack xrun callback */ | |||||
| int | |||||
| Engine::xrun ( void ) | |||||
| { | |||||
| ++_xruns; | |||||
| return 0; | |||||
| } | |||||
| /* THREAD: RT */ | /* THREAD: RT */ | ||||
| /** This is the jack slow-sync callback. */ | /** This is the jack slow-sync callback. */ | ||||
| int | int | ||||
| @@ -140,11 +159,13 @@ Engine::init ( void ) | |||||
| if (( _client = jack_client_open ( APP_NAME, (jack_options_t)0, NULL )) == 0 ) | if (( _client = jack_client_open ( APP_NAME, (jack_options_t)0, NULL )) == 0 ) | ||||
| return 0; | return 0; | ||||
| jack_set_process_callback( _client, &Engine::process, this ); | |||||
| #define set_callback( name ) jack_set_ ## name ## _callback( _client, &Engine:: name , this ) | |||||
| set_callback( process ); | |||||
| set_callback( xrun ); | |||||
| /* FIXME: should we wait to register this until after the session | /* FIXME: should we wait to register this until after the session | ||||
| has been loaded (and we have disk threads running)? */ | has been loaded (and we have disk threads running)? */ | ||||
| jack_set_sync_callback( _client, &Engine::sync, this ); | |||||
| set_callback( sync ); | |||||
| jack_activate( _client ); | jack_activate( _client ); | ||||
| @@ -41,11 +41,15 @@ class Engine : public Mutex | |||||
| blocking operations. */ | blocking operations. */ | ||||
| int _buffers_dropped; /* buffers dropped because of locking */ | int _buffers_dropped; /* buffers dropped because of locking */ | ||||
| nframes_t _sample_rate; | |||||
| volatile int _xruns; | |||||
| static int process ( nframes_t nframes, void *arg ); | static int process ( nframes_t nframes, void *arg ); | ||||
| int process ( nframes_t nframes ); | int process ( nframes_t nframes ); | ||||
| static int sync ( jack_transport_state_t state, jack_position_t *pos, void *arg ); | static int sync ( jack_transport_state_t state, jack_position_t *pos, void *arg ); | ||||
| int sync ( jack_transport_state_t state, jack_position_t *pos ); | int sync ( jack_transport_state_t state, jack_position_t *pos ); | ||||
| static int xrun ( void *arg ); | |||||
| int xrun ( void ); | |||||
| private: | private: | ||||
| @@ -53,7 +57,6 @@ private: | |||||
| friend class Transport; | friend class Transport; | ||||
| jack_client_t * client ( void ) { return _client; } | jack_client_t * client ( void ) { return _client; } | ||||
| nframes_t _sample_rate; | |||||
| public: | public: | ||||
| @@ -66,6 +69,7 @@ public: | |||||
| nframes_t nframes ( void ) const { return jack_get_buffer_size( _client ); } | nframes_t nframes ( void ) const { return jack_get_buffer_size( _client ); } | ||||
| float frame_rate ( void ) const { return jack_get_sample_rate( _client ); } | float frame_rate ( void ) const { return jack_get_sample_rate( _client ); } | ||||
| nframes_t sample_rate ( void ) const { return _sample_rate; } | nframes_t sample_rate ( void ) const { return _sample_rate; } | ||||
| int xruns ( void ) const { return _xruns; }; | |||||
| float cpu_load ( void ) const { return jack_cpu_load( _client ); } | float cpu_load ( void ) const { return jack_cpu_load( _client ); } | ||||
| }; | }; | ||||
| @@ -112,9 +112,9 @@ free( path );} {} | |||||
| } { | } { | ||||
| Fl_Window main_window { | Fl_Window main_window { | ||||
| label {Non-DAW - Timeline} open | label {Non-DAW - Timeline} open | ||||
| xywh {577 50 1024 768} type Double resizable xclass {Non-DAW} visible | |||||
| xywh {577 94 1024 768} type Double resizable xclass {Non-DAW} visible | |||||
| } { | } { | ||||
| Fl_Menu_Bar menubar {open selected | |||||
| Fl_Menu_Bar menubar { | |||||
| xywh {0 0 1024 25} | xywh {0 0 1024 25} | ||||
| } { | } { | ||||
| Submenu {} { | Submenu {} { | ||||
| @@ -509,6 +509,10 @@ delete win;} | |||||
| code0 {timeline = o;} | code0 {timeline = o;} | ||||
| class Timeline | class Timeline | ||||
| } | } | ||||
| Fl_Value_Output xruns_output { | |||||
| label {xruns:} selected | |||||
| xywh {980 2 44 20} maximum 40000 step 1 | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| Function {update_progress( Fl_Progress *p, char *s, float v )} {open private return_type {static void} | Function {update_progress( Fl_Progress *p, char *s, float v )} {open private return_type {static void} | ||||
| @@ -525,7 +529,10 @@ p->label( s );} {} | |||||
| update_progress( capture_buffer_progress, cbp, timeline->total_input_buffer_percent() ); | update_progress( capture_buffer_progress, cbp, timeline->total_input_buffer_percent() ); | ||||
| update_progress( playback_buffer_progress, pbp, timeline->total_output_buffer_percent() ); | update_progress( playback_buffer_progress, pbp, timeline->total_output_buffer_percent() ); | ||||
| update_progress( cpu_load_progress, clp, engine->cpu_load() );} {} | |||||
| update_progress( cpu_load_progress, clp, engine->cpu_load() ); | |||||
| xruns_output->value( engine->xruns() );} {} | |||||
| } | } | ||||
| Function {update_cb( void *v )} {open return_type {static void} | Function {update_cb( void *v )} {open return_type {static void} | ||||
| } { | } { | ||||