Monday, August 1, 2011

Guide: Reducing audio skipping and stuttering

Many of the advanced features of gmmp can consume a good amount of cpu so this is a guide for getting playback as smooth as possible.

To start I would like to explain why these features can consume a lot of CPU time.  In order to provide some of the advanced features like gapless playback, equalization, and extra format (flac, wv, wma, ape) support I had to write my own code to read in the audio data, decode it, then send it to the audio device for output. I will refer to this as the "audioengine". Normally you can just use a built in java class (MediaPlayer)provided by google to play an audio track, but the features I mentioned are simply not possible to do with the MediaPlayer class.

As time goes on it seems google is adding more features that make it possible to do some of these things just by simply using the built in API.  Examples of this are equalizer support in 2.3+ and flac support in 3.1+.  GMMP is smart enough to use the built in features when possible, then fall back to the audioengine if needed.  The built in features typically will take advantage of any additional hardware (dsp chips) on the device to reduce the amount of CPU needed.  The audioengine runs purely in software.

The following are settings you can tweak to improve playback.

1)  If you do not care about gapless playback or an equalizer, disable them.  This will force the android MediaPlayer to be used over the AudioEngine for all the supported formats.
Preferences -> Audio -> Uncheck Gapless Playback
Equalizer View->Menu->Toggle EQ (hit until you see Status: Disabled)

2) Adjusting Priority:  There are 2 priority settings you can play around with: Playback Priority and Decoding Priority.  This will cause the playback and decoding to be giving higher cpu priority over other processing running on the device.  I've found some devices actually skip more if the highest priority is used.  Each device is different so you will need to play around with the priorities to find the sweet spot.  Adjusting decoding priority will have much more of an effect than the playback priority.
Preferences -> Audio -> Playback Priority and Decoding Priority

3) Buffer size:  You can adjust how much memory is allocated to buffer the audio data before playback.  If you tried 1 and 2 above and still get skipping, try increasing the buffer size.
Preferences -> Audio -> Playback Buffer Size

Optimizing your equalizer settings:
If you are using the equalizer and are still getting skipping after doing everything suggested above, try the following:

1) Decrease the EQ quality
Preferences -> Audio -> Equalizer -> Quality

2) Lower the amount of bands used
Preferences -> Audio -> Equalizer -> Number of Bands

3) Take advantage of the preamp setting.  The preamp uses next to no CPU time at all so use it.  A band that is set to 0 dB will be skipped during processing.   So set your bands so you have as many at zero as possible.  Instead of settings like this: preamp 0, b1 +3, b2 +2, b3 -1, b4 +2, b5 +2,  use this:  preamp -2, b1 +1, b2 0, b3 -3, b4 0, b5 0.   Only 2 bands need to be processed which saves CPU and the overall sound should be somewhat similar.

Edit:  If you want to use an equalizer but nothing above works and you have 2.3 or higher, you can try using the android EQ instead (Preferences - > Audio  -> Equalizer -> uncheck Use GMMP EQ)  The quality is not nearly as good but the playback should be smoother