summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/latency.c96
1 files changed, 93 insertions, 3 deletions
diff --git a/test/latency.c b/test/latency.c
index e6855d15..35cc59cb 100644
--- a/test/latency.c
+++ b/test/latency.c
@@ -3,6 +3,7 @@
#include <string.h>
#include <sched.h>
#include <errno.h>
+#include <getopt.h>
#include "../include/asoundlib.h"
#include <sys/time.h>
@@ -298,16 +299,100 @@ long writebuf(snd_pcm_t *handle, char *buf, long len, size_t *frames)
return 0;
}
-int main(void)
+void help(void)
{
+ int k;
+ printf("\
+Usage: latency [OPTION]... [FILE]...
+-h,--help help
+-P,--pdevice playback device
+-C,--cdevice capture device
+-m,--min minimum latency in frames
+-M,--max maximum latency in frames
+-F,--frames frames to transfer
+-f,--format sample format
+-c,--channels channels
+-r,--rate rate
+");
+ printf("Recognized sample formats are:");
+ for (k = 0; k < SND_PCM_FORMAT_LAST; ++(unsigned long) k) {
+ const char *s = snd_pcm_format_name(k);
+ if (s)
+ printf(" %s", s);
+ }
+ printf("\n");
+}
+
+int main(int argc, char *argv[])
+{
+ struct option long_option[] =
+ {
+ {"help", 0, NULL, 'h'},
+ {"pdevice", 1, NULL, 'P'},
+ {"cdevice", 1, NULL, 'C'},
+ {"min", 1, NULL, 'm'},
+ {"max", 1, NULL, 'M'},
+ {"frames", 1, NULL, 'F'},
+ {"format", 1, NULL, 'f'},
+ {"channels", 1, NULL, 'c'},
+ {"rate", 1, NULL, 'r'},
+ {NULL, 0, NULL, 0},
+ };
snd_pcm_t *phandle, *chandle;
char *buffer;
- int err, latency;
+ int err, latency, morehelp;
int size, ok;
snd_timestamp_t p_tstamp, c_tstamp;
ssize_t r;
size_t frames_in, frames_out;
+ morehelp = 0;
+ while (1) {
+ int c;
+ if ((c = getopt_long(argc, argv, "hP:C:m:M:F:f:c:r:", long_option, NULL)) < 0)
+ break;
+ switch (c) {
+ case 'h':
+ morehelp++;
+ break;
+ case 'P':
+ pdevice = strdup(optarg);
+ break;
+ case 'C':
+ cdevice = strdup(optarg);
+ break;
+ case 'm':
+ err = atoi(optarg);
+ latency_min = err >= 4 ? err : 4;
+ if (latency_max < latency_min)
+ latency_max = latency_min;
+ break;
+ case 'M':
+ err = atoi(optarg);
+ latency_max = latency_min > err ? latency_min : err;
+ break;
+ case 'F':
+ format = snd_pcm_format_value(optarg);
+ if (format == SND_PCM_FORMAT_UNKNOWN) {
+ printf("Unknown format, setting to default S16_LE\n");
+ format = SND_PCM_FORMAT_S16_LE;
+ }
+ break;
+ case 'c':
+ err = atoi(optarg);
+ channels = err >= 1 && err < 1024 ? err : 1;
+ break;
+ case 'r':
+ err = atoi(optarg);
+ rate = err >= 4000 && err < 200000 ? err : 44100;
+ break;
+ }
+ }
+
+ if (morehelp) {
+ help();
+ return 0;
+ }
err = snd_output_stdio_attach(&output, stdout, 0);
if (err < 0) {
printf("Output failed: %s\n", snd_strerror(err));
@@ -319,6 +404,12 @@ int main(void)
buffer = malloc((latency_max * snd_pcm_format_width(format) / 8) * 2);
setscheduler();
+
+ printf("Playback device is %s\n", pdevice);
+ printf("Capture device is %s\n", cdevice);
+ printf("Parameters are %iHz, %s, %i channels\n", rate, snd_pcm_format_name(format), channels);
+ printf("Loop limit is %li frames, minimum latency = %i, maximum latency = %i\n", loop_limit, latency_min, latency_max);
+
if ((err = snd_pcm_open(&phandle, pdevice, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) {
printf("Playback open error: %s\n", snd_strerror(err));
return 0;
@@ -328,7 +419,6 @@ int main(void)
return 0;
}
- printf("Loop limit is %li frames\n", loop_limit);
while (1) {
frames_in = frames_out = 0;
if (setparams(phandle, chandle, &latency) < 0)