2.5: Sound
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Sun, 16 Aug 2009 20:37:22 +0000 (20:37 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Sun, 16 Aug 2009 20:37:22 +0000 (20:37 +0000)
* Move sound_init to make sure it gets called everytime user
  preferences is reloaded.
* Merged sound_reinit and sound_init. One used user preferences
  while the other did not, don't see the point of this, so just
  made it always use user preferences now.
* Timeline header audio sync option now controls scene flag
  rather than timeline flag. Since it uses the same playback
  operator now, there is no distinction anymore.
* Added boolean property sync to animation play operator, to sync
  with audio or not. Uses scene setting if property is not set.
* Playback stop button in info header now calls operator, so sounds
  stop playing too.

12 files changed:
source/blender/blenkernel/BKE_sound.h
source/blender/blenkernel/intern/sound.c
source/blender/editors/include/ED_screen.h
source/blender/editors/include/ED_screen_types.h
source/blender/editors/interface/interface_templates.c
source/blender/editors/screen/screen_edit.c
source/blender/editors/screen/screen_ops.c
source/blender/editors/space_time/time_header.c
source/blender/makesdna/DNA_space_types.h
source/blender/makesrna/intern/rna_userdef.c
source/blender/windowmanager/intern/wm_files.c
source/blender/windowmanager/intern/wm_init_exit.c

index ef66b29f1123a848cbd9e2cc4bdcd809adcf7ad9..1dd90b4dbda3c0f5fab79a9b47e802da83d43270 100644 (file)
@@ -39,8 +39,6 @@ struct Main;
 
 void sound_init();
 
-void sound_reinit(struct bContext *C);
-
 void sound_exit();
 
 struct bSound* sound_new_file(struct Main *main, char* filename);
index 347837d1dd0bde0b67a0105ec1cd00791291831d..03123a4e57790929bf76e95a16860b34dfc7154b 100644 (file)
 void sound_init()
 {
        AUD_Specs specs;
-       specs.channels = AUD_CHANNELS_STEREO;
-       specs.format = AUD_FORMAT_S16;
-       specs.rate = AUD_RATE_44100;
-
-       if(!AUD_init(AUD_SDL_DEVICE, specs, AUD_DEFAULT_BUFFER_SIZE))
-               if(!AUD_init(AUD_OPENAL_DEVICE, specs, AUD_DEFAULT_BUFFER_SIZE*4))
-                       AUD_init(AUD_NULL_DEVICE, specs, AUD_DEFAULT_BUFFER_SIZE);
-}
-
-void sound_reinit(struct bContext *C)
-{
-       AUD_Specs specs;
-       int device, buffersize;
+       int device, buffersize, success;
 
        device = U.audiodevice;
        buffersize = U.mixbufsize;
@@ -66,8 +54,15 @@ void sound_reinit(struct bContext *C)
        if(specs.channels <= AUD_CHANNELS_INVALID)
                specs.channels = AUD_CHANNELS_STEREO;
 
-       if(!AUD_init(device, specs, buffersize))
-               AUD_init(AUD_NULL_DEVICE, specs, buffersize);
+       if(!AUD_init(device, specs, buffersize)) {
+               if(device == AUD_SDL_DEVICE)
+                       success= AUD_init(AUD_OPENAL_DEVICE, specs, AUD_DEFAULT_BUFFER_SIZE*4);
+               else
+                       success= AUD_init(AUD_SDL_DEVICE, specs, AUD_DEFAULT_BUFFER_SIZE*4);
+
+               if(!success)
+                       AUD_init(AUD_NULL_DEVICE, specs, buffersize);
+       }
 }
 
 void sound_exit()
index 1c504f84eae31e5bc49be6f5bfdfede1fd02c611..0430a8cecac9e844bb173901044dcffdbe7353c9 100644 (file)
@@ -94,7 +94,7 @@ void  ED_screen_set_scene(struct bContext *C, struct Scene *scene);
 void   ED_screen_delete_scene(struct bContext *C, struct Scene *scene);
 void   ED_screen_set_subwinactive(struct wmWindow *win, struct wmEvent *event);
 void   ED_screen_exit(struct bContext *C, struct wmWindow *window, struct bScreen *screen);
-void   ED_screen_animation_timer(struct bContext *C, int redraws, int enable);
+void   ED_screen_animation_timer(struct bContext *C, int redraws, int sync, int enable);
 int            ED_screen_full_newspace(struct bContext *C, ScrArea *sa, int type);
 void   ED_screen_full_prevspace(struct bContext *C);
 
index 76a2a55c29e1fcb8f9fc9c13102080da4d93aa9b..72afe7704b41cc314d3e600b4942cd037dbcf711 100644 (file)
@@ -31,9 +31,9 @@
 
 /* for animplayer */
 typedef struct ScreenAnimData {
-       ARegion *ar;    /* do not read from this, only for comparing if region exists */
+       ARegion *ar;            /* do not read from this, only for comparing if region exists */
        int redraws;
-       int flag;               /* flags for playback */
+       int flag;                       /* flags for playback */
 } ScreenAnimData;
 
 /* for animplayer */
@@ -42,6 +42,10 @@ enum {
        ANIMPLAY_FLAG_REVERSE           = (1<<0),
                /* temporary - playback just jumped to the start/end */
        ANIMPLAY_FLAG_JUMPED            = (1<<1),
+               /* drop frames as needed to maintain framerate */
+       ANIMPLAY_FLAG_SYNC                      = (1<<2),
+               /* don't drop frames (and ignore AUDIO_SYNC flag) */
+       ANIMPLAY_FLAG_NO_SYNC           = (1<<3),
 };
 
 
index 948203eaa24155983249a5e3485137d570ccb01e..d5df03e151af0aa62919cf8c4778a8f80d31eb5d 100644 (file)
@@ -1579,7 +1579,7 @@ static void do_running_jobs(bContext *C, void *arg, int event)
                        WM_jobs_stop(CTX_wm_manager(C), CTX_wm_screen(C));
                        break;
                case B_STOPANIM:
-                       ED_screen_animation_timer(C, 0, 0);
+                       WM_operator_name_call(C, "SCREEN_OT_animation_play", WM_OP_INVOKE_SCREEN, NULL);
                        break;
        }
 }
