Bungkam suara di Headphone cabut?

10

Apakah ada cara mematikan suara dari komputer saya setiap kali saya mencabut headphone saya (Seperti halnya telepon) untuk menghentikan suara kemudian memutar keluar dari speaker saya?

Dandyman
sumber
1
Tautan Terkait: unix.stackexchange.com/questions/25776/…
con-f-use
Saya mengirim jawaban tanpa menggunakan loop tak terbatas di sini - askubuntu.com/a/1005144/470017
Al.G.

Jawaban:

10

Bagaimana mendeteksi cabut

Pada dasarnya apa yang berhasil untuk saya adalah:

# 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

Bagi saya perbedaannya ada di 'Node 0x16' di bawah '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]

Jadi saya mendasarkan deteksi pada perbedaan yang ditemukan.

Bagaimana bisu

Dengan pengetahuan ini, Anda dapat menjalankan skrip di latar belakang. Jika dicabut, skrip akan membisukan pengeras suara Anda seperti menggunakan amixer sset Master playback 0%(atau perintah lainnya).

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

Anda dapat membuatnya dapat dieksekusi chmod +x scriptname.shdan memasukkannya ke dalam aplikasi startup. Anda harus menyesuaikan deteksi cabut dengan menemukan perbedaan Anda sendiri /proc/asound/card0/codec#0(bahkan mungkin mengubah angka di sini untuk beberapa kartu suara.

Tautan yang berhubungan:

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

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

Bagaimana cara mengubah level volume secara otomatis saat melepas headphone?

membingungkan
sumber
Ini berfungsi dengan baik pada Mint 17.3. Terima kasih!
Briscoooe
4
Memiliki skrip dengan whileloop tak terbatas (bahkan tanpa instruksi tidur sedikit) berjalan terus menerus di latar belakang jauh dari solusi yang ideal; ini adalah solusi yang jelek dan hacky, selain menjadi cpu dan pembunuh baterai. Saya mencobanya dan beralih dari situasi normal pemanfaatan cpu konstan 5% (dengan browser, spotify, terminal, IDE, Telegram, dan aplikasi lain terbuka) menjadi 45% penggunaan cpu konstan.
LeartS
Solusi ini adalah warga negara yang sangat buruk, seperti yang ditunjukkan oleh @LearlS. Tolong jangan pernah melakukan ini. Untuk solusi warga negara yang baik, gunakan acpi_listen, seperti yang disarankan dalam salah satu tautan dalam jawaban ini.
Don Hatch
0

Untuk ubuntu-16.10 saya membuat sedikit perubahan dalam jawaban ini .

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
sumber
Baik jawaban ini maupun jawaban asalnya adalah warga negara yang buruk. Mereka tampaknya bekerja, tetapi mereka memiliki sumber daya sistem yang tidak skala - menjalankan beberapa program seperti ini pada saat yang sama, dan itu merusak sistem. Tolong jangan pernah melakukan ini. Anda dapat menggunakan salah satu solusi yang melibatkan acpi_listen atau yang serupa.
Don Hatch
0

Jika Anda memiliki masalah dengan peristiwa menarik /etc/acpi/handler.shlihat jawaban saya . Itu juga tanpa kode perangkat sebagai Node 0x16.

Kuzeyeu Siarhei
sumber