Browse Source

fix broken jack_get_microseconds in drivers when libjackserver is RTLD_LOCAL

for python loading libjackserver and using controlAPI.
drivers are linked to a second instance of libjackserver.so and the
global symbol _jack_get_microseconds showed up uninitialised.

by providing a function pointer to right instance in the engine struct,
we can fix this problem. since _jack_get_microseconds is a in systemdeps,
we need a generic way to get the right function pointer.

git-svn-id: svn+ssh://jackaudio.org/trunk/jack@4421 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/0.121.0
torben 14 years ago
parent
commit
0cdc3916cd
15 changed files with 51 additions and 25 deletions
  1. +6
    -0
      config/os/generic/time.h
  2. +6
    -0
      config/os/gnu-linux/time.h
  3. +5
    -0
      config/os/macosx/time.c
  4. +8
    -0
      config/os/macosx/time.h
  5. +2
    -2
      drivers/alsa/alsa_driver.c
  6. +6
    -6
      drivers/coreaudio/coreaudio_driver.c
  7. +3
    -3
      drivers/dummy/dummy_driver.c
  8. +2
    -2
      drivers/firewire/ffado_driver.c
  9. +2
    -2
      drivers/freebob/freebob_driver.c
  10. +1
    -1
      drivers/netjack/net_driver.c
  11. +3
    -3
      drivers/oss/oss_driver.c
  12. +2
    -2
      drivers/portaudio/portaudio_driver.c
  13. +3
    -3
      drivers/sun/sun_driver.c
  14. +1
    -1
      jack/engine.h
  15. +1
    -0
      jackd/engine.c

+ 6
- 0
config/os/generic/time.h View File

@@ -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__ */

+ 6
- 0
config/os/gnu-linux/time.h View File

@@ -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__ */

+ 5
- 0
config/os/macosx/time.c View File

@@ -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__ */

+ 8
- 0
config/os/macosx/time.h View File

@@ -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__ */

+ 2
- 2
drivers/alsa/alsa_driver.c View File

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


+ 6
- 6
drivers/coreaudio/coreaudio_driver.c View File

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


+ 3
- 3
drivers/dummy/dummy_driver.c View File

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



+ 2
- 2
drivers/firewire/ffado_driver.c View File

@@ -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;


+ 2
- 2
drivers/freebob/freebob_driver.c View File

@@ -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;


+ 1
- 1
drivers/netjack/net_driver.c View File

@@ -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 */


+ 3
- 3
drivers/oss/oss_driver.c View File

@@ -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;



+ 2
- 2
drivers/portaudio/portaudio_driver.c View File

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



+ 3
- 3
drivers/sun/sun_driver.c View File

@@ -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;


+ 1
- 1
jack/engine.h View File

@@ -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 */


+ 1
- 0
jackd/engine.c View File

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



Loading…
Cancel
Save