1d5ac70f0Sopenharmony_ci#include "config.h"
2d5ac70f0Sopenharmony_ci#include <stdio.h>
3d5ac70f0Sopenharmony_ci#include <string.h>
4d5ac70f0Sopenharmony_ci#include "../include/asoundlib.h"
5d5ac70f0Sopenharmony_ci
6d5ac70f0Sopenharmony_ciint main(void)
7d5ac70f0Sopenharmony_ci{
8d5ac70f0Sopenharmony_ci	int idx, dev, err;
9d5ac70f0Sopenharmony_ci	snd_ctl_t *handle;
10d5ac70f0Sopenharmony_ci	snd_ctl_card_info_t *info;
11d5ac70f0Sopenharmony_ci	snd_pcm_info_t *pcminfo;
12d5ac70f0Sopenharmony_ci	snd_rawmidi_info_t *rawmidiinfo;
13d5ac70f0Sopenharmony_ci	char str[128];
14d5ac70f0Sopenharmony_ci
15d5ac70f0Sopenharmony_ci	snd_ctl_card_info_alloca(&info);
16d5ac70f0Sopenharmony_ci	snd_pcm_info_alloca(&pcminfo);
17d5ac70f0Sopenharmony_ci	snd_rawmidi_info_alloca(&rawmidiinfo);
18d5ac70f0Sopenharmony_ci
19d5ac70f0Sopenharmony_ci	idx = -1;
20d5ac70f0Sopenharmony_ci	while (1) {
21d5ac70f0Sopenharmony_ci		if ((err = snd_card_next(&idx)) < 0) {
22d5ac70f0Sopenharmony_ci			printf("Card next error: %s\n", snd_strerror(err));
23d5ac70f0Sopenharmony_ci			break;
24d5ac70f0Sopenharmony_ci		}
25d5ac70f0Sopenharmony_ci		if (idx < 0)
26d5ac70f0Sopenharmony_ci			break;
27d5ac70f0Sopenharmony_ci		sprintf(str, "hw:CARD=%i", idx);
28d5ac70f0Sopenharmony_ci		if ((err = snd_ctl_open(&handle, str, 0)) < 0) {
29d5ac70f0Sopenharmony_ci			printf("Open error: %s\n", snd_strerror(err));
30d5ac70f0Sopenharmony_ci			continue;
31d5ac70f0Sopenharmony_ci		}
32d5ac70f0Sopenharmony_ci		if ((err = snd_ctl_card_info(handle, info)) < 0) {
33d5ac70f0Sopenharmony_ci			printf("HW info error: %s\n", snd_strerror(err));
34d5ac70f0Sopenharmony_ci			continue;
35d5ac70f0Sopenharmony_ci		}
36d5ac70f0Sopenharmony_ci		printf("Soundcard #%i:\n", idx + 1);
37d5ac70f0Sopenharmony_ci		printf("  card - %i\n", snd_ctl_card_info_get_card(info));
38d5ac70f0Sopenharmony_ci		printf("  id - '%s'\n", snd_ctl_card_info_get_id(info));
39d5ac70f0Sopenharmony_ci		printf("  driver - '%s'\n", snd_ctl_card_info_get_driver(info));
40d5ac70f0Sopenharmony_ci		printf("  name - '%s'\n", snd_ctl_card_info_get_name(info));
41d5ac70f0Sopenharmony_ci		printf("  longname - '%s'\n", snd_ctl_card_info_get_longname(info));
42d5ac70f0Sopenharmony_ci		printf("  mixername - '%s'\n", snd_ctl_card_info_get_mixername(info));
43d5ac70f0Sopenharmony_ci		printf("  components - '%s'\n", snd_ctl_card_info_get_components(info));
44d5ac70f0Sopenharmony_ci		dev = -1;
45d5ac70f0Sopenharmony_ci		while (1) {
46d5ac70f0Sopenharmony_ci			snd_pcm_sync_id_t sync;
47d5ac70f0Sopenharmony_ci			if ((err = snd_ctl_pcm_next_device(handle, &dev)) < 0) {
48d5ac70f0Sopenharmony_ci				printf("  PCM next device error: %s\n", snd_strerror(err));
49d5ac70f0Sopenharmony_ci				break;
50d5ac70f0Sopenharmony_ci			}
51d5ac70f0Sopenharmony_ci			if (dev < 0)
52d5ac70f0Sopenharmony_ci				break;
53d5ac70f0Sopenharmony_ci			snd_pcm_info_set_device(pcminfo, dev);
54d5ac70f0Sopenharmony_ci			snd_pcm_info_set_subdevice(pcminfo, 0);
55d5ac70f0Sopenharmony_ci			snd_pcm_info_set_stream(pcminfo, SND_PCM_STREAM_PLAYBACK);
56d5ac70f0Sopenharmony_ci			if ((err = snd_ctl_pcm_info(handle, pcminfo)) < 0) {
57d5ac70f0Sopenharmony_ci				printf("  PCM info error: %s\n", snd_strerror(err));
58d5ac70f0Sopenharmony_ci				continue;
59d5ac70f0Sopenharmony_ci			}
60d5ac70f0Sopenharmony_ci			printf("PCM info, device #%i:\n", dev);
61d5ac70f0Sopenharmony_ci			printf("  device - %i\n", snd_pcm_info_get_device(pcminfo));
62d5ac70f0Sopenharmony_ci			printf("  subdevice - %i\n", snd_pcm_info_get_subdevice(pcminfo));
63d5ac70f0Sopenharmony_ci			printf("  stream - %i\n", snd_pcm_info_get_stream(pcminfo));
64d5ac70f0Sopenharmony_ci			printf("  card - %i\n", snd_pcm_info_get_card(pcminfo));
65d5ac70f0Sopenharmony_ci			printf("  id - '%s'\n", snd_pcm_info_get_id(pcminfo));
66d5ac70f0Sopenharmony_ci			printf("  name - '%s'\n", snd_pcm_info_get_name(pcminfo));
67d5ac70f0Sopenharmony_ci			printf("  subdevice name - '%s'\n", snd_pcm_info_get_subdevice_name(pcminfo));
68d5ac70f0Sopenharmony_ci			printf("  class - 0x%x\n", snd_pcm_info_get_class(pcminfo));
69d5ac70f0Sopenharmony_ci			printf("  subclass - 0x%x\n", snd_pcm_info_get_subclass(pcminfo));
70d5ac70f0Sopenharmony_ci			printf("  subdevices count - %i\n", snd_pcm_info_get_subdevices_count(pcminfo));
71d5ac70f0Sopenharmony_ci			printf("  subdevices avail - %i\n", snd_pcm_info_get_subdevices_avail(pcminfo));
72d5ac70f0Sopenharmony_ci			sync = snd_pcm_info_get_sync(pcminfo);
73d5ac70f0Sopenharmony_ci			printf("  sync - 0x%x,0x%x,0x%x,0x%x\n", sync.id32[0], sync.id32[1], sync.id32[2], sync.id32[3]);
74d5ac70f0Sopenharmony_ci		}
75d5ac70f0Sopenharmony_ci		dev = -1;
76d5ac70f0Sopenharmony_ci		while (1) {
77d5ac70f0Sopenharmony_ci			if ((err = snd_ctl_rawmidi_next_device(handle, &dev)) < 0) {
78d5ac70f0Sopenharmony_ci				printf("  RAWMIDI next device error: %s\n", snd_strerror(err));
79d5ac70f0Sopenharmony_ci				break;
80d5ac70f0Sopenharmony_ci			}
81d5ac70f0Sopenharmony_ci			if (dev < 0)
82d5ac70f0Sopenharmony_ci				break;
83d5ac70f0Sopenharmony_ci			snd_rawmidi_info_set_device(rawmidiinfo, dev);
84d5ac70f0Sopenharmony_ci			snd_rawmidi_info_set_subdevice(rawmidiinfo, 0);
85d5ac70f0Sopenharmony_ci			snd_rawmidi_info_set_stream(rawmidiinfo, SND_RAWMIDI_STREAM_OUTPUT);
86d5ac70f0Sopenharmony_ci			if ((err = snd_ctl_rawmidi_info(handle, rawmidiinfo)) < 0) {
87d5ac70f0Sopenharmony_ci				printf("  RAWMIDI info error: %s\n", snd_strerror(err));
88d5ac70f0Sopenharmony_ci				continue;
89d5ac70f0Sopenharmony_ci			}
90d5ac70f0Sopenharmony_ci			printf("RAWMIDI info, device #%i:\n", dev);
91d5ac70f0Sopenharmony_ci			printf("  device - %i\n", snd_rawmidi_info_get_device(rawmidiinfo));
92d5ac70f0Sopenharmony_ci			printf("  subdevice - %i\n", snd_rawmidi_info_get_subdevice(rawmidiinfo));
93d5ac70f0Sopenharmony_ci			printf("  stream - %i\n", snd_rawmidi_info_get_stream(rawmidiinfo));
94d5ac70f0Sopenharmony_ci			printf("  card - %i\n", snd_rawmidi_info_get_card(rawmidiinfo));
95d5ac70f0Sopenharmony_ci			printf("  flags - 0x%x\n", snd_rawmidi_info_get_flags(rawmidiinfo));
96d5ac70f0Sopenharmony_ci			printf("  id - '%s'\n", snd_rawmidi_info_get_id(rawmidiinfo));
97d5ac70f0Sopenharmony_ci			printf("  name - '%s'\n", snd_rawmidi_info_get_name(rawmidiinfo));
98d5ac70f0Sopenharmony_ci			printf("  subname - '%s'\n", snd_rawmidi_info_get_subdevice_name(rawmidiinfo));
99d5ac70f0Sopenharmony_ci			printf("  subdevices count - %i\n", snd_rawmidi_info_get_subdevices_count(rawmidiinfo));
100d5ac70f0Sopenharmony_ci			printf("  subdevices avail - %i\n", snd_rawmidi_info_get_subdevices_avail(rawmidiinfo));
101d5ac70f0Sopenharmony_ci		}
102d5ac70f0Sopenharmony_ci		snd_ctl_close(handle);
103d5ac70f0Sopenharmony_ci	}
104d5ac70f0Sopenharmony_ci
105d5ac70f0Sopenharmony_ci	snd_config_update_free_global();
106d5ac70f0Sopenharmony_ci	return 0;
107d5ac70f0Sopenharmony_ci}
108