Prevents SPDIF/HDMI/Bluetooth digital audio playback devices from sleeping. Uses WASAPI, requires Windows 7+. It doesn't have GUI and starts to do its job right after the program is started. To make it autorun, copy the soundkeeper.exe into the startup directory that you can access by pressing Win+R and entering shell:startup. To close the program, run the soundkeeper.exe kill command or just kill its process.
Download: soundkeeper.7z (90KB). Source code →
The archive contains a few builds (you can remove unused ones):
- SoundKeeper64.exe is for x86-64 versions of Windows, most people need this version.
- SoundKeeper32.exe is for x86-32 versions of Windows, if you have a very old PC with 32-bit Windows.
- SoundKeeperARM64.exe is a native ARM64 build, if you have a new ARM based PC.
There is also a debug version that outputs all debug logs into a console window. Please provide the logs when you report issues.
Features
- Sound Keeper is fully automatic and doesn't require any user interaction.
- Supports keeping on multiple sound outputs (e.g. an SPDIF and an HDMI).
- Detects new sound outputs on the fly (e.g. when you connected a TV via HDMI).
- Supports various stream types that should help in all possible cases.
Settings
Default behavior can be changed by changing file name of the Sound Keeper executable (just add desired settings to the Sound Keeper file name) or by passing them as command line arguments. All settings are case insensitive.
Primary audio output is used by default. If current primary audio output has changed, the Sound Keeper detects this and switches to the new output automatically. If you want to run Sound Keeper on all enabled audio outputs, just add All to executable file name to enable Sound Keeper on all outputs.
All supported audio output type modes:
- Primary keeps on primary audio output only. It is used by default.
- All keeps on all enabled audio outputs.
- Digital keeps on all enabled SPDIF and HDMI audio outputs (like it was in Sound Keeper v1.0).
- Analog keeps on all enabled audio outputs except SPDIF and HDMI.
Inaudible stream of zeroes with infrequent smallest possible non-zero samples (fluctuations) is used by default. Add Zero to executable file name to use stream of zeroes only.
All supported stream types:
- OpenOnly opens audio output, but doesn't stream anything. Sometimes it helps if it's a driver only issue.
- Zero plays stream of zeroes. It may be not enough for some hardware.
- Fluctuate plays stream of zeroes with the smallest non-zero samples once in a second. Used by default.
- Sine plays 1Hz sine wave at 1% volume. The frequency and amplitude can be changed. Useful for analog outputs.
- White, Brown, or Pink play named noise, with the same parameters as the sine (except frequency).
If the default inaudible stream doesn't help, try the new Sine stream type. It generates a sine wave, and can be customized. There are two parameters: F (frequency) and A (amplitude). The value goes right after the parameter character. For example, add SineF10A5 to executable file name to generate 10Hz sine wave with 5% amplitude. Low frequencies (below 20Hz) and high frequencies (above 20000Hz) with low amplitude (up to 10%) are inaudible.
Stream parameters:
- F is frequency. Default: 1Hz for Sine and 50Hz for Fluctuate. Applicable for: Fluctuate, Sine.
- A is amplitude (i.e. volume). Default: 1%. If you want to use inaudible noise, set it to 0.1%. Applicable for: Sine, Noise.
- L is length of sound (in seconds). Default: infinite.
- W is waiting time between sounds if L is set. Use to enable periodic sound.
- T is transition or fading time. Default: 0.1 second. Applicable for: Sine, Noise.
Examples:
- SoundKeeperAll.exe generates default inaudible stream on all enabled audio outputs.
- SoundKeeperZero.exe generates zero stream on primary audio output.
- SoundKeeperAllZero.exe generates zero amplitude stream on all enabled audio outputs.
- SoundKeeperSineF10A5.exe generates 10Hz sine wave with 5% amplitude on primary audio output. It is inaudible.
- SoundKeeperSineF1000A100.exe generates 1000Hz sine wave with 100% amplitude. It is audible! Use it for testing.
- SoundKeeper.exe sine -f 1000 -a 100 is command line version of the previous example.
- SoundKeeper.exe brown -a 0.1 generates brown noise with 0.1% amplitude.
What's new in v1.3.4
- Tune the Windows 8-10 WASAPI memory leak workaround to make it working for longer time.
- Native ARM64 build (with statically linked runtime hence the bigger binary).
- [2024/11/12] Added digital signature.
What's new in v1.3.3
- Fixed arguments parsing bug: All or Analog after specifying stream type led to amplitude set to 0.
What's new in v1.3.2
- Fluctuate treats 32-bit PCM output format as 24-bit since WASAPI reports 24-bit as 32-bit for some reason.
- Fluctuate generates 50 fluctuations per second by default. It helps in many more cases.
- Sound Keeper doesn't exit when it is muted.
What's new in v1.3.1
- A potential deadlock when audio devices are being added or removed has been fixed.
- Fluctuate treats non-PCM output formats (like Dolby Atmos) as 24-bit instead of 16-bit.
- Frequency parameter F is limited by half of current sample rate to avoid generation of unexpected noise.
- More detailed logs in debug build. Debug output is flushed immediately, so it can be redirected to a file.
What's new in v1.3.0
- Fluctuate is 1 fluctuation per second by default. Frequency can be changed using the F parameter.
- Periodic playing of a sound (parameters L and W) with optional fading (parameter T).
- New White, Brown, and Pink noise signal types.
- Self kill command is added. Run soundkeeper kill to stop running Sound Keeper instance.
- Analog switch was added. It works as the opposite of Digital.
- Ignores remote desktop audio device (this feature can be disabled using the Remote switch).
- New OpenOnly mode that just opens audio output, but doesn't stream anything.
- New NoSleep switch which disables PC sleep detection (Windows 7-10).
- Work as a dummy when no suitable devices found.
- Sound Keeper shouldn't prevent PC from automatic going into sleep mode on Windows 10.
- The program is not confused anymore when PC auto sleep is disabled on Windows 10.
- The workaround that allowed PC to auto sleep had to be disabled on Windows 11.
Sound Keeper vs. SPDIF Keep Alive vs. SPDIF-KA
Sound Keeper v1.3 | SPDIF Keep Alive v1.2 | SPDIF-KA v1.4 | |
Fully automatic: | Yes | No | No |
Multiple outputs: | Yes | No | No |
Stream types: | 7 | 2 | 2 |
Periodicity: | Yes | No | No |
GUI: | No | Yes | Yes |
Requires .NET: | No | Yes | Yes |
Executable size: | 20KB | 668KB | 163KB |
CPU usage (on Intel Core i5 4460): | 0.004% | 0.06% | 0.06% |
RAM usage (Private Working Set): | 1636KB | 13704KB | 10600KB |
Known issue: streaming audio prevents automatic sleep mode
When a program streams any audio (even silence), the system doesn't go into sleep mode automatically after specified time of inactivity. Sound Keeper uses the NtPowerInformation(SystemPowerInformation, ...) function to retrieve time when system is going to sleep, and disables itself right before this time. On Windows 7, it works perfectly. Windows 10 waits for 2 minutes more after any sound was streamed, so the PC goes into sleep mode after 2 minutes when Sound Keeper disabled itself. For some reason, Windows 11 always reports that the system is going to sleep in 0 seconds. So, the workaround had to be disabled on this OS until a better solution is found. You can try to use the powercfg to workaround this issue at the system level. Details →
SoundKeeperSineF1000A0.1L1W10
SoundKeeperbrownA0.1L1W10
Strangely, two command line above in the filename didn't prevent it to go to sleep/off.
😅
But does any loud noise like SineF1000A10 prevent it from sleeping? Maybe it ignores any sounds and just sleeps based on a timer?
I now tries higher Sine Wave, starting from 24000
SoundKeeperSineF24000A0.1LW10
Will update here on what i found works.
it's been more than 20 minutes, and i can see that it still have the white dot on the display , meaning it's staying alive/on.
I guess it works?
I want to ask that if SoundKeeperSineF24000A0.1LW10 , correct? especially the last part of W
LW10 part makes no sense because L does not have a value here. You should either specify both L and W, or remove both of them. L is length of a sound, and W is wait time between sounds (both in seconds). I would recommend to use something like L1W300 that will make a 1-second sound every 5 minutes (300 seconds).
I definitely need to finish GUI part of this app to reduce amount of questions how to configure it =)
L 's default is infinite, does that mean I don't need to put L in the file name for it to go Infinite?
Yeah, it's the default.
Now i found one settings that finally worked, does the Soundbar volume level effect the program?
Stuart Lee,
It would be nice if you share name of your soundbar and settings that work for you.
It depends on how your soundbar works. If changing soundbar volume on the soundbar is not reflected in Windows anyhow, it can't affect Sound Keeper in any way. But the soundbar itself can take current volume into account when it tries to detect silence.
it worked yesterday, now it doesn't. Not sure what went wrong, haha... had to look into it..
My soundbar was ' EDIFIER B700 Dolby Atmost Soundbar '
By now it doesn't work , is when i first switch on the pc. I put the program in Startup folder though.
Still monitoring the soundbar. I switched off the pc, turn off the wall socket switch, wait for 15 seconds and turn back on the pc. The program was running in Task Manager ( startup programs ).
Will report here if the soundbar stays on or off.
I found the issue, it was i checked the option of the program's properties to ' run as administrator ' and that prevented it from running on start up properly.
Now i am trying to put my pc to sleep and let the soundbar goes to standby/off and wake my pc again to see the program works after pc wakes up.
I've tested for over 10 days since last post at 15 March. My soundbar now stays awake as long as my pc stays awake ( had to sacrifice sleep for pc ) .
Thanks , author.
Soundbar is Edifier B700 5.1.2 Dolby Atmos Soundbar.
So after testing on my Surface Laptop Studio 2 for quite a while, persistent audio doesn't prevent a machine from entering Modern Standby like it does with S3 sleep. I've also confirmed this by exiting SoundKeeper and simply playing music, my machine will enter Modern Standby after a while with music playing and this can be confirmed with Event Viewer as it can when just using SoundKeeper with default settings. This is great for users with newer hardware that supports Modern Standby as there is essentially no compromises when using SoundKeeper on these devices.
Hi Evgeny, thank you for making this excellent tool.
I've just purchased a couple of Xiaomi Sound Pocket Bluetooth 5.4 speakers to use with my Windows 11 laptop which has an Intel BE200 WiFi card with Bluetooth 5.4 and noticed that the speakers shutdown after 15 minutes of inactivity. I've tried every option in Sound Keeper, even white/brown noise and sine waves at audible frequencies and amplitudes (confirmed to be playing through the speakers), but nothing seems to keep the speakers awake.
The really confusing thing is music on Spotify or 50Hz/100Hz test tones on YouTube both keep the speakers awake, even when set to 1% or lower (inaudible) volume levels.
Do you have any idea what the issue could be, or anything I could try?
TaTa, so you tried SineF100A100 and it also couldn't stop the speakers from auto shutdown even though you could clearly hear the sound all the time? It might mean that the detection when the speakers should go into sleep mode is done somewhere in the drivers, and it has some kind of white list of software that is respected. But it sounds crazy for me.
Correct, I'm running the latest Intel Bluetooth drivers (23.60.0.1) and latest Windows 11 build (24H2 26100.1150).
Last night I tried downloading the same 50Hz test tone from YouTube which is proven to keep the speakers awake and played it in a loop using a few different programs - ffplay, LoopDropz and MPC-HC. All failed to keep the speakers awake.
I then tried Microsoft Media Player with the same file and the speakers stayed awake! So I think you might be on the right track with the white listed applications but this also seems absolutely crazy to me.
You gave me an idea though - I renamed SoundKeeper.exe to Microsoft.Media.Player.exe, chrome.exe and Spotify.exe and ran with various switches but no luck. I even tried with the exe in the appropriate application folders. If it is a white list it must be checking against some other criteria.
Looks like it's Intel drivers are trying to be too smart.
You can try to replace "Audio" to "Pro Audio" or "Playback" on this line and rebuild Sound Keeper (use VS2022 with C++ development components for building). Maybe these thread attributes are used somehow.
Also, you can try to remove setting of this attribute. Just remove these lines:
and
Rebuilt and tested all three variants - no luck unfortunately :(
I think I've found the issue - WASAPI.
I've switched a couple of audio players to Direct Sound and the speakers don't go to sleep.
Is it possible to switch Sound Keeper to Direct Sound?
Nope, you need to rewrite most of the code to use Direct Sound instead of WASAPI. In theory, Direct Sound is just a wrapper for WASAPI since Windows Vista, maybe it just uses WASAPI in some specific way that makes the driver satisfied. Also, I hardly believe that modern browsers use legacy Direct Sound (deprecated since 2006) in 2024, I'm quite sure that they rely on WASAPI.
Interesting, yeah I can see that DirectSound is deprecated.
The reason I thought this could be the issue - MusicBee lets you switch between DirectSound and WASAPI output. When DirectSound is selected the speakers stay awake, WASAPI they don't.
I also thought that Foobar2000 used DirectSound by default (using the 'Primary Sound Driver' output) but after doing some more digging I see that it switched to WASAPI in v1.6. Foobar2000 does keep the speakers awake so this definitely invalidates the theory.
Going back to MMCSS, Chrome sets AvSetMmThreadCharacteristics to "Pro Audio" and also sets AvSetMmThreadPriority to AVRT_PRIORITY_CRITICAL:
https://github.com/adobe/chromium/blob/master/media/audio/win/audio_low_latency_output_win.cc#L315
Do you think setting AvSetMmThreadPriority could help?
I tried setting AvSetMmThreadPriority to AVRT_PRIORITY_CRITICAL, no luck.
There are a lot of small things that could be done differently. For example, various flags that can be passed here to IAudioClient::Initialize. Try to replace AUDCLNT_STREAMFLAGS_NOPERSIST | AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM to NULL.
Also, a stream can be timer or event driven. Sound Keeper uses timer as the most robust approach that works for all hardware. You can try to use this sample from Windows 7 SDK to check if event-driven approach affects anything. It shouldn't, but who knows =) There is also a timer-driven sample from Microsoft too.
Replacing AUDCLNT_STREAMFLAGS_NOPERSIST | AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM with NULL didn't help. I'll have a look into other potential flags.
Built and ran WASAPIRenderSharedEventDriven.exe -f 100 -d 1200 -multimedia, no luck.
Built and ran WASAPIRenderSharedTimerDriven.exe -f 100 -d 1200 -multimedia, no luck.
¯\_(ツ)_/¯
I noticed that chromium and foobar2000 both set their rendering thread priority to time critical.
I tried adding this on line 88: SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
But not sure if that's the correct syntax and location (first time using cpp)?
It should be inside of the CKeepSession::StartRenderingThread if you want to apply it for the rendering thread.
I think I'm going to have to admit defeat, just can't get it to work.
Thank you for all your help!
Where is the 1.3.4
It's a current beta.
Been using this for years - set to SoundKeeperAll - and it's been fine. Just joined Windows Insider to install the latest update for something, and it stopped working.
After playing about with it I've got a batch file in my Startup folder set to:
SoundKeeper.exe brown -a 0.01
Issues mostly stem from using a soundbar (PC > soundbar > TV) and using FX Configurator to allow DD over HDMI. Even at SoundKeeperAll, I could open the Dolby Home Theatre app and see a line across the EQ, so I knew SoundKeeper was running, it just wasn't working correctly until I output the brown sound.
Thanks!
Hi again VEG.
I think I've figured out the issue of my speakers turning off. There needs to be an active audio app hooked into the Windows global media controls which appear in quick settings and the lock screen: https://www.elevenforum.com/t/enable-or-disable-media-controls-in-windows-11.11505/
foobar2000 has an advanced option to disable this hook and when I do this the speakers turn off after 15 mins. In the default enabled state they stay awake.
Not sure how to hook into this but would be awesome if SK could?
Thanks for the info. I'll look into it one day in the future, but it won't be soon.
Thank you, will look forward to it. Relevant info that I've found:
https://learn.microsoft.com/en-us/windows/uwp/audio-video-camera/integrate-with-systemmediatransportcontrols
https://learn.microsoft.com/en-us/uwp/api/windows.media.systemmediatransportcontrols
E.g. https://github.com/spmn/vlc-win10smtc/blob/master/vlc-win10smtc/module.cpp
I've tried to figure out how to add this myself but it's a bit beyond my skillset.
Hello, mind you suggest more setting beside in the post? i tried the default but its not working, but it's work when using the testing SineF1000A100, any setting suggestion? Thanks :D
Ucup, try to find the lowest values that still work for you, e.g. SineF1A1 or SineF10A5.
Hi Veg, Thanks, so apparently my speaker has dynamic working range of 180 Hz - 20k Hz, that is why the lower or upper frequency doesn't work. My speaker is JBL Go and this the working setting that i used SineF250A5L0.1W60.
Thanks again for this amazing software!
Stuart Lee, Would you be able to share your customizations?
Dave,
SoundKeeperSineF21000A0.1 , is what i put in the name of the file.... so far, i used for about four months since my last reply up above.
With nothing playing at my PC, the Edifier B700 Soundbar stays awake.
What soundbar you are using? I believe it works on all soundbars. In the end, it just output something we can't hear and trick the soundbar.
Stuart Lee, Thank you! I tested this setup, and unfortunately it doesn't work for me, although I'm also using a B700...
Moreover, even the test SineF1000A100 doesn't work for me, but for some reason BrownF1000A100 does.
And also, for some reason the value A0.1 is not perceived, at this value the soundbar turns off. Even at value A5 it turns off.
So far A10 works for me, and it's damn well audible. :(
And the F value doesn't seem to have any effect at all, no matter what I set..
I don't know what's wrong.
Anyway, thanks a lot for your setup, it was helpful.
Dave, all noise signals ignore frequency. Did you try Sine with low F values? For example, SineF5A10 or SineF10A10.
Oh, just noticed that even SineF1000A100 does not work even though it's perfectly audible I guess. That's interesting.
How much time do you need to wait until it turns off?
VEG, Hmm... For some reason I thought the noise was also frequency tunable, thanks for the hint.
Exactly, the F1000A100 is not working, and yes it can be heard very loudly, but nevertheless the soundbar turns off.
It turns off after 15 minutes.
Now tried lowering the "A" parameter from 10 to 6, and it turns out that A6 is the minimum at which the device is awake, and only when there is noise. At A5, it is already falling asleep, although the noise is still audible.
I don't know what else I can try to check, I seem to be at a dead end because I don't understand the patterns in the settings
Dave, maybe you'll be satisfied with BrownA6L1W840. It will make brown noise with 6% amplitude for one second every 840 seconds (once per 14 minutes). Maybe a shorter 0.5 second signal (BrownA6L0.5W840) would be enough too.
Apparently your soundbar is too smart so it needs more sophisticated signal to consider it as a proper sound. Maybe something better than brown noise could be found, something really inaudible, but I don't have such hardware for experiments.
VEG, Yeah, thanks, I've already thought of that solution to the problem...it's better this than nothing.
Although to be honest I was hoping that maybe there are other obvious solutions that I missed, or not obvious....
I'm also surprised that the person above has the same soundbar with which other settings work...but I don't have those settings working...I don't understand.
Dave,
If you connect it using Bluetooth, the issue might come from your Bluetooth driver that is different.
Hello... I have a new Microsoft Surface Laptop 7 ARM machine. I can be your guinea pig if you like for the ARM version. Need this utility for my Bose Companion 5 speakers to not go mute or on standby. The 64bit version works but native is obviously better. Let me know. Thank you for a great utility filling such a niche gap!
I have updated the beta and debug versions. Now there is a native ARM64 build. It uses a statically linked C runtime hence the bigger binary, but actual memory consumption should be 2-3 times lower than with emulation of x86. I tested it on Windows 11 for ARM64.
I'm running it now. Will let you know how it goes.
I did receive this message when installing. Maybe something you will fix in the final version.
Windows protected your PC
Microsoft Defender SmartScreen prevented an unrecognized app from starting. Running this app might put your PC at risk.
App: SoundKeeperARM64.exe
Publisher: Unknown publisher
Dave J, Windows shows it for all fresh unsigned executable files that Microsoft is not aware of yet. It's not "fixable" without buying an expensive code signing certificate. After some time, when enough people proceed to run it, Microsoft will start to consider this file safe and will stop showing this dialog to new users.
It's purely reputation based, and that dialog is shown when there is no reputation yet for a new executable file.