Программа предотвращает засыпание цифровых аудиовыходов SPDIF и HDMI при отсутствии сигнала, и таким образом решает проблему обрезки начала звука при начале воспроизведения, которая вызвана тем, что звуковому тракту требуется небольшое время на пробуждение. Если у вас нет такой проблемы — значит драйвер аудиокарты не отправляет аудиотракт в сон при остановке воспроизведения. Если же проблема имеет место — Sound Keeper решит проблему непрерывным воспроизведением тишины.
Скачать: soundkeeper.7z (76КБ). Исходный код →
Особенности
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%) являются неслышимыми.
Что нового в v1.3.4
- Доработан воркараунд для утечки памяти в WASAPI в эксклюзивном режиме на Windows 8-10.
- Билд для ARM64 Windows (со статически слинкованным рантаймом си, из-за чего больший размер файла).
Что нового в v1.3.3
- Исправлена ошибка разбора параметров: All или Analog после выбора типа сигнала приводило сбросу амплитуды в 0.
Что нового в v1.3.2
- Fluctuate учитывает, что WASAPI по какой-то причине репортит вывод аудио 24-bit PCM как 32-bit.
- Fluctuate генерирует 50 флуктуаций по умолчанию. Это помогает в гораздо большем числе случаев.
- Sound Keeper больше не закрывается когда он замьючен.
Что нового в v1.3.1
- Исправлена ошибка, которая могла приводить к зависанию программы при добавлении и удалении аудио устройств.
- Fluctuate воспринимает не-PCM форматы вывода (вроде Dolby Atmos) как 24-разрядные вместо 16-разрядных.
- Параметр частоты F ограничен половиной текущей частоты дискретизации, чтобы избежать генерацию неожиданного шума.
- Более детальные логи в отладочной версии. Отладочный вывод может быть перенаправлен в файл.
Что нового в v1.3.0
- Fluctuate делает одну флуктуацию в секунду по умолчанию. Частота может быть изменена параметром F.
- Возможность периодичного проигрывания сигнала (параметры L и W) с опциональным фейдингом (параметр T).
- Новые виды сигналов, генерирующих шум: White, Brown, и Pink.
- Новая команда для остановки уже запущенной копии программы: soundkeeper kill
- Новый режим Analog, который работает как противоположность Digital.
- Аудио-устройства Remote Desktop игнорируются (это может быть отключено параметром Remote).
- Новый режим OpenOnly, который просто открывает аудио-устройство, но не отправляет на него сигнал.
- Новый режим NoSleep, который отключает код определения автоматического ухода системы в сон (Windows 7-10).
- При отсутствии подходящих аудио-устройств, программа работает как заглушка в ожидании подходящих устройств.
- Sound Keeper не должен предотвращать Windows 10 от автоматического перехода в сон.
- Программа работает корректно, когда автоматический переход в сон в Windows 10 отключён.
- Код, позволяющий системе уснуть, пришлось отключить в Windows 11 из-за особенностей этой версии ОС.
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КБ |
Спасибо за ответ. Сначала искал командные аргументы, оказалось все куда проще, чеерез имя файла.
Поигрался с настройкой, оказалось что слышу независимо от частоты.
Видимо какой то гремлин в Windows, ибо на громкость этого звука влияет именно громкость в микшере для SoundKeeper
Алексей, странно. Loudness Equalization в настройках аудиовыхода выключен? Оно должно быть на вкладке Enhancements (Улучшения) в свойствах аудиовыхода.
VEG, вкладки Enhancements вообще нет для этого устройства, проверил по вашему совету раньше.
Алексей, а в режиме Zero проблема тоже проявляется?
VEG, в случае с Zero к сожалению SoundKeeper перестает "работать". Звуковое устройство засыпает, и появляются тихие щелчки при старте/остановке звука в приложениях. Собственно то, что я им и решаю :)
Здравствуйте!
Объясните пожалуйста как сделать, чтобы Sound Keeper не мешал уходить ПК на Windows 10 в сон? Пробовал разные комбинации в переименовывании exe файла. Никак не решить проблему. Если Sound Keeper запущен, то ПК в сон не уходит.
Sound Keeper 123, убедитесь, что у вас последняя версия Sound Keeper. На Windows 10 в сон должно уходить нормально.
Причина в том, что Windows отключает автоматический переход в режим сна, когда любая программа воспроизводит какой-то звук (даже если это тишина). Для Windows 7-10 нашёлся способ это обойти, но он не работает в Windows 11 (так как там сломана функция, которая сообщает, сколько осталось до сна). Если у вас Windows 10, то на последней версии Sound Keeper v1.2 автоматический переход в режим сна должен работать.
Windows 10 Домашняя x64 21H2
Sound Keeper 1.2.1
Порядок действий:
Скачиваю Sound Keeper. Переименовываю SoundKeeper64.exe в DigitalSoundKeeper64.exe (требуется чтобы не засыпал SPDIF).
Добавляю ярлык в автозагрузку через run -> shell:startup
Как я не пробовал... Не уходит в сон ПК.
Список запущенных процессов:
Забыл добавить, что я пробовал убивать не важные для системы процессы один за одним. Думал исключением получится вычислить какой процесс может мешать, но безуспешно.
Нет указания на какой-то процесс. Только на устройство.
Судя по выводу powercfg -requests, система не уходит в сон именно из-за вывода звука. Если это только Sound Keeper, то он должен автоматически выключиться, когда таймер до выхода в сон приблизился к нулю. Если же какие-то другие программы кроме Sound Keeper выводят звук, то компьютер всё равно не уйдёт в сон.
Доработал вывод отладочной информации относительно оставшегося время до сна. Можете собрать самостоятельно или использовать этот отладочный билд, который выводит на экран отладочную информацию. Запустите, подождите минут пять, в норме, когда вы ничего не делаете (нельзя даже мышкой водить), где-то раз в минуту должно выводить сколько времени осталось до сна, и это число должно уменьшаться. После теста отправьте сюда копию вывода.
После отсчета система не ушла в сон, а перезапустила таймер с 4294967266 секунд. Я не знаю связано это как-то или нет, но может быть дело в том, что на последних чипсетах Intel (500 и 600 серии) встроенный звук материнской платы сидит на USB линиях чипсета и это как-то конфликтует с Sound Keeper. Я честно не знаю какой еще процесс может мешать Sound Keeper. Я даже Realtek Audio Universal Service и DTS в службы отключал.
Вот что выдала отладочная версия:
Попробовал оставить из задействованных устройств только аудио выход монитора (Display Port). Все остальные устройства отключил. Тоже не уходит в сон. Значит все таки какой-то процесс.
Огромные числа в секундах — это -30 и -60 секунд, прочитанные как положительные числа (из-за особенностей представления отрицательных чисел в памяти). Это сюрприз, что таймер может зайти в минус. Подправлю код, чтобы учитывать это.
Тем не менее, судя по этому участку, Sound Keeper отключался на почти 30 секунд, и в это время система должна была уйти в сон. Но по-видимому почему-то не ушла. Вы пробовали проверять, работает ли автоматический переход в режим сна без Sound Keeper?
Да. Без Sound Keeper система автоматически уходит в сон без проблем.
Я разрабатывал и тестировал Sound Keeper на Windows 7. Там система уходит в сон как только таймер до сна доходит до 0 и нет предотвращающих сон факторов. Потестировал сейчас как оно работает на Windows 10. Оказалось, что поведение изменилось. Во-первых, таймер до сна почему-то сбрасывается после первых 5 минут бездействия (не выяснил виновника, возможно, так на чистой системе тоже). Во-вторых, при достижении 0 он идёт в минус, если есть активные аудио-сессии, плюс ещё 2 минуты после закрытия последней аудио-сессии. То есть, если установлен уход в сон через 10 минут неактивности, из-за всех этих факторов система уйдёт в сон через 17 минут. Вместо 60 минут, по-видимому, получится 67 минут, и т.д.
Обучил Sound Keeper понимать отрицательные значения таймера, и обновил отладочный билд. Проверьте как оно работает у вас. Для отслеживания как меняется состояние powercfg /requests можно воспользоваться следующим bat-файлом, который нужно запускать с правами администратора:
При тестировании имейте в виду, что даже обычный браузер может предотвращать уход в сон. Например, у меня просто запущенный Firefox удерживает аудио-сессию открытой и предотвращает сон. Судя по сообщениям в интернете, в Chrome может быть тоже самое, в зависимости от открытых сайтов (например, YouTube).
Так-с. Что-то нащупали. Поставил сон через 1 минуту, чтобы проверить. Прошла минута, потом еще где-то полторы и система уснула.
Попробуйте новую отладочную или бета-версию. Добавил больше отладочной инфы; обучил Sound Keeper более разумно реагировать на случай, когда нет ни одного доступного аудио-устройства вывода; оптимизировал код, обрабатывающий появление или исчезновение аудио-устройств; поднял версию до 1.2.2; добавил в ReadMe.txt информацию, как можно попробовать разрешить системе уходить в сон даже с активными аудио-сессиями.
Скачал бета-версию. Запустил, система уснула, но после пробуждения слышу характерные щелчки на SPDIF выходе. Открыл диспетчер задач и выяснилось, что Sound Keeper нет среди процессов. Стал смотреть журнал событий и там видно, что Sound Keeper был сбой.
Проверил несколько раз. Сценарий повторяется.
Из журнала событий:
Из монитора стабильности:
Обновленная отладочная версия продолжает работу после выхода из сна.
Действительно, в новом коде ошибку допустил. Спасибо за информацию. Исправлено. Обновил отладочную и бета версии.
Сбой вызван переименовыванием исполняемого файла.
Сбой происходит на обеих версиях если переименовать исполняемые файлы.
Если переименовать отладочную версию из SoundKeeper64d.exe в DigitalSoundKeeper64.exe, то она тоже сбоит.
Если бета-версию переименовать обратно из DigitalSoundKeeper64.exe в SoundKeeper64.exe, то соответственно и сбоев нет.
В обновлённой версии тоже сбоит? Кажется, по смещению ошибки 0x00000000000029c4 из журнала событий не хватало именно той проверки что я только что добавил.
Обновленную сейчас буду проверять.
И бета, и отладочная версии пережили пробуждение будучи переименованными в DigitalSoundKeeper64.exe
Сбоев не было. Я еще бету погоняю. Если что, то сразу отпишусь. Спасибо.
Отлично! Если больше проблем не будет найдено, выпущу релиз со свежими изменениями.
Sound Keeper v1.2.2
Привет! Большое спасибо за программу!
А можно добавить еще 1 параметр, чтобы генерировало звук на неактивный цифровой аутпут?
Поясню: часто переключаю (Select Playback Device на панели задач в трее) между наушниками (обычный джек) и колонками (SPDIF), и усилитель через 10 минут выключается, а включается он довольно долго.
Хочется, чтобы он не выключался вовсе, пока работает комп/программа.
Шнипер, попробуйте дописать All или Digital к имени файла программы перед запуском.
Оно и дописано. Работает, пока Selected Playback Device - SPDIF, не работает, когда нет.
Может, я плохо описал, вот картинка:
https://monosnap.com/file/QxkpnW0EzwYjvoQh46PoT0eoNlKDar
Default Device у меня наушники, а Speakers, подключенные через SPDIF - Ready. Нужно, чтобы на них шел сигнал и в этом случае.
Должно работать. Попробуйте отладочную версию. Допишите All к имени файла и проверьте как оно работает. То что оно будет выводить на экран — скопируйте и покажите тут в комментариях.
Я использую Zero, но в данном случае вряд ли это важно, аутпуты схожи.
Сперва аутпут, когда включены колонки (и все ок), затем, когда наушники, и на колонки не поступает сигнал.
Извиняюсь, не заметил сообщение, почему-то не пришло уведомление. Судя по логу, оно пытается генерить сигнал на тех же трёх выводах. Странно, что не работает. Попробуйте запустить в режиме AllSineF1000A100. Оно должно в таком случае на всех активных выходах генерить слышимый сигнал с частотой 1000Гц. Слышно ли его на всех выходах, или только на том, что сейчас установлен "по умолчанию"? Если на всех других выходах тишина, возможно, какие-то настройки драйвера не позволяют выводить звук на устройство не по умолчанию?
Слышен писк, слышен и в колонках и в наушниках, в обоих режимах, но, в не-дефолтном он заметно тише, на тех же значениях громкости в микшере.
Драйвер - Realtek Semiconductor Corp. 6.0.8960.1, 26.05.2020
Перепроверил, работает с SineDigital, но не с Zero/Fluctuate. Усилитель "Hybrid Digital DAC Aplifier" подключен через SPDIF, по идее это не аналог. Не хватает громкости, или чего-то еще, выходит? Но когда он активен, то хватает. Не хотелось бы использовать Sine, боюсь,повлияет на звук, или будет к концу дня голова болеть )
Неожиданное поведение. Возможно, это и есть причина. Может быть, в настройках аудиовыхода что-то по этому поводу есть? При Fluctuate генерируется сигнал, где изменяется самый младший бит. То есть, для 16-битного звука, изменение сигнала всего на 1/32768. Любое снижение громкости превращает это в абсолютный 0, что может вызывать засыпание аудио-устройства.
При Sine, если вы выберете малую частоту и минимальную амплитуду, по идее сигнал должен быть неслышимым и невоспринимаемым. В следующей версии ещё можно будет настроить периодичность сигнала. Для некоторых аудио-железяк можно раз в пару минут подать короткий сигнал на долю секунды, и этого хватает для поддержания устройства во включённом состоянии. У вас оно сразу засыпает при отсутствии звука, или по какому-то тайм-ауту?
По таймауту, у меня 20 минут. Периодичность было бы хорошо.
Про Fluctuate понял, а как насчет Zero? Там тоже громкость может его "удалить"? Но я думал, он и так 0. Или там нули с какой-то громкостью? )
Думаете, поставить сайн и забить, или есть идеи как побороть Zero? Сайн по умолчанию - это минимальные значения, или попробовать еще снизить?
Нет, с Zero идут нули. Они помогают обычно, если драйвер отключает аудио выход только когда он не открыт ни одной программой, не анализируя отправляемый сигнал. У вас видимо драйвер применяет разные правила в зависимости от того, установлено ли устройство по умолчанию. Впервые о таком слышу.
Может быть, на самом деле драйвер не выключает выход, а ресивер сам через 20 минут тишины выключается? Ну и когда он у вас основным выходом, то просто что-то на него раз за 20 минут издаёт какой-то звук, чего достаточно, чтобы он не стал уходить в сон.
Новая версия с периодичностью будет где-то через неделю.
>драйвер не выключает выход, а ресивер сам через 20 минут тишины выключается
Думаю, так и есть, но нет, ничего звук не издает, до использования программы выключался регулярно.
Но, может, драйвер нули не передает на не-дефолт. Раз нули помогают когда дефолт, и не помогают, когда не дефолт. Было бы дело только в усилителе, то воспринимал бы в обоих случаях.
Ну, в любом случае, потестирую еще дефолтный Сайн, ну и буду ждать версии.
Спасибо!
Там в новой версии я ещё добавил генерацию шумов разных на выбор (белый, розовый, красный/коричневый), фейдинг и периодичность. Некоторым людям нравится, когда есть негромкий, но слышимый красный/коричневый или розовый шум, близкий к естественной среде =) Можете в бетке посмотреть.
Становится немного запутанно )
- A is amplitude. Default: 1%. If you want to use inaudible noise, set it to 0.1%. - это в имени нужно "A01" или "A0.1"?
Вот так легально? )
SoundKeeperDigitalSineA0.1L0.1W600T0.exe
Да, все значения могут быть не целыми, с точкой. В отладочной версии можете проверить, правильно ли распарсились ваши параметры.
Потестировал. Не работает с периодичностью. Точнее... работает недостаточно )
Сейчас речь про случай, когда выход выбран "по умолчанию".
SoundKeeperDigitalSineF1A0.1 - работает хорошо.
SoundKeeperDigitalSineF1A0.1L1W60 - через время (20 минут у меня на усилителе) выключается. При этом, через 60с - включается снова, и живет еще 20 минут.
Т.е., выглядит так, что этого сигнала достаточно для пробуждения, но не для поддержания включенным. A1 - тот же результат.
Ну тут только методом проб и ошибок можно подобрать параметры, которые устроят ваше устройство. Можете попробовать поднять частоту, например, до 10Hz, сохранив маленькую амплитуду. Чтобы убедиться, что Sound Keeper всё же генерирует звук с заданной периодичностью, можете для теста попробовать 1000Гц с амплитудой 20%, чтобы вам было слышно, что оно вообще работает. А то может оно из-за ошибки какой-то не работает =)
Да, по звуку работает, ну и + у меня в примере стоит период 60с, и после выключения оно через 60с как раз его включает обратно. Но не останавливает выключение.
Так повышение частоты хотя бы до 10Hz и амплитуды до 5% не помогает?
Привет, долго не отвечал, т.к. тестировал разные режимы.
SineF10A5 не отличается от просто Sine, даже без периодов тоже есть проблемка:
когда звук не воспроизводится, а я не около компа (даже когда по умолчанию включен усилитель дефолтным выходом), через 20 минут он выключается. Стоит пошевелить мышкой, нажать что-то - включается обратно. Иногда включается и само, через короткое время после выключения.
Думал, что-то с энергосбережением, но не нашел, что могло бы на это влиять, специфичных настроек в винде не увидел.
Есть какие-то идеи?
Спасибо.
Это скорее всего срабатывает код, который хочет позволить компьютеру уйти в сон. Компьютер всё равно может не засыпать потому что какая-то другая программа мешает этому. Можете отключить автоматический уход компьютера в сон в настройках системы — после этого Sound Keeper должен перестать сам выключаться, когда вы долго не за компьютером.