summaryrefslogtreecommitdiff
path: root/drivers/dummy
diff options
context:
space:
mode:
authorjoq <joq@0c269be4-1314-0410-8aa9-9f06e86f4224>2003-09-11 17:40:25 +0000
committerjoq <joq@0c269be4-1314-0410-8aa9-9f06e86f4224>2003-09-11 17:40:25 +0000
commite5a2e928beb895efe421d0bd05df7e9d842b2d12 (patch)
tree3bed8f8cb0f9d89573a1c44fb3f915869b53bfe1 /drivers/dummy
parenta12e2d4cc705770bda8bb180c210b2b1e60d1f69 (diff)
downloadjack1-e5a2e928beb895efe421d0bd05df7e9d842b2d12.tar.gz
[0.81.2] dummy driver fixes; man page update
git-svn-id: svn+ssh://jackaudio.org/trunk/jack@493 0c269be4-1314-0410-8aa9-9f06e86f4224
Diffstat (limited to 'drivers/dummy')
-rw-r--r--drivers/dummy/dummy_driver.c33
1 files changed, 19 insertions, 14 deletions
diff --git a/drivers/dummy/dummy_driver.c b/drivers/dummy/dummy_driver.c
index de94479..18c53e4 100644
--- a/drivers/dummy/dummy_driver.c
+++ b/drivers/dummy/dummy_driver.c
@@ -19,6 +19,7 @@
$Id$
*/
+#include <math.h>
#include <stdio.h>
#include <memory.h>
#include <unistd.h>
@@ -50,22 +51,25 @@ dummy_driver_audio_stop (dummy_driver_t *driver)
}
static jack_nframes_t
-dummy_driver_wait (dummy_driver_t *driver, int extra_fd, int *status, float *delayed_usecs)
+dummy_driver_wait (dummy_driver_t *driver, int extra_fd, int *status,
+ float *delayed_usecs)
{
- jack_time_t processing_time;
-
- processing_time = driver->last_wait_ust
- ? jack_get_microseconds() - driver->last_wait_ust
- : 0;
-
- if (processing_time < driver->wait_time)
- usleep (driver->wait_time - processing_time);
+ jack_time_t starting_time = jack_get_microseconds();
+ jack_time_t processing_time = (driver->last_wait_ust?
+ starting_time - driver->last_wait_ust: 0);
+ jack_time_t sleeping_time = driver->wait_time - processing_time;
+ /* JOQ: usleep() is inaccurate for small buffer sizes with Linux
+ * 2.4. I suspect it can't wait for less than one (or maybe even
+ * two) scheduler timeslices. Linux 2.6 is probably better. */
+ if (sleeping_time > 0)
+ usleep (sleeping_time);
driver->last_wait_ust = jack_get_microseconds ();
+ driver->engine->transport_cycle_start (driver->engine, driver->last_wait_ust);
*status = 0;
- *delayed_usecs = 0.0;
+ *delayed_usecs = driver->last_wait_ust - starting_time - sleeping_time;
return driver->period_size;
}
@@ -198,8 +202,8 @@ dummy_driver_new (jack_client_t * client,
driver->start = (JackDriverStartFunction) dummy_driver_audio_start;
driver->stop = (JackDriverStopFunction) dummy_driver_audio_stop;
- driver->period_usecs = (((float)period_size) / ((float)sample_rate)) / 1000000.0;
-
+ driver->period_usecs =
+ (jack_time_t) floor ((((float) period_size) / sample_rate) * 1000000.0f);
driver->sample_rate = sample_rate;
driver->period_size = period_size;
driver->wait_time = wait_time;
@@ -321,8 +325,9 @@ driver_initialize (jack_client_t *client, int argc, char **argv)
if (!wait_time_set)
wait_time = (((float)period_size) / ((float)sample_rate)) * 1000000.0;
- return dummy_driver_new (client, "dummy_pcm", capture_ports, playback_ports,
- sample_rate, period_size, wait_time);
+ return dummy_driver_new (client, "dummy_pcm", capture_ports,
+ playback_ports, sample_rate, period_size,
+ wait_time);
}
void