Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/tools/testing/selftests/alsa/global-timer.c
26285 views
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
}
88
89