预留通道是如何工作的?我可以预约特定的频道吗?还是随机选择?没有明确的文档说明它是如何工作的,我似乎做错了,因为mixer.findChannel()仍然选择保留的通道。
下面是我的代码:
self.music1 = pygame.mixer.Channel(0)
self.music2 = pygame.mixer.Channel(1)
self.sound1 = pygame.mixer.Channel(2)
self.sound2 = pygame.mixer.Channel(3)
self.sound3 = pygame.mixer.Channel(4)
self.sound4 = pygame.mixer.Channel(5)
self.sound5 = pygame.mixer.Channel(6)
self.sound6 = pygame.mixer.Channel(7)
pygame.mixer.set_reserved(2)我想预订music1和music2。
文档指出,mixer.set_reserved()的参数定义了将保留的通道数。
如果我不能选择哪些频道将被保留,有什么办法可以解决它吗?
提前感谢
发布于 2021-02-17 14:35:21
有时候,pygame的文档很少,如果你看看pygame实际调用了哪些SDL函数,以及这些函数做了什么,就会发现很多东西更有意义。
所以mixer.set_reserved()实际上是calls Mix_ReserveChannels,但不返回预留的频道数:
Mix_ReserveChannels
int Mix_ReserveChannels(int num)
在将-1作为频道号传递给播放函数时,保留播放采样时使用的频道数。从信道0到num-1预留信道。传入0将取消保留所有通道。正常情况下,SDL_mixer在启动时不保留任何通道。
以下功能受此设置影响:
4.3.3 Mix_PlayChannel
4.3.4 Mix_PlayChannelTimed
4.3.5 Mix_FadeInChannel
4.3.6 Mix_FadeInChannelTimed
mixer.findChannel() calls Mix_GroupAvailable
Mix_GroupAvailable
int Mix_GroupAvailable(int标签)
在group标签中找到第一个可用(未播放)的频道。
如您所见,findChannel会忽略保留的通道。预留频道仅可防止在使用上述功能之一时自动选择频道。Pygame使用Mix_PlayChannelTimed和Mix_FadeInChannelTimed,例如here。
总而言之,如果您想确保播放声音,请使用mixer.set_reserved预留一个或多个频道。
然后,为了播放这个重要的声音,可以使用mixer.findChannel来获得一个预留的频道或一个非预留的空闲频道。如果您希望完全控制播放声音的通道,还可以创建一个通道编号为0的新Channel实例(如果您保留了多个通道,则通道编号为更多)。
在不指定频道的情况下播放所有其他声音,它们将仅在非保留频道上播放。
因此,问题中的代码已经完成了您想要的操作:预留通道0和1。
https://stackoverflow.com/questions/66228684
复制相似问题