예제 #1
0
    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
예제 #2
0
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()
예제 #3
0
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
예제 #4
0
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
예제 #5
0
def get_ticks():
    """ get_ticks() -> milliseconds
    get the time in milliseconds
    """
    if not _get_init():
        return 0
    return sdl.SDL_GetTicks()
예제 #6
0
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
예제 #7
0
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()