oss_mixer: call oss_find_mixer() in init() method
Detect misconfiguration during MPD startup.
This commit is contained in:
parent
881026623c
commit
c552d17c03
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user