Quick answer: Pygame mixer dropping sound effects with channel-occupied warning? Default mixer allocates 8 channels - call pygame.mixer.set_num_channels(32) at init or use a sound pool.

Bullet hit SFX intermittently silent during heavy combat. Console: RuntimeWarning: all 8 channels in use.

Raise channel count

pygame.mixer.init()
pygame.mixer.set_num_channels(32)

32 is plenty for most 2D games. Memory cost is negligible; the saved 8-channel default is from a much earlier era.

Or pool channels per category

Reserve channels 0-3 for music, 4-15 for UI/important SFX, 16-31 for ambient one-shots. Use pygame.mixer.Channel(n).play(sound) to keep categories from starving each other.

Stop oldest on overflow

Iterate channels, find the one with the lowest get_busy time, stop() it, replay. Better than silence for any SFX with a strong onset.

“Channel limits are a 1995 mixer assumption. Override the default at init and forget it.”

Pre-load every sound into a dict at game start. Mixer warmup is fast but the first play of a fresh Sound is meaningfully slower than subsequent plays.