我想使用c程序实现扬声器和耳机的静音(静音/取消静音和调高/调低)。使用此链接https://askubuntu.com/questions/371970/how-to-switch-between-headphones-and-speakers-manually-from-command-line中所示的amixer命令行实用程序可以正常工作,同样,我需要使用C程序实现。

因此,我尝试了以下几种方法。
我看过这个例子来控制Master的音量
Set ALSA master volume from C code

以及静音/取消静音
Linux ALSA/Sound-API Questions - How do you mute?

两种解决方案都非常适合主配置。
但是在我的情况下,我想为扬声器和耳机实现相同的功能。因此,如果我用amixer命令将selem_name替换为Speaker或Headphone + L0而不是“Master”,则会引发错误。

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

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

是否给定selem_name无效?
如果是这样,如何列出扬声器和耳机的有效selem_name?
我使用了它从amixer命令行实用程序中得出的结果。

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

Errorr eturn by test.c program:

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

//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);
}

有什么解决方案可以使特定设备(扬声器和耳机)静音/取消静音?感谢所有帮助。

最佳答案

同样,对于您使用的控件名称,elem变量似乎为NULL。

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

关于c - 如何使用Alsa库API与耳机和扬声器配合使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55841069/

10-12 12:54
查看更多