Как автоматически изменить уровень громкости при отключении / подключении наушников?

36

Я хочу следующее:

  • Когда я подключаю наушники, я хочу, чтобы звук был отключен и был установлен на определенный уровень громкости.
  • Когда я отсоединяю наушники, я хочу, чтобы звук был отключен (или установлен на определенный уровень громкости).

Настройка уровней громкости не является проблемой, но мне как-то нужно это делать при отключении / подключении наушников, поэтому я ищу способ получить уведомление об этих событиях.

Я быстро нашел /proc/asound/card0/codec#0 , чтобы указать, подключены ли наушники или нет, поэтому я попытался контролировать его с помощью inotifywait и изменить уровень громкости на основе уведомлений modified . К сожалению, inotifywait не удалось, потому что proc не является обычной файловой системой.

Есть ли другие способы сделать это (возможно, через PulseAudio)?

Аудиоустройство: Intel HDA , аудиокодек: Conexant CX20585 .

Подводя итог тому, что я пробовал до сих пор:

  • Ear Candy: вообще не запускалась в моей системе. Кажется, это заброшенный проект?
  • Код, отправленный Карлом Билефельдом , может работать на некоторых аппаратных средствах, это не на моем.
  • Идея StephenPaulger не удается из-за отсутствия канала «Спикер».
  • Мотивировано aking1012 Я заработал его, взломав код ядра (после обнаружения кода обнаружения гнезда кодек), но это довольно громоздкое решение.

Итак, я все еще ищу легкий способ сделать это.     

задан htorque 27.01.2011 в 13:16
источник

9 ответов

3

Во время UDS для Oneiric был сеанс обнаружения джек. Подробнее см. проект . Похоже, это точно выполнит то, что я ищу: разные уровни громкости для разных устройств - просто не на каждом аппаратном обеспечении:

<htorque> something i'm curious about: will i be able to have different volume levels for different devices (eg., internal sound muted, headphones 75%) anytime soon?

<coling> this will be supported (on some h/w) yes. Timescales are "soonish" :p
<coling> (I'd also expect OSD to be shown (with current volume) when jacks are plugged/unplugged)

Обновление для 11.10

Теперь это должно быть работающим в Oneiric - к сожалению, мой ThinkPad T510, похоже, является одной из систем, которые в настоящее время не поддерживаются.

Еще одно продолжение Дэвида Хеннингсона:

Long story short, it’s a desirable feature, and we’re moving in that direction, but slowly, as the feature is more complex than it seems like at first glance.

The good news: in the upcoming Ubuntu Oneiric (11.10), this is actually working. The bad news: it isn’t working for everyone.

Подробнее здесь .

Обновление для 12.04

Теперь он работает с моим ThinkPad T510 (и многими другими моделями) в Ubuntu 12.04 (версия для разработки).

    
ответ дан htorque 11.05.2011 в 17:42
источник
3

Для установки уровня громкости с консоли используйте команду amixer. Например:

amixer sset Master playback 0%

Установите уровень на 0%

Я не знаю, как это изменить, когда вы подключаете наушники ... но, возможно, кто-то может помочь вам с этим

    
ответ дан Luciano Facchinelli 27.01.2011 в 15:30
2

Ухо Candy имеет некоторые функции для работы с вставкой / удалением наушников.     

ответ дан zacharyliu 28.01.2011 в 01:08
2

Я не знаю, сколько у вас опыта кодирования, но вы упоминали inotifywait , поэтому я собираюсь предположить, что вы, по крайней мере, комфортно с shell-скриптами. Следующая программа на основе этой статьи должна иметь возможность обнаруживать, что ваши наушники подключены или отсоединены, после чего вы можете выполнять любые действия, которые вы хотите.

#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 для меня, но вам, возможно, придется попробовать несколько, чтобы найти, что находится в вашей системе. Вам понадобятся права на чтение на этом устройстве. Программа выведет имя устройства, тип, код и значение первого события перед выходом.

    
ответ дан Karl Bielefeldt 03.02.2011 в 20:18
1

Проверить dmesg и другие файлы журналов. Возможно, включение / выключение некоторых сообщений.

Затем вы можете использовать демон для анализа этого файла журнала и обнаружения событий. Я думаю, вы знаете, что делать с этого момента:)

    
ответ дан Pedro Loureiro 03.02.2011 в 16:59
1

Если вы делаете

amixer sset 'Speaker' playback 0%

громкость динамика будет отключена, но наушники будут работать. Отсоединение наушников означает отсутствие звука. Это почти то, что вы хотите ...

Однако ...

Если вы измените регулятор громкости, настройка громкости «Динамик» будет настроена снова. Это связано с тем, что pulseaudio пытается быть умным с настройками томов (см. Ссылка для получения дополнительной информации). Мы можем остановить его от возиться с томами, хотя.

Откройте /etc/pulse/default.pa

и найдите прямую

load-module module-udev-detect

и измените его на

load-module module-udev-detect ignore_dB=1

Перезапустите pulseaudio.

killall pulseaudio

Теперь, если вы отключите громкость динамика, мастер-громкость не повлияет на него. Таким образом, наушники будут работать, но динамик будет молчать.

    
ответ дан StephenPaulger 04.02.2011 в 12:23
1

Проверьте сокет ACPID для изменений, можно сделать с помощью сценария python или C или оболочки, ( Python code для управления воспроизведением и паузой в наушниках в ритм-боксе). Проверьте изменения напряжения ACPID, чтобы обнаружить плагин для наушников и разъем для наушников. Можно ожидать задержку в секундах.

    
ответ дан t3pleni9 05.01.2015 в 06:33
0

У Pulseaudio есть модуль, поставляемый по умолчанию, который предназначен для достижения именно этого:

Ссылка

    
ответ дан towolf 08.02.2011 в 22:10
0

Я думаю, вы могли бы достичь того, что вам нужно, используя это: Ссылка

    
ответ дан Zilmar 05.06.2013 в 03:07