jack音频服务器的python绑定

py-jack的Python项目详细描述


注意:这是目前sourceforge项目的直接克隆,网址为http://py jack.sourceforge.net/


原始自述如下。
=--


pyjack 0.5.2版
原始代码由andrew.schmeder<;andy@a2hd.com>;,2003年,Il'dar Akhmetgalev<;Akhilman在gmail dot com>;提供运输支持;2008年1月14日,Falktx<;falktx@gmail.com>;进行修订和包装;2010年2月,Clam团队实施了更改。2010年3月,falktx<;falktx@gmail.com>;发布了更多的jack实现,2010年4月,这是根据gpl许可证发布的开源软件。
此许可证的全文可在"license"文件中找到,
此源代码包中包含此软件。

此软件当前从http://www.a2hd.com分发。
请查看该网站以获取最新的版本。

请参见http://jackit.sourceforge.net。这使得python程序能够连接到使用jack音频服务器的pro-audio应用程序并与之交互。


原型dsp和声音合成
算法使用数字python和类似工具。PyJack提供了捕获和回放音频的
方法。

-对于PatchBay应用程序;使用此模块可以在Python中编写功能强大的Jack PatchBay。这是为将来而计划的。

它的工作原理是这样的;

tar-xzvf pyjack-0.*.tar.gz(解压缩存档文件)
cd pyjack-0.*(CD到源目录)
(sudo)python setup.py install(安装…)

可以在"demo"目录中找到"BR/> BR/------------------------------------------------------BR/>实时问题:
BR/> Python被称为相对较慢(与C/C++相比),
和非实时由于内存管理细节。因此,
python不是一种适合实时音频处理的语言!
这意味着将python intepreter置于jack客户机的"内部"是不可接受的。
因此,Pyjack使用"半分离"方法。pyjack
客户机由两个线程组成:一个jack客户机线程和一个python
线程。jack客户机线程是在实时上下文中运行的;它从不
阻塞,它是完全确定的,并且不涉及任何python
数据结构和解释器。jack客户机线程仅在套接字缓冲区中复制音频数据。在python端,
调用jack.process()将音频数据复制到
那些通过浮点数数组提供到python连接的套接字的另一端。在任何情况下,建议使用较大的缓冲区大小(例如1024个示例)

为了捕获或回放音频而不丢失块,
python必须至少每500*(n/sr)
毫秒调用一次jack.process()。(n=jack.get_buffer_size(),sr=jack.get_sample_rate())。
如果这个速率没有跟上,您可能会得到jack.inputsyncerror或jack.process()引发的jack.outputsyncerror异常。
通常,您需要为一个dsp原型程序使用以下设计:

1。连接到jack服务器(jack.attach)
创建输入和输出端口(jack.register_port)
将输入和输出连接到jack graph(jack.connect)
激活客户端(jack.activate)
2。为输入和输出音频数据预先分配矩阵
3。捕获x秒音频(插口处理)
4。使用您的算法处理音频
这需要多长时间并不重要…
5。播放x秒音频(插口处理)
6。从jack服务器分离(jack.detach)

请参阅示例代码以开始;testtone.py和capture.py.

------------------------------------------------------
-----------------------------
-
-
-
-
模块文档和用法示例:

示例:导入模块:
>;>import jack
>;>dir(jack)
['canmonitor',…]
>;>print jack.attach.\uu doc\u
attach client to the jack server


-----------------------------
jack模块引发的异常:


这些称为jack.error、jack.inputsyncerror等。

jack.error:
出错时引发的一般异常。通常情况下,
会出现一些错误,例如"无法连接到服务器"或"无法连接端口"


jack.notconnectederror:
在连接客户端之前尝试访问jack api函数时抛出。

jack.usageerror:
当您误用pyjack api时抛出。例如,尝试在客户端已激活时调用jack.activate()。


jack.inputsyncerror:
jack.outputsyncerror:
通常低级jack客户端线程与
python端不同步。将引发此异常以警告您存在
潜在的同步问题。jack.outputsyncerror非常罕见,您不应该看到该错误。jack.inputSyncerror非常常见,例如,如果您已激活客户端,但未立即开始调用jack.process()。

>;>;导入jack
>;>;导入时间
>;>;jack.attach("测试")
…etc
>;>;jack.activate()
>;>;time.sleep(1)
>;>;jack.process(输出,输入)


换句话说,输入流已停止1秒,
保存旧数据。尽管出现了这个错误,你还是会得到输入数组中的旧音频数据。


没有足够的时间在不出现inputSyncerror的情况下重新绘制屏幕。基本上,
您只需要在每秒调用jack.process()几次(比如说每秒5次)。每次调用jack.process()
它都会抛出一个inputSyncerror,但您知道音频数据最多为第二个旧数据的1/5;对于
非常简单的输入计量来说,这可能已经足够好了,而不会使gui要求太过极端。

标志:

jack.isinput
jack.isoutput
jack.canmonitor
jack.isphysical
jack.isterminal

对它们使用按位运算符(和&;);

