Visual c++ 同步两张声卡 我有一个用C++编写的程序,使用RTAudio(DigtSoad)来捕获和回放48 kHz采样音频。

Visual c++ 同步两张声卡 我有一个用C++编写的程序,使用RTAudio(DigtSoad)来捕获和回放48 kHz采样音频。,visual-c++,audio,circular-buffer,Visual C++,Audio,Circular Buffer,输入捕获使用回调选项。回调函数将数据写入ringbuffer。 输出是从ringbuffer读取的单独线程中的阻塞写入函数 如果输入和输出设备是相同的音频环路通过完美。 现在我想从设备1获取音频并在设备2上播放。每个设备都有自己的采样时钟设置为48kHz,但不同步。几秒钟后,输入和输出不同步 是否可以同步两个独立的oudio设备 您面临两个挑战: 让两台设备同时启动 使两台设备保持同步 这两项任务都很困难。在专业音频领域,#2使用特殊硬件来同步多个设备的字时钟。这也可以通过一个简单的步骤来完成。

输入捕获使用回调选项。回调函数将数据写入ringbuffer。 输出是从ringbuffer读取的单独线程中的阻塞写入函数

如果输入和输出设备是相同的音频环路通过完美。 现在我想从设备1获取音频并在设备2上播放。每个设备都有自己的采样时钟设置为48kHz,但不同步。几秒钟后,输入和输出不同步


是否可以同步两个独立的oudio设备

您面临两个挑战:

  • 让两台设备同时启动
  • 使两台设备保持同步
  • 这两项任务都很困难。在专业音频领域,#2使用特殊硬件来同步多个设备的字时钟。这也可以通过一个简单的步骤来完成。我相信它也可以通过firewire设备来实现,但我不确定它是如何工作的。在实践中,我使用的设备没有同步(“野生”),并得到了非常合理的同步长达一两个小时。根据您尝试执行的操作,同步在几分钟内的漂移不应超过几毫秒。如果是这样,你可以认为你的硬件坏了(当然,廉价的硬件经常被破坏)。 至于#1,我不确定directsound在任何可靠的意义上都能做到这一点。就任何音频API都可能实现的程度而言,这充其量也很困难:两张卡都有需要一些时间来设置、打开和开始播放的流。一般来说,解决方案是使用一个API,在这个时间是超低的(例如ASIO)。这对于像视频这样的应用程序来说相当有效,但我不知道它是否真的解决了一般问题

    如果你真的需要解决这个问题,你可以打开两张牌,开始玩静默游戏,并使用这些牌产生的计时信息来确定将数据放入卡中和最终播放之间的延迟(这对于每一张牌来说都是不同的,可能每次你运行时都是不同的)并使用该数据计算何时开始实际播放。我不知道RTAudio是否提供了必要的计时信息,但PortAudio提供了。也许会有帮助