Removed snd_defaults_ functions.

Updated the syntax of configuration file to substitute values from
the environment space.
Updated alsa.conf to replace old snd_defaults_ functions.
This commit is contained in:
Jaroslav Kysela 2001-06-08 10:15:25 +00:00
parent 5ce8fbeab5
commit b7c05ad942
7 changed files with 80 additions and 158 deletions

View file

@ -1,3 +1,10 @@
# Include a new configuration file
<filename>
# Replace with an environment variable
# (default value is used if envvar is not present or empty)
<@envvar[,envvar1][,envvar2...]:defaultval@>
# Server definition
server.NAME {
host STR # host where the server is located (if map to local address

View file

@ -266,13 +266,6 @@ int snd_card_get_index(const char *name);
int snd_card_get_name(int card, char **name);
int snd_card_get_longname(int card, char **name);
int snd_defaults_card(void);
int snd_defaults_mixer_card(void);
int snd_defaults_pcm_card(void);
int snd_defaults_pcm_device(void);
int snd_defaults_rawmidi_card(void);
int snd_defaults_rawmidi_device(void);
int snd_card_type_string_to_enum(const char *strid, snd_card_type_t *enumid);
int snd_card_type_enum_to_string(snd_card_type_t enumid, char **strid);

View file

@ -1,10 +1,13 @@
#
# ALSA library configuration file
#
pcm.default {
type plug
slave.pcm {
type hw
card 0
device 0
card <@ALSA_PCM_CARD,ALSA_CARD:0@>
device <@ALSA_PCM_DEVICE:0@>
}
}
@ -115,10 +118,11 @@ pcm.surround40 {
$.1 DEV
$.CARD {
type integer
default <@ALSA_SURROUND40_CARD,ALSA_PCM_CARD,ALSA_CARD:0@>
}
$.DEV {
type integer
default 0
default <@ALSA_SURROUND40_DEVICE:0@>
}
type surround
card $CARD
@ -131,10 +135,11 @@ pcm.surround51 {
$.1 DEV
$.CARD {
type integer
default <@ALSA_SURROUND51_CARD,ALSA_PCM_CARD,ALSA_CARD:0@>
}
$.DEV {
type integer
default 0
default <@ALSA_SURROUND51_DEVICE:0@>
}
type surround
card $CARD
@ -148,7 +153,7 @@ pcm.null {
ctl.default {
type hw
card 0
card <@ALSA_CARD:0@>
}
ctl.hw {
@ -174,6 +179,12 @@ ctl.shm {
ctl $PCM
}
rawmidi.default {
type hw
card <@ALSA_RAWMIDI_CARD,ALSA_CARD:0@>
device <@ALSA_RAWMIDI_DEVICE:0@>
}
rawmidi.hw {
$.0 CARD
$.1 DEV
@ -194,6 +205,10 @@ rawmidi.hw {
subdevice $SUBDEV
}
seq.default {
type hw
}
seq.hw {
type hw
}
@ -242,4 +257,3 @@ pcm.iec958 {
}
}
}

View file

@ -59,6 +59,7 @@ typedef struct {
UNTERMINATED_QUOTE = -2,
UNEXPECTED_CHAR = -3,
UNEXPECTED_EOF = -4,
BAD_ENV_DEFAULT = -5,
} error;
} input_t;
@ -112,19 +113,54 @@ static int get_char_skip_comments(input_t *input)
while (1) {
c = get_char(input);
if (c == '<') {
char *file;
char *str;
snd_input_t *in;
struct filedesc *fd;
int err = get_delimstring(&file, '>', input);
if (err < 0)
return err;
err = snd_input_stdio_open(&in, file, "r");
int err = get_delimstring(&str, '>', input);
if (err < 0)
return err;
if (strlen(str) < 3 ||
str[0] != '@' ||
str[strlen(str)-1] != '@' ||
strchr(str, ':') == NULL) {
err = snd_input_stdio_open(&in, str, "r");
if (err < 0)
return err;
} else {
char *envvar = str + 1;
char *envdef = strchr(str, ':');
char *env, *end;
str[strlen(str)-1] = '\0';
*envdef++ = '\0';
if (*envdef == '\0') {
free(str);
input->error = BAD_ENV_DEFAULT;
return -EINVAL;
}
while (1) {
end = strchr(envvar, ',');
if (end)
*end = '\0';
env = getenv(envvar);
if (env != NULL && *env != '\0')
break;
if (end) {
*end = ','; /* repair for fd->name */
envvar = end + 1;
} else {
env = envdef;
break;
}
}
err = snd_input_buffer_open(&in, env, strlen(env));
if (err < 0)
return err;
}
fd = malloc(sizeof(*fd));
if (!fd)
return -ENOMEM;
fd->name = file;
fd->name = str;
fd->in = in;
fd->next = input->current;
fd->line = 1;
@ -839,6 +875,9 @@ int snd_config_load(snd_config_t *config, snd_input_t *in)
case UNEXPECTED_EOF:
str = "Unexpected end of file";
break;
case BAD_ENV_DEFAULT:
str = "Bad environment default value";
break;
default:
assert(0);
break;
@ -1196,10 +1235,10 @@ int snd_config_search_alias(snd_config_t *config,
}
/** Environment variable containing files list for #snd_config_update */
#define ASOUND_CONFIGS_VAR "ASOUND_CONFIGS"
#define ALSA_CONFIG_PATH_VAR "ALSA_CONFIG_PATH"
/** Default files used by #snd_config_update */
#define ASOUND_CONFIGS_DEFAULT DATADIR "/alsa/alsa.conf:/etc/asound.conf:~/.asoundrc"
#define ALSA_CONFIG_PATH_DEFAULT DATADIR "/alsa/alsa.conf:/etc/asound.conf:~/.asoundrc"
/** \ingroup Config
* Config top node */
@ -1216,7 +1255,7 @@ static unsigned int files_info_count = 0;
/**
* \brief Update #snd_config rereading (if needed) files specified in
* environment variable ASOUND_CONFIGS. If it's not set the default value is
* environment variable ALSA_CONFIG_PATH. If it's not set the default value is
* "/usr/share/alsa/alsa.conf:/etc/asound.conf:~/.asoundrc"
* \return 0 if no action is needed, 1 if tree has been rebuilt otherwise a negative error code
*
@ -1232,9 +1271,9 @@ int snd_config_update()
size_t l;
struct finfo *fi;
unsigned int fi_count;
configs = getenv(ASOUND_CONFIGS_VAR);
configs = getenv(ALSA_CONFIG_PATH_VAR);
if (!configs)
configs = ASOUND_CONFIGS_DEFAULT;
configs = ALSA_CONFIG_PATH_DEFAULT;
for (k = 0, c = configs; (l = strcspn(c, ": ")) > 0; ) {
c += l;
k++;
@ -1351,7 +1390,7 @@ snd_config_iterator_t snd_config_iterator_first(snd_config_t *node)
}
/**
* \brief Return an iterator pointing to next leaf
q * \brief Return an iterator pointing to next leaf
* \param iterator Config node iterator
* \return iterator value for next leaf
*/

View file

@ -1,6 +1,6 @@
EXTRA_LTLIBRARIES = libcontrol.la
libcontrol_la_SOURCES = cards.c cards_id.c hcontrol.c defaults.c \
libcontrol_la_SOURCES = cards.c cards_id.c hcontrol.c \
control.c control_hw.c control_shm.c \
setup.c

View file

@ -1,131 +0,0 @@
/*
* Control Interface - defaults
* Copyright (c) 1998 by Jaroslav Kysela <perex@suse.cz>
*
*
* This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#include <stdlib.h>
#include <string.h>
#include "local.h"
static int defaults_card(const char *env)
{
char *e;
e = getenv(env);
if (!e)
return -ENOENT;
return snd_card_get_index(e);
}
static int defaults_device(const char *env)
{
char *e;
int dev;
e = getenv(env);
if (e) {
dev = atoi(env);
if (dev >= 0 && dev < 1024 * 1024)
return dev;
}
return 0;
}
int snd_defaults_card(void)
{
int result;
result = defaults_card("ALSA_CARD");
if (result >= 0)
return result;
result = -1;
if (snd_card_next(&result))
return -ENOENT;
return result;
}
int snd_defaults_mixer_card(void)
{
int result;
result = defaults_card("ALSA_MIXER_CARD");
if (result >= 0)
return result;
return snd_defaults_card();
}
int snd_defaults_pcm_card(void)
{
int result;
result = defaults_card("ALSA_PCM_CARD");
if (result >= 0)
return result;
return snd_defaults_card();
}
int snd_defaults_pcm_device(void)
{
snd_ctl_t *handle;
char id[16];
int result;
result = defaults_device("ALSA_PCM_DEVICE");
if (result >= 0)
return result;
sprintf(id, "hw:%i", snd_defaults_pcm_card());
if (snd_ctl_open(&handle, id, 0) < 0)
return -ENOENT;
result = -1;
if (snd_ctl_pcm_next_device(handle, &result) < 0) {
snd_ctl_close(handle);
return -ENOENT;
}
return result;
}
int snd_defaults_rawmidi_card(void)
{
int result;
result = defaults_card("ALSA_RAWMIDI_CARD");
if (result >= 0)
return result;
return snd_defaults_card();
}
int snd_defaults_rawmidi_device(void)
{
snd_ctl_t *handle;
char id[16];
int result;
result = defaults_device("ALSA_RAWMIDI_DEVICE");
if (result >= 0)
return result;
sprintf(id, "hw:%i", snd_defaults_rawmidi_card());
if (snd_ctl_open(&handle, id, 0) < 0)
return -ENOENT;
result = -1;
if (snd_ctl_rawmidi_next_device(handle, &result) < 0) {
snd_ctl_close(handle);
return -ENOENT;
}
return result;
}

View file

@ -118,7 +118,7 @@ exit(0);
AC_LANG_RESTORE
dnl Now that we know that we have the right version, let's see if we have the library and not just the headers.
AC_CHECK_LIB([asound], [snd_defaults_card],,
AC_CHECK_LIB([asound], [snd_seq_create_event],,
[ifelse([$3], , [AC_MSG_ERROR(No linkable libasound was found.)])
alsa_found=no]
)