portaudio的环形缓冲区的python包装器
pa-ringbuffer的Python项目详细描述
ring buffer functionality通常不包含在二进制文件中 PortAudio的发行版,因此大多数Python包装器都不包含它, 或者。
pa_ringbuffer模块只提供一个python包装器,实际的 portaudio环缓冲区代码必须单独编译,请参见Usage。 它可以用于任何有CFFI可用的python版本。
此模块设计为与sounddevice模块一起使用(它 也可以与其他模块一起使用)在 主Python程序和一个用C语言实现的音频回调函数 或者其他编译语言。
用法
这个模块不是单独使用的,它只在合作中有用 另一个使用cffi的python模块。 例如,查看https://github.com/spatialaudio/python-rtmixer。
可以从PyPI获取python代码,例如在setup.py文件中 (在下面的示例中,您的模块将被称为mycffimodule):
fromsetuptoolsimportsetupsetup(name=...,version=...,author=...,...,cffi_modules=['mycffimodule_build.py:ffibuilder'],setup_requires=['CFFI','pa_ringbuffer'],install_requires=['pa_ringbuffer'],...,)
或者,只需将文件src/pa_ringbuffer.py复制到您自己的 源目录并从那里导入。
您可以构建自己的CFFI模块,如中所述 http://cffi.readthedocs.io/en/latest/cdef.html,只是在 您的mycffimodule_build.py:
fromcffiimportFFIimportpa_ringbufferffibuilder=FFI()ffibuilder.cdef(pa_ringbuffer.cdef())ffibuilder.cdef(""" /* my own declarations */ """)ffibuilder.set_source('_mycffimodule','/* my implementation */',sources=['portaudio/src/common/pa_ringbuffer.c'],)if__name__=='__main__':ffibuilder.compile(verbose=True)
请注意,编译器必须可以使用以下文件:
- https://app.assembla.com/spaces/portaudio/git/source/master/src/common/pa_ringbuffer.c
- https://app.assembla.com/spaces/portaudio/git/source/master/src/common/pa_ringbuffer.h
- https://app.assembla.com/spaces/portaudio/git/source/master/src/common/pa_memorybarrier.h
对于您自己的C代码,您可能需要主PortAudio中的一些定义 标题:
一旦编译了扩展模块(在cffi的帮助下),就可以 在您自己的模块中使用类似的方法来访问RingBuffer 班级:
importpa_ringbufferfrom_mycffimoduleimportffi,libRingBuffer=pa_ringbuffer.init(ffi,lib)
API参考
只有两个功能:
pa_ringbuffer.cdef()
此函数返回一个字符串,该字符串包含文件中的C声明 pa_ringbuffer.h,可以用作cffi的cdef()函数的参数 (见上面的Usage)。注意,返回的声明略有不同 在macos/darwin系统上调用时。
pa_ringbuffer.init(ffi, lib)
此函数返回与cffi关联的RingBuffer类 实例由ffi和lib给定。
创建文档
RingBuffer类的文档不能单独使用。 如果使用Sphinx,则可以无缝地包含 RingBuffer使用您自己的文档初始化。 一个例子可以在 https://github.com/spatialaudio/python-rtmixer,生成的文档是 可在http://python-rtmixer.readthedocs.io/#rtmixer.RingBuffer购买
您需要在您的conf.py中激活autodoc扩展:
extensions=[...,'sphinx.ext.autodoc',...,]
在模块文档中的某个地方,您应该添加以下内容:
..autoclass:: RingBuffer :inherited-members:
在此之前,您可能必须使用currentmodule指令来选择 自己的模块。使用automodule也可以
版本历史记录
- 0.1.3(2018-06-02):
- 没有新功能,只是一个小文档更新
- 0.1.2(2017-10-21):
- 没有新功能,只是一个错误修复程序
- 0.1.1(2017-09-04):
- 添加buffer参数
- 0.1.0(2017-08-08):
- 初始版本