Maybe I’m nitpicking but you are very close to bit 24 and most DACs don’t resolve the lower bits very well
Good DACs are linear to 18-20, only the ones with the whisper quit circuits can resolve 22 bits correctly.
A simple passive attenuator?
http://thewelltemperedcomputer.com/Intro/SQ/VolumeControl.htm
I used to use a passive line-level attenuator, and it's not a bad solution, but I prefer my current setup because it preserves the ability to get very loud if need be.
I may be losing a few bits towards the bottom, but based on the math in my particular setup, I'm not sure it matters. Let me lay it out; let me know if I've gotten something wrong along the way:
I use volume leveling, so the exact amount of digital attenuation varies, but on average the reduction from volume leveling and my normal internal volume settings adds up to around -40dB total. The music is typically around 75dB RMS right in front of the speakers (based on my measurements). The noise floor in my listening room is between 25 and 40 dB depending on the time of day (again based on my measurements). So the difference between my noise floor (in the best case) and the average listening volume is about 50dB. Add that to the 40 dB I'm throwing away through attenuation and you get 90 dB. So any sounds reproduced below -90dBFS would be very challenging for me to hear, even in the best circumstances.
That means, even with 16 bit output (96dB), I've got a little breathing room (6dB), but I agree that that would be shaving it fine as sometimes I attenuate even more than 40dB. So I set it to 24 bits, and you're quite right, 24 bit DACs rarely fully realize the extra 8-bits. So let's assume I'm only getting three additional bits from the 24bit output (effective 19-bit output) that would be 114dB of dynamic range . That means the quietest bit (-114dBFS) at my normal listening volume would be right around 1dB, which is near the theoretical limit of human hearing in an anechoic chamber.
So if I'm losing sound below that, I'm not sure it matters, even in theory. Maybe I nerfed the math somewhere?