示例:
>;>print jack.get_port_flags('alsa_pcm:capture_1')
22
>;>print(jack.get_port_flags('alsa_pcm:capture_1')&jack.isinput)>;0
0
>;>print(jack.get_port_u flags('alsa_u pcm:capture_1')&jack.isoutput)>;0
1
>;>;打印(jack.get_u port_u flags('alsa_u pcm:capture_1')>;0
1
>;>;打印(jack.get_u port_flags('alsa_u pcm:capture_1')&jack.isterminal)>;0
1
>;打印(jack.get_port_flags('alsa_pcm:capture_1')&;jack.canmonitor)>;0
0



创建端口时,您将希望按位使用标记;jack.register_port("input_1",jack.isinput_jack.canmonitor)
>;jack.register_port("input_1",jack.isoutput jack.canmonitor)

要求您首先调用
此函数。(否则您将得到一个notconnectederror)。

>;>;jack.attach("foo_client")

--
jack.detach()
detach from the jack server

>;>;jack.detach()
>;>;jack.get_sample_rate()
回溯(最近一次调用):
file"<;stdin>;",第1行,输入?
jack.notconnectederror:jack连接尚未建立。

--
jack.register_port(name,flags)
使用给定的标志为此客户端创建一个新端口。
一旦创建了端口,就不能"注销"。
(jack api允许这样做,但是pyjack模块不支持它。)

--
jack.activate()
启用对实时jack线程的回调。
必须在使用jack.process()之前调用它。
启用实时线程的CPU开销最小。

--
jack.deactivate()
禁用jack回调到实时线程。
调用jack.deactivate()后,不能使用jack.process(),
直到再次调用jack.activate()。

--
jack.process()
此函数在python和实时jack线程之间交换音频。

第一个维度的大小
必须与输入或输出的数量匹配,第二个维度的大小必须与缓冲区大小匹配。请参见capture.py和testtone.py
以了解其工作原理的示例。下面是
testtone.py中代码的一部分。在本例中,只有一个输入端口和一个输出端口。input.shape=(1024),output.shape=(1144000)。
注意进程将修改输入数组中的项。

output=numeric.respeat(
numeric.sin(
2*numeric.pi*440.0*(numeric.arange(0,秒,1.0/(sr),'f')[0:int(sr*sec)]
),(1,sr*sec)).astype('f')


i=0
,而i<;output.shape[1]-n:
尝试:
jack.process(output[:,i:i+n],输入)
i+=n
除了杰克。inputSyncerror:
pass
除了杰克。outputSyncerror:
pass

--
杰克。get_ports()
返回杰克图中所有注册端口的列表。
端口的名称如下:"客户机名称:端口名称"

>;>jack.get_ports()
['alsa_pcm:capture_1','alsa_pcm:capture_2','alsa_pcm:capture_3',…]

--
jack.get_port_flags()
返回一个整数,该整数是给定端口的所有标志的位或。

>;>;jack.get_port_flags('alsa_pcm:playback_6')
21

--
jack.get_connections()
返回连接到给定端口的端口列表。
如果没有连接,则返回长度为零的列表。

>;jack.get_connections('alsa_pcm:capture_1')
['foo_client:input_1']

--
jack.connect(源,目标)
连接杰克图上的两个端口。
请注意,源必须具有isoutput标志,
目标必须具有isinput标志。
如果要接收或发送音频,您必须将客户机的输入/输出(那些通过jack.register_port()注册的端口)连接到其他正在生成或接收音频的端口,例如ALSA_pcm端口。
您还可以连接属于其他客户机的端口,例如,对于PatchBay应用程序。

在编写时,如果在调用
jack.activate()之前连接了端口,则jack
API中存在一个错误,会导致输入缓冲区中的音频数据丢失。在修复之前,请确保在使用jack.connect()之前调用jack.activate()
jack.disconnect(源,目的地)
断开由jack.connect()建立的连接。

--
jack.get_buffer_size()
返回jack服务器使用的当前缓冲区大小。
如果此数字很小,则可能有很多同步问题。

--
jack.get_sample_rate()
返回jack服务器使用的当前采样率。

--
jack.check_events()
检查自上次调用jack.check_events()以来是否引发了任何异步事件回调。
使用此函数不需要当前附加到jack服务器;但是,除非您是,否则这些值不会更改!

>;>;jack.check_events()
{graph_ordering':0,'shutdown':0,'port_registration':0,'hangup':0}

端口已从杰克图中添加或删除。

如果关机==1:
则杰克服务器已关机;您的客户端不再连接。

如果挂断==1:
则杰克服务器出于某种原因决定终止pyjack客户端;
不再连接客户端。


调用此
函数时,任何引发的标志都会立即重置为零。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
JavaEclipseMars没有保存首选项   java梯度同步失败:原因:启动失败:   java如何从嵌套的JSON获取数据?   java如何判断可观察对象中的任何对象满足一个条件?   java将字符串转换为保持相同值的byte[]数组   java有没有办法绕过AuditingEntityListener为测试设置数据?   从/usr/share/java中解析linux JAR依赖关系   安卓 My java函数抛出nullpointerexception?   java Gradle使用正确版本的依赖项   JBoss和Java6中带注释的WebService中的web服务ClassCastException   java如何修复codename one中的简单逻辑错误?   java如何迭代矩阵的索引?   java如何在JPanel不可见时将其保存为图像?   java HashMap如何在Kotlin中实现MutableMap接口?   javascript如何在单击后加载特定片段?   EclipseJava为纳什均衡获取所有玩家/策略组合   JavaSpring:Web服务REST在JSON上产生双反斜杠   java为什么ServletContext#getRealPath(“/”)返回相对路径?   java当我的游戏应该重新启动时,我应该如何处理重置SurfaceView和线程?