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