Interrupts and Windows in the year 2020

In times of Corona, I’m also working from home. Next to my gaming PC in its beautiful PowerMac G5 case is my workstation that I use to develop C++ on and that heats my flat with its up to 250 Watts (GPU excluded). To make the situation a bit less boring, I have my speakers playing music most of the day via my gaming PC and Windows 10.

For days, my listening experience was disturbed by small crackles and pops that occur irregularly every ten seconds to multiple minutes. Such drop-outs are not a bit annoying, but highly disturbing. Sometimes they are very pronounced, sometimes very subtle. Especially in the latter case, I wondered if the music really had a small jump, cut or spike at a certain place. No, it didn’t! But where do the drop-outs come from? The speakers are connected with 10 meters of optical TOSLINK cable to my gaming PC.

Some days before this phenomenon occurred, I took my speakers apart, out of curiosity. Uh, oh, did I damage something? That would have been an expeinsive adventure. I mean, where else should the noise come from except from defective electronics processing the optical, digital signal? It shouldn’t be the cable that has only been lying on the ground for a year, barely bent. The computer? No. We’re talking audio with 96 kHz, 24 bit, 2 channels and huge buffer sizes. Nothing fancy. Windows? I didn’t change a thing, except installing some updates. Spotify? Could be, they have a tendency for breaking things.

Workaround

As strange as it may seem, but rebooting the comuter helps. Really. Because the drop-outs only start after I put my computer into sleep mode.

Interrupts

Yet, that can’t be it. There must be a root cause. Searching “the internet” a bit, I found strange bits of information: How devices signal interrupts over PCIe seems to make a difference. mbk1969 summarizes nicely in their post about interrupts on Windows. It sounds far-fetched, I know. We’re talking about audio, not with real-time latencies of single-digit milliseconds, but some regular desktop audio with 20-100 ms latency. That’s not a hundret interrupts per second. But it made sense. After exiting sleep mode, my PC sometimes suffered from an interrupt storm for a minute where it went really sluggish. I looked up the interrupt mapping and indeed: My NVidia GPU shared an interrupt with the internal audio adaptor. A level interrupt, which triggers until it is cleared. If the software or hardware misses to do this, the interrupt repeats. That’s one way to create a storm of interrupts. Also, sharing the interrupt seems suboptimal and totally unnecessary.

Said mbk1969 also made a very handy tool to switch from level interrupt to MSI with just ticking a checkbox and rebooting. NVIdia GPUs support MSI for ages, my audio device too, probably. So I ticked the three checkmarks (integrated audio interface, GPU, GPU audio interface for HDMI):

check and reboot

check and reboot

After rebooting, everything still worked (phew). Some rounds of entering sleep mode later, everything still worked. Without any crackles and pops!

Bottom Line

As strange as it sounds, but NVidia is conservative with their consumer GPUs when it comes to interrupts and my mainboard is configured in a way that it unnecessarily shares interrupts between the GPU and audio chip. This plus probably strange behaviour of the GPU led to drop-outs in the audio output. It can be changed easily. But the GPU setting is reset every time the NVidia driver is updated…

Changing the interrupt setting from level interrupt to MSI solved the drop-out issue. Now, both devices have their own interrupts.

MSI_util_v2

If you need it and the original source might have vanished, here is the nice MSI_util_v2 by mbk1969:

MSI_util_v2.zip, MD5 566495427f95f14d327aa4c9634cbef6