Based on Sergey's suggestion, use spinlocks for threaded loading of
waveforms.
This commit is contained in:
@@ -118,9 +118,10 @@ void BKE_sound_free(bSound *sound)
|
|||||||
|
|
||||||
sound_free_waveform(sound);
|
sound_free_waveform(sound);
|
||||||
|
|
||||||
if (sound->mutex) {
|
if (sound->spinlock) {
|
||||||
BLI_mutex_free(sound->mutex);
|
BLI_spin_end(sound->spinlock);
|
||||||
sound->mutex = NULL;
|
MEM_freeN(sound->spinlock);
|
||||||
|
sound->spinlock = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* WITH_AUDASPACE */
|
#endif /* WITH_AUDASPACE */
|
||||||
@@ -709,18 +710,18 @@ void sound_read_waveform(bSound *sound, short *stop)
|
|||||||
MEM_freeN(waveform->data);
|
MEM_freeN(waveform->data);
|
||||||
}
|
}
|
||||||
MEM_freeN(waveform);
|
MEM_freeN(waveform);
|
||||||
BLI_mutex_lock(sound->mutex);
|
BLI_spin_lock(sound->spinlock);
|
||||||
sound->flags &= ~SOUND_FLAGS_WAVEFORM_LOADING;
|
sound->flags &= ~SOUND_FLAGS_WAVEFORM_LOADING;
|
||||||
BLI_mutex_unlock(sound->mutex);
|
BLI_spin_unlock(sound->spinlock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sound_free_waveform(sound);
|
sound_free_waveform(sound);
|
||||||
|
|
||||||
BLI_mutex_lock(sound->mutex);
|
BLI_spin_lock(sound->spinlock);
|
||||||
sound->waveform = waveform;
|
sound->waveform = waveform;
|
||||||
sound->flags &= ~SOUND_FLAGS_WAVEFORM_LOADING;
|
sound->flags &= ~SOUND_FLAGS_WAVEFORM_LOADING;
|
||||||
BLI_mutex_unlock(sound->mutex);
|
BLI_spin_unlock(sound->spinlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sound_update_scene(Main *bmain, struct Scene *scene)
|
void sound_update_scene(Main *bmain, struct Scene *scene)
|
||||||
|
@@ -6872,9 +6872,10 @@ static void direct_link_sound(FileData *fd, bSound *sound)
|
|||||||
sound->waveform = NULL;
|
sound->waveform = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sound->mutex)
|
if (sound->spinlock) {
|
||||||
sound->mutex = BLI_mutex_alloc();
|
sound->spinlock = MEM_mallocN(sizeof(SpinLock), "sound_spinlock");
|
||||||
|
BLI_spin_init(sound->spinlock);
|
||||||
|
}
|
||||||
/* clear waveform loading flag */
|
/* clear waveform loading flag */
|
||||||
sound->flags &= ~SOUND_FLAGS_WAVEFORM_LOADING;
|
sound->flags &= ~SOUND_FLAGS_WAVEFORM_LOADING;
|
||||||
|
|
||||||
|
@@ -70,6 +70,7 @@
|
|||||||
|
|
||||||
#include "WM_api.h"
|
#include "WM_api.h"
|
||||||
|
|
||||||
|
#include "MEM_guardedalloc.h"
|
||||||
|
|
||||||
/* own include */
|
/* own include */
|
||||||
#include "sequencer_intern.h"
|
#include "sequencer_intern.h"
|
||||||
@@ -200,23 +201,25 @@ static void drawseqwave(const bContext *C, SpaceSeq *sseq, Scene *scene, Sequenc
|
|||||||
|
|
||||||
SoundWaveform *waveform;
|
SoundWaveform *waveform;
|
||||||
|
|
||||||
if (!sound->mutex)
|
if (!sound->spinlock) {
|
||||||
sound->mutex = BLI_mutex_alloc();
|
sound->spinlock = MEM_mallocN(sizeof(SpinLock), "sound_spinlock");
|
||||||
|
BLI_spin_init(sound->spinlock);
|
||||||
|
}
|
||||||
|
|
||||||
BLI_mutex_lock(sound->mutex);
|
BLI_spin_lock(sound->spinlock);
|
||||||
if (!seq->sound->waveform) {
|
if (!seq->sound->waveform) {
|
||||||
if (!(sound->flags & SOUND_FLAGS_WAVEFORM_LOADING)) {
|
if (!(sound->flags & SOUND_FLAGS_WAVEFORM_LOADING)) {
|
||||||
/* prevent sounds from reloading */
|
/* prevent sounds from reloading */
|
||||||
seq->sound->flags |= SOUND_FLAGS_WAVEFORM_LOADING;
|
seq->sound->flags |= SOUND_FLAGS_WAVEFORM_LOADING;
|
||||||
BLI_mutex_unlock(sound->mutex);
|
BLI_spin_unlock(sound->spinlock);
|
||||||
sequencer_preview_add_sound(C, seq);
|
sequencer_preview_add_sound(C, seq);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
BLI_mutex_unlock(sound->mutex);
|
BLI_spin_unlock(sound->spinlock);
|
||||||
}
|
}
|
||||||
return; /* nothing to draw */
|
return; /* nothing to draw */
|
||||||
}
|
}
|
||||||
BLI_mutex_unlock(sound->mutex);
|
BLI_spin_unlock(sound->spinlock);
|
||||||
|
|
||||||
waveform = seq->sound->waveform;
|
waveform = seq->sound->waveform;
|
||||||
|
|
||||||
|
@@ -95,9 +95,9 @@ static void preview_startjob(void *data, short *stop, short *do_update, float *p
|
|||||||
sound = previewjb->sound;
|
sound = previewjb->sound;
|
||||||
|
|
||||||
/* make sure we cleanup the loading flag! */
|
/* make sure we cleanup the loading flag! */
|
||||||
BLI_mutex_lock(sound->mutex);
|
BLI_spin_lock(sound->spinlock);
|
||||||
sound->flags &= ~SOUND_FLAGS_WAVEFORM_LOADING;
|
sound->flags &= ~SOUND_FLAGS_WAVEFORM_LOADING;
|
||||||
BLI_mutex_unlock(sound->mutex);
|
BLI_spin_unlock(sound->spinlock);
|
||||||
|
|
||||||
BLI_mutex_lock(pj->mutex);
|
BLI_mutex_lock(pj->mutex);
|
||||||
previewjb = previewjb->next;
|
previewjb = previewjb->next;
|
||||||
|
@@ -95,8 +95,8 @@ typedef struct bSound {
|
|||||||
*/
|
*/
|
||||||
void *playback_handle;
|
void *playback_handle;
|
||||||
|
|
||||||
/* mutex for asynchronous loading of sounds */
|
/* spinlock for asynchronous loading of sounds */
|
||||||
void *mutex;
|
void *spinlock;
|
||||||
/* XXX unused currently (SOUND_TYPE_LIMITER) */
|
/* XXX unused currently (SOUND_TYPE_LIMITER) */
|
||||||
/* float start, end; */
|
/* float start, end; */
|
||||||
} bSound;
|
} bSound;
|
||||||
|
Reference in New Issue
Block a user