From: Jaroslav Kysela Date: Thu, 11 Mar 1999 13:07:12 +0000 (+0000) Subject: Timer changes.. X-Git-Tag: android-x86-9.0-r1~3538 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=e735bf70dd8cca2d4fd04a3071dd3a447f918a38;p=android-x86%2Fexternal-alsa-lib.git Timer changes.. --- diff --git a/test/timer.c b/test/timer.c index 384bce2c..08ba4c35 100644 --- a/test/timer.c +++ b/test/timer.c @@ -1,4 +1,5 @@ #include +#include #include #include "../include/asoundlib.h" @@ -18,15 +19,63 @@ void show_status(void *handle) printf(" queue = %i\n", status.queue); } -void main(void) +void read_loop(void *handle, int master_ticks, int timeout) { - int err; + int err, max; + fd_set in; + struct timeval tv; + snd_timer_read_t tr; + + while (master_ticks-- > 0) { + FD_ZERO(&in); + max = snd_timer_file_descriptor(handle); + FD_SET(max, &in); + tv.tv_sec = timeout; + tv.tv_usec = 0; + if ((err = select(max + 1, &in, NULL, NULL, &tv)) < 0) { + fprintf(stderr, "select error %i (%s)\n", err, strerror(err)); + exit(0); + } + if (err == 0) { + fprintf(stderr, "timer time out!!\n"); + exit(0); + } + while (snd_timer_read(handle, &tr, sizeof(tr)) == sizeof(tr)) { + printf("TIMER: resolution = %lu, ticks = %lu\n", + tr.resolution, tr.ticks); + } + } +} + +void main(int argc, char *argv[]) +{ + int idx, err; + int timer = SND_TIMER_SYSTEM; + int slave = 0; + int slave_type = SND_TIMER_STYPE_SEQUENCER, slave_id = 0; void *handle; snd_timer_general_info_t ginfo; snd_timer_select_t sel; snd_timer_info_t info; snd_timer_params_t params; + idx = 1; + while (idx < argc) { + if (!strncmp(argv[idx], "timer=", 6)) { + timer = atoi(argv[idx]+6); + } else if (!strcmp(argv[idx], "slave")) { + slave = 1; + } else if (!strncmp(argv[idx], "slave_type=", 11)) { + slave_type = atoi(argv[idx]+11); + } else if (!strncmp(argv[idx], "slave_id=", 9)) { + slave_id = atoi(argv[idx]+9); + } + idx++; + } + if (slave && slave_type == SND_TIMER_STYPE_NONE) { + fprintf(stderr, "sync_type is not set\n"); + exit(0); + } if ((err = snd_timer_open(&handle))<0) { fprintf(stderr, "timer open %i (%s)\n", err, snd_strerror(err)); exit(0); @@ -36,39 +85,47 @@ void main(void) exit(0); } printf("Global timers = %i\n", ginfo.count); + printf("Using timer %i, slave %i, slave_type %i, slave_id %i\n", timer, slave, slave_type, slave_id); bzero(&sel, sizeof(sel)); - sel.number = SND_TIMER_SYSTEM; - sel.slave = 0; + sel.slave = slave; + if (!sel.slave) { + sel.data.number = timer; + } else { + sel.data.slave.type = slave_type; + sel.data.slave.id = slave_id; + } if ((err = snd_timer_select(handle, &sel)) < 0) { fprintf(stderr, "timer select %i (%s)\n", err, snd_strerror(err)); exit(0); } - if ((err = snd_timer_info(handle, &info)) < 0) { - fprintf(stderr, "timer info %i (%s)\n", err, snd_strerror(err)); - exit(0); - } - printf("Timer %i info:\n", sel.number); - printf(" flags = 0x%x\n", info.flags); - printf(" id = '%s'\n", info.id); - printf(" name = '%s'\n", info.name); - printf(" max ticks = %lu\n", info.ticks); - printf(" average resolution = %lu\n", info.resolution); - bzero(¶ms, sizeof(params)); - params.flags = SND_TIMER_PSFLG_AUTO; - params.ticks = (1000000000 / info.resolution) / 50; /* 50Hz */ - if (params.ticks < 1) - params.ticks = 1; - printf("Using %lu tick(s)\n", params.ticks); - if ((err = snd_timer_params(handle, ¶ms)) < 0) { - fprintf(stderr, "timer params %i (%s)\n", err, snd_strerror(err)); - exit(0); + if (!sel.slave) { + if ((err = snd_timer_info(handle, &info)) < 0) { + fprintf(stderr, "timer info %i (%s)\n", err, snd_strerror(err)); + exit(0); + } + printf("Timer %i info:\n", sel.data.number); + printf(" flags = 0x%x\n", info.flags); + printf(" id = '%s'\n", info.id); + printf(" name = '%s'\n", info.name); + printf(" max ticks = %lu\n", info.ticks); + printf(" average resolution = %lu\n", info.resolution); + bzero(¶ms, sizeof(params)); + params.flags = SND_TIMER_PSFLG_AUTO; + params.ticks = (1000000000 / info.resolution) / 50; /* 50Hz */ + if (params.ticks < 1) + params.ticks = 1; + printf("Using %lu tick(s)\n", params.ticks); + if ((err = snd_timer_params(handle, ¶ms)) < 0) { + fprintf(stderr, "timer params %i (%s)\n", err, snd_strerror(err)); + exit(0); + } } show_status(handle); if ((err = snd_timer_start(handle)) < 0) { fprintf(stderr, "timer start %i (%s)\n", err, snd_strerror(err)); exit(0); } - usleep(500000); + read_loop(handle, 25, sel.slave ? 10000 : 1); show_status(handle); snd_timer_close(handle); }