PortAudio的环形缓冲区Python封装
项目描述
通常,环形缓冲区功能不包括在PortAudio的二进制发行版中,因此大多数Python封装也不包括它。
pa_ringbuffer模块仅提供Python封装,实际的PortAudio环形缓冲区代码需要单独编译,见用法。它可以在任何提供CFFI的Python版本中使用。
此模块旨在与sounddevice模块(它也可能与其他模块一起工作)一起使用,以在主Python程序和用C或某些其他编译语言实现的音频回调函数之间进行非阻塞数据传输。
用法
此模块不应单独使用,它仅在与使用CFFI的另一个Python模块合作时才有用。例如,请参阅https://github.com/spatialaudio/python-rtmixer。
您可以从PyPI获取Python代码,例如在您的setup.py文件中(在以下示例中,您的模块将被命名为mycffimodule)
from setuptools import setup
setup(
name=...,
version=...,
author=...,
...,
cffi_modules=['mycffimodule_build.py:ffibuilder'],
setup_requires=['CFFI', 'pa_ringbuffer'],
install_requires=['pa_ringbuffer'],
...,
)
或者,您可以直接将文件src/pa_ringbuffer.py复制到您自己的源目录中,并从中导入它。
您可以根据http://cffi.readthedocs.io/en/latest/cdef.html中的说明构建自己的CFFI模块,只需在mycffimodule_build.py中添加一些额外的代码即可。
from cffi import FFI
import pa_ringbuffer
ffibuilder = 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类的访问权限
import pa_ringbuffer
from _mycffimodule import ffi, lib
RingBuffer = pa_ringbuffer.init(ffi, lib)
API参考
只有两个函数
pa_ringbuffer.cdef()
此函数返回一个字符串,包含来自文件pa_ringbuffer.h的C声明,可以用作CFFI的cdef()函数的参数(参见上面的使用)。请注意,在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找到。
您需要激活autodoc扩展在您的conf.py
extensions = [
...,
'sphinx.ext.autodoc',
...,
]
在模块文档中,您应该添加以下内容
.. autoclass:: RingBuffer
:inherited-members:
在此之前,您可能需要使用currentmodule指令来选择您自己的模块。使用automodule也应该可以。
如果您想使用Sphinx的nitpicky设置,您必须向nitpick_ignore添加一些内容
nitpicky = True
nitpick_ignore = [
('py:class', 'optional'),
('py:class', 'buffer'),
('py:class', 'CData pointer'),
]
版本历史
- 0.1.4 (2020-08-27):
次要文档更新
- 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):
初始版本
项目详情
pa-ringbuffer-0.1.4.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0878054e979e7b4fafcbcf6273a87e1ed2c50dad44c29fc557d72b7b3a04cf42 |
|
MD5 | e3443296fea41532e8b7e15ce4cfa241 |
|
BLAKE2b-256 | b59f31956899bd842747e12b554e04055a6745cfc3e104eaf40a29e6413028da |
pa_ringbuffer-0.1.4-py2.py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a4cb24883645696e021c309bfe13904617bf551491d6f0ab9f9ec70ff33d6a04 |
|
MD5 | b98a3693fc6fd4e48fa389f3b77af646 |
|
BLAKE2b-256 | fd3661306052b7ab56f52d76976676041d64a8d554173a2f1c89508e1434ee7f |