Отключить звук на наушниках отключить?

10

Есть ли способ отключения звука с моего компьютера каждый раз, когда я отсоединяю наушники (как это делает телефон), чтобы остановить звук, а затем воспроизводить его из динамиков?

Dandyman
источник
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

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

кон-е использование
источник
Это прекрасно работает на Mint 17.3. Спасибо!
Briscoooe
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.

Kuzeyeu Siarhei
источник