mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-11-15 07:00:02 -05:00
add card number to ipc key for dmix / dsnoop PCM definitions
See ALSA bug#1573 Also add card_inum, iadd, imul functions to configuration files.
This commit is contained in:
parent
faf8aad99a
commit
aa7a0dd70b
3 changed files with 223 additions and 5 deletions
|
|
@ -38,8 +38,23 @@ pcm.!dmix {
|
||||||
}
|
}
|
||||||
type dmix
|
type dmix
|
||||||
ipc_key {
|
ipc_key {
|
||||||
@func refer
|
@func iadd
|
||||||
name defaults.pcm.ipc_key
|
integers [
|
||||||
|
{
|
||||||
|
@func refer
|
||||||
|
name defaults.pcm.ipc_key
|
||||||
|
}
|
||||||
|
{
|
||||||
|
@func imul
|
||||||
|
integers [
|
||||||
|
{
|
||||||
|
@func card_inum
|
||||||
|
$CARD
|
||||||
|
}
|
||||||
|
2
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
ipc_gid {
|
ipc_gid {
|
||||||
@func refer
|
@func refer
|
||||||
|
|
|
||||||
|
|
@ -38,8 +38,23 @@ pcm.!dsnoop {
|
||||||
}
|
}
|
||||||
type dsnoop
|
type dsnoop
|
||||||
ipc_key {
|
ipc_key {
|
||||||
@func refer
|
@func iadd
|
||||||
name defaults.pcm.ipc_key
|
integers [
|
||||||
|
{
|
||||||
|
@func refer
|
||||||
|
name defaults.pcm.ipc_key
|
||||||
|
}
|
||||||
|
{
|
||||||
|
@func imul
|
||||||
|
integers [
|
||||||
|
{
|
||||||
|
@func card_inum
|
||||||
|
$CARD
|
||||||
|
}
|
||||||
|
2
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
ipc_gid {
|
ipc_gid {
|
||||||
@func refer
|
@func refer
|
||||||
|
|
|
||||||
188
src/confmisc.c
188
src/confmisc.c
|
|
@ -43,10 +43,16 @@
|
||||||
an environment value. The result is an integer.
|
an environment value. The result is an integer.
|
||||||
<LI>The concat function - snd_func_concat() - merges all specified
|
<LI>The concat function - snd_func_concat() - merges all specified
|
||||||
strings. The result is a string.
|
strings. The result is a string.
|
||||||
|
<LI>The iadd function - snd_func_iadd() - sum all specified integers.
|
||||||
|
The result is an integer.
|
||||||
|
<LI>The imul function - snd_func_imul() - multiply all specified integers.
|
||||||
|
The result is an integer.
|
||||||
<LI>The datadir function - snd_func_datadir() - returns the
|
<LI>The datadir function - snd_func_datadir() - returns the
|
||||||
ALSA data directory. The result is a string.
|
ALSA data directory. The result is a string.
|
||||||
<LI>The refer function - snd_func_refer() - copies the referred
|
<LI>The refer function - snd_func_refer() - copies the referred
|
||||||
configuration. The result has the same type as the referred node.
|
configuration. The result has the same type as the referred node.
|
||||||
|
<LI>The card_inum function - snd_func_card_inum() - returns
|
||||||
|
a card number (integers).
|
||||||
<LI>The card_driver function - snd_func_card_driver() - returns
|
<LI>The card_driver function - snd_func_card_driver() - returns
|
||||||
a driver identification. The result is a string.
|
a driver identification. The result is a string.
|
||||||
<LI>The card_id function - snd_func_card_id() - returns
|
<LI>The card_id function - snd_func_card_id() - returns
|
||||||
|
|
@ -447,6 +453,131 @@ int snd_func_concat(snd_config_t **dst, snd_config_t *root, snd_config_t *src,
|
||||||
SND_DLSYM_BUILD_VERSION(snd_func_concat, SND_CONFIG_DLSYM_VERSION_EVALUATE);
|
SND_DLSYM_BUILD_VERSION(snd_func_concat, SND_CONFIG_DLSYM_VERSION_EVALUATE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static int snd_func_iops(snd_config_t **dst,
|
||||||
|
snd_config_t *root,
|
||||||
|
snd_config_t *src,
|
||||||
|
snd_config_t *private_data,
|
||||||
|
int op)
|
||||||
|
{
|
||||||
|
snd_config_t *n;
|
||||||
|
snd_config_iterator_t i, next;
|
||||||
|
const char *id;
|
||||||
|
char *res = NULL;
|
||||||
|
long result = 0, val;
|
||||||
|
int idx = 0, err, hit;
|
||||||
|
|
||||||
|
err = snd_config_search(src, "integers", &n);
|
||||||
|
if (err < 0) {
|
||||||
|
SNDERR("field integers not found");
|
||||||
|
goto __error;
|
||||||
|
}
|
||||||
|
err = snd_config_evaluate(n, root, private_data, NULL);
|
||||||
|
if (err < 0) {
|
||||||
|
SNDERR("error evaluating integers");
|
||||||
|
goto __error;
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
hit = 0;
|
||||||
|
snd_config_for_each(i, next, n) {
|
||||||
|
snd_config_t *n = snd_config_iterator_entry(i);
|
||||||
|
const char *id;
|
||||||
|
long i;
|
||||||
|
if (snd_config_get_id(n, &id) < 0)
|
||||||
|
continue;
|
||||||
|
err = safe_strtol(id, &i);
|
||||||
|
if (err < 0) {
|
||||||
|
SNDERR("id of field %s is not an integer", id);
|
||||||
|
err = -EINVAL;
|
||||||
|
goto __error;
|
||||||
|
}
|
||||||
|
if (i == idx) {
|
||||||
|
idx++;
|
||||||
|
#if 1
|
||||||
|
{
|
||||||
|
snd_output_t *out;
|
||||||
|
fprintf(stderr, "********* ID '%s':\n", id);
|
||||||
|
snd_output_stdio_attach(&out, stderr, 0);
|
||||||
|
snd_config_save(n, out);
|
||||||
|
snd_output_close(out);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
err = snd_config_get_integer(n, &val);
|
||||||
|
if (err < 0) {
|
||||||
|
SNDERR("invalid integer for id %s", id);
|
||||||
|
err = -EINVAL;
|
||||||
|
goto __error;
|
||||||
|
}
|
||||||
|
switch (op) {
|
||||||
|
case 0: result += val; break;
|
||||||
|
case 1: result *= val; break;
|
||||||
|
}
|
||||||
|
hit = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (hit);
|
||||||
|
err = snd_config_get_id(src, &id);
|
||||||
|
if (err >= 0)
|
||||||
|
err = snd_config_imake_integer(dst, id, result);
|
||||||
|
free(res);
|
||||||
|
__error:
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Sum the given integers.
|
||||||
|
* \param dst The function puts the handle to the result configuration node
|
||||||
|
* (with type integer) at the address specified by \p dst.
|
||||||
|
* \param root Handle to the root source node.
|
||||||
|
* \param src Handle to the source node, with a definition for \c integers.
|
||||||
|
* \param private_data Handle to the \c private_data node.
|
||||||
|
* \return A non-negative value if successful, otherwise a negative error code.
|
||||||
|
*
|
||||||
|
* Example (result is 10):
|
||||||
|
\code
|
||||||
|
{
|
||||||
|
@func iadd
|
||||||
|
integers [ 2 3 5 ]
|
||||||
|
}
|
||||||
|
\endcode
|
||||||
|
*/
|
||||||
|
int snd_func_iadd(snd_config_t **dst, snd_config_t *root,
|
||||||
|
snd_config_t *src, snd_config_t *private_data)
|
||||||
|
{
|
||||||
|
return snd_func_iops(dst, root, src, private_data, 0);
|
||||||
|
}
|
||||||
|
#ifndef DOC_HIDDEN
|
||||||
|
SND_DLSYM_BUILD_VERSION(snd_func_iadd, SND_CONFIG_DLSYM_VERSION_EVALUATE);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Multiply the given integers.
|
||||||
|
* \param dst The function puts the handle to the result configuration node
|
||||||
|
* (with type integer) at the address specified by \p dst.
|
||||||
|
* \param root Handle to the root source node.
|
||||||
|
* \param src Handle to the source node, with a definition for \c integers.
|
||||||
|
* \param private_data Handle to the \c private_data node.
|
||||||
|
* \return A non-negative value if successful, otherwise a negative error code.
|
||||||
|
*
|
||||||
|
* Example (result is 12):
|
||||||
|
\code
|
||||||
|
{
|
||||||
|
@func imul
|
||||||
|
integers [ 2 3 2 ]
|
||||||
|
}
|
||||||
|
\endcode
|
||||||
|
*/
|
||||||
|
int snd_func_imul(snd_config_t **dst, snd_config_t *root,
|
||||||
|
snd_config_t *src, snd_config_t *private_data)
|
||||||
|
{
|
||||||
|
return snd_func_iops(dst, root, src, private_data, 1);
|
||||||
|
}
|
||||||
|
#ifndef DOC_HIDDEN
|
||||||
|
SND_DLSYM_BUILD_VERSION(snd_func_imul, SND_CONFIG_DLSYM_VERSION_EVALUATE);
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Returns the ALSA data directory.
|
* \brief Returns the ALSA data directory.
|
||||||
* \param dst The function puts the handle to the result configuration node
|
* \param dst The function puts the handle to the result configuration node
|
||||||
|
|
@ -625,6 +756,63 @@ int snd_func_private_card_driver(snd_config_t **dst, snd_config_t *root ATTRIBUT
|
||||||
SND_DLSYM_BUILD_VERSION(snd_func_private_card_driver, SND_CONFIG_DLSYM_VERSION_EVALUATE);
|
SND_DLSYM_BUILD_VERSION(snd_func_private_card_driver, SND_CONFIG_DLSYM_VERSION_EVALUATE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Returns the card number as integer.
|
||||||
|
* \param dst The function puts the handle to the result configuration node
|
||||||
|
* (with type string) at the address specified by \p dst.
|
||||||
|
* \param root Handle to the root source node.
|
||||||
|
* \param src Handle to the source node, with a \c card definition.
|
||||||
|
* \param private_data Handle to the \c private_data node.
|
||||||
|
* \return A non-negative value if successful, otherwise a negative error code.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
\code
|
||||||
|
{
|
||||||
|
@func card_inum
|
||||||
|
card '0'
|
||||||
|
}
|
||||||
|
\endcode
|
||||||
|
*/
|
||||||
|
int snd_func_card_inum(snd_config_t **dst, snd_config_t *root, snd_config_t *src,
|
||||||
|
snd_config_t *private_data)
|
||||||
|
{
|
||||||
|
snd_config_t *n;
|
||||||
|
const char *id;
|
||||||
|
char *str;
|
||||||
|
long v;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = snd_config_search(src, "card", &n);
|
||||||
|
if (err < 0) {
|
||||||
|
SNDERR("field card not found");
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
err = snd_config_evaluate(n, root, private_data, NULL);
|
||||||
|
if (err < 0) {
|
||||||
|
SNDERR("error evaluating card");
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
err = snd_config_get_ascii(n, &str);
|
||||||
|
if (err < 0) {
|
||||||
|
SNDERR("field card is not an integer or a string");
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
v = snd_card_get_index(str);
|
||||||
|
if (v < 0) {
|
||||||
|
SNDERR("cannot find card '%s'", str);
|
||||||
|
free(str);
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
free(str);
|
||||||
|
err = snd_config_get_id(src, &id);
|
||||||
|
if (err >= 0)
|
||||||
|
err = snd_config_imake_integer(dst, id, v);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
#ifndef DOC_HIDDEN
|
||||||
|
SND_DLSYM_BUILD_VERSION(snd_func_card_inum, SND_CONFIG_DLSYM_VERSION_EVALUATE);
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Returns the driver identification for a card.
|
* \brief Returns the driver identification for a card.
|
||||||
* \param dst The function puts the handle to the result configuration node
|
* \param dst The function puts the handle to the result configuration node
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue