如何在某些C代码执行某些线程时保持python脚本打开?

时间:2011-02-23 16:09:39

标签: python multithreading audio sleep

我正在尝试向pyAudio添加非阻塞音频I / O.

pyAudio依赖PortAudio来进行音频I / O.要在PortAudio中执行非阻塞音频,请在打开音频流时定义回调函数。当音频流启动时,只要需要新的音频数据,它就会调用回调函数。

这部分有效。为了测试这个,我写了一个简单的脚本来实现一个回调函数,如下所示:

def pyAudioCallback(frameCount,inADCtime,curTime,outADCtime,userData,inp = None):
    data=getData(frameCount)
    return (data,0)

只要音频流需要新的音频样本,就会调用此回调。但是,脚本不知道音频流是否仍在运行,并且只要它完成就会终止,这当然也会终止音频流。

我可以通过在某处插入一些time.sleep()来解决此问题。当脚本处于休眠状态时,音频播放将正常工作。但是,我宁愿推迟脚本的完成,直到音频流认为它已完成。

在满足某些条件之前,有没有办法让Python会话保持活跃状态​​?或者是一些等待循环是唯一的选择?

3 个答案:

答案 0 :(得分:1)

有几种方式。

创建一个管道。将读取结束传递给select.select(),没有超时。音频完成后,写完结束。

两次获取信号量或互斥量。音频完成后释放它。

还有更多,你可能不需要。

答案 1 :(得分:1)

您可以启动包含回调的子线程,主线程可以等待/加入子线程直到它完成。

答案 2 :(得分:0)

如果你需要做的就是等待音频完成,一个解决方案来自PyAudio包。

创建信息流后,您可以致电stream.is_active()查询音频信息流以查看其是否已完成。

文档中包含了一个示例:Example: Callback Mode Audio I/O