index b6c2ece1a024cee0b739f0e630ffac39064dff4a..6663dae1194dc3cd6e4c801774ea28372e028f2c 100644 (file)
@@ -1516,7 +1516,7 @@ void ED_screen_full_prevspace(bContext *C)
 /* redraws: uses defines from stime->redraws 
  * enable: 1 - forward on, -1 - backwards on, 0 - off
  */
-void ED_screen_animation_timer(bContext *C, int redraws, int enable)
+void ED_screen_animation_timer(bContext *C, int redraws, int sync, int enable)
 {
        bScreen *screen= CTX_wm_screen(C);
        wmWindow *win= CTX_wm_window(C);
@@ -1532,7 +1532,8 @@ void ED_screen_animation_timer(bContext *C, int redraws, int enable)
                screen->animtimer= WM_event_add_window_timer(win, TIMER0, (1.0/FPS));
                sad->ar= CTX_wm_region(C);
                sad->redraws= redraws;
-               sad->flag= (enable < 0) ? ANIMPLAY_FLAG_REVERSE : 0;
+               sad->flag= (enable < 0)? ANIMPLAY_FLAG_REVERSE: 0;
+               sad->flag= (sync == 0)? ANIMPLAY_FLAG_NO_SYNC: (sync == 1)? ANIMPLAY_FLAG_SYNC: 0;
                screen->animtimer->customdata= sad;
                
        }
index 9fcee99aa5622c6df1f597b70cabca2a18f8fe74..84e4fe1313f55b0c08800ceea13344eb01c4e7b2 100644 (file)
@@ -2227,17 +2227,25 @@ static int screen_animation_step(bContext *C, wmOperator *op, wmEvent *event)
                wmTimer *wt= screen->animtimer;
                ScreenAnimData *sad= wt->customdata;
                ScrArea *sa;
+               int sync;
+
+               /* sync, don't sync, or follow scene setting */
+               if(scene->audio.flag & ANIMPLAY_FLAG_SYNC) sync= 1;
+               else if(scene->audio.flag & ANIMPLAY_FLAG_NO_SYNC) sync= 0;
+               else sync= (scene->audio.flag & AUDIO_SYNC);
                
