[openal] AL_SOFT_source_spatialize proposal

Chris Robinson chris.kcat at gmail.com
Sat May 6 16:18:12 EDT 2017


Here's one that's a little more involved with modifying existing spec 
behavior. The main intention of this is to allow apps to play a stereo 
sound localized when emanating from the listener, and play the same 
sound non-localized when emanating from elsewhere.

Normally in that scenario, the app would be required to create two 
versions of the sound to handle this, the original stereo one to play 
when localized and a second mono one to play when non-local. This 
increases the amount of work the app has to do to generate and manage 
audio buffers, and increases the amount of memory used (about 50% more 
per stereo buffer used this way). To say nothing of the difficulty in 
dealing with a source that may move between being local and non-local 
while playing.

The only thing I'm really unsure of, and would like feedback on, is what 
kind of attenuation (if any) should be applied to a down-mixed sound. 
Normally you see an attenuation of 1/channels or sqrt(1/channels) when 
down-mixing to mono, but there's a case to make for letting the app deal 
with it and not try to invisibly correct it.

Also, I'm not too thrilled with the new name AL_AUTO_SOFT to indicate 
preexisting behavior (automatically allow spatialization or not 
depending if playing a mono buffer or not, respectively). The 
alternative I thought of is AL_DONT_CARE_SOFT, but to me that makes it 
seem like the lib is more free to select one than it really does.

Thoughts, opinions, questions?
-------------- next part --------------
Name

    AL_SOFT_source_spatialize

Contributors

    Chris Robinson

Contact

    Chris Robinson (chris.kcat 'at' gmail.com)

Status

    In Progress

Dependencies

    This extension is for OpenAL 1.1.

Overview

    This extension provides more control over the spatialization behavior of
    sources. By default, OpenAL will spatialize sources playing a mono buffer
    and not spatialize sources playing a multi-channel buffer. Spatialization
    features include positional panning, distance attenuation, cone-related
    attenuation, and doppler effects. This extension allows such features to
    be enabled and disabled per-source independently of the buffer format.

Issues

    Q: Most 3D audio systems don't allow panning non-mono sources due to
       problems with correctly rendering the soundfield in 3D space. How is
       this dealt with?
    A: When a spatialized source plays a non-mono buffer and has a non-0
       distance from the listener, the channels are down-mixed to mono and
       panned as appropriate (that is, all channels occupy the same spot in
       3D space). An exception is the LFE channel of buffer formats that
       include one. The LFE input is sent separately to LFE output as normal,
       rather than being down-mixed and panned. It is still influenced by
       distance and cone attenuation however.

       When such a source occupies the same position as the listener, it is
       played with separated channels as if it was not spatialized (including
       being unaffected by listener orientation). But it still receives
       doppler effects and cone-related attenuation.

    Q: When a multi-channel source is down-mixed for spatialization, is any
       extra attenuation applied from multiple channels occupying the same
       space?
    A: Undetermined. Typically down-mixing a multi-channel sound to mono sees
       gain correction in the form of 1/num_channels or sqrt(1/num_channels).
       However, not applying the given correction gives full control to the
       application to do what it wants without OpenAL in the way.

    Q: What happens to a mono source that is played without spatizalization?
    A: A mono source without spatialization will not have distance or cone
       attenuation, directional panning, or doppler effects, as expected. Its
       perceived location may either be centered (i.e. equal energy from all
       directions) or front-center, but its perceived location should be
       consistent with a 0-distance spatialized mono source.

New Procedures and Functions

        None.

New Tokens

    Accepted as the <param> parameter of alSourcei, alSourceiv, alGetSourcei,
    and alGetSourceiv:

        AL_SOURCE_SPATIALIZE_SOFT                0x1214

    Accepted as the <value> of the AL_SOURCE_SPATIALIZE_SOFT property:

        AL_AUTO_SOFT                             0x0002

Additions to Specification

	Controlling Source Spatialization

    A source may have spatialization features applied depending on its
    AL_SOURCE_SPATIALIZE_SOFT property. Valid values for the property are
    AL_FALSE, AL_TRUE, and AL_AUTO_SOFT. When set to AL_FALSE, spatialization
    features are never applied to the source. When set to AL_TRUE, they are
    always applied. When set to AL_AUTO_SOFT, they are applied if playing a
    buffer with one channel, and not if the buffer has more than one channel.
    The default is AL_AUTO_SOFT.

    When spatialization features are applied on a source playing a non-mono
    buffer, if the source occupies the same 3D position as the listener the
    buffer's channels are placed around the listener according to the format
    (e.g. a stereo buffer has the left channel 30 degrees left of front, and
    the right channel 30 degrees right of front). This panning is NOT effected
    by the source direction or listener orientation.

    If the source does not occupy the same 3D position as the listener, the
    proper panning direction is calculated and all channels of the buffer will
    be panned to that direction (effectively down-mixing the buffer to mono
    dynamically). An exception is the LFE channel in buffer formats that
    include one. The LFE channel may be sent to the LFE output as normal and
    not panned, however it is still attenuated.

Errors

    An AL_INVALID_VALUE error is generated if the value specified for
    AL_SOURCE_SPATIALIZE_SOFT is not AL_FALSE, AL_TRUE, or AL_AUTO_SOFT.


More information about the openal mailing list