Audio 对通过OpenAL播放的声音的编程访问

Audio 对通过OpenAL播放的声音的编程访问,audio,openal,Audio,Openal,我正在使用一个广泛使用OpenALAPI的应用程序。特别是,有多个声源、非平凡的侦听器过滤器等 我希望能够以比实时更快的速度运行此应用程序。同时,必须保存声音,以便以后进行后处理。有没有一种方法可以通过编程(虚拟)访问OpenAL输出,而无需在真正的播放设备上播放声音 理想情况下,我希望在我的应用程序的主循环的每一次滴答声中都能播放访问。通常,一个勾号对应一个渲染帧(例如1/30秒)。但在这种情况下,我们将尽可能快地运行该应用程序。在将音频数据发送到OpenAL之前,您是否能够对其执行所需的功能

我正在使用一个广泛使用OpenALAPI的应用程序。特别是,有多个声源、非平凡的侦听器过滤器等

我希望能够以比实时更快的速度运行此应用程序。同时,必须保存声音,以便以后进行后处理。有没有一种方法可以通过编程(虚拟)访问OpenAL输出,而无需在真正的播放设备上播放声音


理想情况下,我希望在我的应用程序的主循环的每一次
滴答声中都能播放访问。通常,一个勾号对应一个渲染帧(例如1/30秒)。但在这种情况下,我们将尽可能快地运行该应用程序。

在将音频数据发送到OpenAL之前,您是否能够对其执行所需的功能?当javax.sound.sampled被
SourceDataLine
中的blocking write()方法解开时,我已经用它做了很多工作,尤其是当保存到文件而不是回放时

从我对OpenAL所知的一点来看,在发送数据时也会发生阻塞过程,其中包含一个管理的数组队列。我一直想进一步调查这件事


(这里可能没有太大帮助。抱歉。)

在音频数据发送到OpenAL之前,您是否能够使用它执行所需的功能?当javax.sound.sampled被
SourceDataLine
中的blocking write()方法解开时,我已经用它做了很多工作,尤其是当保存到文件而不是回放时

从我对OpenAL所知的一点来看,在发送数据时也会发生阻塞过程,其中包含一个管理的数组队列。我一直想进一步调查这件事


(这里可能没有什么帮助。抱歉。)

我们最终使用OpenAL软件来完成这项工作。例如:

#include "alext.h"
LPALCLOOPBACKOPENDEVICESOFT alcLoopbackOpenDeviceSOFT;
alcLoopbackOpenDeviceSOFT = alcGetProcAddress(NULL,"alcLoopbackOpenDeviceSOFT");
用此设备替换默认设备

ALCcontext *context = alcCreateContext(device, attrs);
将属性设置为默认设备的属性

然后在主循环中使用:

LPALCRENDERSAMPLESSOFT alcRenderSamplesSOFT;
alcRenderSamplesSOFT = alcGetProcAddress(NULL, "alcRenderSamplesSOFT");
alcRenderSamplesSOFT(device, buffer, 1024);

在这里,缓冲区将存储1024个样本。此代码的运行速度比实时速度快,因此您可以在每次使用OpenAL软件完成此操作时对帧进行采样。例如:

#include "alext.h"
LPALCLOOPBACKOPENDEVICESOFT alcLoopbackOpenDeviceSOFT;
alcLoopbackOpenDeviceSOFT = alcGetProcAddress(NULL,"alcLoopbackOpenDeviceSOFT");
用此设备替换默认设备

ALCcontext *context = alcCreateContext(device, attrs);
将属性设置为默认设备的属性

然后在主循环中使用:

LPALCRENDERSAMPLESSOFT alcRenderSamplesSOFT;
alcRenderSamplesSOFT = alcGetProcAddress(NULL, "alcRenderSamplesSOFT");
alcRenderSamplesSOFT(device, buffer, 1024);

在这里,缓冲区将存储1024个样本。此代码的运行速度比实时速度快,因此您可以在每次
勾选

时对帧进行采样。基本上,我有一个现有的应用程序,我希望运行速度比实时速度快。除此之外,我希望捕获应用程序生成的声音。声音子系统相当复杂,涉及多个发射器、滤波器、多普勒频移等。所有这些都由OpenAL处理。理想情况下,我希望提取通常发送到声卡的声音样本,并在应用程序执行时获得对这些样本的运行时访问权。可能会在缓冲区发送到播放点之前拦截数据。我的出发点是寻找这一点。令人沮丧的是,通常声音库并没有用于直接处理数据的挂钩:例如,Java剪辑、JavaFX声音、大多数mp3和ogg/vorbis库。例外:Java的SourceDataLine和Android。我想编写一个包装器,允许将声音库的输出发送到LWJGL,但又遇到了这个障碍。我开始做包装纸,但在遇到复杂情况后,我把它放在了次要位置。应该重新访问。基本上,我有一个现有的应用程序,我想运行得比实时快。除此之外,我希望捕获应用程序生成的声音。声音子系统相当复杂,涉及多个发射器、滤波器、多普勒频移等。所有这些都由OpenAL处理。理想情况下,我希望提取通常发送到声卡的声音样本,并在应用程序执行时获得对这些样本的运行时访问权。可能会在缓冲区发送到播放点之前拦截数据。我的出发点是寻找这一点。令人沮丧的是,通常声音库并没有用于直接处理数据的挂钩:例如,Java剪辑、JavaFX声音、大多数mp3和ogg/vorbis库。例外:Java的SourceDataLine和Android。我想编写一个包装器,允许将声音库的输出发送到LWJGL,但又遇到了这个障碍。我开始做包装纸,但在遇到复杂情况后,我把它放在了次要位置。我们应该重温一下。