Wyciszyć dźwięk po odłączeniu słuchawek?

10

Czy istnieje sposób wyciszenia dźwięku z komputera za każdym razem, gdy odłączam słuchawki (tak jak robi to telefon), aby zatrzymać dźwięk i odtwarzać go z głośników?

Dandyman
źródło
1
Powiązany link: unix.stackexchange.com/questions/25776/…
con-f-use
Odpowiedziałem bez użycia nieskończonych pętli tutaj - askubuntu.com/a/1005144/470017
Al.G.

Odpowiedzi:

10

Jak wykryć odłączenie

Zasadniczo działało dla mnie:

# 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

Dla mnie różnica polegała na tym, że „Węzeł 0x16” w sekcji „Wzory wzmacniacza”:

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]

Oparłem więc wykrycie na znalezionej różnicy.

Howto mute

Dzięki tej wiedzy możesz mieć skrypt działający w tle. Po odłączeniu skrypty wyciszają głośniki, jak przy użyciu amixer sset Master playback 0%(lub dowolnego innego polecenia).

#!/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

Możesz chmod +x scriptname.shustawić go jako wykonywalny i umieścić w aplikacjach startowych. Trzeba będzie jednak dostosować wykrywanie odłączenia, znajdując własną różnicę w /proc/asound/card0/codec#0(może nawet zmienić tutaj liczby dla wielu kart dźwiękowych.

Powiązane linki:

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

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

Jak automatycznie zmienić poziom głośności podczas odłączania / podłączania słuchawek?

dezorientować
źródło
Działa to doskonale na Mint 17.3. Dzięki!
Briscoooe,
4
Posiadanie skryptu z nieskończoną whilepętlą (bez nawet małej instrukcji snu) działającego nieprzerwanie w tle nie jest idealnym rozwiązaniem; jest to brzydkie i pospolite obejście, oprócz bycia procesorem i zabójcą baterii. Próbowałem i przeszedłem z normalnej sytuacji stałego wykorzystania 5% procesora (z przeglądarką, spotify, terminalem, IDE, telegramem i innymi otwartymi aplikacjami) do 45% stałego użycia procesora.
LeartS
To rozwiązanie jest okropnie złym obywatelem, jak wskazuje @LearlS. Proszę, nigdy tego nie rób. Aby uzyskać rozwiązanie dla dobrego obywatela, użyj acpi_listen, jak sugerowano w jednym z łączy w tej odpowiedzi.
Don Hatch
0

W przypadku Ubuntu-16.10 dokonałem niewielkiej zmiany w tej odpowiedzi .

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
Abhishek
źródło
Zarówno ta odpowiedź, jak i odpowiedź, z której ona pochodzi, są złymi obywatelami. Wygląda na to, że działają, ale blokują zasoby systemowe, które nie skalują się - uruchom kilka podobnych programów jednocześnie, a to rujnuje system. Proszę, nigdy tego nie rób. Zamiast tego możesz użyć jednego z rozwiązań obejmujących acpi_listen lub podobny.
Don Hatch
0

Jeśli masz problemy z przechwytywaniem zdarzeń,/etc/acpi/handler.sh zobacz moją odpowiedź . Jest również bez kodów urządzeń jako Node 0x16.

Kuzeyeu Siarhei
źródło