]> Git Repo - J-linux.git/blob - tools/testing/selftests/alsa/global-timer.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / tools / testing / selftests / alsa / global-timer.c
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).
6  *
7  * Author: Ivan Orlov <[email protected]>
8  */
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <alsa/asoundlib.h>
12 #include <time.h>
13
14 static int ticked;
15 static void async_callback(snd_async_handler_t *ahandler)
16 {
17         ticked++;
18 }
19
20 static char timer_name[64];
21 static void bind_to_timer(int device, int subdevice, int timeout)
22 {
23         snd_timer_t *handle;
24         snd_timer_params_t *params;
25         snd_async_handler_t *ahandler;
26
27         time_t end;
28
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);
32
33         snd_timer_params_alloca(&params);
34
35         if (snd_timer_open(&handle, timer_name, SND_TIMER_OPEN_NONBLOCK) < 0) {
36                 perror("Can't open the timer");
37                 exit(EXIT_FAILURE);
38         }
39
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);
45         }
46
47         if (snd_async_add_timer_handler(&ahandler, handle, async_callback, NULL) < 0) {
48                 perror("Can't create a handler");
49                 exit(EXIT_FAILURE);
50         }
51         end = time(NULL) + timeout;
52         if (snd_timer_start(handle) < 0) {
53                 perror("Failed to start the timer");
54                 exit(EXIT_FAILURE);
55         }
56         printf("Timer has started\n");
57         while (time(NULL) <= end) {
58                 /*
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)
61                  */
62         }
63         snd_timer_stop(handle);
64         snd_timer_close(handle);
65 }
66
67 int main(int argc, char *argv[])
68 {
69         int device, subdevice, timeout;
70
71         if (argc < 4) {
72                 perror("Usage: %s <device> <subdevice> <timeout>");
73                 return EXIT_FAILURE;
74         }
75
76         setlinebuf(stdout);
77
78         device = atoi(argv[1]);
79         subdevice = atoi(argv[2]);
80         timeout = atoi(argv[3]);
81
82         bind_to_timer(device, subdevice, timeout);
83
84         printf("Total ticks count: %d\n", ticked);
85
86         return EXIT_SUCCESS;
87 }
This page took 0.03104 seconds and 4 git commands to generate.