更改AudioContext设备但保持OpenAL状态

时间:2014-04-25 22:56:46

标签: c# audio openal opentk

一般来说,在OpenTK或OpenAL中,我需要更改输出设备,而不必重新为我的资源重做所有AL工作。是否可以在不干扰OpenAL状态的情况下更改AudioContext中的输出设备?

例如:我正在使用以下方式更改AudioContext:

context = new AudioContext(deviceName, 0, 0, false, false);
context.MakeCurrent();

但这会让我不得不重做:

BufferIds = AL.GenBuffers(3);

对于每种资源。

我想要的只是改变输出设备,我需要一种方法来保持OpenAL状态,或者在新的AudioContext中存储和重新加载OpenAL状态的方法。

如果我认为AudioContexts的想法都错了,请不要拖延= S

Gr.Viller

1 个答案:

答案 0 :(得分:0)

AL_EXT_disconnect扩展中的讨论来看,这似乎不可能:

  1. 我们是否应该在断开连接后做出有关缓冲区数据的承诺?

    决议:否。

    AL目前无法恢复缓冲数据,   并且共享缓冲区的所有上下文必须位于同一设备上。   因此,在断开连接的情况下,所有缓冲区数据都将丢失。   应用程序将需要重新上载所有缓冲区   打开新设备后的数据。如果未来的扩展暴露   一种从AL恢复缓冲区数据的方法,它应该修改   这个规范。

  2. 到目前为止,我还没有找到恢复缓冲区数据的扩展程序。但是,可能值得将此问题引导至openal mailing list

    编辑:stackoverflow上的另一个relevant discussion

      

    所有al *函数(而不是alc *函数)都在当前上下文中运行。因此,alGenBuffer调用将在当前上下文中运行并创建属于Context的Device的Buffers(Context只能有一个Device)。

         

    在一台设备上创建的缓冲区在另一台设备上不可用。

         

    当你调用alcCloseDevice时,(可能)会自动销毁设备的缓冲区。