Вимкнути звук на роз'ємі для навушників?


10

Чи є можливість вимкнути звук з комп'ютера щоразу, коли я відключаю навушники (як це робить телефон), щоб зупинити звук і відтворювати звук зі своїх динаміків?


1
Посилання на посилання: unix.stackexchange.com/questions/25776/…
con-f-use


Я опублікував відповідь, не використовуючи тут нескінченних циклів - askubuntu.com/a/1005144/470017
Al.G.

Відповіді:


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

Для мене різниця полягала в "Node 0x16" у розділі "Amp-Out vals":

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

Як автоматично змінити рівень гучності під час відключення / підключення навушників?


Це чудово працює на Монетному дворі 17.3. Дякую!
Бріскуо

4
Створення сценарію з нескінченним whileциклом (навіть без невеликої інструкції сну), який постійно працює на задньому плані, далеко не ідеальне рішення; це некрасиве і хитре вирішення, окрім того, що він є вбивцею процесора та акумулятора. Я спробував це і перейшов від звичайної ситуації з постійним використанням 5% процесора (з відкритим браузером, Spotify, терміналом, IDE, Telegram та іншими програмами) до 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.