def periodic(): """ The periodic sound callback. This is called at around 20hz, and is responsible for adjusting the volume of the playing music if necessary, and also for calling the periodic functions of midi and the various channels, which then may play music. """ global pcm_volume if not pcm_ok: return False try: for c in all_channels: c.periodic() pss.periodic() # Perform a synchro-start if necessary. need_ss = False for c in all_channels: if c.synchro_start and c.wait_stop: need_ss = False break if c.synchro_start and not c.wait_stop: need_ss = True if need_ss: pss.unpause_all() for c in all_channels: c.synchro_start = False # Now, consider adjusting the volume of the channel. volumes = renpy.game.preferences.volumes for c in all_channels: vol = c.chan_volume * volumes[c.mixer] if vol != c.actual_volume: pss.set_volume(c.number, vol) c.actual_volume = vol except: if renpy.config.debug_sound: raise
def periodic(self): """ This is the periodic call that causes this channel to load new stuff into its queues, if necessary. """ # Update the channel volume. vol = self.chan_volume * renpy.game.preferences.volumes[self.mixer] if vol != self.actual_volume: pss.set_volume(self.number, vol) self.actual_volume = vol # This should be set from something that checks to see if our # mixer is muted. force_stop = self.context.force_stop or (renpy.game.preferences.mute[self.mixer] and self.stop_on_mute) if self.playing and force_stop: pss.stop(self.number) self.playing = False self.wait_stop = False if force_stop: if self.loop: self.queue = self.queue[-len(self.loop):] else: self.queue = [ ] return # Should we do the callback? do_callback = False # This has been modified so we only queue a single sound file # per call, to prevent memory leaks with really short sound # files. So this loop will only execute once, in practice. while True: depth = pss.queue_depth(self.number) if depth == 0: self.wait_stop = False self.playing = False # Need to check this, so we don't do pointless work. if not self.queue: break # If the pcm_queue is full, then we can't queue # anything, regardless of if it is midi or pcm. if depth >= 2: break # If we can't buffer things, and we're playing something # give up here. if not self.buffer_queue and depth >= 1: break # We can't queue anything if the depth is > 0 and we're # waiting for a synchro_start. if self.synchro_start and depth: break # If the queue is full, return. if pss.queue_depth(self.number) >= 2: break # Otherwise, we might be able to enqueue something. topq = self.queue.pop(0) # Blacklist of old file formats we used to support, but we now # ignore. lfn = topq.filename.lower() + self.file_suffix.lower() for i in (".mod", ".xm", ".mid", ".midi"): if lfn.endswith(i): topq = None if not topq: continue try: topf = load(self.file_prefix + topq.filename + self.file_suffix) if depth == 0: pss.play(self.number, topf, topq.filename, paused=self.synchro_start, fadein=topq.fadein, tight=topq.tight) else: pss.queue(self.number, topf, topq.filename, fadein=topq.fadein, tight=topq.tight) self.playing = True except: # If playing failed, remove topq.filename from self.loop # so we don't keep trying. while topq.filename in self.loop: self.loop.remove(topq.filename) if renpy.config.debug_sound and not renpy.game.after_rollback: raise else: return break if self.loop and not self.queue: for i in self.loop: newq = QueueEntry(i, 0, topq.tight) self.queue.append(newq) else: do_callback = True # Queue empty callback. if do_callback and self.callback: self.callback() # E1102
def periodic(self): """ This is the periodic call that causes this channel to load new stuff into its queues, if necessary. """ # Update the channel volume. vol = self.chan_volume * renpy.game.preferences.volumes[self.mixer] if vol != self.actual_volume: pss.set_volume(self.number, vol) self.actual_volume = vol # This should be set from something that checks to see if our # mixer is muted. force_stop = self.context.force_stop or (renpy.game.preferences.mute[self.mixer] and self.stop_on_mute) if self.playing and force_stop: pss.stop(self.number) self.playing = False self.wait_stop = False if force_stop: if self.loop: self.queue = self.queue[-len(self.loop):] else: self.queue = [ ] return # Should we do the callback? do_callback = False # This has been modified so we only queue a single sound file # per call, to prevent memory leaks with really short sound # files. So this loop will only execute once, in practice. while True: depth = pss.queue_depth(self.number) if depth == 0: self.wait_stop = False self.playing = False # Need to check this, so we don't do pointless work. if not self.queue: break # If the pcm_queue is full, then we can't queue # anything, regardless of if it is midi or pcm. if depth >= 2: break # If we can't buffer things, and we're playing something # give up here. if not self.buffer_queue and depth >= 1: break # We can't queue anything if the depth is > 0 and we're # waiting for a synchro_start. if self.synchro_start and depth: break # If the queue is full, return. if pss.queue_depth(self.number) >= 2: break # Otherwise, we might be able to enqueue something. topq = self.queue.pop(0) # Blacklist of old file formats we used to support, but we now # ignore. lfn = topq.filename.lower() + self.file_suffix.lower() for i in (".mod", ".xm", ".mid", ".midi"): if lfn.endswith(i): topq = None if not topq: continue try: topf = load(self.file_prefix + topq.filename + self.file_suffix) if depth == 0: pss.play(self.number, topf, topq.filename, paused=self.synchro_start, fadein=topq.fadein, tight=topq.tight) else: pss.queue(self.number, topf, topq.filename, fadein=topq.fadein, tight=topq.tight) self.playing = True except: # If playing failed, remove topq.filename from self.loop # so we don't keep trying. while topq.filename in self.loop: self.loop.remove(topq.filename) if renpy.config.debug_sound: raise else: return break if self.loop and not self.queue: for i in self.loop: newq = QueueEntry(i, 0, topq.tight) self.queue.append(newq) else: do_callback = True # Queue empty callback. if do_callback and self.callback: self.callback() # E1102