当前位置: 首页>>技术教程>>正文


取消/插入耳机时如何自动更改音量?

, , ,

问题描述

我想要的是以下内容:

  • 当我插入耳机时,我希望声音为un-muted并设置为特定的音量级别。

  • 当我拔下耳机时,我希望声音被静音(或设置为特定的音量)。

设置音量不是问题所在,但是在取消/插入耳机时我需要这样做,所以我正在寻找一种方法来获得这些事件的通知。

我很快找到了/proc/asound/card0/codec#0来指示是否插入了耳机,所以我尝试使用inotifywait对其进行监控,并根据修改后的通知更改音量。不幸的是,inotifywait失败了,因为proc不是普通的文件系统。

还有其他方法可以做到这一点(可能通过PulseAudio)?

音频设备:Intel HDA,音频编解码器:Conexant CX20585


总结一下到目前为止我尝试过的事情:

  • Ear Candy:在我的系统上根本没有运行。似乎是一个废弃的项目?

  • Karl Bielefeldt发布的代码可能适用于某些硬件,但不适用于我的代码。

  • 由于缺少’Speaker’通道,StephenPaulger的想法失败了。

  • aking1012激发我通过在内核代码中查找(在找到编解码器的插孔感测代码之后)使其工作,但这是一个相当麻烦的解决方案。

所以,我仍然在寻找一种简单的方法来做到这一点。

最佳解决思路

要从控制台设置音量级别,请使用命令amixer。例如:

amixer sset Master playback 0%

将您的等级设为0%

当你插上耳机时,我不知道如何改变它…但也许有人可以帮助你

次佳解决思路

在UDS for Oneiric期间,有一个关于插孔检测的会话。有关详细信息,请参阅the blueprint。听起来这将完全符合我的要求:不同设备的不同音量级别 – 只是不在每个硬件上:

<htorque> something i’m curious about: will i be able to have different volume levels for different devices (eg., internal sound muted, headphones 75%) anytime soon?

<coling> this will be supported (on some h/w) yes. Timescales are “soonish” :p
<coling> (I’d also expect OSD to be shown (with current volume) when jacks are plugged/unplugged)

更新11.10

这应该是working in Oneiric – 遗憾的是我的ThinkPad T510似乎是目前不支持的系统之一。

David Henningsson的另一个follow-up:

Long story short, it’s a desirable feature, and we’re moving in that direction, but slowly, as the feature is more complex than it seems like at first glance.

The good news: in the upcoming Ubuntu Oneiric (11.10), this is actually working. The bad news: it isn’t working for everyone.

更多here

更新12.04

它现在在Ubuntu 12.04(开发版)中使用我的ThinkPad T510(以及许多其他型号)。

第三种解决思路

Ear Candy具有一些处理耳机插入/移除功能。

第四种思路

我不知道你有多少编码经验,但你提到了inotifywait所以我假设你至少对shell脚本感到满意。以下基于this article的C程序应该能够检测到插入或拔出的耳机,之后您可以执行任何您想要的操作。

#include <linux/input.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>

int main(int argc, char* argv[])
{
    int fd = -1;
    char name[256]= "Unknown";
    struct input_event event;

    if ((fd = open(argv[1], O_RDONLY)) < 0) {
        perror("evdev open");
        exit(1);
    }

    if(ioctl(fd, EVIOCGNAME(sizeof(name)), name) < 0) {
        perror("evdev ioctl");
    }

    printf("The device on %s says its name is %s\n",
            argv[1], name);

    read(fd, &event, sizeof(struct input_event));
    printf("Event type is %d\n", event.type);
    printf("Event code is %d\n", event.code);
    printf("Event value is %d\n", event.value);

    close(fd);
    return 0;
}

该程序采用一个参数,该参数应该是耳机输入事件设备的路径。这对我来说是/dev/input/event7,但您可能需要尝试一些来查找系统中的内容。您将需要该设备的读取权限。程序将在退出之前打印设备的名称,第一个事件的类型,代码和值。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1971.html,未经允许,请勿转载。