Use size_t for the vector size and capacity
Copy the null terminator from the string instead of appending it
Add a cast for MSVC
Use VECTOR_FIND_IF instead of manual loops
Use helpers to set the gain step values
Don't use ComputeAngleGains for SetGains
Make ComputeAngleGains use ComputeDirectionalGains
Store default speaker configurations in a struct
Add a helper to search for a channel index by name
Fix stereo device configuration
Avoid taking the square-root of the ambient gain

Although it is more correct for preserving the apparent volume, the ambisonics-
based panning does not work on the same power scale, making it louder by
comparison.
Make alcSuspendContext and alcProcessContext batch updates

This behavior better matches Creative's hardware drivers and Rapture3D's OpenAL
driver. A compatibility environment variable is provided to restore the old
no-op behavior for any app that behaves badly from this change (set
__ALSOFT_SUSPEND_CONTEXT to "ignore").

If too many apps have a problem with this, the default behavior may need to be
changed to ignore, with the env var providing an option to defer/batch instead.
Don't attempt to match a channel input to output

I don't like this, but it's currently necessary. The problem is that the
ambisonics-based panning does not maintain consistent energy output, which
causes sounds mapped directly to an output channel to be louder compared to
when being panned. The inconcistent energy output is partly by design, as it's
trying to render a full 3D sound field and at least attempts to correct for
imbalanced speaker layouts.