diff --git a/drivers/alsa/alsa_driver.c b/drivers/alsa/alsa_driver.c index 6b7f453..b67d824 100644 --- a/drivers/alsa/alsa_driver.c +++ b/drivers/alsa/alsa_driver.c @@ -337,12 +337,19 @@ alsa_driver_configure_stream (alsa_driver_t *driver, jack_error ("ALSA: cannot set start mode for %s", stream_name); return -1; } - - if ((err = snd_pcm_sw_params_set_stop_threshold (handle, sw_params, driver->user_nperiods * driver->frames_per_cycle)) < 0) { - jack_error ("ALSA: cannot set stop mode for %s", stream_name); - return -1; - } + { + snd_pcm_uframes_t stop_th = driver->user_nperiods * driver->frames_per_cycle; + if (driver->soft_mode) { + stop_th = (snd_pcm_uframes_t)-1; + } + + if ((err = snd_pcm_sw_params_set_stop_threshold (handle, sw_params, stop_th)) < 0) { + jack_error ("ALSA: cannot set stop mode for %s", stream_name); + return -1; + } + } + if ((err = snd_pcm_sw_params_set_silence_threshold (handle, sw_params, 0)) < 0) { jack_error ("ALSA: cannot set silence threshold for %s", stream_name); return -1; @@ -1393,15 +1400,16 @@ alsa_driver_new (char *name, char *alsa_device, int hw_monitoring, int capturing, int playing, - DitherAlgorithm dither) + DitherAlgorithm dither, + int soft_mode) { int err; alsa_driver_t *driver; - printf ("creating alsa driver ... %s|%lu|%lu|%lu|%s\n", + printf ("creating alsa driver ... %s|%lu|%lu|%lu|%s|%s\n", alsa_device, frames_per_cycle, user_nperiods, rate, - hw_monitoring ? "hwmon":"swmon"); + hw_monitoring ? "hwmon":"swmon", soft_mode ? "soft-mode":"rt"); driver = (alsa_driver_t *) calloc (1, sizeof (alsa_driver_t)); @@ -1441,6 +1449,7 @@ alsa_driver_new (char *name, char *alsa_device, driver->capture_nfds = 0; driver->dither = dither; + driver->soft_mode = soft_mode; pthread_mutex_init (&driver->clock_sync_lock, 0); driver->clock_sync_listeners = 0; @@ -1595,6 +1604,7 @@ alsa PCM driver args: -C (capture, default: duplex) -P (playback, default: duplex) -z[r|t|s|-] (dither, rect|tri|shaped|off, default: off) + -s soft-mode, no xrun handling (default: off) "); } @@ -1608,6 +1618,7 @@ driver_initialize (int argc, char **argv) int hw_monitoring = FALSE; int capture = FALSE; int playback = FALSE; + int soft_mode = FALSE; DitherAlgorithm dither = None; int i; @@ -1653,7 +1664,7 @@ driver_initialize (int argc, char **argv) break; case 'H': - hw_monitoring = 1; + hw_monitoring = TRUE; break; case 'z': @@ -1676,6 +1687,11 @@ driver_initialize (int argc, char **argv) break; } break; + + case 's': + soft_mode = TRUE; + break; + default: alsa_usage (); @@ -1696,7 +1712,7 @@ driver_initialize (int argc, char **argv) return alsa_driver_new ("alsa_pcm", pcm_name, frames_per_interrupt, user_nperiods, srate, hw_monitoring, capture, - playback, dither); + playback, dither, soft_mode); } void diff --git a/jackd/engine.c b/jackd/engine.c index 9c08c9f..5617955 100644 --- a/jackd/engine.c +++ b/jackd/engine.c @@ -1677,7 +1677,7 @@ jack_main_thread (void *arg) #define WORK_SCALE 1.0f - if (engine->spare_usecs && ((WORK_SCALE * engine->spare_usecs) <= delayed_usecs)) { + if (engine->control->real_time != 0 && engine->spare_usecs && ((WORK_SCALE * engine->spare_usecs) <= delayed_usecs)) { printf ("delay of %.3f usecs exceeds estimated spare time of %.3f; restart ...\n", delayed_usecs, WORK_SCALE * engine->spare_usecs);