oss_mixer: call oss_find_mixer() in init() method

Detect misconfiguration during MPD startup.
This commit is contained in:
Max Kellermann 2009-03-26 19:48:21 +01:00
parent 881026623c
commit c552d17c03

View File

@ -49,6 +49,21 @@ struct oss_mixer {
int volume_control; int volume_control;
}; };
static int
oss_find_mixer(const char *name)
{
const char *labels[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_LABELS;
size_t name_length = strlen(name);
for (unsigned i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
if (g_ascii_strncasecmp(name, labels[i], name_length) == 0 &&
(labels[i][name_length] == 0 ||
labels[i][name_length] == ' '))
return i;
}
return -1;
}
static struct mixer * static struct mixer *
oss_mixer_init(const struct config_param *param) oss_mixer_init(const struct config_param *param)
{ {
@ -60,7 +75,16 @@ oss_mixer_init(const struct config_param *param)
VOLUME_MIXER_OSS_DEFAULT); VOLUME_MIXER_OSS_DEFAULT);
om->control = config_get_block_string(param, "mixer_control", NULL); om->control = config_get_block_string(param, "mixer_control", NULL);
om->volume_control = SOUND_MIXER_PCM; if (om->control != NULL) {
om->volume_control = oss_find_mixer(om->control);
if (om->volume_control < 0) {
g_warning("mixer control \"%s\" not found",
om->control);
g_free(om);
return NULL;
}
} else
om->volume_control = SOUND_MIXER_PCM;
return &om->base; return &om->base;
} }
@ -83,21 +107,6 @@ oss_mixer_close(struct mixer *data)
close(om->device_fd); close(om->device_fd);
} }
static int
oss_find_mixer(const char *name)
{
const char *labels[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_LABELS;
size_t name_length = strlen(name);
for (unsigned i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
if (g_ascii_strncasecmp(name, labels[i], name_length) == 0 &&
(labels[i][name_length] == 0 ||
labels[i][name_length] == ' '))
return i;
}
return -1;
}
static bool static bool
oss_mixer_open(struct mixer *data) oss_mixer_open(struct mixer *data)
{ {
@ -110,7 +119,6 @@ oss_mixer_open(struct mixer *data)
} }
if (om->control) { if (om->control) {
int i;
int devmask = 0; int devmask = 0;
if (ioctl(om->device_fd, SOUND_MIXER_READ_DEVMASK, &devmask) < 0) { if (ioctl(om->device_fd, SOUND_MIXER_READ_DEVMASK, &devmask) < 0) {
@ -118,20 +126,13 @@ oss_mixer_open(struct mixer *data)
oss_mixer_close(data); oss_mixer_close(data);
return false; return false;
} }
i = oss_find_mixer(om->control);
if (i < 0) { if (((1 << om->volume_control) & devmask) == 0) {
g_warning("mixer control \"%s\" not found\n",
om->control);
oss_mixer_close(data);
return false;
} else if (!((1 << i) & devmask)) {
g_warning("mixer control \"%s\" not usable\n", g_warning("mixer control \"%s\" not usable\n",
om->control); om->control);
oss_mixer_close(data); oss_mixer_close(data);
return false; return false;
} }
om->volume_control = i;
} }
return true; return true;
} }