一般来说,在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
答案 0 :(得分:0)
从AL_EXT_disconnect扩展中的讨论来看,这似乎不可能:
我们是否应该在断开连接后做出有关缓冲区数据的承诺?
决议:否。
AL目前无法恢复缓冲数据, 并且共享缓冲区的所有上下文必须位于同一设备上。 因此,在断开连接的情况下,所有缓冲区数据都将丢失。 应用程序将需要重新上载所有缓冲区 打开新设备后的数据。如果未来的扩展暴露 一种从AL恢复缓冲区数据的方法,它应该修改 这个规范。
到目前为止,我还没有找到恢复缓冲区数据的扩展程序。但是,可能值得将此问题引导至openal mailing list。
编辑:stackoverflow上的另一个relevant discussion:
所有al *函数(而不是alc *函数)都在当前上下文中运行。因此,alGenBuffer调用将在当前上下文中运行并创建属于Context的Device的Buffers(Context只能有一个Device)。
在一台设备上创建的缓冲区在另一台设备上不可用。
当你调用alcCloseDevice时,(可能)会自动销毁设备的缓冲区。