音频处理的一个简单、快速循环缓冲区实现
一个用于循环(环形)缓冲区的简单 C 实现使用 OSAtomic.h 原语,并使用虚拟内存映射技术将缓冲区的虚拟副本直接放置在实缓冲区之后来避免任何缓冲区卷绕逻辑的需要,从而实现只有一个生产者和一个消费者,线程安全。
使用方法
初始化和清理:使用 TPCircularBufferInit
和 TPCircularBufferCleanup
分配和释放资源。
生产:使用 TPCircularBufferHead
获取写入缓冲区的指针,然后使用 TPCircularBufferProduce
提交写入数据。TPCircularBufferProduceBytes
是一个方便的例程,用于直接将数据写入缓冲区。
消费:使用 TPCircularBufferTail
获取读取下一个数据的指针,然后使用 TPCircularBufferConsume
释放处理完毕后所占用的空间。
TPCircularBuffer+AudioBufferList.(c,h) 包含用于处理 AudioBufferList 结构的辅助函数。这些函数将自动调整每个缓冲区的 mData 字段,使其指向循环缓冲区内部 16 字节对齐的区域。
线程安全
只要将多线程访问限制为只有一个生产者和一个消费者,此实用工具应该是线程安全的。
仅使用一个共享变量(缓冲区填充计数),并使用OSAtomic原语写入此值以确保原子性。
许可证
版权所有 (C) 2012-2013 A Tasty Pixel
此软件按原样提供,不提供任何明示或暗示的保证。在任何情况下,作者都不会因使用此软件而承担任何损害赔偿责任。
任何人都可以出于任何目的(包括商业用途)使用此软件,并且可以自由地修改和重新分发,但必须遵守以下限制
-
不得歪曲此软件的来源;你不得声称是你编写的原始软件。如果你将此软件用于产品,产品文档中对产品的认可将是有益的,但不是必需的。
-
修改过的源代码版本必须清楚地标记为修订版本,且不得被虚假宣传为原始软件。
-
此声明不得从任何源分布中移除或更改。
虚拟内存技术最初由Philip Howard提出,并由Kurt Revis修改以适应Darwin。
更多信息请参阅atastypixel.com