[alsa-devel] need some workarround or explanation.

Anders Gnistrup agn at datarespons.dk
Fri Nov 4 09:50:36 CET 2011


Hello

I have a USB headset, where when plugged in, a volume setting is set on playback and capture channels using the ctl interface for the device.
After the volume is set I open the capture interface. but I have i have a 2-3 sec. delay that i just don't understand.

I might need to use another solution, but these are difficult to find.
The Headset is a plantronics.

The code is listed below.

#include <alsa/asoundlib.h>

#define qDebug printf
void set_default_volume(const char *a_hw_dev, int a_percent)
{
    int err;
    snd_mixer_t *handle;
    snd_mixer_selem_id_t *sid;
    snd_mixer_elem_t *elem;
    snd_mixer_selem_id_alloca(&sid);

    if ((err = snd_mixer_open(&handle, 0)) < 0)
    {
        qDebug("Mixer open error: %s\n", snd_strerror(err));
        return;
    }
    if ((err = snd_mixer_attach(handle, a_hw_dev)) < 0)
    {
        qDebug("Mixer attach %s error: %s\n", a_hw_dev, snd_strerror(err));
        snd_mixer_close(handle);
        return;
    }
    if ((err = snd_mixer_selem_register(handle, NULL, NULL)) < 0)
    {
        qDebug("Mixer register error: %s\n", snd_strerror(err));
        snd_mixer_close(handle);
        return;
    }
    err = snd_mixer_load(handle);
    if (err < 0)
    {
        qDebug("Mixer %s load error: %s\n", a_hw_dev, snd_strerror(err));
        snd_mixer_close(handle);
        return;
    }
    for (elem = snd_mixer_first_elem(handle); elem; elem = snd_mixer_elem_next(elem))
    {
        snd_mixer_selem_get_id(elem, sid);
        qDebug("Simple mixer control '%s',%i\n", snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid));

        if (snd_mixer_selem_has_playback_switch(elem))
        {
            snd_mixer_selem_set_playback_switch_all(elem, 1); //unmute
        }

        if (snd_mixer_selem_has_playback_volume(elem))
        {
            long min, max;
            snd_mixer_selem_get_playback_volume_range(elem, &min, &max);
            qDebug(" pvolume %ld/%ld\n", min , max);
            snd_mixer_selem_set_playback_volume_all(elem, (a_percent * (max-min))/100);
        }

        if (snd_mixer_selem_has_capture_switch(elem))
        {
            snd_mixer_selem_set_capture_switch_all(elem, 1); // unmute all
        }
        if (snd_mixer_selem_has_capture_volume(elem))
        {
            long min, max;
            snd_mixer_selem_get_capture_volume_range(elem, &min, &max);
            qDebug(" pvolume %ld/%ld\n", min , max);
            snd_mixer_selem_set_capture_volume_all(elem,  (a_percent * (max-min))/100); //set capture volume for all
        }
    }
    snd_mixer_close(handle);
    return;
}

int main(int argc, char *argv[])
{
    snd_pcm_t *m_pcm_handle;

    int err,count;
    // Open connection to the PCM devic
    if ((err = snd_pcm_open(&m_pcm_handle, "plughw:1,0", SND_PCM_STREAM_CAPTURE, 0)) < 0)
    {
        for (count=0; count < 5 && err == -EBUSY; count++)
        {
            sleep(1);
            qDebug("AlsaStream:%d open error: %s (%d)\n ", __LINE__, snd_strerror(err), err);
            err = snd_pcm_open(&m_pcm_handle, "plughw:1,0", SND_PCM_STREAM_CAPTURE, 0);
        }

        if (err < 0)
        {
            qDebug("AlsaStream:%d open error: %s (%d)\n ", __LINE__, snd_strerror(err), err);
            return;
        }
        if (err>= 0)
        {
            printf("Success\n");
        }
    }
    set_default_volume("hw:1", 20);
    snd_pcm_close(m_pcm_handle);
    return 0;
}




More information about the Alsa-devel mailing list