aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2008-09-23 20:47:53 +0200
committerMax Kellermann <max@duempel.org>2008-09-23 20:47:53 +0200
commit9f441f25384c6c9ad5266c34c114535c788ced11 (patch)
treee35cc51dc0af732ba971569ab558a0c795dc75f6
parentd095d52ed4aadd916bd025e1c39bbe2977da3997 (diff)
downloadmpd-9f441f25384c6c9ad5266c34c114535c788ced11.tar.gz
mpd-9f441f25384c6c9ad5266c34c114535c788ced11.tar.xz
mpd-9f441f25384c6c9ad5266c34c114535c788ced11.zip
oss: avoid heap allocations when configuring mixer
Noticed-by: Courtney Cavin
-rw-r--r--src/volume.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/src/volume.c b/src/volume.c
index 71fe098ac..e319afdd9 100644
--- a/src/volume.c
+++ b/src/volume.c
@@ -31,6 +31,7 @@
#ifdef HAVE_ALSA
#include <alsa/asoundlib.h>
#endif
+#include <alloca.h>
#define VOLUME_MIXER_TYPE_SOFTWARE 0
#define VOLUME_MIXER_TYPE_OSS 1
@@ -75,6 +76,8 @@ static int volume_alsaSet = -1;
#ifdef HAVE_OSS
+#include <alloca.h> /* only alloca user in mpd atm, may change ... */
+
static void closeOssMixer(void)
{
while (close(volume_ossFd) && errno == EINTR) ;
@@ -90,12 +93,9 @@ static int prepOssMixer(const char *device)
return -1;
}
- param = getConfigParam(CONF_MIXER_CONTROL);
-
- if (param) {
+ if ((param = getConfigParam(CONF_MIXER_CONTROL))) {
const char *labels[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_LABELS;
- char *duplicated;
- int i, j;
+ int i;
int 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++) {
- duplicated = xstrdup(labels[i]);
+ ssize_t len = strlen(labels[i]);
+ char *duplicated = alloca(len + 1);
+
/* eliminate spaces at the end */
- j = strlen(duplicated) - 1;
- while (j >= 0 && duplicated[j] == ' ')
- duplicated[j--] = '\0';
- if (strcasecmp(duplicated, param->value) == 0) {
- free(duplicated);
+ memcpy(duplicated, labels[i], len + 1);
+ len -= 2;
+ while (len >= 0 && duplicated[len] == ' ')
+ duplicated[len--] = '\0';
+ if (strcasecmp(duplicated, param->value) == 0)
break;
- }
- free(duplicated);
}
if (i >= SOUND_MIXER_NRDEVICES) {