[openal] a new panning matrix ChannelMap?

Chris Robinson chris.kcat at gmail.com
Thu Apr 2 10:46:31 EDT 2015

On 04/02/2015 02:11 AM, Ben Simons wrote:
> I have an RME Fireface UFX. A linux connection to it allows 22 channels.
> Speakers set up in a 360-degree ring.
> Looking at Alc/panning.c the co-efs in aluInitPanning() appear to be a
> matrix,
> but I can't quite decode it.


The panning matrices are actually B-Format decoder coefficients. OpenAL 
Soft effectively pans mono streams into 3rd Order Ambisonics, which uses 
16 specialized channels (completely uncorrelated to physical speaker 
channels), then uses the coefficients to decode those channels to the 
output speaker configuration[1].

The existing coefficients were generated using the Ambisonic Decoder 
Toolbox, a set free of free MATLAB scripts (compatible with GNU Octave) 
to generate B-Format decoder coefficients. You can use any other method 
of generating decoder matrix values however, just make sure to use FuMa 
channel ordering.

The channel maps in panning.c are arranged like this:
{ Channel, {{ Up to 3rd Order coeffs }, { 1st Order coeffs }} }

The reason for the separate set of 1st Order coefficients is because the 
B-Format OpenAL extension provides buffer formats for 1st Order audio 
content, which can't really be decoded with 2nd or 3rd Order 
coefficients (well it can, but it won't sound that good), and I don't 
know how to generate 1st Order coefficients from a 2nd or 3rd Order set.

[1] It actually works a bit different than that, though that's the 
effective result. See the description of commit
for more information.

More information about the openal mailing list