-               if(scene->audio.flag & AUDIO_SYNC) {
+               if(sync) {
+                       /* skip frames */
                        int step = floor(wt->duration * FPS);
-                       if (sad->flag & ANIMPLAY_FLAG_REVERSE) // XXX does this option work with audio?
+                       if(sad->flag & ANIMPLAY_FLAG_REVERSE) // XXX does this option work with audio?
                                scene->r.cfra -= step;
                        else
                                scene->r.cfra += step;
                        wt->duration -= ((float)step)/FPS;
                }
                else {
-                       if (sad->flag & ANIMPLAY_FLAG_REVERSE)
+                       /* one frame +/- */
+                       if(sad->flag & ANIMPLAY_FLAG_REVERSE)
                                scene->r.cfra--;
                        else
                                scene->r.cfra++;
@@ -2325,18 +2333,22 @@ static int screen_animation_play(bContext *C, wmOperator *op, wmEvent *event)
        bScreen *screen= CTX_wm_screen(C);
        
        if(screen->animtimer) {
-               ED_screen_animation_timer(C, 0, 0);
+               ED_screen_animation_timer(C, 0, 0, 0);
                sound_stop_all(C);
        }
        else {
                ScrArea *sa= CTX_wm_area(C);
                int mode= (RNA_boolean_get(op->ptr, "reverse")) ? -1 : 1;
+               int sync= -1;
+
+               if(RNA_property_is_set(op->ptr, "sync"))
+                       sync= (RNA_boolean_get(op->ptr, "sync"));
                
                /* timeline gets special treatment since it has it's own menu for determining redraws */
                if ((sa) && (sa->spacetype == SPACE_TIME)) {
                        SpaceTime *stime= (SpaceTime *)sa->spacedata.first;
                        
-                       ED_screen_animation_timer(C, stime->redraws, mode);
+                       ED_screen_animation_timer(C, stime->redraws, sync, mode);
                        
                        /* update region if TIME_REGION was set, to leftmost 3d window */
                        if(screen->animtimer && (stime->redraws & TIME_REGION)) {
@@ -2347,7 +2359,7 @@ static int screen_animation_play(bContext *C, wmOperator *op, wmEvent *event)
                        }
                }
                else {
-                       ED_screen_animation_timer(C, TIME_REGION|TIME_ALL_3D_WIN, mode);
+                       ED_screen_animation_timer(C, TIME_REGION|TIME_ALL_3D_WIN, sync, mode);
                        
                        if(screen->animtimer) {
                                wmTimer *wt= screen->animtimer;
@@ -2373,6 +2385,7 @@ static void SCREEN_OT_animation_play(wmOperatorType *ot)
        ot->poll= ED_operator_screenactive;
        
        RNA_def_boolean(ot->srna, "reverse", 0, "Play in Reverse", "Animation is played backwards");
+       RNA_def_boolean(ot->srna, "sync", 0, "Sync", "Drop frames to maintain framerate and stay in sync with audio.");
 }
 
 /* ************** border select operator (template) ***************************** */
index ea391e0cca79cf0c2f2d41fb14fcb03d24e298d9..412a1e81d49cd63e12df184efc28663f18a255f1 100644 (file)
@@ -397,7 +397,6 @@ void do_time_buttons(bContext *C, void *arg, int event)
 void time_header_buttons(const bContext *C, ARegion *ar)
 {
        ScrArea *sa= CTX_wm_area(C);
-       SpaceTime *stime= CTX_wm_space_time(C);
        Scene *scene= CTX_data_scene(C);
        wmTimer *animtimer= CTX_wm_screen(C)->animtimer;
        uiBlock *block;
@@ -568,8 +567,8 @@ void time_header_buttons(const bContext *C, ARegion *ar)
        
        xco+= XIC;
        
-       uiDefIconButBitI(block, TOG, TIME_WITH_SEQ_AUDIO, B_DIFF, ICON_SPEAKER,
-                                        xco, yco, XIC, YIC, &(stime->redraws), 0, 0, 0, 0, "Play back and sync with audio from Sequence Editor");
+       uiDefIconButBitS(block, TOG, AUDIO_SYNC, B_DIFF, ICON_SPEAKER,
+                                        xco, yco, XIC, YIC, &(scene->audio.flag), 0, 0, 0, 0, "Play back and sync with audio from Sequence Editor");
        
        
        /* always as last  */
index d24d9af4177cc93d5e051bc2bc1965e053b5eed8..6eb5afbd6ac2cc92b9477e9150fc83f375b513df 100644 (file)
@@ -821,7 +821,7 @@ enum {
 #define TIME_ALL_3D_WIN                        2
 #define TIME_ALL_ANIM_WIN              4
 #define TIME_ALL_BUTS_WIN              8
-#define TIME_WITH_SEQ_AUDIO            16
+#define TIME_WITH_SEQ_AUDIO            16              // deprecated
 #define TIME_SEQ                               32
 #define TIME_ALL_IMAGE_WIN             64
 #define TIME_CONTINUE_PHYSICS  128
index 2179b10e47e1076312d8fd2189c08a69405b2a0f..59333f1191d7be7dc8f3cba2db8685775cfea21f 100644 (file)
@@ -120,7 +120,7 @@ static PointerRNA rna_UserDef_system_get(PointerRNA *ptr)
 
 static void rna_UserDef_audio_update(bContext *C, PointerRNA *ptr)
 {
-       sound_reinit(C);
+       sound_init(C);
 }
 
 #else
index ffaa315f04e2ad6208a764947af6fffeb2946cee..9c30c99bbdd29ede1a74e805030f170e72eb0302 100644 (file)
@@ -68,6 +68,7 @@
 #include "BKE_main.h"
 #include "BKE_packedFile.h"
 #include "BKE_report.h"
+#include "BKE_sound.h"
 #include "BKE_texture.h"
 #include "BKE_utildefines.h"
 
@@ -224,7 +225,7 @@ static void wm_init_userdef()
 {
        UI_init_userdef();
        MEM_CacheLimiter_set_maximum(U.memcachelimit * 1024 * 1024);
-       
+       sound_init();
 }
 
 void WM_read_file(bContext *C, char *name, ReportList *reports)
@@ -252,7 +253,6 @@ void WM_read_file(bContext *C, char *name, ReportList *reports)
                wm_check(C); /* opens window(s), checks keymaps */
                
 // XXX         mainwindow_set_filename_to_title(G.main->name);
-// XXX         sound_initialize_sounds();
 
                if(retval==2) wm_init_userdef();        // in case a userdef is read from regular .blend
                
index c679cbcab53e71303968739be892f6ebfb8e6531..ee826d5f57eed78f618f1ca044b77e4af6b67c48 100644 (file)
@@ -144,8 +144,6 @@ void WM_init(bContext *C)
        
        read_Blog();
        BLI_strncpy(G.lib, G.sce, FILE_MAX);
-
-       sound_init();
 }
 
 /* free strings of open recent files */