我写的应用程序需要使用大型音频多样,从约50mb。一个文件中包含大约80个简短的录音记录,这能得到的回放过我的应用程序在任何时间。因此,所有声音数据加载到存储器,用于快速访问。

然而,当装载这些文件中的一个,它可以采取许多秒把记忆,意味着我的计划,如果暂时冻结。什么是一个很好的方式来避免发生这种事?它必须与Windows和OS X.它冻结在这样的: myMultiSampleClass->open(); 这已经做了大量的动态存储器的分配和读取文件的使用ifstream.

我已经想到了两个可能的选择:

  1. 打开文件,并将其加载到存在另外一个线程,所以我申请过程并不冻结。我已经看到提高图书馆做到这一点,但需要做相当大量的阅读之前,我准备要实施的。所有我需要做的是叫open()功能的在线然后摧毁线之后。

  2. 拿出一个方案,以确保我不载整个文件存入内存在任何一个时间,我只负荷的飞行以这么说。问题是任何样本可能会触发任何时间。我知道一些其他的软件有这样的系统中的地方但我不知道它是如何工作的。它在很大程度上取决于个人计算机的规格,它可以工作好在我的电脑但有人与一个缓慢的硬盘/存储器可能获得非常糟糕的结果。一想法,我已经加载x样品的每个音记录存入内存,然后,如果我需要起,开始播放的样本,已经存在,同时载的其余部分的声音进入存储器。

任何意见或批评?在此先感谢:-)

有帮助吗?

解决方案

我喜欢解决方案1的第一次尝试--简单和要点。

如果你是在窗口,你能做的异步文件作业-- 什么,他们呼吁重叠 -要告诉操作系统加载文件,让你知道什么时候准备好了。

其他提示

使用 存储器映文件.装载时最初的"即时",的开销I/O将被延长的时间。

我认为最好的解决办法是载的一小块或单一样品的数据在一段时间播放期间使用异步I/O(如约翰Dibling提到的)以固定的尺寸的重放缓冲区。

该战略将须填补重放缓冲区的第一个然后播放(这将增加小额的延迟而确保连续播放),同时播放缓冲区,可以重新填补的另一个重放缓冲区在不同的线(重叠),至少需要有两个重放缓冲区,一个用于播放,一个用于填充的背景下,随后的开关其实时间

以后你可以设定大放缓冲区的大小根据客户的电脑性能(这将是贸易之间存储器的尺寸和处理能力、速度最快的CPU会需要更小的缓冲区因此较低的延迟)。

你也许想要考虑的一个 生产者-消费者 办法。这基本上涉及阅读的声音数据进入一个缓冲区采用一个线程,以及传输数据的数据从缓冲到你的声音卡的使用另外一个线程。

数据读者是生产者和流数据以声音卡是消费者。你需要高水和低水痕所以,如果缓冲区得到充分的生产者将停止阅读,并且如果缓冲区低,生产者开始阅读。

C++生产者-消费者并发模板图书馆
http://www.bayimage.com/code/pcpaper.html

编辑: 我要补充说,这种事情比较棘手。如果你正在建设一个样本的球员,负载系统的不断变化的函数关键是正在播放,如许多声音都播放一次,如何长期间的每一个声音,是否维持踏板是被压制,以及其他因素,例如硬盘的速度和缓冲和量处理器的马力可用。一些编程优化,最终采用不会很明显在第一眼。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top