def _base(self, framerate=None, use_accurate_delay=False): if framerate: endtime = int((1.0 / framerate) * 1000.) self._rawpassed = sdl.SDL_GetTicks() - self._last_tick delay = endtime - self._rawpassed _try_init() if use_accurate_delay: delay = _accurate_delay(delay) else: delay = max(delay, 0) sdl.SDL_Delay(delay) nowtime = sdl.SDL_GetTicks() self._timepassed = nowtime - self._last_tick self._fps_count += 1 self._last_tick = nowtime if not framerate: self._rawpassed = self._timepassed if not self._fps_tick: self._fps_count = 0 self._fps_tick = nowtime elif self._fps_count >= 10: try: self._fps = (self._fps_count / ((nowtime - self._fps_tick) / 1000.0)) except ZeroDivisionError: self._fps = float('inf') self._fps_count = 0 self._fps_tick = nowtime return self._timepassed
def play(loops=0, startpos=0.0): """play(loops=0, start=0.0): return None Start the playback of the music stream""" global _current_music, _music_pos, _music_pos_time, \ _music_frequency, _music_format, _music_channels check_mixer() if not _current_music: raise SDLError("music not loaded") sdl.Mix_HookMusicFinished(_endmusic_callback) sdl.Mix_SetPostMix(_mixmusic_callback, ffi.NULL) frequency, format, channels = (ffi.new('int*'), ffi.new('uint16_t*'), ffi.new('int*')) sdl.Mix_QuerySpec(frequency, format, channels) _music_pos = 0 _music_pos_time = sdl.SDL_GetTicks() _music_frequency = frequency[0] _music_format = format[0] _music_channels = channels[0] volume = sdl.Mix_VolumeMusic(-1) val = sdl.Mix_FadeInMusicPos(_current_music, loops, 0, startpos) sdl.Mix_VolumeMusic(volume) if val == -1: raise SDLError.from_sdl_error()
def _accurate_delay(ticks): if ticks <= 0: return 0 start = sdl.SDL_GetTicks() if ticks >= WORST_CLOCK_ACCURACY: delay = (ticks - 2) - (ticks % WORST_CLOCK_ACCURACY) if delay >= WORST_CLOCK_ACCURACY: sdl.SDL_Delay(delay) # hog CPU for a bit to get the delay just right delay = ticks - (sdl.SDL_GetTicks() - start) while delay > 0: delay = ticks - (sdl.SDL_GetTicks() - start) return sdl.SDL_GetTicks() - start
def wait(milliseconds): """ wait(milliseconds) -> time pause the program for an amount of time """ try: milliseconds = int(milliseconds) except (ValueError, TypeError): raise TypeError("wait requires one integer argument") _try_init() milliseconds = max(milliseconds, 0) start = sdl.SDL_GetTicks() sdl.SDL_Delay(milliseconds) return sdl.SDL_GetTicks() - start
def get_ticks(): """ get_ticks() -> milliseconds get the time in milliseconds """ if not _get_init(): return 0 return sdl.SDL_GetTicks()
def get_pos(): """ get_pos() -> time get the music play time """ check_mixer() if _music_pos_time < 0: return -1 ticks = (1000 * _music_pos / (float(_music_channels) * _music_frequency * ((_music_format & 0xff) >> 3))) if not sdl.Mix_PausedMusic(): ticks += sdl.SDL_GetTicks() - _music_pos_time return ticks
def _mixmusic_callback(udata, stream, len): global _music_pos, _music_pos_time if not sdl.Mix_PausedMusic(): _music_pos += len _music_pos_time = sdl.SDL_GetTicks()