diff --git a/config/os/generic/time.h b/config/os/generic/time.h index 6e1760a..e57391c 100644 --- a/config/os/generic/time.h +++ b/config/os/generic/time.h @@ -30,4 +30,10 @@ jack_get_microseconds (void) { return jack_get_microseconds_from_system (); } +typedef jack_time_t (*jack_get_microseconds_t)(void); +static inline jack_get_microseconds_t jack_get_microseconds_pointer(void) +{ + return jack_get_microseconds_from_system; +} + #endif /* __jack_time_h__ */ diff --git a/config/os/gnu-linux/time.h b/config/os/gnu-linux/time.h index 10a2a8c..16e7e58 100644 --- a/config/os/gnu-linux/time.h +++ b/config/os/gnu-linux/time.h @@ -33,4 +33,10 @@ jack_get_microseconds (void) return _jack_get_microseconds (); } +typedef jack_time_t (*jack_get_microseconds_t)(void); +static inline jack_get_microseconds_t jack_get_microseconds_pointer(void) +{ + return _jack_get_microseconds; +} + #endif /* __jack_time_h__ */ diff --git a/config/os/macosx/time.c b/config/os/macosx/time.c index 4c8ebb5..2249121 100644 --- a/config/os/macosx/time.c +++ b/config/os/macosx/time.c @@ -38,4 +38,9 @@ void jack_set_clock_source (jack_timer_type_t clocksrc) /* only one clock source for os x */ } +static jack_time_t +jack_get_microseconds_symbol(void) +{ + return (jack_time_t) mach_absolute_time () * __jack_time_ratio; +} #endif /* __jack_time_c__ */ diff --git a/config/os/macosx/time.h b/config/os/macosx/time.h index b384098..0a47f08 100644 --- a/config/os/macosx/time.h +++ b/config/os/macosx/time.h @@ -31,4 +31,12 @@ jack_get_microseconds(void) return (jack_time_t) mach_absolute_time () * __jack_time_ratio; } +extern jack_time_t jack_get_microseconds_symbol(void); + +typedef jack_time_t (*jack_get_microseconds_t)(void); +static inline jack_get_microseconds_t jack_get_microseconds_pointer(void) +{ + return jack_get_microseconds_symbol; +} + #endif /* __jack_time_h__ */ diff --git a/drivers/alsa/alsa_driver.c b/drivers/alsa/alsa_driver.c index f8cd209..05581ee 100644 --- a/drivers/alsa/alsa_driver.c +++ b/drivers/alsa/alsa_driver.c @@ -1262,7 +1262,7 @@ alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *status, float nfds++; } - poll_enter = jack_get_microseconds (); + poll_enter = driver->engine->get_microseconds (); if (poll_enter > driver->poll_next) { /* @@ -1296,7 +1296,7 @@ alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *status, float } - poll_ret = jack_get_microseconds (); + poll_ret = driver->engine->get_microseconds (); if (extra_fd < 0) { if (driver->poll_next && poll_ret > driver->poll_next) { diff --git a/drivers/coreaudio/coreaudio_driver.c b/drivers/coreaudio/coreaudio_driver.c index 9bb1562..9dfb9a3 100755 --- a/drivers/coreaudio/coreaudio_driver.c +++ b/drivers/coreaudio/coreaudio_driver.c @@ -297,16 +297,16 @@ static OSStatus render(void *inRefCon, AudioUnitRender(ca_driver->au_hal, ioActionFlags, inTimeStamp, 1, inNumberFrames, ca_driver->input_list); if (ca_driver->xrun_detected > 0) { /* XRun was detected */ - jack_time_t current_time = jack_get_microseconds(); + jack_time_t current_time = ca_driver->engine->get_microseconds(); ca_driver->engine->delay(ca_driver->engine, current_time - (ca_driver->last_wait_ust + ca_driver->period_usecs)); ca_driver->last_wait_ust = current_time; ca_driver->xrun_detected = 0; return 0; } else { - ca_driver->last_wait_ust = jack_get_microseconds(); + ca_driver->last_wait_ust = ca_driver->engine->get_microseconds(); ca_driver->engine->transport_cycle_start(ca_driver->engine, - jack_get_microseconds()); + ca_driver->engine->get_microseconds()); res = ca_driver->engine->run_cycle(ca_driver->engine, inNumberFrames, 0); } @@ -337,16 +337,16 @@ static OSStatus render_input(void *inRefCon, coreaudio_driver_t* ca_driver = (coreaudio_driver_t*)inRefCon; AudioUnitRender(ca_driver->au_hal, ioActionFlags, inTimeStamp, 1, inNumberFrames, ca_driver->input_list); if (ca_driver->xrun_detected > 0) { /* XRun was detected */ - jack_time_t current_time = jack_get_microseconds(); + jack_time_t current_time = ca_driver->engine->get_microseconds(); ca_driver->engine->delay(ca_driver->engine, current_time - (ca_driver->last_wait_ust + ca_driver->period_usecs)); ca_driver->last_wait_ust = current_time; ca_driver->xrun_detected = 0; return 0; } else { - ca_driver->last_wait_ust = jack_get_microseconds(); + ca_driver->last_wait_ust = ca_driver->engine->get_microseconds(); ca_driver->engine->transport_cycle_start(ca_driver->engine, - jack_get_microseconds()); + ca_driver->engine->get_microseconds()); return ca_driver->engine->run_cycle(ca_driver->engine, inNumberFrames, 0); } } diff --git a/drivers/dummy/dummy_driver.c b/drivers/dummy/dummy_driver.c index 5647d20..3d101bb 100644 --- a/drivers/dummy/dummy_driver.c +++ b/drivers/dummy/dummy_driver.c @@ -146,7 +146,7 @@ dummy_driver_wait (dummy_driver_t *driver, int extra_fd, int *status, driver->next_wakeup = add_ts(driver->next_wakeup, driver->wait_time); } - driver->last_wait_ust = jack_get_microseconds (); + driver->last_wait_ust = driver->engine->get_microseconds (); driver->engine->transport_cycle_start (driver->engine, driver->last_wait_ust); @@ -165,7 +165,7 @@ static jack_nframes_t dummy_driver_wait (dummy_driver_t *driver, int extra_fd, int *status, float *delayed_usecs) { - jack_time_t now = jack_get_microseconds(); + jack_time_t now = driver->engine->get_microseconds(); if (driver->next_time < now) { if (driver->next_time == 0) { @@ -191,7 +191,7 @@ dummy_driver_wait (dummy_driver_t *driver, int extra_fd, int *status, driver->next_time += driver->wait_time; } - driver->last_wait_ust = jack_get_microseconds (); + driver->last_wait_ust = driver->engine->get_microseconds (); driver->engine->transport_cycle_start (driver->engine, driver->last_wait_ust); diff --git a/drivers/firewire/ffado_driver.c b/drivers/firewire/ffado_driver.c index ddf7c9b..6ee9a7a 100644 --- a/drivers/firewire/ffado_driver.c +++ b/drivers/firewire/ffado_driver.c @@ -520,7 +520,7 @@ ffado_driver_wait (ffado_driver_t *driver, int extra_fd, int *status, printEnter(); - wait_enter = jack_get_microseconds (); + wait_enter = driver->engine->get_microseconds (); if (wait_enter > driver->wait_next) { /* * This processing cycle was delayed past the @@ -536,7 +536,7 @@ ffado_driver_wait (ffado_driver_t *driver, int extra_fd, int *status, response = ffado_streaming_wait(driver->dev); - wait_ret = jack_get_microseconds (); + wait_ret = driver->engine->get_microseconds (); if (driver->wait_next && wait_ret > driver->wait_next) { *delayed_usecs = wait_ret - driver->wait_next; diff --git a/drivers/freebob/freebob_driver.c b/drivers/freebob/freebob_driver.c index 20a539d..530b115 100644 --- a/drivers/freebob/freebob_driver.c +++ b/drivers/freebob/freebob_driver.c @@ -452,7 +452,7 @@ freebob_driver_wait (freebob_driver_t *driver, int extra_fd, int *status, printEnter(); - wait_enter = jack_get_microseconds (); + wait_enter = driver->engine->get_microseconds (); if (wait_enter > driver->wait_next) { /* * This processing cycle was delayed past the @@ -468,7 +468,7 @@ freebob_driver_wait (freebob_driver_t *driver, int extra_fd, int *status, nframes=freebob_streaming_wait(driver->dev); - wait_ret = jack_get_microseconds (); + wait_ret = driver->engine->get_microseconds (); if (driver->wait_next && wait_ret > driver->wait_next) { *delayed_usecs = wait_ret - driver->wait_next; diff --git a/drivers/netjack/net_driver.c b/drivers/netjack/net_driver.c index 01bbb3e..a20e9aa 100644 --- a/drivers/netjack/net_driver.c +++ b/drivers/netjack/net_driver.c @@ -67,7 +67,7 @@ net_driver_wait (net_driver_t *driver, int extra_fd, int *status, float *delayed } - driver->last_wait_ust = jack_get_microseconds (); + driver->last_wait_ust = driver->engine->get_microseconds (); driver->engine->transport_cycle_start (driver->engine, driver->last_wait_ust); /* this driver doesn't work so well if we report a delay */ diff --git a/drivers/oss/oss_driver.c b/drivers/oss/oss_driver.c index eddb2c9..9726249 100644 --- a/drivers/oss/oss_driver.c +++ b/drivers/oss/oss_driver.c @@ -181,7 +181,7 @@ static void set_period_size (oss_driver_t *driver, ((double) driver->period_size / (double) driver->sample_rate) * 1e6; driver->last_wait_ust = 0; - driver->last_periodtime = jack_get_microseconds(); + driver->last_periodtime = driver->engine->get_microseconds(); driver->next_periodtime = 0; driver->iodelay = 0.0F; } @@ -189,7 +189,7 @@ static void set_period_size (oss_driver_t *driver, static inline void update_times (oss_driver_t *driver) { - driver->last_periodtime = jack_get_microseconds(); + driver->last_periodtime = driver->engine->get_microseconds(); if (driver->next_periodtime > 0) { driver->iodelay = (float) @@ -759,7 +759,7 @@ static int oss_driver_start (oss_driver_t *driver) if (driver->threads & 1) sem_post(&driver->sem_start); if (driver->threads & 2) sem_post(&driver->sem_start); - driver->last_periodtime = jack_get_microseconds(); + driver->last_periodtime = driver->engine->get_microseconds(); driver->next_periodtime = 0; driver->iodelay = 0.0F; diff --git a/drivers/portaudio/portaudio_driver.c b/drivers/portaudio/portaudio_driver.c index 97cea9b..50a43ac 100644 --- a/drivers/portaudio/portaudio_driver.c +++ b/drivers/portaudio/portaudio_driver.c @@ -121,7 +121,7 @@ paCallback(void *inputBuffer, void *outputBuffer, driver->inPortAudio = (float*)inputBuffer; driver->outPortAudio = (float*)outputBuffer; - driver->last_wait_ust = jack_get_microseconds(); + driver->last_wait_ust = driver->engine->get_microseconds(); return driver->engine->run_cycle(driver->engine, framesPerBuffer, 0); } @@ -247,7 +247,7 @@ portaudio_driver_read (portaudio_driver_t *driver, jack_nframes_t nframes) } driver->engine->transport_cycle_start (driver->engine, - jack_get_microseconds ()); + driver->engine->get_microseconds ()); return 0; } diff --git a/drivers/sun/sun_driver.c b/drivers/sun/sun_driver.c index aff6894..5ecc8a3 100644 --- a/drivers/sun/sun_driver.c +++ b/drivers/sun/sun_driver.c @@ -243,7 +243,7 @@ sun_driver_wait (sun_driver_t *driver, int *status, float *iodelay) if (driver->outfd >= 0) need_playback = 1; - poll_enter = jack_get_microseconds(); + poll_enter = driver->engine->get_microseconds(); if (poll_enter > driver->poll_next) { /* late. don't count as wakeup delay. */ @@ -284,7 +284,7 @@ sun_driver_wait (sun_driver_t *driver, int *status, float *iodelay) } } - poll_ret = jack_get_microseconds(); + poll_ret = driver->engine->get_microseconds(); if (driver->poll_next && poll_ret > driver->poll_next) *iodelay = poll_ret - driver->poll_next; @@ -425,7 +425,7 @@ sun_driver_run_cycle (sun_driver_t *driver) return -1; case -5: /* poll() timeout */ - now = jack_get_microseconds(); + now = driver->engine->get_microseconds(); if (now > driver->poll_next) { iodelay = now - driver->poll_next; diff --git a/jack/engine.h b/jack/engine.h index d09127e..ba2e475 100644 --- a/jack/engine.h +++ b/jack/engine.h @@ -78,7 +78,7 @@ struct _jack_engine { void (*delay) (struct _jack_engine *, float delayed_usecs); void (*transport_cycle_start) (struct _jack_engine *, jack_time_t time); void (*driver_exit) (struct _jack_engine *); - + jack_time_t (*get_microseconds)(void); /* "private" sections starts here */ /* engine serialization -- use precedence for deadlock avoidance */ diff --git a/jackd/engine.c b/jackd/engine.c index e88c415..f6d0111 100644 --- a/jackd/engine.c +++ b/jackd/engine.c @@ -1978,6 +1978,7 @@ jack_engine_new (int realtime, int rtpriority, int do_mlock, int do_unlock, jack_set_clock_source (clock_source); engine->control->clock_source = clock_source; + engine->get_microseconds = jack_get_microseconds_pointer(); VERBOSE (engine, "clock source = %s", jack_clock_source_name (clock_source));