Encapsulated hwdep. Converted all enums to type safety

This commit is contained in:
Abramo Bagnara 2001-02-05 15:44:45 +00:00
parent 2121e1576c
commit 3df0171dc0
4 changed files with 104 additions and 85 deletions

View file

@ -142,7 +142,8 @@ static int get_control(snd_ctl_t *handle, snd_control_id_t *id, snd_config_t *to
snd_config_t *control, *comment, *item, *value;
char *s;
char buf[256];
int idx, err;
unsigned int idx;
int err;
memset(&info, 0, sizeof(info));
info.id = *id;
@ -316,7 +317,7 @@ static int get_control(snd_ctl_t *handle, snd_control_id_t *id, snd_config_t *to
case SND_CONTROL_TYPE_BYTES:
case SND_CONTROL_TYPE_IEC958:
{
int count = info.type == SND_CONTROL_TYPE_BYTES ?
size_t count = info.type == SND_CONTROL_TYPE_BYTES ?
info.values_count : sizeof(snd_aes_iec958_t);
char buf[count * 2 + 1];
char *p = buf;
@ -433,7 +434,8 @@ static int get_controls(int cardno, snd_config_t *top)
snd_ctl_hw_info_t info;
snd_config_t *state, *card, *control;
snd_control_list_t list;
int idx, err;
unsigned int idx;
int err;
char name[32];
sprintf(name, "hw:%d", cardno);
@ -538,12 +540,13 @@ static int config_iface(snd_config_t *n)
{ SND_CONTROL_IFACE_TIMER, "timer" },
{ SND_CONTROL_IFACE_SEQUENCER, "sequencer" }
};
long idx;
unsigned long i;
unsigned int idx;
char *str;
switch (snd_config_type(n)) {
switch (snd_enum_to_int(snd_config_type(n))) {
case SND_CONFIG_TYPE_INTEGER:
snd_config_integer_get(n, &idx);
return idx;
snd_config_integer_get(n, &i);
return i;
case SND_CONFIG_TYPE_STRING:
snd_config_string_get(n, &str);
break;
@ -561,7 +564,7 @@ static int config_bool(snd_config_t *n)
{
char *str;
long val;
switch (snd_config_type(n)) {
switch (snd_enum_to_int(snd_config_type(n))) {
case SND_CONFIG_TYPE_INTEGER:
snd_config_integer_get(n, &val);
if (val < 0 || val > 1)
@ -585,8 +588,8 @@ static int config_enumerated(snd_config_t *n, snd_ctl_t *handle,
{
char *str;
long val;
int idx;
switch (snd_config_type(n)) {
unsigned int idx;
switch (snd_enum_to_int(snd_config_type(n))) {
case SND_CONFIG_TYPE_INTEGER:
snd_config_integer_get(n, &val);
return val;
@ -615,7 +618,7 @@ static int set_control(snd_ctl_t *handle, snd_config_t *control)
snd_control_t ctl;
snd_control_info_t info;
snd_config_iterator_t i;
int numid;
unsigned int numid;
long iface = -1;
long device = -1;
long subdevice = -1;
@ -623,7 +626,8 @@ static int set_control(snd_ctl_t *handle, snd_config_t *control)
long index = -1;
snd_config_t *value = NULL;
long val;
int idx, err;
unsigned int idx;
int err;
char *set;
if (snd_config_type(control) != SND_CONFIG_TYPE_COMPOUND) {
error("control is not a compound");
@ -768,7 +772,7 @@ static int set_control(snd_ctl_t *handle, snd_config_t *control)
if (err >= 0) {
int c1 = 0;
int len = strlen(buf);
int idx = 0;
unsigned int idx = 0;
int count = info.type == SND_CONTROL_TYPE_BYTES ?
info.values_count : sizeof(snd_aes_iec958_t);
if (count * 2 != len) {

View file

@ -207,11 +207,11 @@ static int mixer_elem_mask[] = {
};
/* left and right channels for each type */
static int mixer_elem_chn[][2] = {
static snd_mixer_channel_id_t mixer_elem_chn[][2] = {
{ SND_MIXER_CHN_FRONT_LEFT, SND_MIXER_CHN_FRONT_RIGHT },
{ SND_MIXER_CHN_REAR_LEFT, SND_MIXER_CHN_REAR_RIGHT },
{ SND_MIXER_CHN_FRONT_CENTER, -1 },
{ SND_MIXER_CHN_WOOFER, -1 },
{ SND_MIXER_CHN_FRONT_CENTER, SND_MIXER_CHN_UNKNOWN },
{ SND_MIXER_CHN_WOOFER, SND_MIXER_CHN_UNKNOWN },
};
static snd_mixer_sid_t *mixer_sid = NULL;
@ -469,10 +469,9 @@ mixer_conv(int val, int omin, int omax, int nmin, int nmax)
}
static int
mixer_calc_volume(snd_mixer_simple_control_t *scontrol, int vol, int chn)
mixer_calc_volume(snd_mixer_simple_control_t *scontrol, int vol, snd_mixer_channel_id_t chn)
{
int vol1;
vol1 = (vol < 0) ? -vol : vol;
if (vol1 > 0) {
if (vol1 > 100)
@ -484,7 +483,7 @@ mixer_calc_volume(snd_mixer_simple_control_t *scontrol, int vol, int chn)
if (vol < 0)
vol1 = -vol1;
}
vol1 += scontrol->volume.values[chn];
vol1 += scontrol->volume.values[snd_enum_to_int(chn)];
return CLAMP(vol1, scontrol->min, scontrol->max);
}
@ -495,8 +494,9 @@ mixer_write_cbar (int elem_index)
{
snd_mixer_simple_control_t scontrol;
int vleft, vright, vbalance;
int type, chn_left, chn_right;
int i, err, changed;
int type;
snd_mixer_channel_id_t chn_left, chn_right, chn;
int err, changed;
bzero(&scontrol, sizeof(scontrol));
if (mixer_sid == NULL)
@ -507,11 +507,11 @@ mixer_write_cbar (int elem_index)
type = mixer_type[elem_index];
chn_left = mixer_elem_chn[type][MIXER_CHN_LEFT];
if (! (scontrol.channels & (1 << chn_left)))
if (! (scontrol.channels & (1 << snd_enum_to_int(chn_left))))
return; /* ..??.. */
chn_right = mixer_elem_chn[type][MIXER_CHN_RIGHT];
if (chn_right >= 0 && ! (scontrol.channels & (1 << chn_right)))
chn_right = -1;
if (chn_right != SND_MIXER_CHN_UNKNOWN && ! (scontrol.channels & (1 << snd_enum_to_int(chn_right))))
chn_right = SND_MIXER_CHN_UNKNOWN;
changed = 0;
@ -522,7 +522,7 @@ mixer_write_cbar (int elem_index)
mixer_balance_volumes) &&
(scontrol.caps & SND_MIXER_SCTCAP_VOLUME)) {
int mono =
(chn_right < 0 || (scontrol.caps & SND_MIXER_SCTCAP_JOINTLY_VOLUME));
(chn_right == SND_MIXER_CHN_UNKNOWN || (scontrol.caps & SND_MIXER_SCTCAP_JOINTLY_VOLUME));
if (mono && !mixer_volume_delta[MIXER_CHN_LEFT])
mixer_volume_delta[MIXER_CHN_LEFT] = mixer_volume_delta[MIXER_CHN_RIGHT];
vleft = mixer_calc_volume(&scontrol, mixer_volume_delta[MIXER_CHN_LEFT], chn_left);
@ -535,16 +535,17 @@ mixer_write_cbar (int elem_index)
vright = vleft;
if (vleft >= 0 && vright >= 0) {
if (scontrol.caps & SND_MIXER_SCTCAP_JOINTLY_VOLUME) {
for (i = 0; i < SND_MIXER_CHN_LAST; i++) {
if (scontrol.channels & (1 << i))
scontrol.volume.values[i] = vleft;
for (chn = 0; chn < SND_MIXER_CHN_LAST; snd_enum_incr(chn)) {
int c = snd_enum_to_int(chn);
if (scontrol.channels & (1 << c))
scontrol.volume.values[c] = vleft;
}
} else {
if (mixer_balance_volumes)
vleft = vright = vbalance;
scontrol.volume.values[chn_left] = vleft;
scontrol.volume.values[snd_enum_to_int(chn_left)] = vleft;
if (! mono)
scontrol.volume.values[chn_right] = vright;
scontrol.volume.values[snd_enum_to_int(chn_right)] = vright;
}
changed = 1;
}
@ -560,9 +561,10 @@ mixer_write_cbar (int elem_index)
scontrol.mute = scontrol.mute ? 0 : scontrol.channels;
else {
if (mixer_toggle_mute & MIXER_MASK_LEFT)
scontrol.mute ^= (1 << chn_left);
if (chn_right >= 0 && (mixer_toggle_mute & MIXER_MASK_RIGHT))
scontrol.mute ^= (1 << chn_right);
scontrol.mute ^= (1 << snd_enum_to_int(chn_left));
if (chn_right != SND_MIXER_CHN_UNKNOWN &&
(mixer_toggle_mute & MIXER_MASK_RIGHT))
scontrol.mute ^= (1 << snd_enum_to_int(chn_right));
}
changed = 1;
}
@ -576,9 +578,9 @@ mixer_write_cbar (int elem_index)
scontrol.capture = scontrol.capture ? 0 : scontrol.channels;
else {
if (mixer_toggle_capture & MIXER_MASK_LEFT)
scontrol.capture ^= (1 << chn_left);
if (chn_right >= 0 && (mixer_toggle_capture & MIXER_MASK_RIGHT))
scontrol.capture ^= (1 << chn_right);
scontrol.capture ^= (1 << snd_enum_to_int(chn_left));
if (chn_right != SND_MIXER_CHN_UNKNOWN && (mixer_toggle_capture & MIXER_MASK_RIGHT))
scontrol.capture ^= (1 << snd_enum_to_int(chn_right));
}
changed = 1;
}
@ -598,8 +600,10 @@ mixer_update_cbar (int elem_index)
int err, dc;
snd_mixer_simple_control_t scontrol;
int vleft, vright;
int type, chn_left, chn_right;
int type;
snd_mixer_channel_id_t chn_left, chn_right;
int x, y, i;
int c_left, c_right;
/* set new scontrol indices and read info
*/
@ -612,21 +616,24 @@ mixer_update_cbar (int elem_index)
type = mixer_type[elem_index];
chn_left = mixer_elem_chn[type][MIXER_CHN_LEFT];
if (! (scontrol.channels & (1 << chn_left)))
if (! (scontrol.channels & (1 << snd_enum_to_int(chn_left))))
return; /* ..??.. */
chn_right = mixer_elem_chn[type][MIXER_CHN_RIGHT];
if (chn_right >= 0 && ! (scontrol.channels & (1 << chn_right)))
chn_right = -1;
if (chn_right != SND_MIXER_CHN_UNKNOWN &&
! (scontrol.channels & (1 << snd_enum_to_int(chn_right))))
chn_right = SND_MIXER_CHN_UNKNOWN;
c_left = snd_enum_to_int(chn_left);
c_right = snd_enum_to_int(chn_right);
/* first, read values for the numbers to be displayed
*/
if ((err = snd_mixer_simple_control_read (mixer_handle, &scontrol)) < 0)
CHECK_ABORT (ERR_FCN, "snd_mixer_simple_control_read()", err);
vleft = scontrol.volume.values[chn_left];
vleft = scontrol.volume.values[c_left];
vleft = mixer_conv(vleft, scontrol.min, scontrol.max, 0, 100);
if (chn_right >= 0) {
vright = scontrol.volume.values[chn_right];
if (chn_right != SND_MIXER_CHN_UNKNOWN) {
vright = scontrol.volume.values[c_right];
vright = mixer_conv(vright, scontrol.min, scontrol.max, 0, 100);
} else {
vright = vleft;
@ -722,10 +729,10 @@ mixer_update_cbar (int elem_index)
mvaddstr (y, x, " ");
mixer_dc (DC_CBAR_FRAME);
mvaddch (y, x + 2, ACS_ULCORNER);
dc = scontrol.mute & (1 << chn_left) ? DC_CBAR_MUTE : DC_CBAR_NOMUTE;
dc = scontrol.mute & (1 << c_left) ? DC_CBAR_MUTE : DC_CBAR_NOMUTE;
mvaddch (y, x + 3, mixer_dc (dc));
if (chn_right >= 0)
dc = scontrol.mute & (1 << chn_right) ? DC_CBAR_MUTE : DC_CBAR_NOMUTE;
if (chn_right != SND_MIXER_CHN_UNKNOWN)
dc = scontrol.mute & (1 << c_right) ? DC_CBAR_MUTE : DC_CBAR_NOMUTE;
mvaddch (y, x + 4, mixer_dc (dc));
mixer_dc (DC_CBAR_FRAME);
mvaddch (y, x + 5, ACS_URCORNER);
@ -733,17 +740,18 @@ mixer_update_cbar (int elem_index)
/* capture input?
*/
if ((scontrol.capture & (1 << chn_left)) ||
(chn_right >= 0 && (scontrol.capture & (1 << chn_right))))
if ((scontrol.capture & (1 << c_left)) ||
(chn_right != SND_MIXER_CHN_UNKNOWN && (scontrol.capture & (1 << c_right))))
{
mixer_dc (DC_CBAR_CAPTURE);
mvaddstr (y, x + 1, "CAPTUR");
if (scontrol.capture & (1 << chn_left)) {
if (scontrol.capture & (1 << c_left)) {
mvaddstr (y + 1, x + 1, "L");
if (chn_right < 0)
if (chn_right == SND_MIXER_CHN_UNKNOWN)
mvaddstr (y + 1, x + 6, "R");
}
if (chn_right >= 0 && (scontrol.capture & (1 << chn_right)))
if (chn_right != SND_MIXER_CHN_UNKNOWN &&
(scontrol.capture & (1 << c_right)))
mvaddstr (y + 1, x + 6, "R");
}
else if (scontrol.caps & SND_MIXER_SCTCAP_CAPTURE)
@ -1398,7 +1406,7 @@ mixer_resize (void)
}
static void
mixer_callback_rebuild (snd_mixer_t *handle, void *private_data)
mixer_callback_rebuild (snd_mixer_t *handle ATTRIBUTE_UNUSED, void *private_data ATTRIBUTE_UNUSED)
{
/* we don't actually need to update the individual channels because
* we redraw the whole screen upon every main iteration anyways.
@ -1407,7 +1415,7 @@ mixer_callback_rebuild (snd_mixer_t *handle, void *private_data)
}
static void
mixer_callback_scontrol (snd_mixer_t *handle, void *private_data, snd_mixer_sid_t *gid)
mixer_callback_scontrol (snd_mixer_t *handle ATTRIBUTE_UNUSED, void *private_data ATTRIBUTE_UNUSED, snd_mixer_sid_t *gid ATTRIBUTE_UNUSED)
{
mixer_reinit ();
}
@ -1433,7 +1441,7 @@ mixer_add_delta(int delta)
static int
mixer_iteration (void)
{
struct timeval delay = { 0, };
struct timeval delay = { 0, 0 };
snd_mixer_simple_callbacks_t callbacks = { 0, };
int mixer_fd;
fd_set rfds;

View file

@ -416,7 +416,8 @@ static int show_control(const char *space, snd_ctl_t *handle, snd_control_id_t *
static int controls(int level)
{
int err, idx;
int err;
unsigned int idx;
snd_ctl_t *handle;
snd_hcontrol_list_t list;
@ -456,7 +457,8 @@ static int controls(int level)
static int show_simple_control(void *handle, snd_mixer_sid_t *sid, const char *space, int level)
{
int err, chn;
int err;
snd_mixer_channel_id_t chn;
snd_mixer_simple_control_t scontrol;
bzero(&scontrol, sizeof(scontrol));
@ -490,8 +492,8 @@ static int show_simple_control(void *handle, snd_mixer_sid_t *sid, const char *s
if (scontrol.channels == SND_MIXER_CHN_MASK_MONO) {
printf("Mono");
} else {
for (chn = 0; chn <= SND_MIXER_CHN_LAST; chn++) {
if (!(scontrol.channels & (1<<chn)))
for (chn = 0; chn <= SND_MIXER_CHN_LAST; snd_enum_incr(chn)){
if (!(scontrol.channels & (1<<snd_enum_to_int(chn))))
continue;
printf("%s ", snd_mixer_simple_channel_name(chn));
}
@ -501,15 +503,16 @@ static int show_simple_control(void *handle, snd_mixer_sid_t *sid, const char *s
if (scontrol.channels == SND_MIXER_CHN_MASK_MONO) {
printf("%sMono: %s [%s]\n", space, get_percent(scontrol.volume.names.front_left, scontrol.min, scontrol.max), scontrol.mute & SND_MIXER_CHN_MASK_MONO ? "mute" : "on");
} else {
for (chn = 0; chn <= SND_MIXER_CHN_LAST; chn++) {
if (!(scontrol.channels & (1<<chn)))
for (chn = 0; chn <= SND_MIXER_CHN_LAST; snd_enum_incr(chn)) {
int c = snd_enum_to_int(chn);
if (!(scontrol.channels & (1<<c)))
continue;
printf("%s%s: %s [%s] [%s]\n",
space,
snd_mixer_simple_channel_name(chn),
get_percent(scontrol.volume.values[chn], scontrol.min, scontrol.max),
scontrol.mute & (1<<chn) ? "mute" : "on",
scontrol.capture & (1<<chn) ? "capture" : "---");
get_percent(scontrol.volume.values[c], scontrol.min, scontrol.max),
scontrol.mute & (1<<c) ? "mute" : "on",
scontrol.capture & (1<<c) ? "capture" : "---");
}
}
}
@ -518,7 +521,8 @@ static int show_simple_control(void *handle, snd_mixer_sid_t *sid, const char *s
static int simple_controls(int level)
{
int err, idx;
int err;
unsigned int idx;
snd_mixer_t *handle;
snd_mixer_simple_control_list_t list;
snd_mixer_sid_t *sid;
@ -691,7 +695,7 @@ static int cset(int argc, char *argv[], int roflag)
snd_control_id_t id;
snd_control_t control;
char *ptr;
int idx;
unsigned int idx;
long tmp;
if (argc < 1) {
@ -785,7 +789,7 @@ static channel_mask_t chanmask[] = {
{"rearright", SND_MIXER_CHN_MASK_REAR_RIGHT},
{"rear", SND_MIXER_CHN_MASK_REAR_LEFT|SND_MIXER_CHN_MASK_REAR_RIGHT},
{"woofer", SND_MIXER_CHN_MASK_WOOFER},
{NULL}
{NULL, 0}
};
static int check_channels(char *arg, unsigned int mask, unsigned int *mask_return)
@ -801,9 +805,11 @@ static int check_channels(char *arg, unsigned int mask, unsigned int *mask_retur
return 0;
}
static int sset(int argc, char *argv[], int roflag)
static int sset(unsigned int argc, char *argv[], int roflag)
{
int err, idx, chn;
int err;
unsigned int idx;
snd_mixer_channel_id_t chn;
unsigned int channels;
snd_mixer_t *handle;
snd_mixer_sid_t sid;
@ -864,14 +870,15 @@ static int sset(int argc, char *argv[], int roflag)
multi = (strchr(argv[idx], ',') != NULL);
ptr = argv[idx];
for (chn = 0; chn <= SND_MIXER_CHN_LAST; chn++) {
if (!(control.channels & (1<<chn)) ||
!(channels & (1<<chn)))
for (chn = 0; chn <= SND_MIXER_CHN_LAST; snd_enum_incr(chn)) {
int c = snd_enum_to_int(chn);
if (!(control.channels & (1<<c)) ||
!(channels & (1<<c)))
continue;
if (! multi)
ptr = argv[idx];
control.volume.values[chn] = get_volume_simple(&ptr, control.min, control.max, control.volume.values[chn]);
control.volume.values[c] = get_volume_simple(&ptr, control.min, control.max, control.volume.values[c]);
}
} else {
error("Unknown setup '%s'..\n", argv[idx]);
@ -893,34 +900,34 @@ static int sset(int argc, char *argv[], int roflag)
return 0;
}
static void events_change(snd_ctl_t *handle, snd_hcontrol_t *hcontrol)
static void events_change(snd_ctl_t *handle ATTRIBUTE_UNUSED, snd_hcontrol_t *hcontrol)
{
printf("event change: ");
show_control_id(&hcontrol->id);
printf("\n");
}
static void events_value(snd_ctl_t *handle, snd_hcontrol_t *hcontrol)
static void events_value(snd_ctl_t *handle ATTRIBUTE_UNUSED, snd_hcontrol_t *hcontrol)
{
printf("event value: ");
show_control_id(&hcontrol->id);
printf("\n");
}
static void events_remove(snd_ctl_t *handle, snd_hcontrol_t *hcontrol)
static void events_remove(snd_ctl_t *handle ATTRIBUTE_UNUSED, snd_hcontrol_t *hcontrol)
{
printf("event remove: ");
show_control_id(&hcontrol->id);
printf("\n");
}
static void events_rebuild(snd_ctl_t *handle, void *private_data)
static void events_rebuild(snd_ctl_t *handle ATTRIBUTE_UNUSED, void *private_data)
{
assert(private_data != (void *)1);
printf("event rebuild\n");
}
static void events_add(snd_ctl_t *handle, void *private_data, snd_hcontrol_t *hcontrol)
static void events_add(snd_ctl_t *handle ATTRIBUTE_UNUSED, void *private_data, snd_hcontrol_t *hcontrol)
{
assert(private_data != (void *)1);
printf("event add: ");
@ -931,7 +938,7 @@ static void events_add(snd_ctl_t *handle, void *private_data, snd_hcontrol_t *hc
hcontrol->event_remove = events_remove;
}
static int events(int argc, char *argv[])
static int events(int argc ATTRIBUTE_UNUSED, char *argv[] ATTRIBUTE_UNUSED)
{
snd_ctl_t *handle;
snd_hcontrol_t *hcontrol;
@ -975,40 +982,40 @@ static int events(int argc, char *argv[])
snd_ctl_close(handle);
}
static void sevents_rebuild(snd_mixer_t *handle, void *private_data)
static void sevents_rebuild(snd_mixer_t *handle ATTRIBUTE_UNUSED, void *private_data ATTRIBUTE_UNUSED)
{
printf("event rebuild\n");
}
static void sevents_value(snd_mixer_t *handle, void *private_data, snd_mixer_sid_t *sid)
static void sevents_value(snd_mixer_t *handle ATTRIBUTE_UNUSED, void *private_data ATTRIBUTE_UNUSED, snd_mixer_sid_t *sid)
{
char name[simple_name_size];
printf("event value: '%s',%i\n", simple_name(sid->name, name), sid->index);
}
static void sevents_change(snd_mixer_t *handle, void *private_data, snd_mixer_sid_t *sid)
static void sevents_change(snd_mixer_t *handle ATTRIBUTE_UNUSED, void *private_data ATTRIBUTE_UNUSED, snd_mixer_sid_t *sid)
{
char name[simple_name_size];
printf("event change: '%s',%i\n", simple_name(sid->name, name), sid->index);
}
static void sevents_add(snd_mixer_t *handle, void *private_data, snd_mixer_sid_t *sid)
static void sevents_add(snd_mixer_t *handle ATTRIBUTE_UNUSED, void *private_data ATTRIBUTE_UNUSED, snd_mixer_sid_t *sid)
{
char name[simple_name_size];
printf("event add: '%s',%i\n", simple_name(sid->name, name), sid->index);
}
static void sevents_remove(snd_mixer_t *handle, void *private_data, snd_mixer_sid_t *sid)
static void sevents_remove(snd_mixer_t *handle ATTRIBUTE_UNUSED, void *private_data ATTRIBUTE_UNUSED, snd_mixer_sid_t *sid)
{
char name[simple_name_size];
printf("event remove: '%s',%i\n", simple_name(sid->name, name), sid->index);
}
static int sevents(int argc, char *argv[])
static int sevents(int argc ATTRIBUTE_UNUSED, char *argv[] ATTRIBUTE_UNUSED)
{
snd_mixer_t *handle;
static snd_mixer_simple_callbacks_t callbacks = {

View file

@ -364,7 +364,7 @@ int main(int argc, char *argv[])
rhwparams.channels = 2;
} else {
rhwparams.format = snd_pcm_format_value(optarg);
if (rhwparams.format < 0) {
if (rhwparams.format == SND_PCM_FORMAT_UNKNOWN) {
error("wrong extended format '%s'", optarg);
exit(EXIT_FAILURE);
}