2.5
authorTon Roosendaal <ton@blender.org>
Sun, 15 Feb 2009 13:09:19 +0000 (13:09 +0000)
committerTon Roosendaal <ton@blender.org>
Sun, 15 Feb 2009 13:09:19 +0000 (13:09 +0000)
Anim playback now uses "Sync" option, skipping frames to match
real time (as set by the frames/sec button).

This is a quicky for tests with audio. Note that the real time
in seconds to update sound to in ED_update_for_newframe() would be:

(scene->r.cfra / FPS) + screen->animtimer->duration

Also this can have a slight inaccuracy, the time between the timer
handler and the ED_update_for_newframe() notifier is not known,
but in general nearly zero. A better implementation is possible, but
thats for later. :)

source/blender/editors/screen/screen_ops.c
source/blender/windowmanager/intern/wm_window.c

index e973e776c21217411d9d87971220cf6c5069f4d3..50ab5798441ccef076e181fc2a30e78f7d2044b4 100644 (file)
@@ -24,6 +24,8 @@
  * ***** END GPL LICENSE BLOCK *****
  */
 
+#include <math.h>
+
 #include "MEM_guardedalloc.h"
 
 #include "BLI_arithb.h"
@@ -1774,7 +1776,14 @@ static int screen_animation_play(bContext *C, wmOperator *op, wmEvent *event)
        if(screen->animtimer==event->customdata) {
                Scene *scene= CTX_data_scene(C);
                
-               scene->r.cfra++;
+               if(scene->audio.flag & AUDIO_SYNC) {
+                       wmTimer *wt= screen->animtimer;
+                       int step = floor(wt->duration * FPS);
+                       scene->r.cfra += step;
+                       wt->duration -= ((float)step)/FPS;
+               }
+               else
+                       scene->r.cfra++;
                
                if (scene->r.psfra) {
                        if(scene->r.cfra > scene->r.pefra)
index a6eba6df0e6a767d8f4e8afa1b054a390dee8b24..dbd0b8f2205a649cc0f936176f9512c03a92af40 100644 (file)
@@ -528,7 +528,8 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private)
 /* This timer system only gives maximum 1 timer event per redraw cycle,
    to prevent queues to get overloaded. 
    Timer handlers should check for delta to decide if they just
-   update, or follow real time 
+   update, or follow real time.
+   Timer handlers can also set duration to match frames passed */
 */
 static int wm_window_timer(const bContext *C)
 {