Skip to content

Commit 929c5ef

Browse files
authored
Bring back crossfade computation over overlap. (#3716)
1 parent 1b75452 commit 929c5ef

File tree

2 files changed

+59
-2
lines changed

2 files changed

+59
-2
lines changed

src/core/operators/cross.ml

+48
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ class cross val_source ~duration_getter ~override_duration ~persist_override
265265
in
266266
let buffered_before = Generator.length gen_before in
267267
let buffered_after = Generator.length gen_after in
268+
let buffered = min buffered_after buffered_before in
268269
let after =
269270
Clock.collect_after (fun () ->
270271
let metadata = function
@@ -273,20 +274,55 @@ class cross val_source ~duration_getter ~override_duration ~persist_override
273274
in
274275
let before_metadata = metadata before_metadata in
275276
let after_metadata = metadata after_metadata in
277+
let before_head =
278+
if buffered < buffered_before then (
279+
let head =
280+
Generator.slice gen_before (buffered_before - buffered)
281+
in
282+
let head_gen =
283+
Generator.create ~content:head
284+
(Generator.content_type gen_before)
285+
in
286+
let s = new consumer head_gen in
287+
s#set_id (self#id ^ "_before_head");
288+
Typing.(s#frame_type <: self#frame_type);
289+
Some s)
290+
else None
291+
in
276292
let before = new consumer gen_before in
277293
Typing.(before#frame_type <: self#frame_type);
278294
let before = new Insert_metadata.replay before_metadata before in
279295
Typing.(before#frame_type <: self#frame_type);
280296
before#set_id (self#id ^ "_before");
297+
let after_tail =
298+
if buffered < buffered_after then (
299+
let head = Generator.slice gen_after buffered in
300+
let head_gen =
301+
Generator.create ~content:head
302+
(Generator.content_type gen_after)
303+
in
304+
let tail_gen = gen_after in
305+
gen_after <- head_gen;
306+
let s = new consumer tail_gen in
307+
Typing.(s#frame_type <: self#frame_type);
308+
s#set_id (self#id ^ "_after_tail");
309+
Some s)
310+
else None
311+
in
281312
let after = new consumer gen_after in
282313
Typing.(after#frame_type <: self#frame_type);
283314
let after = new Insert_metadata.replay after_metadata after in
284315
Typing.(after#frame_type <: self#frame_type);
316+
before#set_id (self#id ^ "_before");
285317
after#set_id (self#id ^ "_after");
286318
self#log#important "Analysis: %fdB / %fdB (%.2fs / %.2fs)" db_before
287319
db_after
288320
(Frame.seconds_of_main buffered_before)
289321
(Frame.seconds_of_main buffered_after);
322+
self#log#important
323+
"Computing crossfade duration over overlapping %.2fs buffered \
324+
data at start and end."
325+
(Frame.seconds_of_main buffered);
290326
let compound =
291327
let params =
292328
[
@@ -317,7 +353,19 @@ class cross val_source ~duration_getter ~override_duration ~persist_override
317353
Lang.to_source (Lang.apply transition params)
318354
in
319355
Typing.(compound#frame_type <: self#frame_type);
356+
let compound =
357+
match (before_head, after_tail) with
358+
| None, None -> compound
359+
| Some s, None ->
360+
(new Sequence.sequence ~merge:true [s; compound]
361+
:> Source.source)
362+
| None, Some s ->
363+
(new Sequence.sequence ~merge:true [compound; s]
364+
:> Source.source)
365+
| Some _, Some _ -> assert false
366+
in
320367
Clock.unify ~pos:self#pos compound#clock s#clock;
368+
Typing.(compound#frame_type <: self#frame_type);
321369
compound)
322370
in
323371
self#prepare_source after;

src/libs/fades.liq

+11-2
Original file line numberDiff line numberDiff line change
@@ -526,9 +526,18 @@ def fade.in(
526526
curve_log =
527527
if null.defined(curve()) then string(null.get(curve())) else "default" end
528528

529+
duration =
530+
if
531+
source.remaining(s) < duration()
532+
then
533+
source.remaining(s)
534+
else
535+
duration()
536+
end
537+
529538
log(
530539
"Fading in with type: #{type()}, curve: #{curve_log}, delay: #{delay()}s \
531-
and duration: #{duration()}s."
540+
and duration: #{duration}s."
532541
)
533542
fn :=
534543
mkfade(
@@ -537,7 +546,7 @@ def fade.in(
537546
type=type(),
538547
curve=curve(),
539548
delay=delay(),
540-
duration=duration(),
549+
duration=duration,
541550
s
542551
)
543552
end

0 commit comments

Comments
 (0)