TODO: - directsound: incomplete and somewhat broken - osx: understand why AudioQueueGetCurrentTime can return negative mSampleTime - test (and fix) sub-prefill size data playback - report stream delay instead of position; leave position calculation to user - capture support - capture and output enumeration and configuration - also expose default hardware config to allow decisions on speaker layout - prefill occurs at different times in each backend: - pulse prefills async off worker thread after init - coreaudio prefills during init - alsa prefills async after start - expose configured prefill size; may differ from requested latency - solved by exposing stream delay - xruns may occur in user callback but also in audio hardware may need to expose details of hardware xruns to user api - document thread safety - document which calls may block, and when effects take effect - document what's permissible inside callbacks - implement basic channel mapping for surround - vorbis has documented mapping based on channel count (if mapping type == 0) -- http://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-800004.3.9 1 -> M 2 -> L, R 3 -> L, C, R 4 -> L, R, RL, RR 5 -> L, C, R, RL, RR 6 -> L, C, R, RL, RR, LFE 7 -> L, C, R, SL, SR, RC, LFE 8 -> L, C, R, SL, SR, RL, RR, LFE >8 -> application defined - wave files with channel count only 3 -> L, R, C 4 -> L, R, RL, RR 5 -> L, R, C, RL, RR 6 -> L, R, C, LFE, RL, RR 7 -> L, R, C, LFE, RC, SL, SR 8 -> L, R, C, LFE, RL, RR, SL, SR - wave files with WAVE_FORMAT_EXTENSIBLE have explicitly mappings, can extract these - implement configurable channel mapping