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


36

내가 원하는 것은 다음과 같습니다.

  • 헤드폰을 꽂을 때 사운드가 음소거 해제되고 특정 음량 레벨로 설정되기를 원합니다.
  • 헤드폰을 뽑을 때 소리가 나지 않게 (또는 특정 볼륨 레벨로 설정) 싶습니다.

볼륨 레벨을 설정하는 것은 문제가되지 않지만 헤드폰을 연결 해제 / 연결할 때 어떻게해야하므로 이러한 이벤트에 대한 알림을받는 방법을 찾고 있습니다.

/proc/asound/card0/codec#0헤드폰이 연결되어 있는지 여부를 신속하게 확인 했으므로이를 사용하여 모니터링하고 수정 된 알림을 inotifywait기반으로 볼륨 레벨을 변경 하려고했습니다 . 불행히도 proc 은 일반적인 파일 시스템이 아니기 때문에 실패했습니다 .inotifywait

다른 방법이 있습니까 (PulseAudio를 통해)?

오디오 장치 : Intel HDA , 오디오 코덱 : Conexant CX20585 .


지금까지 시도한 내용을 요약하면 다음과 같습니다.

  • Ear Candy : 시스템에서 전혀 실행되지 않았습니다. 버려진 프로젝트 인 것 같습니까?
  • Karl Bielefeldt 가 게시 한 코드는 일부 하드웨어에서 작동하지만 내 하드웨어에서는 작동하지 않을 수 있습니다.
  • '스피커'채널이 없기 때문에 StephenPaulger 의 아이디어는 실패합니다.
  • aking1012에서 동기를 얻었 습니다. (코덱의 잭 감지 코드를 찾은 후) 커널 코드를 해킹하여 작동 시켰지만 다소 번거로운 솔루션입니다.

그래서 나는 여전히 이것을 할 수있는 쉬운 방법을 찾고 있습니다.


훌륭한 질문입니다, 나도 이것을하고 싶습니다!
Stephen Paulger

nice ...하지만 플러그 / 언 플러그에서 원하는 "인스턴트"응답에 alsa 패치가 필요할 것입니다. 그렇지 않으면 작동하거나 작동하는 것처럼 보이지만 부하 또는 기타 조건에서는 응답이 지연 될 수 있습니다. 플러그 이벤트와 출력 토글 사이에 들어가야한다고 생각하십시오. 아마도 가능하지만 sooooo은 alsa 개발자가 트렁크에 최선을 다하겠다고 말하지 않는 한 개별 패치 기준으로 가치가 없습니다.
RobotHumans

한 가지 방법은 gdb에 모듈을로드하고 "정상적인"사운드 이벤트가 중지 될 때까지 기다린 다음, 녹음 옵션을 사용하고, 헤드 폰을 꽂았다가 뽑고, 디버그 녹음에서 발생한 것을 확인하는 것입니다.
RobotHumans

얼마나 지연이 편안합니까?
RobotHumans

답변:


3

콘솔에서 볼륨 레벨을 설정하려면 amixer 명령을 사용하십시오. 예를 들면 다음과 같습니다.

믹서 셋 마스터 재생 0 %

레벨을 0 %로 설정합니다

헤드폰을 꽂을 때 이것을 바꾸는 방법을 모르겠지만 ... 어쩌면 누군가가 당신을 도울 수 있습니다.


3

Oneiric 용 UDS 중에 잭 감지에 대한 세션이있었습니다. 자세한 내용 은 청사진 을 참조하십시오. 이것은 내가 원하는 것을 정확하게 할 것입니다 : 모든 하드웨어가 아닌 다른 장치마다 다른 볼륨 레벨 :

<htorque> 궁금한 점 : 곧 다른 기기 (예 : 내부 사운드 음소거, 헤드폰 75 %)에 대해 다른 볼륨 레벨을 가질 수 있습니까?

<coling> 이것은 (일부 시간에) 지원됩니다.
타임 스케일 은 " 투명 "합니다 : p <coling> (잭을 꽂거나 뽑을 때 OSD가 현재 볼륨으로 표시 될 것으로 예상합니다)

11.10 업데이트

이것은 현재 Oneiric에서 작동 해야합니다. 불행히도 ThinkPad T510은 현재 지원되지 않는 시스템 중 하나 인 것 같습니다.

David Henningsson의 또 다른 후속 조치 :

간단히 말해서, 그것은 바람직한 기능이며, 우리는 그 방향으로 움직이고 있지만 기능이 언뜻보기보다 복잡하기 때문에 천천히 진행합니다.

다가오는 Ubuntu Oneiric (11.10)에서는 실제로 작동합니다. 나쁜 소식은 모든 사람에게 효과가 없다는 것입니다.

여기 더 .

12.04 업데이트

