def pump(self): underrun = False if self._stop_alsatime is not None: return underrun # Check that ALSA's still playing if self._playing: state = asound.snd_pcm_state(self.pcm) if state not in (asound.SND_PCM_STATE_RUNNING, asound.SND_PCM_STATE_PREPARED): # Underrun! check(asound.snd_pcm_prepare(self.pcm)) underrun = True alsatime = self._get_asound_time() try: while self._timestamps[0][0] < alsatime: self._timestamps.pop(0) while self._timestamps[0][0] is None: self._eos_count += 1 self._timestamps.pop(0) except IndexError: pass return underrun
def get_write_size(self): state = asound.snd_pcm_state(self.pcm) if state == asound.SND_PCM_STATE_PAUSED: return 0 avail = max(0, asound.snd_pcm_avail_update(self.pcm)) bytes = avail * self.audio_format.bytes_per_sample if bytes < self._min_write_bytes: return 0 return bytes
def play(self): if self._playing: return self._playing = True if not self._sources: return if self._device: state = asound.snd_pcm_state(self._device.pcm) if self._device.can_pause and state == asound.SND_PCM_STATE_PAUSED: check(asound.snd_pcm_pause(self._device.pcm, 0)) self._set_start_time(self._sources[0], self._timestamp)
def play(self): if self._playing: return state = asound.snd_pcm_state(self.pcm) if self.can_pause and state == asound.SND_PCM_STATE_PAUSED: check(asound.snd_pcm_pause(self.pcm, 0)) elif state not in (asound.SND_PCM_STATE_RUNNING, asound.SND_PCM_STATE_PREPARED): check(asound.snd_pcm_prepare(self.pcm)) self._playing = True if self._stop_alsatime is not None: diff = self._get_asound_time() - self._stop_alsatime self._timestamps = [(a + diff, t) for a, t in self._timestamps] self._stop_alsatime = None