diff options
author | Ton Roosendaal <ton@blender.org> | 2006-11-25 16:07:28 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2006-11-25 16:07:28 +0300 |
commit | 604b4230325aa012efb063e0a3fd2ac23809e393 (patch) | |
tree | 10d0b42f972550484bde3d9d47a72bbbd68a956e /source/blender | |
parent | b78b3a4761849bd7e2b368884e05c40ef58d12d0 (diff) |
- Library linking feature: global undo/redo now doesn't read the linked
library .blend files anymore, making it a load faster to use.
- Fixed ancient annoyance; samples were not properly freed, giving a lot
"Error Totblock" when using sound.
This fix also involves removing an ancient NaN hack, which treated the
samples as fake Library data in the Main database.
But still, the Blender Sound and Sample code is horrible... :/
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_sound.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/blender.c | 11 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/library.c | 19 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/sound.c | 20 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readblenentry.c | 24 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 59 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.h | 5 | ||||
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 34 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_ID.h | 7 | ||||
-rw-r--r-- | source/blender/src/buttons_scene.c | 50 | ||||
-rw-r--r-- | source/blender/src/editsound.c | 170 |
11 files changed, 205 insertions, 197 deletions
diff --git a/source/blender/blenkernel/BKE_sound.h b/source/blender/blenkernel/BKE_sound.h index e6634bc4a6a..0a747847b11 100644 --- a/source/blender/blenkernel/BKE_sound.h +++ b/source/blender/blenkernel/BKE_sound.h @@ -39,8 +39,11 @@ struct bSound; struct bSample; struct ListBase; +/* bad bad global... */ extern struct ListBase *samples; +void sound_free_all_samples(void); + /* void *sound_get_listener(void); implemented in src!also declared there now */ void sound_set_packedfile(struct bSample* sample, struct PackedFile* pf); diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index 570f993f542..bb5f25c6907 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -73,6 +73,7 @@ #include "BKE_main.h" #include "BKE_object.h" #include "BKE_scene.h" +#include "BKE_sound.h" #include "BLI_editVert.h" @@ -166,10 +167,14 @@ void pushpop_test() void free_blender(void) { + /* samples are in a global list..., also sets G.main->sound->sample NULL */ + sound_free_all_samples(); + free_main(G.main); G.main= NULL; IMB_freeImBufdata(); /* imbuf lib */ + } void duplicatelist(ListBase *list1, ListBase *list2) /* copy from 2 to 1 */ @@ -336,7 +341,7 @@ static void setup_app_data(BlendFileData *bfd, char *filename) lib_link_screen_restore(bfd->main, curscene); } - clear_global(); + clear_global(); /* free Main database */ if(mode!='u') G.save_over = 1; @@ -351,6 +356,9 @@ static void setup_app_data(BlendFileData *bfd, char *filename) } + /* samples is a global list... */ + sound_free_all_samples(); + /* case G_FILE_NO_UI or no screens in file */ if(mode) { G.curscreen= curscreen; @@ -459,6 +467,7 @@ int BKE_read_file_from_memory(char* filebuf, int filelength, void *type_r) return (bfd?1:0); } +/* memfile is the undo buffer */ int BKE_read_file_from_memfile(MemFile *memfile) { BlendReadError bre; diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c index e6aa0208a5e..6038e70f6f2 100644 --- a/source/blender/blenkernel/intern/library.c +++ b/source/blender/blenkernel/intern/library.c @@ -184,9 +184,6 @@ ListBase *wich_libbase(Main *mainlib, short type) return &(mainlib->script); case ID_SO: return &(mainlib->sound); - case ID_SAMPLE: - /* declared as an external in sound.h !!! */ - return (samples); case ID_GR: return &(mainlib->group); case ID_AR: @@ -239,12 +236,10 @@ int set_listbasepointers(Main *main, ListBase **lb) lb[22]= &(main->group); lb[23]= &(main->nodetree); lb[24]= &(main->brush); + lb[25]= &(main->script); + lb[26]= NULL; - lb[25]= samples; - lb[26]= &(main->script); - lb[27]= NULL; - - return 27; + return 26; } /* *********** ALLOC AND FREE ***************** @@ -325,11 +320,8 @@ static ID *alloc_libblock_notest(short type) case ID_SO: id= MEM_callocN(sizeof(bSound), "sound"); break; - case ID_SAMPLE: - id = MEM_callocN(sizeof(bSample), "sound"); - break; case ID_GR: - id= MEM_callocN(sizeof(Group), "sound"); + id= MEM_callocN(sizeof(Group), "group"); break; case ID_AR: id = MEM_callocN(sizeof(bArmature), "armature"); @@ -471,9 +463,6 @@ void free_libblock(ListBase *lb, void *idv) case ID_SO: sound_free_sound((bSound *)id); break; - case ID_SAMPLE: - sound_free_sample((bSample *)id); - break; case ID_GR: free_group((Group *)id); break; diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c index 2f31dbcaa80..3b14cb8adac 100644 --- a/source/blender/blenkernel/intern/sound.c +++ b/source/blender/blenkernel/intern/sound.c @@ -62,7 +62,25 @@ void sound_free_sample(bSample *sample) } } - +/* this is called after file reading or undos */ +void sound_free_all_samples(void) +{ + bSample *sample; + bSound *sound; + + /* ensure no sample pointers exist, and check packedfile */ + for(sound= G.main->sound.first; sound; sound= sound->id.next) { + if(sound->sample && sound->sample->packedfile==sound->newpackedfile) + sound->newpackedfile= NULL; + sound->sample= NULL; + } + + /* now free samples */ + for(sample= samples->first; sample; sample= sample->id.next) + sound_free_sample(sample); + BLI_freelistN(samples); + +} void sound_set_packedfile(bSample *sample, PackedFile *pf) { diff --git a/source/blender/blenloader/intern/readblenentry.c b/source/blender/blenloader/intern/readblenentry.c index 17549485025..1e602285fc0 100644 --- a/source/blender/blenloader/intern/readblenentry.c +++ b/source/blender/blenloader/intern/readblenentry.c @@ -54,6 +54,7 @@ #include "BKE_utildefines.h" // for ENDB #include "BKE_main.h" +#include "BKE_global.h" #include "BKE_library.h" // for free_main #include "BLO_readfile.h" @@ -98,7 +99,6 @@ static IDType idtypes[]= { { ID_ME, "Mesh", IDTYPE_FLAGS_ISLINKABLE}, { ID_NT, "NodeTree", IDTYPE_FLAGS_ISLINKABLE}, { ID_OB, "Object", IDTYPE_FLAGS_ISLINKABLE}, - { ID_SAMPLE, "Sample", 0}, { ID_SCE, "Scene", IDTYPE_FLAGS_ISLINKABLE}, { ID_SCR, "Screen", 0}, { ID_SEQ, "Sequence", 0}, @@ -289,16 +289,21 @@ BlendFileData *BLO_read_from_memory(void *mem, int memsize, BlendReadError *erro return bfd; } - BlendFileData *BLO_read_from_memfile(const char *filename, MemFile *memfile, BlendReadError *error_r) { BlendFileData *bfd = NULL; FileData *fd; - + ListBase mainlist; + fd = blo_openblendermemfile(memfile, error_r); if (fd) { strcpy(fd->filename, filename); + /* separate libraries from G.main */ + blo_split_main(&mainlist, G.main); + /* add the library pointers in oldmap lookup */ + blo_add_library_pointer_map(&mainlist, fd); + /* makes lookup of existing images in G.main */ blo_make_image_pointer_map(fd); @@ -311,6 +316,19 @@ BlendFileData *BLO_read_from_memfile(const char *filename, MemFile *memfile, Ble /* ensures relinked images are not freed */ blo_end_image_pointer_map(fd); + /* move libraries from G.main to new main */ + if(bfd && mainlist.first!=mainlist.last) { + + /* Library structs themselves */ + bfd->main->library= G.main->library; + G.main->library.first= G.main->library.last= NULL; + + /* add the Library mainlist to the new main */ + BLI_remlink(&mainlist, G.main); + BLI_addhead(&mainlist, bfd->main); + } + blo_join_main(&mainlist); + blo_freefiledata(fd); } diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 547b5f016e7..79ea9cc5d81 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -320,7 +320,7 @@ static void *oldnewmap_lookup_and_inc(OldNewMap *onm, void *addr) return NULL; } -/* for libdate, nr has ID code, no increment */ +/* for libdata, nr has ID code, no increment */ static void *oldnewmap_liblookup(OldNewMap *onm, void *addr, void *lib) { int i; @@ -438,22 +438,27 @@ static void split_libdata(ListBase *lb, Main *first) } } -void blo_split_main(ListBase *mainlist) +void blo_split_main(ListBase *mainlist, Main *main) { - Main *mainl= mainlist->first; ListBase *lbarray[MAX_LIBARRAY]; Library *lib; int i; - for (lib= mainl->library.first; lib; lib= lib->id.next) { + mainlist->first= mainlist->last= main; + main->next= NULL; + + if(main->library.first==NULL) + return; + + for (lib= main->library.first; lib; lib= lib->id.next) { Main *libmain= MEM_callocN(sizeof(Main), "libmain"); libmain->curlib= lib; BLI_addtail(mainlist, libmain); } - i= set_listbasepointers(mainl, lbarray); + i= set_listbasepointers(main, lbarray); while(i--) - split_libdata(lbarray[i], mainl->next); + split_libdata(lbarray[i], main->next); } /* removes things like /blah/blah/../../blah/ etc, then writes in *name the full path */ @@ -1031,9 +1036,8 @@ static void *newlibadr_us(FileData *fd, void *lib, void *adr) /* increases user { ID *id= newlibadr(fd, lib, adr); - if(id) { + if(id) id->us++; - } return id; } @@ -1122,6 +1126,23 @@ void blo_end_image_pointer_map(FileData *fd) } } +/* undo file support: add all library pointers in lookup */ +void blo_add_library_pointer_map(ListBase *mainlist, FileData *fd) +{ + Main *main= mainlist->first; + ListBase *lbarray[MAX_LIBARRAY]; + + for(main= main->next; main; main= main->next) { + int i= set_listbasepointers(main, lbarray); + while(i--) { + ID *id; + for(id= lbarray[i]->first; id; id= id->next) + oldnewmap_insert(fd->libmap, id, id, GS(id->name)); + } + } +} + + /* ********** END OLD POINTERS ****************** */ /* ********** READ FILE ****************** */ @@ -3804,7 +3825,6 @@ static char *dataname(short id_code) case ID_VF: return "Data from VF"; case ID_TXT : return "Data from TXT"; case ID_SO: return "Data from SO"; - case ID_SAMPLE: return "Data from SAMPLE"; case ID_NT: return "Data from NT"; case ID_BR: return "Data from BR"; } @@ -4915,8 +4935,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) Mesh *me; bScreen *sc; - for (sound=main->sound.first; sound; sound=sound->id.next) - { + for (sound=main->sound.first; sound; sound=sound->id.next) { if (sound->packedfile) { if (sound->newpackedfile == NULL) { sound->newpackedfile = sound->packedfile; @@ -6179,17 +6198,15 @@ BlendFileData *blo_read_file_internal(FileData *fd, BlendReadError *error_r) */ bhead = read_libblock(fd, fd->mainlist.last, bhead, LIB_READ+LIB_EXTERN, NULL); break; -// case ID_GR: -// bhead = blo_nextbhead(fd, bhead); -// break; default: bhead = read_libblock(fd, bfd->main, bhead, LIB_LOCAL, NULL); } } - /* before read_libraries */ - do_versions(fd, NULL, bfd->main); + /* do before read_libraries, but skip undo case */ +// if(fd->memfile==NULL) (the mesh shuffle hacks don't work yet? ton) + do_versions(fd, NULL, bfd->main); read_libraries(fd, &fd->mainlist); blo_join_main(&fd->mainlist); @@ -6966,11 +6983,8 @@ void BLO_script_library_append(BlendHandle *bh, char *dir, char *name, int idcod Main *mainl; FileData *fd = (FileData *)bh; - mainlist.first= mainlist.last= G.main; - G.main->next= NULL; - /* make mains */ - blo_split_main(&mainlist); + blo_split_main(&mainlist, G.main); /* which one do we need? */ mainl = blo_find_main(&mainlist, dir, G.sce); @@ -7030,11 +7044,8 @@ void BLO_library_append(SpaceFile *sfile, char *dir, int idcode) if(sfile->flag & FILE_AUTOSELECT) scene_deselect_all(G.scene); - fd->mainlist.first= fd->mainlist.last= G.main; - G.main->next= NULL; - /* make mains */ - blo_split_main(&fd->mainlist); + blo_split_main(&fd->mainlist, G.main); /* which one do we need? */ mainl = blo_find_main(&fd->mainlist, dir, G.sce); diff --git a/source/blender/blenloader/intern/readfile.h b/source/blender/blenloader/intern/readfile.h index a0f42769762..fd7e5c0ee00 100644 --- a/source/blender/blenloader/intern/readfile.h +++ b/source/blender/blenloader/intern/readfile.h @@ -99,9 +99,9 @@ typedef struct BHeadN { #define SIZEOFBLENDERHEADER 12 /***/ - +struct Main; void blo_join_main(ListBase *mainlist); -void blo_split_main(ListBase *mainlist); +void blo_split_main(ListBase *mainlist, struct Main *main); BlendFileData *blo_read_file_internal( FileData *fd, BlendReadError *error_r); @@ -111,6 +111,7 @@ FileData *blo_openblendermemfile(struct MemFile *memfile, BlendReadError *error_ void blo_make_image_pointer_map(FileData *fd); void blo_end_image_pointer_map(FileData *fd); +void blo_add_library_pointer_map(ListBase *mainlist, FileData *fd); void blo_freefiledata( FileData *fd); diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 56adb3b732d..00c8fc86081 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -1603,20 +1603,18 @@ static void write_libraries(WriteData *wd, Main *main) ID *id; int a, tot, foundone; - while(main) { + for(; main; main= main->next) { a=tot= set_listbasepointers(main, lbarray); /* test: is lib being used */ foundone= 0; while(tot--) { - id= lbarray[tot]->first; - while(id) { + for(id= lbarray[tot]->first; id; id= id->next) { if(id->us>0 && (id->flag & LIB_EXTERN)) { foundone= 1; break; } - id= id->next; } if(foundone) break; } @@ -1625,20 +1623,13 @@ static void write_libraries(WriteData *wd, Main *main) writestruct(wd, ID_LI, "Library", 1, main->curlib); while(a--) { - id= lbarray[a]->first; - while(id) { - if(G.rt==127 && GS(id->name)!=ID_GR) break; - + for(id= lbarray[a]->first; id; id= id->next) { if(id->us>0 && (id->flag & LIB_EXTERN)) { - writestruct(wd, ID_ID, "ID", 1, id); } - id= id->next; } } } - - main= main->next; } } @@ -1856,19 +1847,15 @@ static void write_global(WriteData *wd) writestruct(wd, GLOB, "FileGlobal", 1, &fg); } -/* if *mem there's filesave to memory */ +/* if MemFile * there's filesave to memory */ static int write_file_handle(int handle, MemFile *compare, MemFile *current, int write_user_block, int write_flags) { BHead bhead; ListBase mainlist; char buf[13]; WriteData *wd; -/* int data; */ /*unused*/ - - mainlist.first= mainlist.last= G.main; - G.main->next= NULL; - blo_split_main(&mainlist); + blo_split_main(&mainlist, G.main); wd= bgnwrite(handle, compare, current, write_flags); @@ -1878,7 +1865,7 @@ static int write_file_handle(int handle, MemFile *compare, MemFile *current, int write_renderinfo(wd); if(current==NULL) - write_screens (wd, &G.main->screen); // no UI save + write_screens (wd, &G.main->screen); /* no UI save in undo */ write_scenes (wd, &G.main->scene); write_curves (wd, &G.main->curve); write_mballs (wd, &G.main->mball); @@ -1901,7 +1888,8 @@ static int write_file_handle(int handle, MemFile *compare, MemFile *current, int write_meshs (wd, &G.main->mesh); write_nodetrees(wd, &G.main->nodetree); write_brushes (wd, &G.main->brush); - write_libraries(wd, G.main->next); + if(current==NULL) + write_libraries(wd, G.main->next); /* no library save in undo */ write_global(wd); if (write_user_block) { @@ -1927,7 +1915,7 @@ int BLO_write_file(char *dir, int write_flags, char **error_r) { char userfilename[FILE_MAXDIR+FILE_MAXFILE]; char tempname[FILE_MAXDIR+FILE_MAXFILE]; - int file, fout, write_user_block; + int file, err, write_user_block; sprintf(tempname, "%s@", dir); @@ -1941,10 +1929,10 @@ int BLO_write_file(char *dir, int write_flags, char **error_r) write_user_block= BLI_streq(dir, userfilename); - fout= write_file_handle(file, NULL,NULL, write_user_block, write_flags); + err= write_file_handle(file, NULL,NULL, write_user_block, write_flags); close(file); - if(!fout) { + if(!err) { if(write_flags & G_FILE_COMPRESS) { // compressed files have the same ending as regular files... only from 2.4!!! diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h index facd0b02db7..638a225bd21 100644 --- a/source/blender/makesdna/DNA_ID.h +++ b/source/blender/makesdna/DNA_ID.h @@ -147,7 +147,7 @@ typedef struct Library { #define BLITTLE_ENDIAN #endif -/* ID */ +/* ID from database */ #define ID_SCE MAKE_ID2('S', 'C') #define ID_LI MAKE_ID2('L', 'I') #define ID_OB MAKE_ID2('O', 'B') @@ -171,13 +171,11 @@ typedef struct Library { #define ID_VF MAKE_ID2('V', 'F') #define ID_TXT MAKE_ID2('T', 'X') #define ID_SO MAKE_ID2('S', 'O') -#define ID_SAMPLE MAKE_ID2('S', 'A') #define ID_GR MAKE_ID2('G', 'R') #define ID_ID MAKE_ID2('I', 'D') #define ID_AR MAKE_ID2('A', 'R') #define ID_AC MAKE_ID2('A', 'C') #define ID_SCRIPT MAKE_ID2('P', 'Y') -#define ID_FLUIDSIM MAKE_ID2('F', 'S') #define ID_NT MAKE_ID2('N', 'T') #define ID_BR MAKE_ID2('B', 'R') @@ -189,6 +187,9 @@ typedef struct Library { #define ID_PO MAKE_ID2('A', 'C') /* used in outliner... */ #define ID_NLA MAKE_ID2('N', 'L') + /* fluidsim Ipo */ +#define ID_FLUIDSIM MAKE_ID2('F', 'S') + /*#ifdef WITH_VERSE*/ #define ID_VS MAKE_ID2('V', 'S') /* fake id for VerseSession, needed for outliner */ diff --git a/source/blender/src/buttons_scene.c b/source/blender/src/buttons_scene.c index 19e23f23377..770261c8280 100644 --- a/source/blender/src/buttons_scene.c +++ b/source/blender/src/buttons_scene.c @@ -188,11 +188,7 @@ void do_soundbuts(unsigned short event) break; case B_SOUND_MENU_SAMPLE: - if (G.buts->menunr == -2) { - if (sound) { - activate_databrowse((ID *)sound->sample, ID_SAMPLE, 0, B_SOUND_MENU_SAMPLE, &G.buts->menunr, do_soundbuts); - } - } else if (G.buts->menunr > 0) { + if (G.buts->menunr > 0) { sample = BLI_findlink(samples, G.buts->menunr - 1); if (sample && sound) { BLI_strncpy(sound->name, sample->name, sizeof(sound->name)); @@ -348,13 +344,32 @@ static void sound_panel_sequencer(void) } +static char *make_sample_menu(void) +{ + int len= BLI_countlist(samples); /* BKE_sound.h */ + + if(len) { + bSample *sample; + char *str; + int nr, a=0; + + str= MEM_callocN(32*len, "menu"); + + for(nr=1, sample= samples->first; sample; sample= sample->id.next, nr++) { + a+= sprintf(str+a, "|%s %%x%d", sample->id.name+2, nr); + } + return str; + } + return NULL; +} + static void sound_panel_sound(bSound *sound) { static int packdummy=0; ID *id, *idfrom; uiBlock *block; bSample *sample; - char *strp, str[32], ch[256]; + char *strp, ch[256]; block= uiNewBlock(&curarea->uiblocks, "sound_panel_sound", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Sound", "Sound", 0, 0, 318, 204)==0) return; @@ -388,27 +403,26 @@ static void sound_panel_sound(bSound *sound) } /* sample browse buttons */ - - id= (ID *)sound->sample; - IDnames_to_pupstring(&strp, NULL, NULL, samples, id, &(G.buts->menunr)); - if (strp[0]) uiDefButS(block, MENU, B_SOUND_MENU_SAMPLE, strp, 10,120,23,20, &(G.buts->menunr), 0, 0, 0, 0, "Select another loaded sample"); - MEM_freeN(strp); - - uiDefBut(block, TEX, B_SOUND_NAME_SAMPLE, "", 35,120,225,20, sound->name, 0.0, 79.0, 0, 0, "The sample file used by this Sound"); - - sprintf(str, "%d", sample->id.us); - uiDefBut(block, BUT, B_SOUND_UNLINK_SAMPLE, str, 260,120,25,20, 0, 0, 0, 0, 0, "The number of users"); + uiBlockBeginAlign(block); + strp= make_sample_menu(); + if (strp) { + uiDefButS(block, MENU, B_SOUND_MENU_SAMPLE, strp, 10,120,23,20, &(G.buts->menunr), 0, 0, 0, 0, "Select another loaded sample"); + MEM_freeN(strp); + } + uiDefBut(block, TEX, B_SOUND_NAME_SAMPLE, "", 35,120,250,20, sound->name, 0.0, 79.0, 0, 0, "The sample file used by this Sound"); if (sound->sample->packedfile) packdummy = 1; else packdummy = 0; uiDefIconButBitI(block, TOG, 1, B_SOUND_UNPACK_SAMPLE, ICON_PACKAGE, - 285, 120,25,24, &packdummy, 0, 0, 0, 0,"Pack/Unpack this sample"); + 285, 120,25,20, &packdummy, 0, 0, 0, 0,"Pack/Unpack this sample"); + uiBlockBeginAlign(block); uiDefBut(block, BUT, B_SOUND_LOAD_SAMPLE, "Load sample", 10, 95,150,24, 0, 0, 0, 0, 0, "Load a different sample file"); uiDefBut(block, BUT, B_SOUND_PLAY_SAMPLE, "Play", 160, 95, 150, 24, 0, 0.0, 0, 0, 0, "Playback sample using settings below"); + uiBlockBeginAlign(block); uiDefButF(block, NUMSLI, B_SOUND_CHANGED, "Volume: ", 10,70,150,20, &sound->volume, 0.0, 1.0, 0, 0, "Game engine only: Set the volume of this sound"); @@ -416,6 +430,7 @@ static void sound_panel_sound(bSound *sound) 160,70,150,20, &sound->pitch, -12.0, 12.0, 0, 0, "Game engine only: Set the pitch of this sound"); /* looping */ + uiBlockBeginAlign(block); uiDefButBitI(block, TOG, SOUND_FLAGS_LOOP, B_SOUND_REDRAW, "Loop", 10, 50, 95, 20, &sound->flags, 0.0, 0.0, 0, 0, "Game engine only: Toggle between looping on/off"); @@ -427,6 +442,7 @@ static void sound_panel_sound(bSound *sound) /* 3D settings ------------------------------------------------------------------ */ + uiBlockBeginAlign(block); if (sound->sample->channels == 1) { uiDefButBitI(block, TOG, SOUND_FLAGS_3D, B_SOUND_REDRAW, "3D Sound", diff --git a/source/blender/src/editsound.c b/source/blender/src/editsound.c index b1ec94d123b..bd209f2d39c 100644 --- a/source/blender/src/editsound.c +++ b/source/blender/src/editsound.c @@ -201,7 +201,7 @@ void winqreadsoundspace(ScrArea *sa, void *spacedata, BWinEvent *evt) void sound_initialize_sounds(void) { - bSound* sound; + bSound *sound; if(ghSoundScene) { @@ -212,8 +212,7 @@ void sound_initialize_sounds(void) /* initialize sample blocks (doesnt call audio system, needs to be done once after load */ sound = G.main->sound.first; - while (sound) - { + while (sound) { sound_sample_is_null(sound); sound = (bSound *) sound->id.next; } @@ -221,9 +220,9 @@ void sound_initialize_sounds(void) -bSound* sound_make_copy(bSound* originalsound) +bSound *sound_make_copy(bSound *originalsound) { - bSound* sound = NULL; + bSound *sound = NULL; char name[160]; int len; @@ -273,7 +272,7 @@ bSound* sound_make_copy(bSound* originalsound) -void sound_initialize_sample(bSound* sound) +void sound_initialize_sample(bSound *sound) { if(ghSoundScene==NULL) sound_init_audio(); @@ -282,7 +281,7 @@ void sound_initialize_sample(bSound* sound) } -void sound_read_wav_data(bSound* sound, PackedFile* pf) +void sound_read_wav_data(bSound *sound, PackedFile *pf) { int i, temp; short shortbuf, *temps; @@ -299,36 +298,31 @@ void sound_read_wav_data(bSound* sound, PackedFile* pf) rewindPackedFile(pf); /* check to see if it is a file in "RIFF WAVE fmt" format */ - if (readPackedFile(pf, buffer, 16) != 16) - { + if (readPackedFile(pf, buffer, 16) != 16) { if (G.f & G_DEBUG) printf("File too short\n"); return; } - if(!(memcmp(buffer, "RIFF", 4) && memcmp(&(buffer[8]), "WAVEfmt ", 8))) - { + if(!(memcmp(buffer, "RIFF", 4) && memcmp(&(buffer[8]), "WAVEfmt ", 8))) { readPackedFile(pf, &i, 4);// start of data if(G.order==B_ENDIAN) SWITCH_INT(i); /* read the sampleformat */ readPackedFile(pf, &shortbuf, 2); - if(G.order==B_ENDIAN) - { + if(G.order==B_ENDIAN) { SWITCH_SHORT(shortbuf); } /* read the number of channels */ readPackedFile(pf, &shortbuf, 2); - if(G.order==B_ENDIAN) - { + if(G.order==B_ENDIAN) { SWITCH_SHORT(shortbuf); } /* check the number of channels */ - if(shortbuf != 1 && shortbuf != 2) - { + if(shortbuf != 1 && shortbuf != 2) { if (G.f & G_DEBUG) printf("Unsupported number of channels\n"); return; } @@ -356,8 +350,7 @@ void sound_read_wav_data(bSound* sound, PackedFile* pf) readPackedFile(pf, &shortbuf, 2); readPackedFile(pf, &shortbuf, 2); - if(G.order==B_ENDIAN) - { + if(G.order==B_ENDIAN) { SWITCH_SHORT(shortbuf); } bits = shortbuf; @@ -365,8 +358,7 @@ void sound_read_wav_data(bSound* sound, PackedFile* pf) seekPackedFile(pf, i-16, SEEK_CUR); readPackedFile(pf, buffer, 4); /* check if we have a 'data' chunk */ - while(memcmp(buffer, "data", 4)!=0) - { + while(memcmp(buffer, "data", 4)!=0) { if (readPackedFile(pf, &i, 4) != 4) break; @@ -379,13 +371,11 @@ void sound_read_wav_data(bSound* sound, PackedFile* pf) } /* guess not */ - if (memcmp(buffer, "data", 4) !=0) - { + if (memcmp(buffer, "data", 4) !=0) { if (G.f & G_DEBUG) printf("No data found\n"); } /* or maybe we do! */ - else - { + else { readPackedFile(pf, &longbuf, 4); if(G.order==B_ENDIAN) SWITCH_INT(longbuf); @@ -399,21 +389,17 @@ void sound_read_wav_data(bSound* sound, PackedFile* pf) len = longbuf /*/ 4.0*/; /* for some strange reason the sample length is off by a factor of 4... */ /* intrr's comment: Funny eh, how one 16-bit stereo sample is 4 bytes? :-) */ - if(data) - { + if(data) { readPackedFile(pf, data, len); /* data is only used to draw! */ - if (bits == 8) - { + if (bits == 8) { temps = (short *) data; tempc = (char *) data; for (i = len - 1; i >= 0; i--) temps[i] = tempc[i] << 8; } - else - { - if(G.order==B_ENDIAN) - { + else { + if(G.order==B_ENDIAN) { swab(data, data, len); } } @@ -428,8 +414,7 @@ void sound_read_wav_data(bSound* sound, PackedFile* pf) } } } - else - { + else { sound->sample->type = SAMPLE_INVALID; if (G.f & G_DEBUG) printf("Unsupported sound format: %s\n", sound->name); } @@ -438,7 +423,7 @@ void sound_read_wav_data(bSound* sound, PackedFile* pf) /* ugly, but it works (for now) */ -static int sound_get_filetype_from_header(bSound* sound, PackedFile* pf) +static int sound_get_filetype_from_header(bSound *sound, PackedFile *pf) { int filetype = SAMPLE_INVALID; int i; @@ -447,22 +432,19 @@ static int sound_get_filetype_from_header(bSound* sound, PackedFile* pf) rewindPackedFile(pf); - if (readPackedFile(pf, buffer, 16) != 16) - { + if (readPackedFile(pf, buffer, 16) != 16) { if (G.f & G_DEBUG) printf("File too short\n"); return filetype; } - if(!(memcmp(buffer, "RIFF", 4) && memcmp(&(buffer[8]), "WAVEfmt ", 8))) - { + if(!(memcmp(buffer, "RIFF", 4) && memcmp(&(buffer[8]), "WAVEfmt ", 8))) { readPackedFile(pf, &i, 4); if(G.order==B_ENDIAN) SWITCH_INT(i); /* read the sampleformat */ readPackedFile(pf, &shortbuf, 2); - if(G.order==B_ENDIAN) - { + if(G.order==B_ENDIAN) { char s_i, *p_i; p_i= (char *)&(shortbuf); s_i= p_i[0]; @@ -470,8 +452,7 @@ static int sound_get_filetype_from_header(bSound* sound, PackedFile* pf) p_i[1]= s_i; } - if (shortbuf == SND_WAVE_FORMAT_PCM) - { + if (shortbuf == SND_WAVE_FORMAT_PCM) { filetype = SAMPLE_WAV; } else @@ -500,17 +481,14 @@ static int sound_get_filetype_from_header(bSound* sound, PackedFile* pf) #ifdef USE_FMOD } } - else if (!memcmp(buffer, "OggS", 4)) - { + else if (!memcmp(buffer, "OggS", 4)) { filetype = SAMPLE_OGG_VORBIS; } - else if ((!memcmp(buffer, "ID3", 3)) || (!memcmp(buffer, "", 2))) - { + else if ((!memcmp(buffer, "ID3", 3)) || (!memcmp(buffer, "", 2))) { filetype = SAMPLE_MP3; } #endif - else - { + else { filetype = SAMPLE_INVALID; if (G.f & G_DEBUG) printf("Unsupported sound format: %s\n", sound->name); } @@ -520,7 +498,7 @@ static int sound_get_filetype_from_header(bSound* sound, PackedFile* pf) -static int check_filetype(bSound* sound, PackedFile* pf) +static int check_filetype(bSound *sound, PackedFile *pf) { // char* pdest; sound->sample->type = SAMPLE_INVALID; @@ -550,8 +528,7 @@ static int check_filetype(bSound* sound, PackedFile* pf) sound->sample->type = sound_get_filetype_from_header(sound, pf); /* get some info from the sample */ - switch (sound->sample->type) - { + switch (sound->sample->type) { case SAMPLE_WAV: { sound_read_wav_data(sound, pf); @@ -576,24 +553,22 @@ static int check_filetype(bSound* sound, PackedFile* pf) -int sound_load_sample(bSound* sound) +int sound_load_sample(bSound *sound) { int result = FALSE; - PackedFile* pf; + PackedFile *pf; int freePF = FALSE; int buffer = -1; if(ghSoundScene==NULL) sound_init_audio(); /* check the sample (valid?) */ - if (sound->sample->type == SAMPLE_UNKNOWN || sound->snd_sound == NULL) - { + if (sound->sample->type == SAMPLE_UNKNOWN || sound->snd_sound == NULL) { /* find... */ pf = sound_find_packedfile(sound); /* ...or create a (temp)packedfile */ - if (pf == NULL) - { + if (pf == NULL) { pf = newPackedFile(sound->name); /* if autopack is off, free the pf afterwards */ @@ -602,14 +577,12 @@ int sound_load_sample(bSound* sound) } /* if we have a valid pf... */ - if (pf) - { + if (pf) { /* check the content of the pf */ check_filetype(sound, pf); /* check if the sampletype is supported */ - if (sound->sample->type != SAMPLE_INVALID && sound->sample->type != SAMPLE_UNKNOWN) - { + if (sound->sample->type != SAMPLE_INVALID && sound->sample->type != SAMPLE_UNKNOWN) { /* register the sample at the audiodevice */ buffer = SND_AddSample(ghSoundScene, sound->sample->name, pf->data, pf->size); @@ -628,33 +601,28 @@ int sound_load_sample(bSound* sound) result = TRUE; } /* if not, free the pf */ - else - { + else { freePF = TRUE; } /* if you want it freed, make it so */ - if (freePF) - { + if (freePF) { freePackedFile(pf); pf = NULL; } /* or else connect the pf to the sound and sample */ -// else -// { +// else { sound->newpackedfile = pf; sound->sample->packedfile = pf; // } } - else - { + else { if (G.f & G_DEBUG) printf("%s: File not found!\n", sound->name); sound->sample->type = SAMPLE_INVALID; } } /* if the sample ain't invalid, we're ready to go! */ - else if (sound->sample->type != SAMPLE_INVALID) - { + else if (sound->sample->type != SAMPLE_INVALID) { result = TRUE; } @@ -663,7 +631,7 @@ int sound_load_sample(bSound* sound) -bSound* sound_new_sound(char* name) +bSound *sound_new_sound(char *name) { bSound *sound = NULL; int len, file; @@ -679,8 +647,7 @@ bSound* sound_new_sound(char* name) /* check if the sample on disk can be opened */ file = open(str, O_BINARY|O_RDONLY); - if (file != -1) - { + if (file != -1) { close(file); @@ -699,8 +666,7 @@ bSound* sound_new_sound(char* name) /* load the sample & check if this blender supports the sound format */ // sound_load_sample(sound); - if (sound->sample->type == SAMPLE_INVALID) - { + if (sound->sample->type == SAMPLE_INVALID) { free_libblock(&G.main->sound, sound); sound = NULL; } @@ -725,13 +691,8 @@ int sound_set_sample(bSound *sound, bSample *sample) if(ghSoundScene==NULL) sound_init_audio(); - /* decrease the usernumber for this sample */ - if (sound->sample) - sound->sample->id.us--; - /* delete the soundobject */ - if (sound->snd_sound) - { + if (sound->snd_sound) { SND_RemoveSound(ghSoundScene, sound->snd_sound); sound->snd_sound = NULL; } @@ -740,22 +701,17 @@ int sound_set_sample(bSound *sound, bSample *sample) sound->sample = sample; sound->newpackedfile = NULL; - /* increase the usercount */ - if (sound->sample) - { - sound->sample->id.us++; + if (sound->sample) { /* and set the right pf */ sound->newpackedfile = sample->packedfile; /* if the sampletype is unknown initialize it */ - if (sound->sample->type == SAMPLE_UNKNOWN) - { + if (sound->sample->type == SAMPLE_UNKNOWN) { sound_initialize_sample(sound); /* load the sample & check if this blender supports the sound format */ - if (!sound_load_sample(sound)) - { + if (!sound_load_sample(sound)) { result = FALSE; } } @@ -766,14 +722,13 @@ int sound_set_sample(bSound *sound, bSample *sample) -bSample *sound_new_sample(bSound * sound) +bSample *sound_new_sample(bSound *sound) { bSample *sample = NULL; int len; char *name; - if (sound != NULL) - { + if (sound != NULL) { name = sound->name; len = strlen(name); /* do some name magic */ @@ -781,7 +736,10 @@ bSample *sound_new_sample(bSound * sound) len--; /* allocate the memory for the sample */ - sample = alloc_libblock(samples, ID_SAMPLE, name + len); + sample = MEM_callocN(sizeof(bSample), "sample"); + BLI_strncpy(sample->id.name+2, name+len, 20); + BLI_addtail(samples, sample); /* samples is ugly global */ + sample->data = &sample->fakedata[0]; sample->type = SAMPLE_UNKNOWN; @@ -808,9 +766,9 @@ bSample *sound_new_sample(bSound * sound) /* find a sample that might already be loaded */ -bSample* sound_find_sample(bSound* sound) +bSample *sound_find_sample(bSound *sound) { - bSample* sample; + bSample *sample; char name[FILE_MAXDIR + FILE_MAXFILE]; char samplename[FILE_MAXDIR + FILE_MAXFILE]; @@ -820,14 +778,11 @@ bSample* sound_find_sample(bSound* sound) /* search through the list of loaded samples */ sample = samples->first; - - while (sample) - { + while (sample) { strcpy(samplename, sample->name); BLI_convertstringcode(samplename, G.sce, G.scene->r.cfra); - if (strcmp(name, samplename) == 0) - { + if (strcmp(name, samplename) == 0) { break; } sample = sample->id.next; @@ -838,16 +793,15 @@ bSample* sound_find_sample(bSound* sound) -int sound_sample_is_null(bSound* sound) +int sound_sample_is_null(bSound *sound) { int result = FALSE; - bSample* sample; + bSample *sample; if(ghSoundScene==NULL) sound_init_audio(); /* find the right sample or else create one */ - if (sound->sample == NULL) - { + if (sound->sample == NULL) { /* find... */ sample = sound_find_sample(sound); @@ -888,7 +842,7 @@ void sound_end_all_sounds(void) -void sound_play_sound(bSound* sound) +void sound_play_sound(bSound *sound) { #if GAMEBLENDER == 1 if(ghSoundScene==NULL) sound_init_audio(); |