Thanks, Glenn. I'll take a look at those. On Thursday, March 6, 2014 12:26:24 PM UTC-8, Glenn Kasten wrote: > > 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! :-) > > On Thursday, March 6, 2014 12:08:53 PM UTC-8, AudioLinger wrote: >> >> Hi Glenn, >> >> Thanks for your reply, it's very helpful and confirms most of the things >> I've discovered in my investigation. >> >> As a short followup question, where can I read more (either documents or >> source) about deep buffers? I enabled logging and added some custom log >> messages in AudioFlinger::PlaybackThread::threadLoop_write(), and I see >> that it writes to two different sinks depending on the application. One of >> them (the "normal sink") writes frames of audio depending on how I >> configure AudioFlinger, and the other one writes to an AudioStreamOut (HAL >> object) directly. Whenever the latter happens, I also see messages about >> offloading printed. Is this in any way related to deep buffers or >> fast/normal mixer selection? >> >> On Thursday, March 6, 2014 7:10:13 AM UTC-8, Glenn Kasten wrote: >>> >>> See attached diagram "Audio playback architecture.pdf". >>> This shows 3 major paths that audio can be played out, >>> however these are not the only paths. >>> >>> 1. Low latency tracks are mixed directly by fast mixer. >>> They have attenuation applied, but no resampling or app processor >>> effects. >>> >>> 2. Normal latency tracks are mixed by normal mixer, >>> and in addition to attenuation can have optional resampling >>> or app processor effects applied. Both of the latter can use >>> significant CPU time, and may be bursty in CPU consumption, >>> thus this is why they are limited to normal tracks. >>> The output of normal mixer is a single fast track (via a memory pipe), >>> which then is treated as (1) above by fast mixer. >>> >>> 3. Deep buffer tracks, used for music playback with screen off, >>> go through a similar path as #2 but without the fast mixer part. >>> After the mix is done, it is written directly to HAL. >>> >>> There are other paths but they are less relevant to your question. >>> >>> So to answer your question: no there is no single point. >>> If you're applying CPU-intensive processing, I would recommed >>> adding them to the normal mixer path used for #2 and #3. >>> Avoid adding them to fast mixer as this will likely cause >>> performance problems for lower latency tracks. >>> >>> >>> On Wednesday, March 5, 2014 6:20:02 PM UTC-8, AudioLinger wrote: >>>> >>>> Hi all, >>>> >>>> I've been reading through AudioFlinger and audio hardware code looking >>>> for the place where all audio from all tracks and sessions comes together. >>>> My initial guess was the audio mixer, but there are now two audio mixers >>>> (the normal one and the FastMixer). When looking at the ssize_t >>>> AudioFlinger::PlaybackThread::threadLoop_write() method inside >>>> frameworks/av/services/audioflinger/Threads.cpp, depending on existence of >>>> a "normal sink" we either process audio through a mixer or, if I >>>> understand >>>> it correctly, send it directly to the hardware to take care of. My goal is >>>> to be able to process all audio (except phone call and other such special >>>> things) that the device outputs. The above mentioned method was my best >>>> guess, but even at that point it splits into different mixing strategies. >>>> >>>> Any pointers? >>>> >>>
-- -- unsubscribe: android-porting+unsubscr...@googlegroups.com website: http://groups.google.com/group/android-porting --- You received this message because you are subscribed to the Google Groups "android-porting" group. To unsubscribe from this group and stop receiving emails from it, send an email to android-porting+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.