【发布时间】:2013-06-25 19:16:28
【问题描述】:
作为一名吉他手,我一直想开发自己的录音、混音软件。我在 Direct Sound、Windows 多媒体(waveOutOpen 等)方面有一些经验。我意识到这将是一个复杂的项目,但纯粹是为了我自己的使用和学习,即没有截止日期!我打算使用 C++,但还不确定它是最好的 SDK/API。我希望软件是可扩展的,因为我可能希望在将来添加效果。一些先决条件...
- 在 Windows XP 上运行
- 最小延迟
- VU 表(在所有轨道上) 这导致我回避 Direct Sound,因为似乎没有办法从主缓冲区读取音频数据。
- 配音(即在播放现有曲目的同时录制新曲目)。
- 包括节拍器
我最初的想法是使用WMM并使用waveOutWrite函数来播放音频数据。我想这本质上是一个音频流播放器。为了让事情更简单,我将采样率硬编码为 16 位,44.1kHZ(我的声卡支持的最佳采样率)。我需要的是关于整体架构的一些想法和指导。
例如,假设我的速度是 60 BPM,拍号是 4/4。我希望节拍器在每个小节/小节的开头播放一个咔嗒声。现在假设我已经录制了节奏音轨。播放时,我需要编排(双关语)将哪些数据发送到主声音缓冲区。在某些时候,我可能还想添加乐器、鼓(主要是)。同样,我需要知道如何在正确的时间将正确的音频数据发送到主音频缓冲区。我很欣赏时机是这里的关键。我不确定的是如何从各个音轨中获取正确的数据以发送到主声音缓冲区。
我最初的想法是有一个定时线程,它会定期询问每个曲目,“我需要数据来覆盖 N 毫秒的播放时间”。其中 N 取决于主缓冲区大小。
我明白这是一个复杂的问题,我只需要一些关于如何解决上述问题的指导。
另一个问题是 WMM 或 DirectSound 更适合我的需求。甚至ASIO?但是,主要问题是如何使用流式传输机制收集正确的轨道数据(来自多个轨道)以发送到主缓冲区,并保持最小的延迟?
感谢您的帮助,
非常感谢
卡尔
感谢您的回复。但是,我的主要问题是如何对所有这些进行计时,以确保每个轨道在正确的时间将适当的数据写入主缓冲区。我当然欢迎(免费)图书馆,这将帮助我实现我的主要目标。
【问题讨论】:
-
关于 API 选择的说明:从 Vista 开始,一个新的 API (WASAPI) 通过其exclusive-mode streams 专门针对低延迟音频。这是在 Windows 中处理低延迟音频的最佳简便方法。在 XP 中类似的低延迟我想你将不得不使用 ASIO。
-
谢谢 Roman,是的,我考虑过 ASIO,因为这纯粹是一个 XP 项目。
-
当然,您也应该考虑使用 PortAudio,它可以让您访问 ASIO 和其他 API。
-
您的“主要问题”并不是一个真正的具体问题。您是否尝试过编写任何代码?什么没有奏效?为什么您无法安排多个轨道的缓冲区同时到达?
-
我不确定如何将正确的轨道数据写入主缓冲区。例如,根据速度和主缓冲区大小,可能需要多次写入节拍器数据。对于先前记录的轨道,我将发送一个等于主缓冲区大小的块,直到所有轨道数据都已发送。根据乔的回答,我想我需要根据主缓冲区大小计算时间范围。然后我可以计算出适合时间范围内的节拍数。然后我可以确定要写入主缓冲区的样本数(节拍器、鼓等)。
标签: c++ audio windows-xp