From a213dd2c665ce87a0258b1ffa892d418a4c96b14 Mon Sep 17 00:00:00 2001 From: Jonathan Moore Liles Date: Tue, 29 Apr 2008 12:18:27 -0500 Subject: [PATCH] Add xrun display to GUI. --- Timeline/Engine.C | 29 +++++++++++++++++++++++++---- Timeline/Engine.H | 6 +++++- Timeline/TLE.fl | 13 ++++++++++--- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/Timeline/Engine.C b/Timeline/Engine.C index 4d2ebf5..a67dfc4 100644 --- a/Timeline/Engine.C +++ b/Timeline/Engine.C @@ -33,21 +33,30 @@ Engine::Engine ( ) _buffers_dropped = 0; } +/*******************/ +/* Static Wrappers */ +/*******************/ -/* static wrapper */ int Engine::process ( nframes_t nframes, void *arg ) { return ((Engine*)arg)->process( nframes ); } -/* static wrapper */ int Engine::sync ( jack_transport_state_t state, jack_position_t *pos, void *arg ) { return ((Engine*)arg)->sync( state, pos ); } +int +Engine::xrun ( void *arg ) +{ + return ((Engine*)arg)->xrun( arg ); +} + + + void Engine::request_locate ( nframes_t frame ) { @@ -55,6 +64,16 @@ Engine::request_locate ( nframes_t frame ) timeline->seek( frame ); } +/* THREAD: RT */ +/** This is the jack xrun callback */ +int +Engine::xrun ( void ) +{ + ++_xruns; + + return 0; +} + /* THREAD: RT */ /** This is the jack slow-sync callback. */ int @@ -140,11 +159,13 @@ Engine::init ( void ) if (( _client = jack_client_open ( APP_NAME, (jack_options_t)0, NULL )) == 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 has been loaded (and we have disk threads running)? */ - jack_set_sync_callback( _client, &Engine::sync, this ); + set_callback( sync ); jack_activate( _client ); diff --git a/Timeline/Engine.H b/Timeline/Engine.H index f0fadbe..93774db 100644 --- a/Timeline/Engine.H +++ b/Timeline/Engine.H @@ -41,11 +41,15 @@ class Engine : public Mutex blocking operations. */ int _buffers_dropped; /* buffers dropped because of locking */ + nframes_t _sample_rate; + volatile int _xruns; static int process ( nframes_t nframes, void *arg ); int process ( nframes_t nframes ); 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 ); + static int xrun ( void *arg ); + int xrun ( void ); private: @@ -53,7 +57,6 @@ private: friend class Transport; jack_client_t * client ( void ) { return _client; } - nframes_t _sample_rate; public: @@ -66,6 +69,7 @@ public: nframes_t nframes ( void ) const { return jack_get_buffer_size( _client ); } float frame_rate ( void ) const { return jack_get_sample_rate( _client ); } 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 ); } }; diff --git a/Timeline/TLE.fl b/Timeline/TLE.fl index b842a5d..28a6862 100644 --- a/Timeline/TLE.fl +++ b/Timeline/TLE.fl @@ -112,9 +112,9 @@ free( path );} {} } { Fl_Window main_window { 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} } { Submenu {} { @@ -509,6 +509,10 @@ delete win;} code0 {timeline = o;} 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} @@ -525,7 +529,10 @@ p->label( s );} {} update_progress( capture_buffer_progress, cbp, timeline->total_input_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} } {