헤드폰에서 소리가 나지 않습니까?


10

헤드폰을 뽑을 때마다 (휴대폰처럼) 사운드를 멈춘 다음 스피커에서 재생할 때마다 컴퓨터에서 사운드를 끄는 방법이 있습니까?




무한 루프를 사용하지 않고 답변을 게시했습니다 -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

나에게 차이점은 '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

헤드폰을 분리 / 연결할 때 볼륨 레벨을 자동으로 변경하는 방법은 무엇입니까?


이것은 민트 17.3에서 완벽하게 작동합니다. 감사!
Briscoooe

4
while백그라운드에서 연속적으로 실행 되는 무한 루프 (작은 수면 명령없이)가 있는 스크립트를 갖는 것은 이상적인 솔루션과는 거리가 멀다. CPU 및 배터리 킬러뿐만 아니라 추악하고 해킹 된 해결 방법입니다. 나는 그것을 시도하고 일정한 5 % CPU 사용률 (브라우저, spotify, 터미널, IDE, Telegram 및 기타 응용 프로그램이 열린 상태)에서 45 % 일정한 CPU 사용으로 정상 상태에서 갔다.
LeartS

@LearlS가 지적 했듯이이 솔루션은 끔찍한 나쁜 시민입니다. 제발 이러지마 시민권이 좋은 솔루션의 acpi_listen경우이 답변의 링크 중 하나에서 제안 된대로을 사용 하십시오.
Don Hatch


0

우분투 -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 또는 이와 유사한 솔루션 중 하나를 사용할 수 있습니다.
Don Hatch

0

당신이 이벤트를 잡기에 문제가 있다면 /etc/acpi/handler.sh대답 을 참조하십시오 . 또한 장치 코드 가 없습니다 Node 0x16.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.