C 如何使用alsa库API处理耳机和扬声器?

C 如何使用alsa库API处理耳机和扬声器?,c,audio,alsa,libalsa,amixer,C,Audio,Alsa,Libalsa,Amixer,我想使用c程序为扬声器和耳机实现(静音/取消静音和音量增大/减小)。使用amixer命令行实用程序,如本链接所示,它可以工作,我需要使用c程序实现相同的功能 所以我尝试了不同的方法。 我看到了Master的音量控制示例 用于主控器静音/取消静音 这两种解决方案都适用于主配置。 但在我的例子中,我想为扬声器和耳机实现相同的功能。因此,如果我用扬声器或耳机+L0替换selem_名称(我使用amixer命令发现它会抛出错误),而不是“Master” 这里我需要静音/取消静音“扬声器”或“耳机” 如

我想使用c程序为扬声器和耳机实现(静音/取消静音和音量增大/减小)。使用amixer命令行实用程序,如本链接所示,它可以工作,我需要使用c程序实现相同的功能

所以我尝试了不同的方法。 我看到了Master的音量控制示例

用于主控器静音/取消静音

这两种解决方案都适用于主配置。 但在我的例子中,我想为扬声器和耳机实现相同的功能。因此,如果我用扬声器或耳机+L0替换selem_名称(我使用amixer命令发现它会抛出错误),而不是“Master”

这里我需要静音/取消静音“扬声器”或“耳机”

如果我在下面的代码中使用*selem_name=“Speaker”或“heephone”,则会引发如下所示的错误:

给定的selem_名称是否无效? 如果是,我如何列出扬声器和耳机的有效selem_名称? 我使用它的一个是从amixer命令行实用程序中找到的

我必须为扬声器和耳机使用什么API

Errorr eturn by test.c program:

alsa: simple.c:346: snd_mixer_selem_has_playback_switch: Assertion 
`elem' failed.
Aborted

是否有任何特定设备(扬声器和耳机)静音/取消静音的解决方案?感谢所有帮助。

同样,您使用的控件名称的elem变量似乎为空


您应该检查混合器连接的控制ID(名称、索引、接口)和控制设备。“默认”设备名称通常重定向到脉冲音频(仅主/PCM控制)。如果将“-c 0”用于amixer,则正确的设备名称为“hw:0”(const char*card=“hw:0”)。

哪一行是简单的。c:346?返回错误消息。它显示了alsa库函数snd_mixer_selem_在alsa librray文件simple中有_playback_switch()。c给出了错误。此代码缺少错误处理。对于任何返回错误代码的函数,您都必须检查它。是的。但这只是一个示例代码。它不能解决我关于静音/取消静音耳机和扬声器的问题@CLI不认为这个问题值得解决-它是关于编程(libalsa)。

//test.c

#include<stdio.h>
#include<alsa/asoundlib.h>

void SetAlsaSpeakerMute()
{
    snd_mixer_t *handle;
    snd_mixer_selem_id_t *sid;
    const char *card = "default";

    const char *selem_name = "Speaker";

    snd_mixer_open(&handle, 0);
    snd_mixer_attach(handle, card);
    snd_mixer_selem_register(handle, NULL, NULL);
    snd_mixer_load(handle);

    snd_mixer_selem_id_alloca(&sid);
    snd_mixer_selem_id_set_index(sid, 0);
    snd_mixer_selem_id_set_name(sid, selem_name);
    snd_mixer_elem_t* elem = snd_mixer_find_selem(handle, sid);

    if (snd_mixer_selem_has_playback_switch(elem)) {
        snd_mixer_selem_set_playback_switch_all(elem, 0);
    }

    snd_mixer_close(handle);
}

int main()
{
    SetAlsaSpeakerMute();
    return 0;
}
//For const char *selem_name = "Master" this program works fine.
//This can mute Mixer of default sound card

void SetAlsaMasterMute()
{
    snd_mixer_t *handle;
    snd_mixer_selem_id_t *sid;
    const char *card = "default";
    const char *selem_name = "Master";

    snd_mixer_open(&handle, 0);
    snd_mixer_attach(handle, card);
    snd_mixer_selem_register(handle, NULL, NULL);
    snd_mixer_load(handle);

    snd_mixer_selem_id_alloca(&sid);
    snd_mixer_selem_id_set_index(sid, 0);
    snd_mixer_selem_id_set_name(sid, selem_name);
    snd_mixer_elem_t* elem = snd_mixer_find_selem(handle, sid);

    if (snd_mixer_selem_has_playback_switch(elem)) {
        snd_mixer_selem_set_playback_switch_all(elem, 0);
    }

    snd_mixer_close(handle);
}