- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 portaudio 库和 ASIO sdk 从我的吉他获取输入以通过我的计算机播放。
我一直在按照官方网站上的一些教程来设置基础知识。目前我让它工作,以便 portaudio 正在监听正确的输入和输出设备,并且我有回调设置来只输出输入而不像这样对它做任何事情:
static int paTestCallback(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags, void *userData)
{
float *out = (float*)outputBuffer;
float* in = (float*)inputBuffer;
for (int i = 0; i<framesPerBuffer; i++)
{
*out++ = *in++; /* left */
*out++ = *in++; /* right */
}
return 0;
}
这个回调是通过调用这个来设置的:
PaError error = Pa_OpenDefaultStream(&stream, 2, 2, paFloat32, 44100, paFramesPerBufferUnspecified, paTestCallback, &data);
Pa_StartStream(stream);
现在,这确实有效,但是当我在吉他上敲弦以及通过监听器听到它时,我有很多延迟(大约 0.5 秒)。
有没有办法解决这个延迟?需要重写回调方法吗?
编辑:
所以,我使用这段代码而不是基本的 Pa_OpenDefaultStream()
int defaultIn = Pa_GetDefaultInputDevice();
int defaultOut = Pa_GetDefaultOutputDevice();
PaStreamParameters *inParam = new PaStreamParameters();
inParam->channelCount = 2;
inParam->device = defaultIn;
inParam->sampleFormat = paFloat32;
inParam->suggestedLatency = 0.05;
PaStreamParameters *outParam = new PaStreamParameters();
outParam->channelCount = 2;
outParam->device = defaultOut;
outParam->sampleFormat = paFloat32;
outParam->suggestedLatency = 0;
error = Pa_OpenStream(&stream, inParam, outParam, 44100, paFramesPerBufferUnspecified, paNoFlag, paTestCallback, &data);
if (error != paNoError) {
Logger::log("[PortAudioManager] Could not open default stream. Exiting function...");
return;
}
Pa_StartStream(stream);
虽然仍然有一点延迟,但在弹奏多于一个音符时最为明显。
编辑:
在 Ross-Bencina 的帮助下,我发现 Windows 默认输入设备和输出设备不会对 PortAudio 中主机 api 的索引进行任何更改。我似乎一直在使用MME。我执行了以下操作以获得 ASIO 设备的正确索引:
int hostNr = Pa_GetHostApiCount();
std::vector<const PaHostApiInfo*> infoVertex;
for (int t = 0; t < hostNr; ++t) {
infoVertex.push_back(Pa_GetHostApiInfo(t));
}
然后我检查了哪个是带有 ASIO 的,并将 PaStreamParameters
中的 suggestedLatency 设置为 0,现在延迟消失了,声音很好(虽然现在是单声道)。
最佳答案
使用 paFramesPerBufferUnspecified
您走在正确的轨道上。
ASIO 延迟行为取决于驱动程序。有两种可能:
ASIO 驱动程序允许代码(即 PortAudio)请求延迟(可能有一些限制)。 PortAudio 发现受支持的驱动程序缓冲区大小与您请求的延迟之间的最佳匹配。
另一种可能性是您的音频接口(interface)不提供对延迟设置的编程控制。相反,延迟只能从驱动程序的 ASIO 控制面板 UI 中选择(并且驱动程序将在 PortAudio 上强制使用固定的缓冲区大小)。在这种情况下,您应该调查驱动程序控制面板 UI 以设置最低可行延迟。
在任何一种情况下,您使用 Pa_OpenStream
的方法都接近最佳,但您应该要求输入和输出都为零延迟(在您的编辑中,您要求输入延迟为 50 毫秒,输出延迟为零) .最终结果将是 PortAudio 选择最小的可用 ASIO 缓冲区大小。如果事实证明这不稳定(音频故障),那么您将需要增加请求的延迟。
include/pa_asio.h
公开了一个特定于主机 API 的接口(interface),用于查询驱动程序允许的 ASIO 缓冲区大小(请注意,如果您更改控制面板中的设置,这可能会发生变化)。它还提供了显示驱动程序控制面板 UI 的功能。
编辑:请注意,如果您仅为 ASIO 构建 PortAudio,则 Pa_GetDefaultInputDevice()
和 Pa_GetDefaultOutputDevice()
将仅返回 ASIO 设备。如果您在构建中包含任何其他更常见的 API(例如 WMME 或 DirectSound),它们将被优先作为(最低公分母)默认设备。您可以添加一个检查以确保您实际上正在访问 ASIO 设备:
assert(Pa_GetHostApiInfo(Pa_GetDeviceInfo(Pa_GetDefaultOutputDevice())->hostApi)->type == paASIO);
如果 PortAudio 编译时支持多个主机 API: 要获取默认 ASIO 设备:使用 Pa_GetHostApiCount
和 Pa_GetHostApiInfo
枚举主机 API 以查找 ASIO 主机 API。然后从返回的 PaHostApiInfo
结构中提取默认的 ASIO 设备索引。
关于c++ - 使用 PortAudio 回调和 ASIO sdk 的输入延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33171525/
我正在细读 http://www.khronos.org/网站,只找到了 OpenCL 的头文件(不是我不关心的 OpenGL)。如何获取 OpenCL SDK? 最佳答案 AMD 的 ATI Str
Android 项目中最低(最低 sdk)和最高(目标 sdk)级别是否有任何影响。这些东西是否会影响项目的可靠性和效率。 最佳答案 没有影响,如果您以 SDK 级别 8 为目标,那么您的应用将以 9
“min sdk version/target sdk version”和“compile sdk version”有什么区别?我知道 min 和 target sdk 是什么意思,但是 compil
我正在尝试运行 Dji Mobile-Sdk-Android:https://github.com/dji-sdk/Mobile-SDK-Android使用 dji 网站上的说明:https://de
我目前正在向我的 iPhone 应用程序添加新的 Facebook iOS sdk 3.1.1。我看到 sdk 有重大变化。例如。我的旧 sdk 创建一个 Facebook 对象并从 FBReques
我最近刚刚下载了 Xcode 4.6 with mac 10.8.4 with iOS 6.0 SDK package,我立即注意到我无法使用我的 iPhone 3Gs with iOS 4.6 进行
我尝试下载 OpenCL SDK。但是没办法。我有一个 AMD GPU,所以我在谷歌上搜索了 AMD SDK,但是来自谷歌的所有链接和一些教程都被破坏了,不可能通过 AMD 开发者网站找到 sdk。
安装 Google Cloud SDK 后,当我运行时 gcloud 授权登录 我收到一条错误消息: Your browser has been opened to visit: https://a
我一直在 nvidia 网站上搜索 GPU 计算 SDK,因为我正在尝试构建具有 cuda 支持的点云库 (PCL)。但是,在 nvidia 网站上,我只能找到工具包的链接,而不是 SDK 的单个下载
Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅关注editing this post一个问题。 2
当我打开 Android SDK 管理器时,会出现一个屏幕“选择要安装的包”。它列出了一堆带有绿色复选标记(已经安装)的软件包,还有一些带有 x's 的软件包,它们没有安装。如果我选择“全部接受”,它
在开发过程中,我发布了 SDK 21 Lollipop,但我无法在我的 KitKat 设备上使用它。应用程序非常简单,我只将 SDK 用于动画和 Material 设计,但是当我尝试对 Play 商店
enter image description here friend 们好 在使用 Linux、jenkins 和 docker 探索 dotnet 核心时,我遇到了构建问题,该问题在标题“/usr
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我创建了一个flutter项目,运行flutter packages get,输出如下:【二】flutter包搞定等待另一个 flutter 命令释放启动锁...第二次运行“flutter packa
这个问题在这里已经有了答案: What are the Android SDK build-tools, platform-tools and tools? And which version sh
我使用 Corona SDK 已经快一年了,并且开发了几个简单的游戏。我现在正在寻找的是在 Corona SDK 中创建 3D 幻觉的某种方法。如果有人有 Corona 3D 方面的经验,我将不胜感激
我有一个CLDC 1.1 / MIDP 2.0项目,可以使用Java ME SDK 3.2很好地进行编译。 最近,我已将Java SE升级到8,结果Java ME SDK开始在Windows启动时显示
有没有办法以编程方式控制连接到华擎主板的 RGB 照明?我知道华硕有一个 Aura SDK,但华擎是否也有一个用于他们的硬件? 如果是,我在哪里可以找到它? 最佳答案 没有用于华擎多彩的 sdk。但是
如何使用 crm 2011 sdk 和 XrmServiceContext 创建事务? 在下一个示例中,'new_brand' 是一些自定义实体。我想创建三个品牌。第三个拥有错误的 OwnerID g
我是一名优秀的程序员,十分优秀!