@@ -265,6 +265,7 @@ class cross val_source ~duration_getter ~override_duration ~persist_override
265
265
in
266
266
let buffered_before = Generator. length gen_before in
267
267
let buffered_after = Generator. length gen_after in
268
+ let buffered = min buffered_after buffered_before in
268
269
let after =
269
270
Clock. collect_after (fun () ->
270
271
let metadata = function
@@ -273,20 +274,55 @@ class cross val_source ~duration_getter ~override_duration ~persist_override
273
274
in
274
275
let before_metadata = metadata before_metadata in
275
276
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
276
292
let before = new consumer gen_before in
277
293
Typing. (before#frame_type < : self#frame_type );
278
294
let before = new Insert_metadata. replay before_metadata before in
279
295
Typing. (before#frame_type < : self#frame_type );
280
296
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
281
312
let after = new consumer gen_after in
282
313
Typing. (after#frame_type < : self#frame_type );
283
314
let after = new Insert_metadata. replay after_metadata after in
284
315
Typing. (after#frame_type < : self#frame_type );
316
+ before#set_id (self#id ^ " _before" );
285
317
after#set_id (self#id ^ " _after" );
286
318
self#log#important " Analysis: %fdB / %fdB (%.2fs / %.2fs)" db_before
287
319
db_after
288
320
(Frame. seconds_of_main buffered_before)
289
321
(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);
290
326
let compound =
291
327
let params =
292
328
[
@@ -317,7 +353,19 @@ class cross val_source ~duration_getter ~override_duration ~persist_override
317
353
Lang. to_source (Lang. apply transition params)
318
354
in
319
355
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
320
367
Clock. unify ~pos: self#pos compound#clock s#clock;
368
+ Typing. (compound#frame_type < : self#frame_type );
321
369
compound)
322
370
in
323
371
self#prepare_source after;
0 commit comments