gpt4 book ai didi

alsa - 观察 ALSA/Pulseaudio 中的音量变化

转载 作者:IT王子 更新时间:2023-10-29 00:56:54 26 4
gpt4 key购买 nike

如何在默认声卡上监听主 channel 的音量变化?我希望通过 dbus 或回调或其他方式收到音量已更改的通知。

我已经尝试查看 ALSA 和 PulseAudio API,它们似乎只允许您设置和获取音量,但不能收听音量变化。

任何编程语言都可以。

最佳答案

编辑:在第二个示例中,当音量低于 5% 或高于 100% 时,不会为我生成事件。据我所知,第一个示例运行完美。

pactl subscribe 将在音量变化时打印出有关接收器的数据。我现在正在做的是将输出通过管道传输到一个将运行脚本的小型 C 程序。

运行.sh:

pactl subscribe | grep --line-buffered "sink" | ./prog

或特定的水槽,例如3:

pactl subscribe | grep --line-buffered "sink #3" | ./prog

程序.c:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[]){
while(1){
while(getchar() != '\n');
system("./volume_notify.sh");
}
}

当水槽的体积改变时,pactl 会打印一行,这会导致程序运行脚本。

-或-

这是一个基于 amixer monitor 的示例,如 CL 所引用。每次音量变化时 while 循环都会迭代,因此请将您的回调放在那里。

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

#define MAX_CARDS 256

int monitor_native(char const *name);
int open_ctl(const char *name, snd_ctl_t **ctlp);
void close_all(snd_ctl_t* ctls[], int ncards);

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

const char *ctl_name = "hw:0";

while(monitor_native(ctl_name) == 1){
//volume has been changed, do something
system("~/.volume_notify.sh");
}

return 0;
}

int monitor_native(char const *name) {
snd_ctl_t *ctls[MAX_CARDS];
int ncards = 0;
int i, err = 0;

if (!name) {
int card = -1;
while (snd_card_next(&card) >= 0 && card >= 0) {
char cardname[16];
if (ncards >= MAX_CARDS) {
fprintf(stderr, "alsactl: too many cards\n");
close_all(ctls, ncards);
return -E2BIG;
}
sprintf(cardname, "hw:%d", card);
err = open_ctl(cardname, &ctls[ncards]);
if (err < 0) {
close_all(ctls, ncards);
return err;
}
ncards++;
}
} else {
err = open_ctl(name, &ctls[0]);
if (err < 0) {
close_all(ctls, ncards);
return err;
}
ncards++;
}

for (;ncards > 0;) {
pollfd* fds = new pollfd[ncards];

for (i = 0; i < ncards; i++) {
snd_ctl_poll_descriptors(ctls[i], &fds[i], 1);
}

err = poll(fds, ncards, -1);
if (err <= 0) {
err = 0;
break;
}

for (i = 0; i < ncards; i++) {
unsigned short revents;
snd_ctl_poll_descriptors_revents(ctls[i], &fds[i], 1, &revents);
if (revents & POLLIN) {
snd_ctl_event_t *event;
snd_ctl_event_alloca(&event);

if (snd_ctl_read(ctls[i], event) < 0) {
continue;
}
if (snd_ctl_event_get_type(event) != SND_CTL_EVENT_ELEM) {
continue;
}

unsigned int mask = snd_ctl_event_elem_get_mask(event);
if (mask & SND_CTL_EVENT_MASK_VALUE) {
close_all(ctls, ncards);
return 1;
}
}
}
}

close_all(ctls, ncards);
return 0;
}

int open_ctl(const char *name, snd_ctl_t **ctlp) {
snd_ctl_t *ctl;
int err;

err = snd_ctl_open(&ctl, name, SND_CTL_READONLY);
if (err < 0) {
fprintf(stderr, "Cannot open ctl %s\n", name);
return err;
}
err = snd_ctl_subscribe_events(ctl, 1);
if (err < 0) {
fprintf(stderr, "Cannot open subscribe events to ctl %s\n", name);
snd_ctl_close(ctl);
return err;
}
*ctlp = ctl;
return 0;
}

void close_all(snd_ctl_t* ctls[], int ncards) {
for (ncards -= 1; ncards >= 0; --ncards) {
snd_ctl_close(ctls[ncards]);
}
}

关于alsa - 观察 ALSA/Pulseaudio 中的音量变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34936783/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com