Как автоматически изменить уровень громкости при отключении / подключении наушников?
То, что я хочу, это следующее:
- Когда я подключаю наушники, я хочу, чтобы звук не был приглушен и установлен на определенный уровень громкости.
- Когда я отключаю наушники, я хочу, чтобы звук был отключен (или установлен на определенный уровень громкости).
Установка уровней громкости не является проблемой, но мне как-то нужно это делать при отключении / подключении наушников, поэтому я ищу способ получать уведомления об этих событиях.
Я быстро нашел /proc/asound/card0/codec#0
чтобы указать, подключены ли наушники или нет, поэтому я попытался контролировать его с помощью inotifywait
и изменить уровень громкости на основе измененных уведомлений. к несчастью inotifywait
не удалось, потому что proc не обычная файловая система.
Есть ли другие способы сделать это (возможно, через PulseAudio)?
Аудиоустройство: Intel HDA, аудиокодек: Conexant CX20585.
Подводя итог, что я пробовал до сих пор:
- Ear Candy: вообще не работал в моей системе. Кажется, заброшенный проект?
- Код, опубликованный Karl Bielefeldt, может работать на некоторых аппаратных средствах, но не на моем.
- Идея от Stephen Paulger проваливается из-за отсутствия канала "Speaker".
- По RobotHumans я заставил его работать, взломав код ядра (после нахождения кода кодека, распознающего домкрат), но это довольно громоздкое решение.
Итак, я все еще ищу простой способ сделать это.
9 ответов
Во время UDS для Oneiric был сеанс об обнаружении гнезда. Смотрите план для деталей. Похоже, это будет именно то, что я ищу: разные уровни громкости для разных устройств - только не на каждом оборудовании:
что-то, что меня интересует: смогу ли я иметь разные уровни громкости для разных устройств (например, внутренний звук отключен, наушники на 75%) в ближайшее время?
это будет поддерживаться (на некоторых ч / б) да. Сроки "скоро": p
(я также ожидал бы, что экранное меню будет отображаться (с текущей громкостью), когда разъемы подключены / отключены)
Обновление для 11.10
Теперь это должно работать в Oneiric - к сожалению, мой ThinkPad T510, похоже, является одной из систем, которые в настоящее время не поддерживаются.
Еще одно продолжение от Дэвида Хеннингсона:
Короче говоря, это желательная функция, и мы движемся в этом направлении, но медленно, поскольку эта функция более сложна, чем кажется на первый взгляд.
Хорошая новость: в предстоящем Ubuntu Oneiric (11.10) это действительно работает. Плохая новость: это работает не для всех.
Больше здесь.
Обновление от 12.04
Теперь он работает с моим ThinkPad T510 (и многими другими моделями) в Ubuntu 12.04 (версия для разработчиков).
Чтобы установить уровень громкости с консоли, используйте команду amixer. Например:
amixer sset Мастер воспроизведения 0%
Установлю свой уровень на 0%
Я не знаю, как это изменить, когда вы подключите наушники... но, возможно, кто-то может помочь вам с этим
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
для меня, но вам, возможно, придется попробовать несколько, чтобы найти, что это в вашей системе. Вам понадобятся разрешения на чтение на этом устройстве. Программа напечатает имя устройства, а также тип, код и значение первого события перед выходом.
Если вы делаете
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-сокет на наличие изменений, можно с помощью python или C или сценария оболочки ( код Python для управления воспроизведением в плагине наушников и паузы на rhythmbox). Проверьте наличие изменений напряжения ACPID, чтобы обнаружить разъем наушников и разъем наушников. Однако можно ожидать задержку в несколько секунд.
Проверьте dmesg и другие файлы журнала. Вероятно, подключение / выход запускает некоторые конкретные сообщения.
Затем вы можете использовать демон для анализа этого файла журнала и обнаружения событий. Я думаю, вы знаете, что делать с этого момента:)
Я думаю, что вы можете достичь того, что вам нужно, используя это: https://bbs.archlinux.org/viewtopic.php?pid=1105458
Pulseaudio имеет модуль, поставляемый по умолчанию, который предназначен для достижения именно этого:
http://pulseaudio.org/wiki/Modules