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客户端;
不再连接客户端。
调用此
函数时,任何引发的标志都会立即重置为零。
原始自述如下。
=--
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客户端;
不再连接客户端。
调用此
函数时,任何引发的标志都会立即重置为零。