diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 74679ce89a6..92780d1b973 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -1533,23 +1533,32 @@ void wm_event_do_handlers(bContext *C) wm_event_free_all(win); else { - if(win->screen->scene) + Scene* scene = win->screen->scene; + if(scene) { int playing = sound_scene_playing(win->screen->scene); if(playing != -1) { + CTX_wm_window_set(C, win); + CTX_wm_screen_set(C, win->screen); + CTX_data_scene_set(C, scene); if(((playing == 1) && (!win->screen->animtimer)) || ((playing == 0) && (win->screen->animtimer))) { - CTX_wm_window_set(C, win); - CTX_wm_screen_set(C, win->screen); - CTX_data_scene_set(C, win->screen->scene); - ED_screen_animation_play(C, -1, 1); - - CTX_data_scene_set(C, NULL); - CTX_wm_screen_set(C, NULL); - CTX_wm_window_set(C, NULL); } + if(playing == 0) + { + int ncfra = floor(sound_sync_scene(scene) * FPS); + if(ncfra != scene->r.cfra) + { + scene->r.cfra = ncfra; + ED_update_for_newframe(C, 1); + WM_event_add_notifier(C, NC_WINDOW, NULL); + } + } + CTX_data_scene_set(C, NULL); + CTX_wm_screen_set(C, NULL); + CTX_wm_window_set(C, NULL); } } } diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index d3a760002ae..9c8ccfe7380 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -88,6 +88,7 @@ int WM_enum_search_invoke(struct bContext *C, struct wmOperator *op, struct wmEv void WM_event_add_notifier(const struct bContext *C, unsigned int type, void *reference){} void WM_main_add_notifier(unsigned int type, void *reference){} void ED_armature_bone_rename(struct bArmature *arm, char *oldnamep, char *newnamep){} +struct wmEventHandler *WM_event_add_modal_handler(struct bContext *C, struct wmOperator *op){return (struct wmEventHandler *)NULL;}; void ED_armature_edit_bone_remove(struct bArmature *arm, struct EditBone *exBone){} void object_test_constraints (struct Object *owner){} void ED_object_parent(struct Object *ob, struct Object *par, int type, const char *substr){}