brintos

brintos / linux-shallow public Read only

0
0
Text · 2.0 KiB · c15ec0b Raw
88 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * This tool is used by the utimer test, and it allows us to4 * count the ticks of a global timer in a certain time frame5 * (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 gets60		 * 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}88