[openal] ALC_SOFT_reopen_device extension proposal

Chris Robinson chris.kcat at gmail.com
Thu Dec 2 13:31:39 EST 2021

This extension is primarily designed to allow apps to change which output an 
OpenAL device plays on without having to destroy and recreate everything. This 
can be in response to a device becoming disconnected and wanting to move the 
context and everything to another still-accessible device, or the default 
device changing (although the app is responsible for detecting that, either 
with system calls or manually polling the default device regularly; a future 
extension is expected to address this shortcoming), or changes in the app's 
configuration desiring a different output.

State is obviously maintained when reopening, so a playing source will 
continue playing on the new device right where it left off on the old one. 
OpenAL itself won't miss anything, although this isn't guaranteed to be break-
free if the system decides to drop buffered samples when the old output is 
stopped and closed as the new one is opened and started. It's implemented in 
current Git under ALC_SOFTX_reopen_device, and will be renamed to 
ALC_SOFT_reopen_device when the extension is finalized after any changes or 
adjustments to the API are made.

Any questions, comments, and suggestions are welcome.
-------------- next part --------------



    Chris Robinson


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


    In progress


    This extension is for OpenAL 1.1.
    This extension interacts with ALC_EXT_disconnect.


    This extension provides a mechanism for applications to move the output of
    a device from one endpoint to another. Standard OpenAL devices are
    associated with an output on the system upon being opened, but if the
    endpoint should no longer be the desired output, there is no method for
    the application to easily change it. The only option for the application
    is to delete all AL objects, destroy the context, close the device handle,
    open a new device, and reload/recreate the necessary resources. A method
    to more simply move the device with its existing resources to a different
    output is easier, requiring less management from the application.


New Procedures and Functions

    ALCboolean ALC_APIENTRY alcReopenDeviceSOFT(ALCdevice *device,
        const ALCchar *deviceName, const ALCint *attribs);

Additions to Specification

    Reopening a Device

    Once a playback device is opened, it becomes associated with a particular
    output endpoint. When this output is no longer the desired output, the
    playback device can be reopened to re-associate it with a potentially
    different output endpoint using alcReopenDeviceSOFT.

        ALCboolean alcReopenDeviceSOFT(ALCdevice *device,
            const ALCchar *deviceName, const ALCint *attribs);

    The <device> handle must be a non-NULL handle for an existing device.
    <deviceName> is the device name to open, or NULL for the default (same as
    would be passed to alcOpenDevice). <attribs> is an attribute list to
    configure the device with, with the same attribute list that would be
    passed to alcCreateContext.

    Returns ALC_TRUE on success, with output now on the requested device name.
    If the device was in a disconnected state with the device's ALC_CONNECTED
    attribute being ALC_FALSE, the device is also restored to a connected
    state. On failure, the device remains associated with the previous output,
    ALC_FALSE is returned and an error is generated that can be queried with
    alcGetError using the device handle.

More information about the openal mailing list