// SPDX-License-Identifier: GPL-2.0 /* * This tool is used by the utimer test, and it allows us to * count the ticks of a global timer in a certain time frame * (which is set by `timeout` parameter). * * Author: Ivan Orlov */ #include #include #include #include static int ticked; static void async_callback(snd_async_handler_t *ahandler) { ticked++; } static char timer_name[64]; static void bind_to_timer(int device, int subdevice, int timeout) { snd_timer_t *handle; snd_timer_params_t *params; snd_async_handler_t *ahandler; time_t end; sprintf(timer_name, "hw:CLASS=%d,SCLASS=%d,DEV=%d,SUBDEV=%d", SND_TIMER_CLASS_GLOBAL, SND_TIMER_SCLASS_NONE, device, subdevice); snd_timer_params_alloca(¶ms); if (snd_timer_open(&handle, timer_name, SND_TIMER_OPEN_NONBLOCK) < 0) { perror("Can't open the timer"); exit(EXIT_FAILURE); } snd_timer_params_set_auto_start(params, 1); snd_timer_params_set_ticks(params, 1); if (snd_timer_params(handle, params) < 0) { perror("Can't set timer params"); exit(EXIT_FAILURE); } if (snd_async_add_timer_handler(&ahandler, handle, async_callback, NULL) < 0) { perror("Can't create a handler"); exit(EXIT_FAILURE); } end = time(NULL) + timeout; if (snd_timer_start(handle) < 0) { perror("Failed to start the timer"); exit(EXIT_FAILURE); } printf("Timer has started\n"); while (time(NULL) <= end) { /* * Waiting for the timeout to elapse. Can't use sleep here, as it gets * constantly interrupted by the signal from the timer (SIGIO) */ } snd_timer_stop(handle); snd_timer_close(handle); } int main(int argc, char *argv[]) { int device, subdevice, timeout; if (argc < 4) { perror("Usage: %s "); return EXIT_FAILURE; } setlinebuf(stdout); device = atoi(argv[1]); subdevice = atoi(argv[2]); timeout = atoi(argv[3]); bind_to_timer(device, subdevice, timeout); printf("Total ticks count: %d\n", ticked); return EXIT_SUCCESS; }