1d5ac70f0Sopenharmony_ci#include <stdio.h>
2d5ac70f0Sopenharmony_ci#include <stdlib.h>
3d5ac70f0Sopenharmony_ci#include <string.h>
4d5ac70f0Sopenharmony_ci#include <sched.h>
5d5ac70f0Sopenharmony_ci#include <errno.h>
6d5ac70f0Sopenharmony_ci#include <getopt.h>
7d5ac70f0Sopenharmony_ci#include "../include/mixer_ordinary.h"
8d5ac70f0Sopenharmony_ci#include <sys/time.h>
9d5ac70f0Sopenharmony_ci#include <math.h>
10d5ac70f0Sopenharmony_ci
11d5ac70f0Sopenharmony_cistatic void help(void)
12d5ac70f0Sopenharmony_ci{
13d5ac70f0Sopenharmony_ci	printf(
14d5ac70f0Sopenharmony_ci"Usage: omixer [OPTION]...\n\n"
15d5ac70f0Sopenharmony_ci"-h,--help      help\n"
16d5ac70f0Sopenharmony_ci"-P,--pname     playback PCM device\n"
17d5ac70f0Sopenharmony_ci"-C,--cname     capture PCM device\n"
18d5ac70f0Sopenharmony_ci);
19d5ac70f0Sopenharmony_ci}
20d5ac70f0Sopenharmony_ci
21d5ac70f0Sopenharmony_ciint main(int argc, char *argv[])
22d5ac70f0Sopenharmony_ci{
23d5ac70f0Sopenharmony_ci	struct option long_option[] =
24d5ac70f0Sopenharmony_ci	{
25d5ac70f0Sopenharmony_ci		{"help", 0, NULL, 'h'},
26d5ac70f0Sopenharmony_ci		{"pname", 1, NULL, 'P'},
27d5ac70f0Sopenharmony_ci		{"cname", 1, NULL, 'C'},
28d5ac70f0Sopenharmony_ci		{NULL, 0, NULL, 0},
29d5ac70f0Sopenharmony_ci	};
30d5ac70f0Sopenharmony_ci	int err, morehelp, result = EXIT_SUCCESS;
31d5ac70f0Sopenharmony_ci	char *pname = "default", *cname = "default";
32d5ac70f0Sopenharmony_ci	snd_pcm_t *phandle = NULL, *chandle = NULL;
33d5ac70f0Sopenharmony_ci	sndo_mixer_t *handle;
34d5ac70f0Sopenharmony_ci
35d5ac70f0Sopenharmony_ci	morehelp = 0;
36d5ac70f0Sopenharmony_ci	while (1) {
37d5ac70f0Sopenharmony_ci		int c;
38d5ac70f0Sopenharmony_ci		if ((c = getopt_long(argc, argv, "hP:C:", long_option, NULL)) < 0)
39d5ac70f0Sopenharmony_ci			break;
40d5ac70f0Sopenharmony_ci		switch (c) {
41d5ac70f0Sopenharmony_ci		case 'h':
42d5ac70f0Sopenharmony_ci			morehelp++;
43d5ac70f0Sopenharmony_ci			break;
44d5ac70f0Sopenharmony_ci		case 'P':
45d5ac70f0Sopenharmony_ci			pname = strdup(optarg);
46d5ac70f0Sopenharmony_ci			break;
47d5ac70f0Sopenharmony_ci		case 'C':
48d5ac70f0Sopenharmony_ci			cname = strdup(optarg);
49d5ac70f0Sopenharmony_ci			break;
50d5ac70f0Sopenharmony_ci		}
51d5ac70f0Sopenharmony_ci	}
52d5ac70f0Sopenharmony_ci
53d5ac70f0Sopenharmony_ci	if (morehelp) {
54d5ac70f0Sopenharmony_ci		help();
55d5ac70f0Sopenharmony_ci		return 0;
56d5ac70f0Sopenharmony_ci	}
57d5ac70f0Sopenharmony_ci
58d5ac70f0Sopenharmony_ci	if (strcmp(pname, "-")) {
59d5ac70f0Sopenharmony_ci		err = snd_pcm_open(&phandle, pname, SND_PCM_STREAM_PLAYBACK, 0);
60d5ac70f0Sopenharmony_ci		if (err < 0) {
61d5ac70f0Sopenharmony_ci			fprintf(stderr, "Playback PCM open error: %s\n", snd_strerror(err));
62d5ac70f0Sopenharmony_ci			result = EXIT_FAILURE;
63d5ac70f0Sopenharmony_ci			goto __end;
64d5ac70f0Sopenharmony_ci		}
65d5ac70f0Sopenharmony_ci	}
66d5ac70f0Sopenharmony_ci
67d5ac70f0Sopenharmony_ci	if (strcmp(cname, "-")) {
68d5ac70f0Sopenharmony_ci		err = snd_pcm_open(&chandle, cname, SND_PCM_STREAM_CAPTURE, 0);
69d5ac70f0Sopenharmony_ci		if (err < 0) {
70d5ac70f0Sopenharmony_ci			if (phandle)
71d5ac70f0Sopenharmony_ci				snd_pcm_close(phandle);
72d5ac70f0Sopenharmony_ci			fprintf(stderr, "Capture PCM open error: %s\n", snd_strerror(err));
73d5ac70f0Sopenharmony_ci			result = EXIT_FAILURE;
74d5ac70f0Sopenharmony_ci			goto __end;
75d5ac70f0Sopenharmony_ci		}
76d5ac70f0Sopenharmony_ci	}
77d5ac70f0Sopenharmony_ci
78d5ac70f0Sopenharmony_ci	err = sndo_mixer_open_pcm(&handle, phandle, chandle, NULL);
79d5ac70f0Sopenharmony_ci	if (err < 0) {
80d5ac70f0Sopenharmony_ci		fprintf(stderr, "mixer open error: %s\n", snd_strerror(err));
81d5ac70f0Sopenharmony_ci		result = EXIT_FAILURE;
82d5ac70f0Sopenharmony_ci	} else {
83d5ac70f0Sopenharmony_ci		sndo_mixer_close(handle);
84d5ac70f0Sopenharmony_ci	}
85d5ac70f0Sopenharmony_ci      __end:
86d5ac70f0Sopenharmony_ci	if (chandle)
87d5ac70f0Sopenharmony_ci		snd_pcm_close(chandle);
88d5ac70f0Sopenharmony_ci	if (phandle)
89d5ac70f0Sopenharmony_ci		snd_pcm_close(phandle);
90d5ac70f0Sopenharmony_ci	snd_config_update_free_global(); /* to keep valgrind happy */
91d5ac70f0Sopenharmony_ci	return result;
92d5ac70f0Sopenharmony_ci}
93