使用PyOpenAL时正确的清理方法是什么?

0 投票
1 回答
673 浏览
提问于 2025-04-15 11:14

我在用Python做一些声音相关的事情,正在研究PyOpenAL。可惜的是,文档不太丰富,只有一个示例脚本,但这个脚本不改动就不能用。根据我的理解,PyOpenAL有两个层次:一个是直接调用OpenAL的接口,另一个是一个轻量级的“Python风格”的封装,我主要关注的是后者。具体来说,我想知道怎么正确地清理资源?我们来看一个简单的例子:

import time

import pyopenal

pyopenal.init(None)

l = pyopenal.Listener(22050)

b = pyopenal.WaveBuffer("somefile.wav")
s = pyopenal.Source()
s.buffer = b
s.looping = False

s.play()

while s.get_state() == pyopenal.AL_PLAYING:
    time.sleep(1)

pyopenal.quit()

现在,终端上会显示类似“一个源没有被删除,一个缓冲区没有被删除”的信息。但我在想,既然这些对象不能直接用OpenAL的原生调用,那我该怎么正确清理呢?

补充:

最后我还是放弃了pyopenal,自己写了一个小的ctypes封装来调用OpenAL和alure(pyopenal直接暴露了OpenAL的函数,但我总是遇到SIGFPE错误)。我还是很好奇在这里我应该怎么做。

1 个回答

1
#relese reference to l b and s
del l
del b
del s 
#now the WaveBuffer and Source should be destroyed, so we could:
pyopenal.quit()

可能是pyopenal的析构函数在程序退出前会自动调用quit(),所以你不需要自己去调用它。

撰写回答