耳机拔出时静音吗?


10

每次拔下耳机时(就像电话一样),是否可以从计算机中使声音静音,以停止声音然后在扬声器中播放?




我在这里不使用无限循环就发布了答案-askubuntu.com/a/1005144/470017
Al.G.

Answers:


10

如何检测拔出

基本上对我有用的是:

# When plugged in:
cat /proc/asound/card0/codec#0 > pluggedin.txt

# When not plugged in:
cat /proc/asound/card0/codec#0 > notplugged.txt

# Then compare the differences
diff pluggedin.txt notplugged.txt

对我来说,区别在于“ Amp-Out vals”下的“ Node 0x16”:

Node 0x16 [Pin Complex] wcaps 0x40058d: Stereo Amp-Out             Node 0x16 [PinComplex] wcaps 0x40058d: Stereo Amp-Out
  Amp-Out caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1         Amp-Out caps:ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
  Amp-Out vals:  [0x80 0x80]                                    |    Amp-Out vals:  [0x00 0x00]

因此,我根据发现的差异进行检测。

如何静音

有了这些知识,您就可以在后台运行脚本了。如果将其拔出,脚本将使扬声器静音,就像使用一样amixer sset Master playback 0%(或其他任何命令)。

#!/bin/bash
# This scripts detecs unplugging headphones.

oldstatus="unrelated string"
while [ 1 ]; do
    # The following line has to be changed depending on the difference (use diff) in '/proc/asound/card0/code#0'
    status=$(grep -A 4 'Node 0x16' '/proc/asound/card0/codec#0' |  grep 'Amp-Out vals:  \[0x80 0x80\]')
    if [ "$status" != "$oldstatus" ]; then
        if [ -n "$status" ]; then
            echo "Plugged in"
             amixer sset Master playback 80% # Set volume to 80%
            oldstatus="$status"
        else
            echo "Unplugged"
            amixer sset Master playback 0%  # Mute
            oldstatus="$status"
        fi
    fi
done

您可以使其可执行chmod +x scriptname.sh并放入启动应用程序。您必须通过找到自己的差异来调整拔出检测/proc/asound/card0/codec#0(甚至可以更改多个声卡的数字)。

相关链接:

https://wiki.ubuntu.com/Audio/PreciseJackDetectionTesting

/unix/25776/detecting-headphone-connection-disconnection-in-linux

拔/插耳机时如何自动改变音量?


这在Mint 17.3上完美工作。谢谢!
Briscoooe 2015年

4
while后台连续运行具有无限循环(甚至没有一点睡眠指令)的脚本远不是理想的解决方案。除了成为CPU和电池杀手之外,这也是一个丑陋且棘手的解决方法。我尝试了一下,然后从cpu利用率恒定为5%(打开浏览器,spotify,终端,IDE,Telegram和其他应用程序的正常情况)转变为cpu恒定利用率为45%。
LeartS

正如@LearlS指出的那样,该解决方案是一个非常糟糕的公民。请永远不要这样做。要获得良好的公民解决方案,请acpi_listen按照此答案中的链接之一中的建议使用。
唐·哈奇


0

对于ubuntu-16.10,我在此答案中所做的更改很少。

oldresult="Some Random String"

while [ 1 ]; do
        # incase of plugged out result will contain some data
        result=$(grep "EAPD 0x2: EAPD" /proc/asound/card0/codec#0)

        # checking for oldresult if not same then only go inside
        if [ "$oldresult" != "$result" ]; then
                oldresult=$result
                if [[ -z "$result" ]]; then
                        notify-send "Plugged In"
                        amixer sset Master playback 80% # Set volume to 80%
                 else
                        notify-send "Plugged Out"
                        amixer sset Master playback 0% # Set volume to 0%
                 fi
        fi
done

这个答案和它的答案都是坏公民。它们似乎可以工作,但是它们占用了无法扩展的系统资源-同时运行一些这样的程序,这会破坏系统。请永远不要这样做。您可以使用涉及acpi_listen或类似方法的解决方案之一。
唐·哈奇

0

如果您有与事件问题在追赶/etc/acpi/handler.sh看到我的答案。它也没有设备代码Node 0x16

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.