oss: avoid heap allocations when configuring mixer
Noticed-by: Courtney Cavin
This commit is contained in:

committed by
Max Kellermann

parent
d095d52ed4
commit
9f441f2538
26
src/volume.c
26
src/volume.c
@@ -31,6 +31,7 @@
|
|||||||
#ifdef HAVE_ALSA
|
#ifdef HAVE_ALSA
|
||||||
#include <alsa/asoundlib.h>
|
#include <alsa/asoundlib.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include <alloca.h>
|
||||||
|
|
||||||
#define VOLUME_MIXER_TYPE_SOFTWARE 0
|
#define VOLUME_MIXER_TYPE_SOFTWARE 0
|
||||||
#define VOLUME_MIXER_TYPE_OSS 1
|
#define VOLUME_MIXER_TYPE_OSS 1
|
||||||
@@ -75,6 +76,8 @@ static int volume_alsaSet = -1;
|
|||||||
|
|
||||||
#ifdef HAVE_OSS
|
#ifdef HAVE_OSS
|
||||||
|
|
||||||
|
#include <alloca.h> /* only alloca user in mpd atm, may change ... */
|
||||||
|
|
||||||
static void closeOssMixer(void)
|
static void closeOssMixer(void)
|
||||||
{
|
{
|
||||||
while (close(volume_ossFd) && errno == EINTR) ;
|
while (close(volume_ossFd) && errno == EINTR) ;
|
||||||
@@ -90,12 +93,9 @@ static int prepOssMixer(const char *device)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
param = getConfigParam(CONF_MIXER_CONTROL);
|
if ((param = getConfigParam(CONF_MIXER_CONTROL))) {
|
||||||
|
|
||||||
if (param) {
|
|
||||||
const char *labels[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_LABELS;
|
const char *labels[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_LABELS;
|
||||||
char *duplicated;
|
int i;
|
||||||
int i, j;
|
|
||||||
int devmask = 0;
|
int devmask = 0;
|
||||||
|
|
||||||
if (ioctl(volume_ossFd, SOUND_MIXER_READ_DEVMASK, &devmask) < 0) {
|
if (ioctl(volume_ossFd, SOUND_MIXER_READ_DEVMASK, &devmask) < 0) {
|
||||||
@@ -105,16 +105,16 @@ static int prepOssMixer(const char *device)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
|
for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
|
||||||
duplicated = xstrdup(labels[i]);
|
ssize_t len = strlen(labels[i]);
|
||||||
|
char *duplicated = alloca(len + 1);
|
||||||
|
|
||||||
/* eliminate spaces at the end */
|
/* eliminate spaces at the end */
|
||||||
j = strlen(duplicated) - 1;
|
memcpy(duplicated, labels[i], len + 1);
|
||||||
while (j >= 0 && duplicated[j] == ' ')
|
len -= 2;
|
||||||
duplicated[j--] = '\0';
|
while (len >= 0 && duplicated[len] == ' ')
|
||||||
if (strcasecmp(duplicated, param->value) == 0) {
|
duplicated[len--] = '\0';
|
||||||
free(duplicated);
|
if (strcasecmp(duplicated, param->value) == 0)
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
free(duplicated);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i >= SOUND_MIXER_NRDEVICES) {
|
if (i >= SOUND_MIXER_NRDEVICES) {
|
||||||
|
Reference in New Issue
Block a user