Actually the plot thickens on this one. Notice how there's no user code on the stack at all? At the point the crash happens, there are still a few more steps in the shutdown process (going by my own console output), and yet here you can see that main() has already returned. I'm completely baffled.

One case where it's useful is if you want to output, say, 8- and 16-bit audio in the same app (maybe your game has some sort of retro effect or something), you can't actually create an 8-bit mixer so you need to make the voice 8-bit. In this case you would need 2 voices.

A more practical use case is that Allegro won't let you attach a mixer to another mixer unless the formats match, whereas voices have automatic conversion. For this reason the Mixer objects in my JS-based minisphere game engine encapsulate both a mixer and a voice. Since the JS code could create a mixer of any format, attaching it to the default mixer is likely to fail. It's easier just to create multiple voices at that point and let the OS handle mixing them all together.