Ubuntu 12.04 (개발 버전)에서 ThinkPad T510 (및 기타 여러 모델)과 함께 작동합니다.


현재 지원되는 하드웨어 또는 그 영향을 추적하는 것이 있습니까?
Mu Mind


2

코딩 경험이 어느 정도인지 모르겠지만 언급 inotifywait했으므로 적어도 쉘 스크립팅에 익숙하다고 가정합니다. 이 기사를 기반으로 한 다음 C 프로그램 은 헤드폰의 플러그가 연결되어 있거나 분리되어 있지 않은 것을 감지 한 후 원하는 조치를 수행 할 수 있습니다.

#include <linux/input.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>

int main(int argc, char* argv[])
{
    int fd = -1;
    char name[256]= "Unknown";
    struct input_event event;

    if ((fd = open(argv[1], O_RDONLY)) < 0) {
        perror("evdev open");
        exit(1);
    }

    if(ioctl(fd, EVIOCGNAME(sizeof(name)), name) < 0) {
        perror("evdev ioctl");
    }

    printf("The device on %s says its name is %s\n",
            argv[1], name);

    read(fd, &event, sizeof(struct input_event));
    printf("Event type is %d\n", event.type);
    printf("Event code is %d\n", event.code);
    printf("Event value is %d\n", event.value);

    close(fd);
    return 0;
}

프로그램은 하나의 인수를 취하는데, 이는 헤드폰의 입력 이벤트 장치에 대한 경로 여야합니다. 이것은 /dev/input/event7나를위한 것이지만 시스템에있는 것을 찾으려면 몇 가지를 시도해야 할 수도 있습니다. 해당 장치에 대한 읽기 권한이 필요합니다. 프로그램은 종료하기 전에 장치 이름과 첫 번째 이벤트의 유형, 코드 및 값을 인쇄합니다.


불행히도 이벤트 * 중 어느 것도 내 헤드폰에 연결되지 않은 것으로 나타났습니다. 어쨌든 +1-다른 사용자에게 도움이 될 수 있습니다.
htorque

+1, 저에게 효과적 event.value이며 실제로 전환됩니다 ...하지만 값이 변경 read 때만 작업이 반환 됩니다 ... 어쩌면 차단하지 않는 방법을 알고 있습니까? 어쨌든 고마워!
케빈

O_NONBLOCK장치를 열 때 추가 하고의 반환 값을 확인하십시오 read. 음수이면 읽기가 차단되었거나 다른 오류가 발생한 것입니다. 이 프로그램을 더 큰 프로그램에 통합하는 경우 폴링없이 더 복잡한 다른 방법이 있습니다.
Karl Bielefeldt

1

dmesg 및 기타 로그 파일을 확인하십시오. 아마도 플러그 인 / 아웃은 특정 메시지를 발생시킵니다.

그런 다음 디먼을 사용하여 해당 로그 파일을 구문 분석하고 이벤트를 감지 할 수 있습니다. 나는 당신 이이 시점에서해야 할 일을 알고 있다고 생각합니다 :)


1

당신이 할 경우

amixer sset 'Speaker' playback 0%

스피커 볼륨이 소거되지만 헤드폰은 계속 작동합니다. 헤드폰을 분리하면 소리가 나지 않습니다. 거의 당신이 원하는 것입니다 ...

그러나 ...

볼륨 조절을 변경하면 '스피커'볼륨 설정이 다시 설정됩니다. 이는 pulseaudio가 볼륨을 설정하여 영리하려고하기 때문입니다 (자세한 내용은 http://pulseaudio.org/wiki/PulseAudioStoleMyVolumes 참조 ). 그래도 볼륨이 엉망이되는 것을 막을 수 있습니다.

/etc/pulse/default.pa를여십시오.

그리고 줄을 찾으십시오

load-module module-udev-detect

로 변경

load-module module-udev-detect ignore_dB=1

pulseaudio를 다시 시작하십시오.

killall pulseaudio

이제 스피커 볼륨을 소거해도 마스터 볼륨을 변경해도 영향을 미치지 않습니다. 따라서 헤드폰은 작동하지만 스피커는 소리가 나지 않습니다.


다른 접근 방식이지만 불행히도 스피커 볼륨 채널이 없으며 마스터 및 PCM 만 있습니다.
htorque

1

변경 사항은 ACPID 소켓을 확인하십시오. 파이썬 또는 C 또는 쉘 스크립트 ( 이어폰 플러그인 재생 및 리듬 박스에서 일시 중지를 제어하는 Python 코드) 를 사용하여 수행 할 수 있습니다 . 이어폰 플러그인 및 이어폰 플러그 아웃을 감지하기 위해 ACPID 전압의 변화를 확인하십시오. 그래도 몇 초 지연 될 수 있습니다.



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