@@ -24,35 +24,27 @@ open Mm
24
24
open Source
25
25
26
26
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
31
27
object (self )
32
28
inherit source ~name: " blank" ()
33
29
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
36
32
33
+ (* * Remaining time, -1 for infinity. *)
37
34
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)
44
39
45
40
method stype = `Infallible
46
41
method private can_generate_frame = true
47
42
method self_sync = (`Static , false )
48
43
method! seek x = x
49
44
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
52
46
53
47
method generate_frame =
54
- let was_first = is_first in
55
- is_first < - false ;
56
48
let length = Lazy. force Frame. size in
57
49
let audio_len = Frame. audio_of_main length in
58
50
let frame =
@@ -94,15 +86,19 @@ class blank duration =
94
86
self#content_type
95
87
(Frame. create ~length Frame.Fields. empty)
96
88
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 ->
101
97
if r < length then (
102
- remaining < - Some (ticks () - r);
98
+ Atomic. set position ( `Elapsed (length - r) );
103
99
Frame. add_track_mark frame r)
104
100
else (
105
- remaining < - Some (r - length);
101
+ Atomic. set position ( `Elapsed (d + length) );
106
102
frame)
107
103
end
108
104
0 commit comments