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

36

То, что я хочу, это следующее:

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

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

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

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

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


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

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

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

htorque
источник
Отличный вопрос, я тоже хочу это сделать!
Стивен Полгер
хорошо ... но я думаю, что патч для alsa будет необходим для желаемого "мгновенного" ответа на plug / unplug. в противном случае это сработало бы или, казалось бы, сработало, но при нагрузке или других условиях реакция может отставать. Я думаю, что вам нужно попасть между событием plug и выходным переключателем. вероятно, возможно, но оооочень не стоит отдельного патча, если только разработчик Alsa не скажет, что он будет привязан к транку.
RobotHumans
Один из подходов состоит в том, чтобы загрузить модуль в GDB, дождаться остановки «нормальных» звуковых событий, использовать опцию записи, подключить и отключить наушники и посмотреть, что произошло в записи отладки.
RobotHumans
с какой задержкой вам удобно?
RobotHumans

Ответы:

3

Чтобы установить уровень громкости с консоли, используйте команду amixer. Например:

amixer sset Мастер воспроизведения 0%

Установлю свой уровень на 0%

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

Лучано Фаччинелли
источник
3

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

<htorque> что-то, что мне интересно: смогу ли я иметь разные уровни громкости для разных устройств (например, внутренний звук отключен, наушники на 75%) в ближайшее время?

<coling> это будет поддерживаться (на некоторых ч / б) да. Шкалы времени "скорые": p
<coling> (я также ожидал бы, что OSD будет отображаться (с текущей громкостью), когда разъемы подключены / отключены)

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

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

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

Короче говоря, это желательная функция, и мы движемся в этом направлении, но медленно, поскольку эта функция более сложна, чем кажется на первый взгляд.

Хорошая новость: в предстоящем Ubuntu Oneiric (11.10) это действительно работает. Плохая новость: это работает не для всех.

Больше здесь .

Обновление от 12.04

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

htorque
источник
Есть ли что-то отслеживающее, какое оборудование в настоящее время поддерживается, или что-то на этот счет?
Му разум
2

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

zacharyliu
источник
1
Похоже, это только для USB-наушников ... это правильно?
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. Если он отрицательный, чтение либо заблокировано, либо произошла какая-то другая ошибка. Существуют и другие более сложные способы сделать это без опроса, если вы включаете это в большую программу.
Карл Билефельдт
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

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

оборота СтивенПолгер
источник
Был бы другой подход, но, к сожалению, у меня нет канала громкости динамика, только Master и PCM.
htorque
1

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

t3pleni9
источник
0

Я думаю, что вы можете достичь того, что вам нужно, используя это: https://bbs.archlinux.org/viewtopic.php?pid=1105458#p1105458

Zilmar
источник
Добро пожаловать в Спросите Ubuntu! Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить здесь основные части ответа и предоставить ссылку для справки.
Кевин Боуэн