Làm cách nào để tự động thay đổi mức âm lượng khi hủy / cắm tai nghe?


36

Những gì tôi muốn là như sau:

  • Khi tôi cắm tai nghe, tôi muốn âm thanh không bị tắt và được đặt ở mức âm lượng cụ thể.
  • Khi tôi rút tai nghe ra, tôi muốn âm thanh bị tắt (hoặc được đặt ở mức âm lượng cụ thể).

Đặt mức âm lượng không phải là vấn đề, nhưng bằng cách nào đó tôi cần phải làm điều này khi hủy / cắm tai nghe, vì vậy tôi đang tìm cách để được thông báo về những sự kiện đó.

Tôi nhanh chóng tìm thấy /proc/asound/card0/codec#0để cho biết tai nghe có được cắm hay không, vì vậy tôi đã cố gắng theo dõi nó bằng cách sử dụng inotifywaitvà thay đổi mức âm lượng dựa trên thông báo đã sửa đổi . Thật không may inotifywaitthất bại vì Proc không phải là một hệ thống tập tin thông thường.

Có những cách khác để làm điều này (có thể thông qua PulseAudio)?

Thiết bị âm thanh: Intel HDA , codec âm thanh: Conexant CX20585 .


Để tóm tắt những gì tôi đã cố gắng cho đến nay:

  • Ear Candy: hoàn toàn không chạy trên hệ thống của tôi. Có vẻ là một dự án bị bỏ rơi?
  • Mã được đăng bởi Karl Bielefeldt có thể hoạt động trên một số phần cứng, nó không thuộc về tôi.
  • Ý tưởng từ StephenPaulger thất bại do thiếu kênh 'Loa'.
  • Được thúc đẩy bởi aking1012 Tôi đã làm cho nó hoạt động bằng cách hack xung quanh mã hạt nhân (sau khi tìm thấy mã cảm biến jack của codec), nhưng đó là một giải pháp khá cồng kềnh.

Vì vậy, tôi vẫn đang tìm kiếm một cách dễ dàng để làm điều này.


Câu hỏi tuyệt vời, tôi cũng muốn làm điều này!
Stephen Paulger

tốt ... nhưng tôi nghĩ rằng một bản vá cho alsa sẽ là cần thiết cho phản ứng "tức thời" mong muốn trên phích cắm / rút phích cắm. nếu không, nó sẽ hoạt động hoặc có vẻ hoạt động, nhưng trong điều kiện tải hoặc các điều kiện khác, phản hồi có thể bị trễ. nghĩ rằng bạn phải nhận được giữa sự kiện cắm và chuyển đổi đầu ra. có thể có thể, nhưng vì vậy không có giá trị cơ sở vá cá nhân trừ khi một nhà phát triển alsa nói rằng nó sẽ được cam kết với thân cây.
RobotHumans

Một cách tiếp cận là tải mô-đun lên trong gdb, đợi cho các sự kiện âm thanh "bình thường" dừng lại, sử dụng tùy chọn ghi âm, cắm và rút phích cắm điện thoại đầu và xem điều gì đã xảy ra trong bản ghi gỡ lỗi.
RobotHumans

bạn cảm thấy thoải mái bao nhiêu
RobotHumans

Câu trả lời:


3

Để đặt mức âm lượng từ bàn điều khiển, hãy sử dụng bộ trộn lệnh. Ví dụ:

amixer sset Master phát lại 0%

Sẽ đặt cấp độ của bạn thành 0%

Tôi không biết cách thay đổi điều này khi bạn cắm tai nghe ... nhưng có lẽ ai đó có thể giúp bạn với điều đó


3

Trong UDS cho Oneiric đã có một phiên về phát hiện jack. Xem bản thiết kế để biết chi tiết. Có vẻ như điều này sẽ thực hiện chính xác những gì tôi đang tìm kiếm: các mức âm lượng khác nhau cho các thiết bị khác nhau - không chỉ trên mọi phần cứng:

<htorque> một điều tôi tò mò: liệu tôi có thể có các mức âm lượng khác nhau cho các thiết bị khác nhau không (ví dụ: âm thanh bên trong bị tắt tiếng, tai nghe 75%) sớm?

<coling> điều này sẽ được hỗ trợ (trên một số h / w) có. Thời gian là "sớm": p
<coling> (Tôi cũng mong muốn OSD sẽ được hiển thị (với âm lượng hiện tại) khi cắm / rút phích cắm)

Cập nhật cho 11.10

Điều này bây giờ sẽ hoạt động trong Oneiric - thật không may, ThinkPad T510 của tôi dường như là một trong những hệ thống hiện không được hỗ trợ.

Một phần tiếp theo của David Henningsson:

Tóm lại, đó là một tính năng đáng mong đợi và chúng ta đang đi theo hướng đó, nhưng dần dần, vì tính năng này phức tạp hơn so với cái nhìn đầu tiên.

