如何使用 alsa 库 API 与耳机和扬声器一起使用?
How to use alsa library API to work with Headphone and Speaker?
我想使用 c program.Using amixer 命令行实用程序为扬声器和耳机实现(mute/unmute 和音量 up/down),如此 link https://askubuntu.com/questions/371970/how-to-switch-between-headphones-and-speakers-manually-from-command-line 它有效,我需要使用 C 程序实现相同的东西。
所以我尝试了不同的方法。
我看到了这个例子来控制 Master 的音量
Set ALSA master volume from C code
和 mute/unmute 的大师
Linux ALSA/Sound-API Questions - How do you mute?
两种解决方案都非常适合主配置。
但在我的例子中,如果我将 selem_name 替换为 Speaker 或 Headphone+L0,我想为扬声器和 headphone.So 而不是 "Master" 实现相同的功能我发现使用 amixer 命令会抛出错误。
这里我需要mute/unmute"Speaker"或者"Headphone".
如果我在下面的代码中使用 *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);
}
有没有针对mute/unmute特定设备(扬声器和耳机)的解决方案?大家帮忙谢谢。
同样,对于您正在使用的控件名称,elem 变量似乎为 NULL。
您应该检查混音器连接的控制ID(名称、索引、接口)和控制设备。 'default' 设备名称通常重定向到脉冲音频(仅限主控/PCM 控制)。如果您对 amixer 使用“-c 0”,则正确的设备名称是 'hw:0' (const char *card = "hw:0";).
我想使用 c program.Using amixer 命令行实用程序为扬声器和耳机实现(mute/unmute 和音量 up/down),如此 link https://askubuntu.com/questions/371970/how-to-switch-between-headphones-and-speakers-manually-from-command-line 它有效,我需要使用 C 程序实现相同的东西。
所以我尝试了不同的方法。 我看到了这个例子来控制 Master 的音量 Set ALSA master volume from C code
和 mute/unmute 的大师 Linux ALSA/Sound-API Questions - How do you mute?
两种解决方案都非常适合主配置。 但在我的例子中,如果我将 selem_name 替换为 Speaker 或 Headphone+L0,我想为扬声器和 headphone.So 而不是 "Master" 实现相同的功能我发现使用 amixer 命令会抛出错误。
这里我需要mute/unmute"Speaker"或者"Headphone".
如果我在下面的代码中使用 *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);
}
有没有针对mute/unmute特定设备(扬声器和耳机)的解决方案?大家帮忙谢谢。
同样,对于您正在使用的控件名称,elem 变量似乎为 NULL。
您应该检查混音器连接的控制ID(名称、索引、接口)和控制设备。 'default' 设备名称通常重定向到脉冲音频(仅限主控/PCM 控制)。如果您对 amixer 使用“-c 0”,则正确的设备名称是 'hw:0' (const char *card = "hw:0";).