Python wrapper for PortAudio's ring buffer
This module is designed to be used together with the sounddevice module (it might work with other modules, too) for non-blocking transfer of data between the main Python program and an audio callback function which is implemented in C or some other compiled language.
This module is not meant to be used on its own, it is only useful in cooperation with another Python module using CFFI. For an example, have a look at https://github.com/spatialaudio/python-rtmixer.
You can get the Python code from PyPI, for example in your
(in the following example, your module would be called
from setuptools import setup setup( name=..., version=..., author=..., ..., cffi_modules=['mycffimodule_build.py:ffibuilder'], setup_requires=['CFFI', 'pa_ringbuffer'], install_requires=['pa_ringbuffer'], ..., )
Alternatively, you can just copy the file
src/pa_ringbuffer.py to your own
source directory and import it from there.
You can build your own CFFI module like described in
http://cffi.readthedocs.io/en/latest/cdef.html, just adding a few more bits to
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)
Note that the following files must be available to the compiler:
For your own C code, you might need some definitions from the main PortAudio header:
Once you have compiled your extension module (with the help of CFFI), you can
use something like this in your own module to get access to the
import pa_ringbuffer from _mycffimodule import ffi, lib RingBuffer = pa_ringbuffer.init(ffi, lib)
There are only two functions:
This function returns a string containing C declarations from the file
pa_ringbuffer.h, which can be used as argument to CFFI's cdef() function
(see Usage above). Note that the returned declarations are slightly different
when called on a macOS/Darwin system.
This function returns the
RingBuffer class which is associated with the CFFI
instance given by
Creating the Documentation
The documentation of the
RingBuffer class is not available separately.
If you are using Sphinx, you can seamlessly include the documentation of the
RingBuffer class with your own documentation.
An example for this can be found at
https://github.com/spatialaudio/python-rtmixer, the generated documentation is
available at http://python-rtmixer.readthedocs.io/#rtmixer.RingBuffer.
You'll need to have the autodoc extension activated in your
extensions = [ ..., 'sphinx.ext.autodoc', ..., ]
And somewhere within your module documentation, you should add this:
.. autoclass:: RingBuffer :inherited-members: