Blender  V3.3
sequencer_preview.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2001-2002 NaN Holding BV. All rights reserved. */
3 
8 #include "DNA_sequence_types.h"
9 #include "DNA_sound_types.h"
10 
11 #include "BLI_listbase.h"
12 #include "BLI_threads.h"
13 
14 #include "BKE_context.h"
15 #include "BKE_global.h"
16 #include "BKE_sound.h"
17 
18 #include "WM_api.h"
19 #include "WM_types.h"
20 
21 #include "ED_screen.h"
22 
23 #include "MEM_guardedalloc.h"
24 
25 #include "sequencer_intern.h"
26 
27 typedef struct PreviewJob {
31  int total;
32  int processed;
34 
35 typedef struct PreviewJobAudio {
37  struct Main *bmain;
39  int lr; /* Sample left or right. */
41  bool waveform; /* Reload sound or waveform. */
43 
44 static void free_preview_job(void *data)
45 {
46  PreviewJob *pj = (PreviewJob *)data;
47 
48  BLI_mutex_free(pj->mutex);
49  BLI_freelistN(&pj->previews);
50  MEM_freeN(pj);
51 }
52 
53 /* Only this runs inside thread. */
54 static void preview_startjob(void *data, short *stop, short *do_update, float *progress)
55 {
56  PreviewJob *pj = data;
57  PreviewJobAudio *previewjb;
58 
59  BLI_mutex_lock(pj->mutex);
60  previewjb = pj->previews.first;
62 
63  while (previewjb) {
64  PreviewJobAudio *preview_next;
65  bSound *sound = previewjb->sound;
66 
67  BKE_sound_read_waveform(previewjb->bmain, sound, stop);
68 
69  if (*stop || G.is_break) {
70  BLI_mutex_lock(pj->mutex);
71  previewjb = previewjb->next;
73  while (previewjb) {
74  sound = previewjb->sound;
75 
76  /* Make sure we cleanup the loading flag! */
77  BLI_spin_lock(sound->spinlock);
79  BLI_spin_unlock(sound->spinlock);
80 
81  BLI_mutex_lock(pj->mutex);
82  previewjb = previewjb->next;
84  }
85 
86  BLI_mutex_lock(pj->mutex);
87  BLI_freelistN(&pj->previews);
88  pj->total = 0;
89  pj->processed = 0;
91  break;
92  }
93 
94  BLI_mutex_lock(pj->mutex);
95  preview_next = previewjb->next;
96  BLI_freelinkN(&pj->previews, previewjb);
97  previewjb = preview_next;
98  pj->processed++;
99  *progress = (pj->total > 0) ? (float)pj->processed / (float)pj->total : 1.0f;
100  *do_update = true;
101  BLI_mutex_unlock(pj->mutex);
102  }
103 }
104 
105 static void preview_endjob(void *data)
106 {
107  PreviewJob *pj = data;
108 
110 }
111 
113 {
114  wmJob *wm_job;
115  PreviewJob *pj;
117  PreviewJobAudio *audiojob = MEM_callocN(sizeof(PreviewJobAudio), "preview_audio");
118  wm_job = WM_jobs_get(CTX_wm_manager(C),
119  CTX_wm_window(C),
120  CTX_data_scene(C),
121  "Strip Previews",
124 
125  /* Get the preview job if it exists. */
126  pj = WM_jobs_customdata_get(wm_job);
127 
128  if (!pj) {
129  pj = MEM_callocN(sizeof(PreviewJob), "preview rebuild job");
130 
131  pj->mutex = BLI_mutex_alloc();
132  pj->scene = CTX_data_scene(C);
133 
137  }
138 
139  audiojob->bmain = CTX_data_main(C);
140  audiojob->sound = seq->sound;
141 
142  BLI_mutex_lock(pj->mutex);
143  BLI_addtail(&pj->previews, audiojob);
144  pj->total++;
145  BLI_mutex_unlock(pj->mutex);
146 
147  if (!WM_jobs_is_running(wm_job)) {
148  G.is_break = false;
149  WM_jobs_start(CTX_wm_manager(C), wm_job);
150  }
151 
153 }
typedef float(TangentPoint)[2]
struct ScrArea * CTX_wm_area(const bContext *C)
Definition: context.c:738
struct Scene * CTX_data_scene(const bContext *C)
Definition: context.c:1090
struct wmWindowManager * CTX_wm_manager(const bContext *C)
Definition: context.c:713
struct Main * CTX_data_main(const bContext *C)
Definition: context.c:1074
struct wmWindow * CTX_wm_window(const bContext *C)
Definition: context.c:723
void BKE_sound_read_waveform(struct Main *bmain, struct bSound *sound, short *stop)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:239
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
Definition: listbase.c:466
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:80
void BLI_mutex_free(ThreadMutex *mutex)
Definition: threads.cc:400
ThreadMutex * BLI_mutex_alloc(void)
Definition: threads.cc:393
void BLI_mutex_lock(ThreadMutex *mutex)
Definition: threads.cc:373
void BLI_mutex_unlock(ThreadMutex *mutex)
Definition: threads.cc:378
void BLI_spin_unlock(SpinLock *spin)
Definition: threads.cc:452
void BLI_spin_lock(SpinLock *spin)
Definition: threads.cc:433
pthread_mutex_t ThreadMutex
Definition: BLI_threads.h:82
@ SOUND_TAGS_WAVEFORM_LOADING
void ED_area_tag_redraw(ScrArea *area)
Definition: area.c:729
Read Guarded memory(de)allocation.
#define C
Definition: RandGen.cpp:25
@ WM_JOB_PROGRESS
Definition: WM_api.h:1339
@ WM_JOB_TYPE_SEQ_BUILD_PREVIEW
Definition: WM_api.h:1363
#define ND_SEQUENCER
Definition: WM_types.h:385
#define NC_SCENE
Definition: WM_types.h:328
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:31
#define G(x, y, z)
static void area(int d1, int d2, int e1, int e2, float weights[2])
static void preview_startjob(void *data, short *stop, short *do_update, float *progress)
static void preview_endjob(void *data)
struct PreviewJobAudio PreviewJobAudio
void sequencer_preview_add_sound(const bContext *C, Sequence *seq)
struct PreviewJob PreviewJob
static void free_preview_job(void *data)
void * first
Definition: DNA_listBase.h:31
Definition: BKE_main.h:121
struct PreviewJobAudio * next
struct Main * bmain
struct PreviewJobAudio * prev
ListBase previews
ThreadMutex * mutex
struct bSound * sound
void * spinlock
short tags
Definition: wm_jobs.c:57
void WM_main_add_notifier(unsigned int type, void *reference)
bool WM_jobs_is_running(const wmJob *wm_job)
Definition: wm_jobs.c:304
void WM_jobs_start(wmWindowManager *wm, wmJob *wm_job)
Definition: wm_jobs.c:437
void WM_jobs_callbacks(wmJob *wm_job, wm_jobs_start_callback startjob, void(*initjob)(void *), void(*update)(void *), void(*endjob)(void *))
Definition: wm_jobs.c:351
void * WM_jobs_customdata_get(wmJob *wm_job)
Definition: wm_jobs.c:315
void WM_jobs_customdata_set(wmJob *wm_job, void *customdata, void(*free)(void *))
Definition: wm_jobs.c:323
void WM_jobs_timer(wmJob *wm_job, double timestep, unsigned int note, unsigned int endnote)
Definition: wm_jobs.c:339
wmJob * WM_jobs_get(wmWindowManager *wm, wmWindow *win, const void *owner, const char *name, int flag, int job_type)
Definition: wm_jobs.c:184