| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <sched.h> |
| #include <errno.h> |
| #include <getopt.h> |
| #include "../include/mixer_ordinary.h" |
| #include <sys/time.h> |
| #include <math.h> |
| |
| static void help(void) |
| { |
| printf( |
| "Usage: omixer [OPTION]...\n\n" |
| "-h,--help help\n" |
| "-P,--pname playback PCM device\n" |
| "-C,--cname capture PCM device\n" |
| ); |
| } |
| |
| int main(int argc, char *argv[]) |
| { |
| struct option long_option[] = |
| { |
| {"help", 0, NULL, 'h'}, |
| {"pname", 1, NULL, 'P'}, |
| {"cname", 1, NULL, 'C'}, |
| {NULL, 0, NULL, 0}, |
| }; |
| int err, morehelp, result = EXIT_SUCCESS; |
| char *pname = "default", *cname = "default"; |
| snd_pcm_t *phandle = NULL, *chandle = NULL; |
| sndo_mixer_t *handle; |
| |
| morehelp = 0; |
| while (1) { |
| int c; |
| if ((c = getopt_long(argc, argv, "hP:C:", long_option, NULL)) < 0) |
| break; |
| switch (c) { |
| case 'h': |
| morehelp++; |
| break; |
| case 'P': |
| pname = strdup(optarg); |
| break; |
| case 'C': |
| cname = strdup(optarg); |
| break; |
| } |
| } |
| |
| if (morehelp) { |
| help(); |
| return 0; |
| } |
| |
| if (strcmp(pname, "-")) { |
| err = snd_pcm_open(&phandle, pname, SND_PCM_STREAM_PLAYBACK, 0); |
| if (err < 0) { |
| fprintf(stderr, "Playback PCM open error: %s\n", snd_strerror(err)); |
| result = EXIT_FAILURE; |
| goto __end; |
| } |
| } |
| |
| if (strcmp(cname, "-")) { |
| err = snd_pcm_open(&chandle, cname, SND_PCM_STREAM_CAPTURE, 0); |
| if (err < 0) { |
| if (phandle) |
| snd_pcm_close(phandle); |
| fprintf(stderr, "Capture PCM open error: %s\n", snd_strerror(err)); |
| result = EXIT_FAILURE; |
| goto __end; |
| } |
| } |
| |
| err = sndo_mixer_open_pcm(&handle, phandle, chandle, NULL); |
| if (err < 0) { |
| fprintf(stderr, "mixer open error: %s\n", snd_strerror(err)); |
| result = EXIT_FAILURE; |
| } else { |
| sndo_mixer_close(handle); |
| } |
| __end: |
| if (chandle) |
| snd_pcm_close(chandle); |
| if (phandle) |
| snd_pcm_close(phandle); |
| snd_config_update_free_global(); /* to keep valgrind happy */ |
| return result; |
| } |