헤드폰을 분리 / 연결할 때 볼륨 레벨을 자동으로 변경하는 방법은 무엇입니까? 실패했습니다 .inotifywait 다른 방법이 있습니까 (PulseAudio를 통해)? 오디오 장치

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

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

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

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

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

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


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

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

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



답변

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

믹서 셋 마스터 재생 0 %

레벨을 0 %로 설정합니다

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


답변

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 (및 기타 여러 모델)과 함께 작동합니다.


답변

Ear Candy 에는 헤드폰 삽입 / 제거를 처리하는 기능이 있습니다.


답변

코딩 경험이 어느 정도인지 모르겠지만 언급 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나를위한 것이지만 시스템에있는 것을 찾으려면 몇 가지를 시도해야 할 수도 있습니다. 해당 장치에 대한 읽기 권한이 필요합니다. 프로그램은 종료하기 전에 장치 이름과 첫 번째 이벤트의 유형, 코드 및 값을 인쇄합니다.


답변

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

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


답변

당신이 할 경우

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

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


답변

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