Sound Keeper v1.2.2 [2022/05/15]

Программа предотвращает засыпание цифровых аудиовыходов SPDIF и HDMI при отсутствии сигнала, и таким образом решает проблему обрезки начала звука при начале воспроизведения, которая вызвана тем, что звуковому тракту требуется небольшое время на пробуждение. Если у вас нет такой проблемы — значит драйвер аудиокарты не отправляет аудиотракт в сон при остановке воспроизведения. Если же проблема имеет место — Sound Keeper решит проблему непрерывным воспроизведением тишины.

Скачать: soundkeeper.7z (17КБ). Исходный код →

Особенности

Sound Keeper работает через WASAPI на Windows 7 и новее. Программа написана на C++, без использования тяжёлых фреймворков вроде .NET, поэтому она очень легковесна и расходует минимум памяти.

Sound Keeper внешне никак себя не проявляет и работает полностью автоматически: находит все цифровые выходы (SPDIF или HDMI) и предотвращает их засыпание. Если во время работы программы появится новый цифровой выход (например, если вы подключили компьютер по HDMI к телевизору) — это будет корректно обработано, перезапуск программы не требуется. Для отключения Sound Keeper вы должны либо выключить звук в микшере для этой программы (после чего Sound Keeper автоматически закроется), либо просто убить процесс soundkeeper.exe. Для автоматической загрузки программы вместе с системой просто скопируйте исполняемый файл soundkeeper.exe в каталог Автозагрузка (чтобы открыть его, нажмите Win+R, введите shell:startup и нажмите Enter).

Настройки

  • Поведение по умолчанию может быть изменено добавлением опций к имени исполняемого файла.
  • По умолчанию используется основной аудио выход. Добавьте All к имени исполняемого файла программы для включения Sound Keeper на всех аудио выходах.
  • По умолчанию используется неслышимый сигнал. Добавьте Zero к имени исполняемого файла чтобы использовать поток нулей в качестве сигнала (как это было в Sound Keeper v1.0).

Если режим по умолчанию не помогает, попробуйте новый тип потока Sine. Он генерирует синусоиду, и может быть настроен. Имеется два параметра: F (частота) и A (амплитуда). Значение параметра идёт сразу за символом параметра. Например, добавьте SineF10A5 к имени исполняемого файла для генерации синусоиды 10Hz с амплитудой 5%. Низкие частоты (ниже 20Hz) и высокие частоты (выше 20000Hz) с низкой амплитудой (до 10%) являются неслышимыми.

Sound Keeper vs. SPDIF Keep Alive vs. SPDIF-KA

Sound Keeper v1.0 SPDIF Keep Alive v1.2 SPDIF-KA v1.4
Полный автомат: Да Нет Нет
Поддержка нескольких выходов: Да Нет Нет
Графический интерфейс: Нет Есть Есть
Требует .NET: Нет Требует Требует
Объём EXE-файла: 17КБ 668КБ 163КБ
Расход CPU (на Intel Core i5 4460): 0.004% 0.06% 0.06%
Расход RAM (Private Working Set): 1636КБ 13704КБ 10600КБ

