@@ -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 ); | |||
@@ -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 ); } | |||
}; | |||
@@ -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} | |||
} { | |||