def queue(self, s): self.loop = None self.queued = s sound.queue(self.id, s.what, s.serial) with condition: condition.notify()
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