Ссылки

  1. #101
    VEG Автор

    Также в отладочной и бета версиях появилась настройка NoSleep, которая отключает уход Sound Keeper в сон. Если вам не нужно, чтобы компьютер сам засыпал, можете воспользоваться этой настройкой.

  2. #102
    Шнипер

    У меня нет автоматического ухода в сон, по крайней мере в Control Panel\All Control Panel Items\Power Options\Edit Plan Settings\Put the computer to sleep: Never

  3. #103
    VEG Автор

    Странно. Можете попробовать воспроизвести проблему с отладочной версией и показать что она выводит в консоль?

  4. #104
    Шнипер

    Готово. См. 10:21 (отошел о компа) и 10:43 (пошевелил мышкой)

    10:15:42.772 [ 4504] Windows Build Number: 19044 (buggy WASAPI).
    10:15:42.776 [ 4504] Remaining time to sleeping: -1 seconds.
    10:15:42.778 [ 4504] Main thread started.
    10:15:42.783 [ 4504] Exe File Name: SoundKeeper64dDigitalSineF1A0.1.exe.
    10:15:42.785 [ 4504] Device Type: Digital.
    10:15:42.789 [ 4504] Stream Type: Sine (Frequency: 1.000Hz; Amplitude: 0.100%).
    10:15:42.794 [ 4504] Main loop started.
    10:15:42.794 [ 4504] Starting...
    10:15:42.797 [30240] Rendering thread started. Device ID: '{0.0.0.00000000}.{0b3e0a6e-d9cf-45a7-892e-70ed9309bdd1}'.
    10:15:42.797 [30240] Render. Device State: 1.
    10:15:42.798 [30772] Rendering thread started. Device ID: '{0.0.0.00000000}.{0e856358-8c39-4316-b582-5306e2211c4c}'.
    10:15:42.798 [30772] Render. Device State: 1.
    10:15:42.800 [30240] Getting output format...
    10:15:42.800 [30772] Getting output format...
    10:15:42.800 [30240] Format: PCM 2ch 96000Hz 32-bit integer.
    10:15:42.801 [30240] Getting mixing format...
    10:15:42.801 [30772] Format: PCM 2ch 48000Hz 16-bit integer.
    10:15:42.802 [30772] Getting mixing format...
    10:15:42.802 [30240] Format: PCM 2ch 96000Hz 32-bit float.
    10:15:42.802 [30772] Format: PCM 2ch 48000Hz 32-bit float.
    10:15:42.809 [30240] Starting rendering...
    10:15:42.809 [30772] Starting rendering...
    10:15:42.810 [30772] Rendering loop started.
    10:15:42.811 [30240] Rendering loop started.
    10:21:18.325 [ 4504] Remaining time to sleeping: -31 seconds.
    10:21:18.325 [ 4504] Going to sleep...
    10:21:18.325 [30240] Stopping rendering...
    10:21:18.327 [30240] Rendering thread finished. Return code: 0.
    10:21:18.328 [30772] Stopping rendering...
    10:21:18.329 [30772] Rendering thread finished. Return code: 0.
    10:21:47.370 [ 4504] Remaining time to sleeping: -61 seconds.
    10:22:17.391 [ 4504] Remaining time to sleeping: -91 seconds.
    10:22:47.446 [ 4504] Remaining time to sleeping: -121 seconds.
    10:23:17.478 [ 4504] Remaining time to sleeping: -151 seconds.
    10:23:47.513 [ 4504] Remaining time to sleeping: -181 seconds.
    10:24:17.546 [ 4504] Remaining time to sleeping: -211 seconds.
    ...
    10:43:17.093 [ 4504] Remaining time to sleeping: -1351 seconds.
    10:43:47.129 [ 4504] Remaining time to sleeping: -1 seconds.
    10:43:47.129 [ 4504] Starting...
    10:43:47.131 [ 4728] Rendering thread started. Device ID: '{0.0.0.00000000}.{0b3e0a6e-d9cf-45a7-892e-70ed9309bdd1}'.
    10:43:47.131 [ 4728] Render. Device State: 1.
    10:43:47.131 [16544] Rendering thread started. Device ID: '{0.0.0.00000000}.{0e856358-8c39-4316-b582-5306e2211c4c}'.
    10:43:47.132 [16544] Render. Device State: 1.
    10:43:47.132 [ 4728] Getting output format...
    10:43:47.132 [ 4728] Format: PCM 2ch 96000Hz 32-bit integer.
    10:43:47.133 [ 4728] Getting mixing format...
    10:43:47.133 [16544] Getting output format...
    10:43:47.133 [ 4728] Format: PCM 2ch 96000Hz 32-bit float.
    10:43:47.133 [16544] Format: PCM 2ch 48000Hz 16-bit integer.
    10:43:47.134 [16544] Getting mixing format...
    10:43:47.134 [16544] Format: PCM 2ch 48000Hz 32-bit float.
    10:43:47.137 [ 4728] Starting rendering...
    10:43:47.139 [ 4728] Rendering loop started.
    10:43:47.140 [16544] Starting rendering...
    10:43:47.141 [16544] Rendering loop started.
  5. #105
    Шнипер

    Проверил, через сколько оно думает что нужен слип:
    вот это, 10:50:47, написало рочно через 40с после последнего движения мышкой в 10:50:07.

    10:43:47.141 [16544] Rendering loop started.
    10:50:47.817 [ 4504] Remaining time to sleeping: -31 seconds.
    10:50:47.817 [ 4504] Going to sleep...
  6. #106
    VEG Автор

    Нда... У функции получения остатка времени до сна какое-то неадекватное поведение в Windows 10. Предсказуемо она работала походу только в Windows 7. Неудивительно, что эту функцию совсем отключили в Windows 11. Судя по всему, когда система возвращает отрицательное время, заканчивающееся на единицу, это значит, что сон выключен.

    Наверное, стоит убрать автодетект сна вообще. Но пока что попробую всё же исправить её хотя бы для Windows 10. Обновил отладочную и бета версии. Должно теперь не отключаться при таких странных показаниях системы.

  7. #107
    Шнипер

    Спасибо! Теперь пишет так, так и задумано?
    19:14:16.464 [ 4644] Rendering loop started.
    19:15:16.552 [ 6436] Remaining time to sleeping: -31 seconds.
    19:15:46.604 [ 6436] Remaining time to sleeping: -61 seconds.
    19:16:16.648 [ 6436] Remaining time to sleeping: -1 seconds.
    Сам слип не проверял, работает ли, позже проверю, и погоняю.

  8. #108
    Шнипер

    Вроде бы все хорошо. Комп в слип уходит по запросу, при этом пишет такое.

    22:50:40.515 [13244] Device '{0.0.0.00000000}.{0b3e0a6e-d9cf-45a7-892e-70ed9309bdd1}' is default for flow 0 and role 0.
    22:50:40.515 [13244] Device '{0.0.0.00000000}.{0b3e0a6e-d9cf-45a7-892e-70ed9309bdd1}' is default for flow 0 and role 1.
    22:50:40.638 [13244] Device '{0.0.0.00000000}.{0b3e0a6e-d9cf-45a7-892e-70ed9309bdd1}' is default for flow 0 and role 1.
    22:50:40.639 [13244] Device '{0.0.0.00000000}.{0b3e0a6e-d9cf-45a7-892e-70ed9309bdd1}' is default for flow 0 and role 0.
    22:50:40.763 [13244] Device '{0.0.0.00000000}.{0b3e0a6e-d9cf-45a7-892e-70ed9309bdd1}' is default for flow 0 and role 2.

    По таймеру не знаю, уйдет ли, не пользовался никогда автослипом.
    Спасибо!

  9. #109
    VEG Автор

    Шнипер, оно выводит те же значения что и раньше (так как их сообщает система), просто теперь они интерпретируются иначе и Sound Keeper не уходит в сон. Можете дописать NoSleep, чтобы он не проверял сколько до сна осталось.

    Сообщения про изменение устройств по умолчанию — это просто то что WASAPI сообщает о работе аудиоподсистемы. Sound Keeper по этим событиям определяет, нужно ли ему перезапуститься. Если он как-то на это отреагировал (кроме вывода информации в лог) — вы увидели бы это в логе следом.