diff options
| author | 2012-05-13 23:50:15 -0700 | |
|---|---|---|
| committer | 2012-05-13 23:50:15 -0700 | |
| commit | a545db353466ed35f6ca4564d80744d6d59fba00 (patch) | |
| tree | 96be1b046c50948f796961479d25f01e58ef3d44 | |
| parent | 11fd02f63acba18a1b03351b595490597136fc6a (diff) | |
| parent | db7dd2af93ae96e5749cfbe978c2695049d9d782 (diff) | |
Merge "fix BootAnimation timing" into jb-dev
| -rw-r--r-- | cmds/bootanimation/BootAnimation.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index c0fb06fc9c4d..1d5f20766c06 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -55,6 +55,10 @@ #define SYSTEM_BOOTANIMATION_FILE "/system/media/bootanimation.zip" #define SYSTEM_ENCRYPTED_BOOTANIMATION_FILE "/system/media/bootanimation-encrypted.zip" +extern "C" int clock_nanosleep(clockid_t clock_id, int flags, + const struct timespec *request, + struct timespec *remain); + namespace android { // --------------------------------------------------------------------------- @@ -476,6 +480,7 @@ bool BootAnimation::movie() for (int r=0 ; !part.count || r<part.count ; r++) { for (int j=0 ; j<fcount && !exitPending(); j++) { const Animation::Frame& frame(part.frames[j]); + nsecs_t lastFrame = systemTime(); if (r > 0) { glBindTexture(GL_TEXTURE_2D, frame.tid); @@ -508,10 +513,18 @@ bool BootAnimation::movie() nsecs_t now = systemTime(); nsecs_t delay = frameDuration - (now - lastFrame); + //ALOGD("%lld, %lld", ns2ms(now - lastFrame), ns2ms(delay)); lastFrame = now; - long wait = ns2us(delay); - if (wait > 0) - usleep(wait); + + if (delay > 0) { + struct timespec spec; + spec.tv_sec = (now + delay) / 1000000000; + spec.tv_nsec = (now + delay) % 1000000000; + int err; + do { + err = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &spec, NULL); + } while (err<0 && errno == EINTR); + } } usleep(part.pause * ns2us(frameDuration)); } |