diff options
author | Antony Riakiotakis <kalast@gmail.com> | 2014-11-24 20:18:35 +0300 |
---|---|---|
committer | Antony Riakiotakis <kalast@gmail.com> | 2014-11-24 20:23:44 +0300 |
commit | 649a2bcc3d51cfc6f9fc237695015c87bcca7deb (patch) | |
tree | 4bea67033363027c40c3e78b2782d7df00e39558 /source/blender/blenloader | |
parent | aa0b268acbf352bdf69644bb11ee3b893008cc40 (diff) |
Politically correct terrible consequencer changes
This patch includes the work done in the terrible consequencer branch
that hasn't been merged to master minus a few controversial and WIP
stuff, like strip parenting, new sequence data structs and cuddly
widgets.
What is included:
* Strip extensions only when slipping. It can very easily be made an
option but with a few strips with overlapping durations it makes view
too crowded and difficult to make out.
* Threaded waveform loading + code that restores waveforms on undo (not
used though, since sound_load recreates everything. There's a patch for
review D876)
* Toggle to enable backdrop in the strip sequence editor
* Toggle to easily turn on/off waveform display
* Snapping during transform on sequence boundaries. Snapping to start or
end of selection depends on position of mouse when invoking the operator
* Snapping of timeline indicator in sequencer to strip boundaries. To
use just press and hold ctrl while dragging.
Reviewers: campbellbarton
Differential Revision: https://developer.blender.org/D904
Diffstat (limited to 'source/blender/blenloader')
-rw-r--r-- | source/blender/blenloader/intern/readblenentry.c | 8 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 59 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.h | 3 | ||||
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 1 |
4 files changed, 67 insertions, 4 deletions
diff --git a/source/blender/blenloader/intern/readblenentry.c b/source/blender/blenloader/intern/readblenentry.c index d9bcfc2e8f9..95440158277 100644 --- a/source/blender/blenloader/intern/readblenentry.c +++ b/source/blender/blenloader/intern/readblenentry.c @@ -308,6 +308,9 @@ BlendFileData *BLO_read_from_memfile(Main *oldmain, const char *filename, MemFil /* makes lookup of existing video clips in old main */ blo_make_movieclip_pointer_map(fd, oldmain); + + /* make lookups of existing sound data in old main */ + blo_make_sound_pointer_map(fd, oldmain); /* removed packed data from this trick - it's internal data that needs saves */ @@ -318,7 +321,10 @@ BlendFileData *BLO_read_from_memfile(Main *oldmain, const char *filename, MemFil /* ensures relinked movie clips are not freed */ blo_end_movieclip_pointer_map(fd, oldmain); - + + /* ensures relinked sounds are not freed */ + blo_end_sound_pointer_map(fd, oldmain); + /* move libraries from old main to new main */ if (bfd && mainlist.first != mainlist.last) { diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index dd947ae5f79..9b043c6dbda 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -1128,6 +1128,8 @@ void blo_freefiledata(FileData *fd) oldnewmap_free(fd->imamap); if (fd->movieclipmap) oldnewmap_free(fd->movieclipmap); + if (fd->soundmap) + oldnewmap_free(fd->soundmap); if (fd->packedmap) oldnewmap_free(fd->packedmap); if (fd->libmap && !(fd->flags & FD_FLAGS_NOT_MY_LIBMAP)) @@ -1221,6 +1223,13 @@ static void *newmclipadr(FileData *fd, void *adr) /* used to restore movie return NULL; } +static void *newsoundadr(FileData *fd, void *adr) /* used to restore sound data after undo */ +{ + if (fd->soundmap && adr) + return oldnewmap_lookup_and_inc(fd->soundmap, adr, true); + return NULL; +} + static void *newpackedadr(FileData *fd, void *adr) /* used to restore packed data after undo */ { if (fd->packedmap && adr) @@ -1437,6 +1446,37 @@ void blo_end_movieclip_pointer_map(FileData *fd, Main *oldmain) } } +void blo_make_sound_pointer_map(FileData *fd, Main *oldmain) +{ + bSound *sound = oldmain->sound.first; + + fd->soundmap = oldnewmap_new(); + + for (; sound; sound = sound->id.next) { + if (sound->waveform) + oldnewmap_insert(fd->soundmap, sound->waveform, sound->waveform, 0); + } +} + +/* set old main sound caches to zero if it has been restored */ +/* this works because freeing old main only happens after this call */ +void blo_end_sound_pointer_map(FileData *fd, Main *oldmain) +{ + OldNew *entry = fd->soundmap->entries; + bSound *sound = oldmain->sound.first; + int i; + + /* used entries were restored, so we put them to zero */ + for (i = 0; i < fd->soundmap->nentries; i++, entry++) { + if (entry->nr > 0) + entry->newp = NULL; + } + + for (; sound; sound = sound->id.next) { + sound->waveform = newsoundadr(fd, sound->waveform); + } +} + /* XXX disabled this feature - packed files also belong in temp saves and quit.blend, to make restore work */ static void insert_packedmap(FileData *fd, PackedFile *pf) @@ -5457,7 +5497,7 @@ static void direct_link_scene(FileData *fd, Scene *sce) } if (sce->ed) { - ListBase *old_seqbasep = &((Editing *)sce->ed)->seqbase; + ListBase *old_seqbasep = &sce->ed->seqbase; ed = sce->ed = newdataadr(fd, sce->ed); @@ -5471,6 +5511,7 @@ static void direct_link_scene(FileData *fd, Scene *sce) seq->seq1= newdataadr(fd, seq->seq1); seq->seq2= newdataadr(fd, seq->seq2); seq->seq3= newdataadr(fd, seq->seq3); + /* a patch: after introduction of effects with 3 input strips */ if (seq->seq3 == NULL) seq->seq3 = seq->seq2; @@ -6776,14 +6817,26 @@ static void direct_link_sound(FileData *fd, bSound *sound) { sound->handle = NULL; sound->playback_handle = NULL; - sound->waveform = NULL; - // versioning stuff, if there was a cache, then we enable caching: + /* versioning stuff, if there was a cache, then we enable caching: */ if (sound->cache) { sound->flags |= SOUND_FLAGS_CACHING; sound->cache = NULL; } + if (fd->soundmap) { + sound->waveform = newsoundadr(fd, sound->waveform); + } + else { + sound->waveform = NULL; + } + + if (sound->mutex) + sound->mutex = BLI_mutex_alloc(); + + /* clear waveform loading flag */ + sound->flags &= ~SOUND_FLAGS_WAVEFORM_LOADING; + sound->packedfile = direct_link_packedfile(fd, sound->packedfile); sound->newpackedfile = direct_link_packedfile(fd, sound->newpackedfile); } diff --git a/source/blender/blenloader/intern/readfile.h b/source/blender/blenloader/intern/readfile.h index d56f58d1b37..2b40accbf21 100644 --- a/source/blender/blenloader/intern/readfile.h +++ b/source/blender/blenloader/intern/readfile.h @@ -88,6 +88,7 @@ typedef struct FileData { struct OldNewMap *libmap; struct OldNewMap *imamap; struct OldNewMap *movieclipmap; + struct OldNewMap *soundmap; struct OldNewMap *packedmap; struct BHeadSort *bheadmap; @@ -133,6 +134,8 @@ void blo_make_image_pointer_map(FileData *fd, Main *oldmain); void blo_end_image_pointer_map(FileData *fd, Main *oldmain); void blo_make_movieclip_pointer_map(FileData *fd, Main *oldmain); void blo_end_movieclip_pointer_map(FileData *fd, Main *oldmain); +void blo_make_sound_pointer_map(FileData *fd, Main *oldmain); +void blo_end_sound_pointer_map(FileData *fd, Main *oldmain); void blo_make_packed_pointer_map(FileData *fd, Main *oldmain); void blo_end_packed_pointer_map(FileData *fd, Main *oldmain); void blo_add_library_pointer_map(ListBase *mainlist, FileData *fd); diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 59f12657703..13cceb9fe45 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -156,6 +156,7 @@ #include "BKE_node.h" #include "BKE_report.h" #include "BKE_sequencer.h" +#include "BKE_sound.h" #include "BKE_subsurf.h" #include "BKE_modifier.h" #include "BKE_fcurve.h" |