Ronald S. Bultje wrote:
> is it possible for me to get the cardnumber (and thereby the hw:N
> entry) for a given non-hw device (e.g. dspN, hw:N,M, dmix, ...)?

Try something like this:

/* Get the slave pcm of a pcm node.  Caller must free the result. */
static snd_config_t *get_pcm_slave_pcm(snd_config_t *pcm)
{
        snd_config_t *slave;
        snd_config_t *result = NULL;
        int free_slave = 0;
        const char *str;

        if (snd_config_search(pcm, "slave", &slave) < 0)
                goto _exit;
        if (snd_config_get_string(slave, &str) >= 0) {
                if (snd_config_search_definition(snd_config, "pcm_slave", str, &slave) 
< 0)
                        goto _exit;
                free_slave = 1;
        }
        if (snd_config_get_type(slave) != SND_CONFIG_TYPE_COMPOUND)
                goto _exit;

        if (snd_config_search(slave, "pcm", &pcm) < 0)
                goto _exit;
        if (snd_config_get_string(pcm, &str) >= 0) {
                if (snd_config_search_definition(snd_config, "pcm", str, &pcm) >= 0)
                        result = pcm;
        } else {
                /* always make a dynamic copy, because the caller frees it */
                if (snd_config_copy(&pcm, pcm) >= 0)
                        result = pcm;
        }
_exit:
        if (free_slave)
                snd_config_delete(slave);
        return result;
}

/* Get the card number from a pcm node.  Searches recursively. */
static int get_pcm_card(snd_config_t *pcm)
{
        snd_config_t *slave_pcm;
        snd_config_t *card_node;
        long card;

        if (snd_config_get_type(pcm) != SND_CONFIG_TYPE_COMPOUND)
                return -1;
        slave_pcm = get_pcm_slave_pcm(pcm);
        if (slave_pcm) {
                card = get_pcm_card(slave_pcm);
                snd_config_delete(slave_pcm);
                return card;
        } else if (snd_config_search(pcm, "card", &card_node) >= 0) {
                const char *str;
                if (snd_config_get_integer(card_node, &card) >= 0)
                        return card;
                if (snd_config_get_string(card_node, &str) >= 0)
                        return snd_card_get_index(str);
        }
        return -1;
}

/* Get the card number from a pcm device name. */
static int get_named_pcm_card(const char *pcm_name)
{
        snd_config_t *pcm;
        int card;

        if (snd_config_update() < 0)
                return -1;

        if (snd_config_search_definition(snd_config, "pcm", pcm_name, &pcm) < 0)
                return -1;
        card = get_pcm_card(pcm);
        snd_config_delete(pcm);
        return card;
}


/* ... */
card = get_named_pcm_card(pcm_name);
if (card >= 0)
        sprintf(ctl_name, "hw:CARD=%d", card);
else
        /* unknown card */


HTH
Clemens




-------------------------------------------------------
This SF.Net email is sponsored by: SourceForge.net Broadband
Sign-up now for SourceForge Broadband and get the fastest
6.0/768 connection for only $19.95/mo for the first 3 months!
http://ads.osdn.com/?ad_id=2562&alloc_id=6184&op=click
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to