Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.2.
 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 <ivan.orlov0322@gmail.com>
 8 */
 9#include <stdio.h>
10#include <stdlib.h>
11#include <alsa/asoundlib.h>
12#include <time.h>
13
14static int ticked;
15static void async_callback(snd_async_handler_t *ahandler)
16{
17	ticked++;
18}
19
20static char timer_name[64];
21static 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
67int 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}