accel/qaic: Add AIC200 support
[drm/drm-misc.git] / tools / testing / selftests / alsa / global-timer.c
blobc15ec0ba851acf4be1c4a5e8956b6732b08f53b7
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * This tool is used by the utimer test, and it allows us to
4 * count the ticks of a global timer in a certain time frame
5 * (which is set by `timeout` parameter).
7 * Author: Ivan Orlov <ivan.orlov0322@gmail.com>
8 */
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <alsa/asoundlib.h>
12 #include <time.h>
14 static int ticked;
15 static void async_callback(snd_async_handler_t *ahandler)
17 ticked++;
20 static char timer_name[64];
21 static void bind_to_timer(int device, int subdevice, int timeout)
23 snd_timer_t *handle;
24 snd_timer_params_t *params;
25 snd_async_handler_t *ahandler;
27 time_t end;
29 sprintf(timer_name, "hw:CLASS=%d,SCLASS=%d,DEV=%d,SUBDEV=%d",
30 SND_TIMER_CLASS_GLOBAL, SND_TIMER_SCLASS_NONE,
31 device, subdevice);
33 snd_timer_params_alloca(&params);
35 if (snd_timer_open(&handle, timer_name, SND_TIMER_OPEN_NONBLOCK) < 0) {
36 perror("Can't open the timer");
37 exit(EXIT_FAILURE);
40 snd_timer_params_set_auto_start(params, 1);
41 snd_timer_params_set_ticks(params, 1);
42 if (snd_timer_params(handle, params) < 0) {
43 perror("Can't set timer params");
44 exit(EXIT_FAILURE);
47 if (snd_async_add_timer_handler(&ahandler, handle, async_callback, NULL) < 0) {
48 perror("Can't create a handler");
49 exit(EXIT_FAILURE);
51 end = time(NULL) + timeout;
52 if (snd_timer_start(handle) < 0) {
53 perror("Failed to start the timer");
54 exit(EXIT_FAILURE);
56 printf("Timer has started\n");
57 while (time(NULL) <= end) {
59 * Waiting for the timeout to elapse. Can't use sleep here, as it gets
60 * constantly interrupted by the signal from the timer (SIGIO)
63 snd_timer_stop(handle);
64 snd_timer_close(handle);
67 int main(int argc, char *argv[])
69 int device, subdevice, timeout;
71 if (argc < 4) {
72 perror("Usage: %s <device> <subdevice> <timeout>");
73 return EXIT_FAILURE;
76 setlinebuf(stdout);
78 device = atoi(argv[1]);
79 subdevice = atoi(argv[2]);
80 timeout = atoi(argv[3]);
82 bind_to_timer(device, subdevice, timeout);
84 printf("Total ticks count: %d\n", ticked);
86 return EXIT_SUCCESS;