I was afraid you would mention offloading! :-)
OK, so offloading is yet another way for audio to be played.
So here's the distinction between deep buffer and offloaded tracks:
- Deep buffer tracks are decoded from MP3, AAC, etc. to PCM on app processor
and then written as PCM to HAL [driver].
The buffer size is larger than normal mixer's typical 20 milliseconds,
perhaps on the order 100 to 200 milliseconds or so.
The key thing is that app processor still needs to wake up several times a second,
and must run the software decoder on app processor.
This does save wakeup & context switch time relative to normal tracks,
but the decode time is the same. Implementation is mostly portable,
although it does require device to support multiple concurrent output streams
(recall that FastMixer is also using a stream), so not all devices can do it.
- Offloaded tracks are new for Android 4.4 (KitKat),
and implementation is even more device-specific. It is enabled on Nexus 5.
Offloaded track data is transferred from app processor to HAL/driver
in encoded format (MP3, AAC, etc.). Decode is then (partially) implemented
in hardware, typically by a DSP attached to app processor.
This has the advantage of even fewer app processor wakeups,
and no decode on app processor. Presumably the DSP is optimized
for decode and so can do it more efficiently than app processor.
Also as the data sent to DSP is in encoded format which is much smaller,
a given buffer size can translate to longer elapsed time per buffer,
on the order of seconds.
The principle downside to offloading is that it requires a DSP,
and the greater complexity of implementation.
To read more (either documents or source) about deep buffers,
grep -r AUDIO_OUTPUT_FLAG_DEEP_BUFFER frameworks/av/*
grep -r AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD frameworks/av/*
These grep results will give you the starting points for your code reading.
Then continue following the code from there. Adding logs is always helpful! :-)