Skip to content

Commit b00da03

Browse files
authored
Support changing blank duration in-track. (#3710)
1 parent 41b84f4 commit b00da03

File tree

1 file changed

+18
-22
lines changed

1 file changed

+18
-22
lines changed

src/core/sources/blank.ml

+18-22
Original file line numberDiff line numberDiff line change
@@ -24,35 +24,27 @@ open Mm
2424
open Source
2525

2626
class blank duration =
27-
let ticks () =
28-
let d = duration () in
29-
if d < 0. then -1 else Frame.main_of_seconds d
30-
in
3127
object (self)
3228
inherit source ~name:"blank" ()
3329

34-
(** Remaining time, -1 for infinity. *)
35-
val mutable remaining = None
30+
val position : [ `New_track | `Elapsed of int ] Atomic.t =
31+
Atomic.make `New_track
3632

33+
(** Remaining time, -1 for infinity. *)
3734
method remaining =
38-
match remaining with
39-
| Some r -> r
40-
| None ->
41-
let r = ticks () in
42-
remaining <- Some r;
43-
r
35+
match (Atomic.get position, duration ()) with
36+
| `New_track, _ -> 0
37+
| `Elapsed _, d when d < 0. -> -1
38+
| `Elapsed e, d -> max 0 (Frame.main_of_seconds d - e)
4439

4540
method stype = `Infallible
4641
method private can_generate_frame = true
4742
method self_sync = (`Static, false)
4843
method! seek x = x
4944
method seek_source = (self :> Source.source)
50-
method abort_track = remaining <- Some 0
51-
val mutable is_first = true
45+
method abort_track = Atomic.set position `New_track
5246

5347
method generate_frame =
54-
let was_first = is_first in
55-
is_first <- false;
5648
let length = Lazy.force Frame.size in
5749
let audio_len = Frame.audio_of_main length in
5850
let frame =
@@ -94,15 +86,19 @@ class blank duration =
9486
self#content_type
9587
(Frame.create ~length Frame.Fields.empty)
9688
in
97-
match (was_first, self#remaining) with
98-
| true, _ -> Frame.add_track_mark frame 0
99-
| _, -1 -> frame
100-
| _, r ->
89+
match (Atomic.get position, self#remaining) with
90+
| `New_track, _ ->
91+
Atomic.set position (`Elapsed length);
92+
Frame.add_track_mark frame 0
93+
| `Elapsed d, -1 ->
94+
Atomic.set position (`Elapsed (d + length));
95+
frame
96+
| `Elapsed d, r ->
10197
if r < length then (
102-
remaining <- Some (ticks () - r);
98+
Atomic.set position (`Elapsed (length - r));
10399
Frame.add_track_mark frame r)
104100
else (
105-
remaining <- Some (r - length);
101+
Atomic.set position (`Elapsed (d + length));
106102
frame)
107103
end
108104

0 commit comments

Comments
 (0)