Qball's Weblog
Reduce MPD power consumption
Saving power when using MPD.
On your laptop battery power is everything? but playing music means a lot too.
Playing music can easily decrease your battery life significant. For example on my netbook it cost me 22% battery, this is the difference between almost 9.5 hours of battery life time and just 7.5 hours.
So what can we do? (this guide is based on debian testing)
- Avoid dmix. DMIX causes re-sampling and worse it (for me) causes the soundcard to use small internal buffers.
In mpd make an output like:
audio_output{ type "alsa" name "my alsa" device "hw:0,0" }
This stops MPD from using dmix.
- Force 16 bit.
When decoding mp3′s the result is send to your soundcard (if it accepts this format, most modern soundcards do) in S32_LE (32 bit).
Using 32bit is pointless, most laptop soundcards have so much distortion and noise they cannot reproduce output with details described in more then the first 13-14bits.
Forcing 16 bits, allows you to store twice the amount of samples in the soundcard buffers, so less wake ups to refill it.
audio_output{ type "alsa" name "my alsa" device "hw:0,0" format "44100:16:2" }
- Increase buffer/period time.
The larger the buffers, the less wakeups are needed to refill them.
My card supports a period_size of 8192 samples and a buffer_size of 16384 samples. This means we need to refill the buffer 5.3 times a second. (before step one it was refilled more then 82 times a second, so this reduces the wake ups of the card a 15 fold).
You can check f.e. powertop to see how often the soundcards interrups the system.
In MPD you can set buffer_time and period_time. The default for buffer_time is large enough (0.5 seconds), however period_time is small (around 512 samples) so we increase this. So lets set this at 200ms. (MPD will find the largest closest supported value).
audio_output { type "alsa" name "My ALSA Device" device "hw:0,0" format "44100:16:2" period_time "200000" }
Doing all these steps dropped the number of wakeups from hda_intel to +- 5.3 a second. MPD dropped to 13 wakeups a second. This resulted in a powerdrop from 12W to 10.6W (during writing this), resulting in giving me more then an extra hour of battery life time.
(for me blacklisting uvcvideo and usb_storage (webcam + cardreader) saves me around 0.6W. (even when they are unused)).