I like music a lot and I spend a large chunk of my time with either over-the-ear headphones or in-ear monitors on. Sadly, human ears are fragile things and you should always try to keep the volume as low as possible when using headphones.
When I'm not at home, I usually stream music from my home server to my Android device. Although the DAC quality on my Nexus 5 isn't incredible, my IEMs aren't stellar either.
Sadly, I've always been displeased with how little control Android actually gives you over the media volume and I've always wished I could have the lowest setting even lower.
I know a bunch of proprietary apps exist on the Google Play Store to help you achieve that kind of thing, but hey, I don't swing that way.
Android Audio Policies
After having a look at Android's audio policies documentation, it turns out if you have a rooted device, you can define the audio level curve yourself!
On a recent-ish version of Android, the two files you want to mess with are:
/vendor/etc/audio_policy_volumes.xml, which defines what type of audio stream (media, phone calls, earbuds, bluetooth, etc.) uses what type of audio curve.
/vendor/etc/default_volume_tables.xml, which defines the default audio curves referenced in the previous file.
If you've never modified files on Android, I highly recommend plugging your
device to a computer, enabling USB debugging and connecting through
will likely need to remount the filesystem, as it's in read-only mode by
$ adb shell $ su $ mount -o remount,rw /system
I don't really care about anything else than media volume, so here is the curve I ended up with. It goes very low and gives you more control at low volume, while still being quite loud at maximum volume. You will need to experiment with your device though, as DACs are all different.
<reference name="DEFAULT_MEDIA_VOLUME_CURVE"> <!-- Default Media reference Volume Curve --> <point>1,-9000</point> <point>10,-8000</point> <point>20,-7000</point> <point>30,-6000</point> <point>40,-4000</point> <point>60,-3000</point> <point>100,-2000</point> </reference>
For reference, the scale goes from
0 being the loudest sound
your device can produce.
As all things Android, if you are not building your own images, this will get erased next time you update your device. Don't forget to backup the files you modify, as audio curves are easy to screw up!