Утилита в трее Windows
Своя громкость для каждого приложения —
в один клик.
Chrome — 30 %, Teams — 70 %, Spotify — 20 %. Вместо того чтобы каждый раз открывать микшер громкости, один профиль возвращает всё на место. Два клика из трея или один ползунок в панели.
Окно, которое открывает значок в трее. Те же значения меняются и прямо из меню.
Что умеет
То, что вы делали в микшере громкости, — в два клика из трея.
Громкость и отключение звука по приложениям
Собирает звучащие сейчас сеансы по приложениям. Приложение с десятком процессов, как Chrome, остаётся одной строкой.
Своё устройство вывода для каждого приложения
Игра — на колонки, Discord — на гарнитуру. Устройство по умолчанию тоже переключается из меню, а профиль сохраняет устройство вместе с громкостями.
Сохраняется при закрытии и повторном запуске приложения
Запоминает громкость каждого приложения и возвращает её, когда это приложение снова начинает играть . Отключённое и снова подключённое устройство или выход из сна тоже приводят к повторному применению профиля.
Микрофон — той же рукой
Самая срочная кнопка на совещании. CtrlAltK выключает и включает микрофон.
Панель
Редактирование профилей, изменение сочетаний клавиш, правила автоматизации — всё в окне. Править файл настроек руками не приходится.
Наружу уходит только включённое вами
Анонимный отчёт об использовании, проверка обновлений и уведомления разработчика — это всё, и все три выключены по умолчанию. Панель открывается только на 127.0.0.1 и требует токен, создаваемый заново при каждом запуске.
Профили
Меняется обстановка — должны меняться и все громкости.
Три профиля есть сразу, а текущее состояние в любой момент можно сохранить как новый. Автоматическое переключение — по запуску приложения, подключению устройства или времени суток — по умолчанию выключено.
| Профили | Общая | Настройки приложений |
|---|---|---|
| Work | 72% | Chrome 30% · Teams 70% · Spotify 20% |
| Gaming | 80% | Discord 65 % · Spotify 15 % · браузер без звука |
| Meeting | 60% | Teams 80 % · Zoom 80 % · Chrome 20 % · Spotify без звука |
Сочетания клавиш
Когда руки уже на клавиатуре.
Все можно изменить, и если сочетание уже занято другой программой, вам об этом скажут, а не промолчат.
- CtrlAlt↑ Громче
- CtrlAlt↓ Тише
- CtrlAltM Без звука
- CtrlAltK Отключить микрофон
- CtrlAltS Окно
- CtrlAlt1–3 Сменить профиль
Маршрутизация по приложениям
Путь, который Windows нигде не описала, проверяется перед использованием.
измерено
у «только это приложение — на гарнитуру» нет публичного API. Приходится вызывать внутренний интерфейс, которым пользуется приложение «Параметры» Windows, Windows.Media.Internal.AudioPolicyConfig , а его идентификатор и раскладка vtable отличаются от сборки к сборке. SoundDesk не пользуется ими наугад.
Опасный первый вызов выполняется в отдельном процессе, чтобы значок пережил аварийное завершение, а после того как приложение действительно перенесено, результат перечитывается через Get ; только когда возвращается то же устройство, статус повышается до «подтверждено». Если перечитанное не совпадает, функция выключает себя сама и открывает страницу параметров Windows.
| Состояние | Основание |
|---|---|
| verified | Процесс действительно перенесён, и перечитанный endpoint id совпадает. Если ничего не играет, самопроверка создаёт себе сеанс с тихим потоком и проверяет себя сама |
| probable | Нечего было перечитывать — известно лишь, что активация фабрики и вызов через vtable не привели к аварии |
| unsupported | Самопроверка не прошла или вызов удался, а Windows его не применила → вас отправляют на страницу параметров |
Безопасность
Безопасно даже при запуске прямо из папки загрузок.
Это те проблемы, с которыми переносимый исполняемый файл сталкивается на самом деле. Не абстрактный список: за каждой строкой стоят код и тест.
| Угроза | Что сделано |
|---|---|
| Подмена DLL Поддельная DLL, положенная рядом с exe |
Системные DLL загружаются только по System32 абсолютному пути. При запуске папка exe и рабочий каталог убираются из пути поиска |
| Захват мьютекса Другой сеанс занимает имя первым и блокирует запуск |
Объект единственного экземпляра живёт в пространстве имён Local\ . |
| Внедрение через файл настроек | endpoint id доходит до вызова COM только после проверки регулярным выражением |
| Подделка журнала Перевод строки в имени процесса, вставляющий ложную запись |
Из имён приложений и устройств удаляются управляющие символы, затем ограничивается длина |
| Путь автозапуска без кавычек | Значение Run — всегда абсолютный путь в кавычках, и используется только HKCU . |
| Постороннее вмешательство в панель Другая программа на том же ПК или веб-страница |
127.0.0.1 и только он, плюс новый 256-битный токен при каждом запуске и проверка Host и Origin. Токен при первой загрузке превращается в HttpOnly-cookie и исчезает из адресной строки |
Конфиденциальность
Наружу уходит только то, что вы включили.
Имена приложений и сведения о сеансах обрабатываются на этом компьютере и больше нигде, а настройки — это один файл JSON. Функций, выходящих в сеть, ровно три — анонимный отчёт об использовании, проверка обновлений и уведомления разработчика — и все три выключены. Пока вы не включите что-то в панели, не уходит ни один запрос.
| Файл настроек | %APPDATA%\SoundDesk\config.json |
|---|---|
| Журнал | %APPDATA%\SoundDesk\sounddesk.log |
| Анонимный отчёт об использовании | Выключено по умолчанию — если включить, раз в сутки: случайный идентификатор установки, версия, сборка Windows, язык и три счётчика |
| Проверка обновлений · уведомления разработчика | Выключено по умолчанию — если включить, только текущая версия и язык. Идентификатор установки не отправляется |
| Что не уходит никогда | Имена приложений · имена устройств · пути к файлам · имя учётной записи Windows |
| Используемые API | IMMDeviceEnumerator · IAudioSessionManager2 · ISimpleAudioVolume · IPolicyConfig · AudioPolicyConfig |
| Автозапуск | HKCU\Software\Microsoft\Windows\CurrentVersion\Run (по желанию) |
Самопроверка
Спросите у самого приложения, работает ли оно на вашем ПК.
Прогоняет собственные возможности по одной на настоящем звуковом стеке и возвращает на место то, чего касалась. Ничего, что издало бы звук, не делается вовсе — общая громкость проверяется перезаписью того же значения, что доказывает путь вызова и ничего больше.
| Команда | Что проверяет |
|---|---|
| --selftest-audio | Устройства · общая громкость · микрофон · громкость, отключение звука и маршрутизация по приложениям · профили · глобальные сочетания клавиш. Если ничего не играет, маршрутизация проверяется на собственном тихом сеансе |
| --selftest-panel | Действительно ли собранный файл отдаёт панель |
| --report | Устройства, сеансы и профили в JSON |
Результат на этом ПК
OK Громкость по приложениям (firefox.exe 100 % → 42 % → возвращено)
OK Отключение звука по приложениям
OK Маршрутизация вывода по приложениям (firefox.exe → ASUS VZ279 → возвращено)
OK Смена устройства по умолчанию · профили · глобальные сочетания клавиш
— Микрофон (на этом ПК нет устройства ввода)
11 passed, 0 failed, 2 skipped — Windows 10 22H2, сборка 19045
Где угодно
На вашем языке, на вашем компьютере.
Одни и те же настройки дома и на работе, на том языке, которым вы пользуетесь, вызываемые из макроса, когда нужно.
12 языков
Следует языку интерфейса Windows. Можно выбрать и вручную — панель и меню в трее сменят язык сразу, без перезапуска.
한국어 · English · 日本語 · 简体中文 · 繁體中文 · Español · Português · Français · Deutsch · Русский · Italiano · Tiếng Việt
Дома и на работе — одни настройки
Выгрузите профили, сочетания клавиш и правила в один файл и загрузите его на другом ПК. Устройства сопоставляются по имени — у одной и той же гарнитуры на каждом ПК свой id, поэтому простое копирование файла тихо лишило бы вас маршрутизации. Об устройствах, которых на этом ПК нет, вам сообщат по имени.
Вызов из макроса
Используйте как есть из кнопки Stream Deck или одной строки AutoHotkey. Работает и когда значок запущен, и когда нет, и второй значок не создаёт. Код возврата 0, если что-то изменилось, 1 — если ничего не подошло.
SoundDesk.exe --set-app chrome.exe=25
SoundDesk.exe --profile Gaming
SoundDesk.exe --list apps
Установка
Один файл. Без установщика.
SoundDesk.exe в любое место и запустите — в трее появится значок. Чтобы удалить, сотрите файл и папку настроек. Python не нужен.