Tin tốt: trong Ubuntu Oneiric sắp tới (11.10), điều này thực sự đang hoạt động. Tin xấu: nó không hoạt động cho tất cả mọi người.

Thêm ở đây .

Cập nhật ngày 12.04

Hiện tại nó đang hoạt động với ThinkPad T510 (và nhiều model khác) trong Ubuntu 12.04 (phiên bản phát triển).


Có bất cứ điều gì theo dõi phần cứng nào hiện đang được hỗ trợ, hoặc một cái gì đó để có hiệu lực đó?
Mu Tâm

2

Ear Candy có một số chức năng để xử lý việc chèn / loại bỏ tai nghe.


1
Có vẻ như điều này chỉ dành cho tai nghe USB ... có đúng không?
Mu Mind

2

Tôi không biết bạn có bao nhiêu kinh nghiệm mã hóa, nhưng bạn đã đề cập inotifywaitvì vậy tôi sẽ cho rằng bạn ít nhất cảm thấy thoải mái với kịch bản shell. Chương trình C sau đây, dựa trên bài viết này , sẽ có thể phát hiện tai nghe của bạn được cắm hoặc rút phích cắm, sau đó bạn có thể thực hiện bất kỳ hành động nào bạn muốn.

#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;
}

Chương trình có một đối số, đó là một đường dẫn đến thiết bị sự kiện đầu vào cho tai nghe của bạn. Điều này là /dev/input/event7cho tôi, nhưng bạn có thể phải thử một vài cái để tìm nó trên hệ thống của bạn. Bạn sẽ cần quyền đọc trên thiết bị đó. Chương trình sẽ in tên của thiết bị và loại, mã và giá trị của sự kiện đầu tiên trước khi thoát.


Thật không may, không có sự kiện nào * hóa ra được kết nối với tai nghe của tôi. Dù sao, +1 - có thể nó giúp ích cho những người dùng khác.
htorque

+1, hoạt động với tôi, event.valuethực sự đã được chuyển đổi ... nhưng readhoạt động chỉ trả về khi giá trị thay đổi ... có lẽ bạn biết cách làm cho nó không bị chặn? dù sao cũng cảm ơn bạn!
Kevin

Bạn thêm O_NONBLOCKkhi bạn mở thiết bị và kiểm tra giá trị trả về của read. Nếu nó âm tính, thì đọc sẽ bị chặn hoặc một số lỗi khác xảy ra. Có nhiều cách khác phức tạp hơn để làm điều đó mà không bỏ phiếu nếu bạn kết hợp điều này vào một chương trình lớn hơn.
Karl Bielefeldt

1

Kiểm tra dmesg và các tệp nhật ký khác. Có thể cắm vào / ra kích hoạt một số tin nhắn cụ thể.

Sau đó, bạn có thể sử dụng một daemon để phân tích tệp nhật ký đó và phát hiện các sự kiện. Tôi nghĩ bạn biết phải làm gì từ thời điểm này :)


1

Nếu bạn làm

amixer sset 'Speaker' playback 0%

âm lượng loa sẽ bị tắt nhưng tai nghe sẽ tiếp tục hoạt động. Rút tai nghe có nghĩa là không có âm thanh. Đó gần như là những gì bạn muốn ...

Tuy nhiên ...

Nếu bạn thay đổi điều khiển âm lượng, cài đặt âm lượng của 'Loa' sẽ được thiết lập lại. Điều này là do pulseaudio cố gắng khéo léo với cài đặt âm lượng (Xem http://pulseaudio.org/wiki/PulseAudioStoleMyVolume để biết thêm thông tin). Chúng tôi có thể ngăn chặn nó khỏi gây rối với khối lượng mặc dù.

Mở /etc/pulse/default.pa

và tìm dòng

load-module module-udev-detect

và thay đổi nó thành

load-module module-udev-detect ignore_dB=1

Khởi động lại pulseaudio.

killall pulseaudio

Bây giờ nếu bạn tắt âm lượng loa, việc thay đổi âm lượng chính sẽ không ảnh hưởng đến nó. Vì vậy, tai nghe sẽ hoạt động nhưng loa sẽ im lặng.


Sẽ là một cách tiếp cận khác, nhưng thật không may, tôi không có kênh âm lượng Loa, chỉ có Master và PCM.
htorque

1

Kiểm tra ổ cắm ACPID để biết các thay đổi, có thể được thực hiện với sự trợ giúp của python hoặc C hoặc shell script, ( mã Python để kiểm soát trình phát plugin tai nghe và tạm dừng trên nhịp điệu). Kiểm tra sự thay đổi điện áp ACPID để phát hiện plugin tai nghe và đầu cắm tai nghe. Một sự chậm trễ giây có thể được dự kiến ​​mặc dù.



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.