Lines Matching refs:ws
138 static void pink_fill(struct wavesynth_context *ws)
143 ws->pink_pos = 0;
144 if (!ws->pink_need)
151 vt[j] = (int32_t)lcg_next(&ws->pink_state) >> 3;
154 ws->pink_pool[i] = v + ((int32_t)lcg_next(&ws->pink_state) >> 3);
156 lcg_next(&ws->pink_state); /* so we use exactly 256 steps */
198 static void wavesynth_seek(struct wavesynth_context *ws, int64_t ts)
203 last = &ws->cur_inter;
204 for (i = 0; i < ws->nb_inter; i++) {
205 in = &ws->inter[i];
216 ws->next_inter = i;
217 ws->next_ts = i < ws->nb_inter ? ws->inter[i].ts_start : INF_TS;
219 lcg_seek(&ws->dither_state, (uint32_t)ts - (uint32_t)ws->cur_ts);
220 if (ws->pink_need) {
221 uint64_t pink_ts_cur = (ws->cur_ts + (uint64_t)PINK_UNIT - 1) & ~(PINK_UNIT - 1);
224 lcg_seek(&ws->pink_state, (uint32_t)(pink_ts_next - pink_ts_cur) * 2);
226 pink_fill(ws);
227 ws->pink_pos = pos;
229 ws->pink_pos = PINK_UNIT;
232 ws->cur_ts = ts;
237 struct wavesynth_context *ws = avc->priv_data;
249 ws->nb_inter = AV_RL32(edata);
251 if (ws->nb_inter < 0 || (edata_end - edata) / 24 < ws->nb_inter)
253 ws->inter = av_calloc(ws->nb_inter, sizeof(*ws->inter));
254 if (!ws->inter)
256 for (i = 0; i < ws->nb_inter; i++) {
257 in = &ws->inter[i];
290 in->phi0 = phi_at(&ws->inter[phi], in->ts_start);
315 struct wavesynth_context *ws = avc->priv_data;
329 ws->sin = av_malloc(sizeof(*ws->sin) << SIN_BITS);
330 if (!ws->sin)
333 ws->sin[i] = floor(32767 * sin(2 * M_PI * i / (1 << SIN_BITS)));
334 ws->dither_state = MKTAG('D','I','T','H');
335 for (i = 0; i < ws->nb_inter; i++)
336 ws->pink_need += ws->inter[i].type == WS_NOISE;
337 ws->pink_state = MKTAG('P','I','N','K');
338 ws->pink_pos = PINK_UNIT;
339 wavesynth_seek(ws, 0);
344 static void wavesynth_synth_sample(struct wavesynth_context *ws, int64_t ts,
353 i = ws->cur_inter;
354 last = &ws->cur_inter;
355 if (ws->pink_pos == PINK_UNIT)
356 pink_fill(ws);
357 pink = ws->pink_pool[ws->pink_pos++] >> 16;
359 in = &ws->inter[i];
370 val = amp * (unsigned)ws->sin[in->phi >> (64 - SIN_BITS)];
385 val = (int32_t)lcg_next(&ws->dither_state) >> 16;
391 static void wavesynth_enter_intervals(struct wavesynth_context *ws, int64_t ts)
396 last = &ws->cur_inter;
397 for (i = ws->cur_inter; i >= 0; i = ws->inter[i].next)
398 last = &ws->inter[i].next;
399 for (i = ws->next_inter; i < ws->nb_inter; i++) {
400 in = &ws->inter[i];
411 ws->next_inter = i;
412 ws->next_ts = i < ws->nb_inter ? ws->inter[i].ts_start : INF_TS;
419 struct wavesynth_context *ws = avc->priv_data;
430 if (ts != ws->cur_ts)
431 wavesynth_seek(ws, ts);
442 if (ts >= ws->next_ts)
443 wavesynth_enter_intervals(ws, ts);
444 wavesynth_synth_sample(ws, ts, channels);
448 ws->cur_ts += (uint64_t)duration;
455 struct wavesynth_context *ws = avc->priv_data;
457 av_freep(&ws->sin);
458 av_freep(&ws->inter);