Python pygame.Sound.get_num_频道不准确
我正在使用pygame+Twisted。我制作了一个Python pygame.Sound.get_num_频道不准确,python,audio,sdl,pygame,twisted,Python,Audio,Sdl,Pygame,Twisted,我正在使用pygame+Twisted。我制作了一个声音包装类,其相关部分如下: class Sound(object): def __init__(self, sound): self.sound = sound self._status_task = task.LoopingCall(self._check_status) self._status_task.start(0.05) def _check_status(sel
声音
包装类,其相关部分如下:
class Sound(object):
def __init__(self, sound):
self.sound = sound
self._status_task = task.LoopingCall(self._check_status)
self._status_task.start(0.05)
def _check_status(self):
chans = self.sound.get_num_channels()
if chans > 0:
logger.debug("'%s' playing on %d channels",
self.filename, chans)
def play(self):
self.sound.play()
但是,在播放完声音后,.get\u num\u channels()
返回一个正数,例如:
2013-07-08 15:13:30,502-DEBUG-engine.sound - 'sounds/foo.wav' playing on 2 channels
2013-07-08 15:13:30,503-DEBUG-engine.sound - 'sounds/bar.wav' playing on 1 channels
2013-07-08 15:13:30,546-DEBUG-engine.sound - 'sounds/foo.wav' playing on 2 channels
2013-07-08 15:13:30,558-DEBUG-engine.sound - 'sounds/bar.wav' playing on 1 channels
2013-07-08 15:13:30,602-DEBUG-engine.sound - 'sounds/foo.wav' playing on 2 channels
为什么会这样
我这样问是因为有时候当我告诉别人的时候,声音根本就不响,我正试图弄清真相。我想理解这一点可能会有助于解决这个bug。根据我的经验,get_num_channels()统计所有分配了声音的频道,即使它们已经播放完毕 一个解决办法是去检查这些频道是否仍然“繁忙”。 您可以将_check_status方法更改为此,以考虑通道是否处于活动状态:
def _check_status(self):
chans = self.sound.get_num_channels()
if chans > 0:
logger.debug("'%s' assigned to %d channels", self.filename, chans)
active_chans = 0
for i in range(pygame.mixer.get_num_channels()):
channel = pygame.mixer.Channel(i)
if channel.get_sound() == self.sound and channel.get_busy():
active_chans += 1
logger.debug("'%s' actively playing on %d channels", self.filename, active_chans)
以及两个有助于解决此问题的其他任何人的帮助功能:
def get_num_active_channels(sound):
"""
Returns the number of pygame.mixer.Channel that are actively playing the sound.
"""
active_channels = 0
if sound.get_num_channels() > 0:
for i in range(pygame.mixer.get_num_channels()):
channel = pygame.mixer.Channel(i)
if channel.get_sound() == sound and channel.get_busy():
active_channels += 1
return active_channels
def get_active_channel(sound):
"""
Returns the first pygame.mixer.Channel that we find that is actively playing the sound.
"""
if sound.get_num_channels() > 0:
for i in range(pygame.mixer.get_num_channels()):
channel = pygame.mixer.Channel(i)
if channel.get_sound() == sound and channel.get_busy()
return channel
return None
出于好奇:声音没有播放的原因是因为我有2个pygame程序在运行,而只有当前聚焦的程序发出声音。这似乎与这个bug无关,但我想知道这是否是因为样本长度接近循环间隔,有时循环再次开始播放时它还没有完全播放完?哦,或者如果输出是真实的,那么似乎总是在两个通道上的
foo.wav
。也许foo.wav
比循环间隔稍长,但bar.wav
足够短?你能发布你的全部代码吗?我最好的猜测是保持声音播放的pygame内部事件队列没有正确更新。你看,声音的结尾有很多东西吗?