@@ -8,39 +8,49 @@ use crate::AtomicF64;
8
8
/// Helper struct to start and stop audio streams
9
9
#[ derive( Clone , Debug ) ]
10
10
pub ( crate ) struct Scheduler {
11
- start : Arc < AtomicF64 > ,
12
- stop : Arc < AtomicF64 > ,
11
+ inner : Arc < SchedulerInner > ,
13
12
}
14
13
14
+ #[ derive( Debug ) ]
15
+ struct SchedulerInner {
16
+ start : AtomicF64 ,
17
+ stop : AtomicF64 ,
18
+ }
19
+
20
+ // Uses the canonical ordering for handover of values, i.e. `Acquire` on load and `Release` on
21
+ // store.
15
22
impl Scheduler {
16
23
/// Create a new Scheduler. Initial playback state will be: inactive.
17
24
pub fn new ( ) -> Self {
25
+ let inner = SchedulerInner {
26
+ start : AtomicF64 :: new ( f64:: MAX ) ,
27
+ stop : AtomicF64 :: new ( f64:: MAX ) ,
28
+ } ;
18
29
Self {
19
- start : Arc :: new ( AtomicF64 :: new ( f64:: MAX ) ) ,
20
- stop : Arc :: new ( AtomicF64 :: new ( f64:: MAX ) ) ,
30
+ inner : Arc :: new ( inner) ,
21
31
}
22
32
}
23
33
24
34
/// Retrieve playback start value
25
35
pub fn get_start_at ( & self ) -> f64 {
26
- self . start . load ( Ordering :: SeqCst )
36
+ self . inner . start . load ( Ordering :: Acquire )
27
37
}
28
38
29
39
/// Schedule playback start at this timestamp
30
40
pub fn start_at ( & self , start : f64 ) {
31
41
// todo panic on invalid values, or when already called
32
- self . start . store ( start, Ordering :: SeqCst ) ;
42
+ self . inner . start . store ( start, Ordering :: Release ) ;
33
43
}
34
44
35
45
/// Retrieve playback stop value
36
46
pub fn get_stop_at ( & self ) -> f64 {
37
- self . stop . load ( Ordering :: SeqCst )
47
+ self . inner . stop . load ( Ordering :: Acquire )
38
48
}
39
49
40
50
/// Stop playback at this timestamp
41
51
pub fn stop_at ( & self , stop : f64 ) {
42
52
// todo panic on invalid values, or when already called
43
- self . stop . store ( stop, Ordering :: SeqCst ) ;
53
+ self . inner . stop . store ( stop, Ordering :: Release ) ;
44
54
}
45
55
}
46
56
@@ -53,69 +63,80 @@ impl Default for Scheduler {
53
63
/// Helper struct to control audio streams
54
64
#[ derive( Clone , Debug ) ]
55
65
pub ( crate ) struct Controller {
56
- scheduler : Arc < Scheduler > ,
57
- loop_ : Arc < AtomicBool > ,
58
- loop_start : Arc < AtomicF64 > ,
59
- loop_end : Arc < AtomicF64 > ,
60
- offset : Arc < AtomicF64 > ,
61
- duration : Arc < AtomicF64 > ,
66
+ inner : Arc < ControllerInner > ,
62
67
}
63
68
69
+ #[ derive( Debug ) ]
70
+ struct ControllerInner {
71
+ scheduler : Scheduler ,
72
+ loop_ : AtomicBool ,
73
+ loop_start : AtomicF64 ,
74
+ loop_end : AtomicF64 ,
75
+ offset : AtomicF64 ,
76
+ duration : AtomicF64 ,
77
+ }
78
+
79
+ // Uses the canonical ordering for handover of values, i.e. `Acquire` on load and `Release` on
80
+ // store.
64
81
impl Controller {
65
82
/// Create a new Controller. It will not be active
66
83
pub fn new ( ) -> Self {
84
+ let inner = ControllerInner {
85
+ scheduler : Scheduler :: new ( ) ,
86
+ loop_ : AtomicBool :: new ( false ) ,
87
+ loop_start : AtomicF64 :: new ( 0. ) ,
88
+ loop_end : AtomicF64 :: new ( f64:: MAX ) ,
89
+ offset : AtomicF64 :: new ( f64:: MAX ) ,
90
+ duration : AtomicF64 :: new ( f64:: MAX ) ,
91
+ } ;
92
+
67
93
Self {
68
- scheduler : Arc :: new ( Scheduler :: new ( ) ) ,
69
- loop_ : Arc :: new ( AtomicBool :: new ( false ) ) ,
70
- loop_start : Arc :: new ( AtomicF64 :: new ( 0. ) ) ,
71
- loop_end : Arc :: new ( AtomicF64 :: new ( f64:: MAX ) ) ,
72
- offset : Arc :: new ( AtomicF64 :: new ( f64:: MAX ) ) ,
73
- duration : Arc :: new ( AtomicF64 :: new ( f64:: MAX ) ) ,
94
+ inner : Arc :: new ( inner) ,
74
95
}
75
96
}
76
97
77
98
pub fn scheduler ( & self ) -> & Scheduler {
78
- & self . scheduler
99
+ & self . inner . scheduler
79
100
}
80
101
81
102
pub fn loop_ ( & self ) -> bool {
82
- self . loop_ . load ( Ordering :: SeqCst )
103
+ self . inner . loop_ . load ( Ordering :: Acquire )
83
104
}
84
105
85
106
pub fn set_loop ( & self , loop_ : bool ) {
86
- self . loop_ . store ( loop_, Ordering :: SeqCst ) ;
107
+ self . inner . loop_ . store ( loop_, Ordering :: Release ) ;
87
108
}
88
109
89
110
pub fn loop_start ( & self ) -> f64 {
90
- self . loop_start . load ( Ordering :: SeqCst )
111
+ self . inner . loop_start . load ( Ordering :: Acquire )
91
112
}
92
113
93
114
pub fn set_loop_start ( & self , loop_start : f64 ) {
94
- self . loop_start . store ( loop_start, Ordering :: SeqCst ) ;
115
+ self . inner . loop_start . store ( loop_start, Ordering :: Release ) ;
95
116
}
96
117
97
118
pub fn loop_end ( & self ) -> f64 {
98
- self . loop_end . load ( Ordering :: SeqCst )
119
+ self . inner . loop_end . load ( Ordering :: Acquire )
99
120
}
100
121
101
122
pub fn set_loop_end ( & self , loop_end : f64 ) {
102
- self . loop_end . store ( loop_end, Ordering :: SeqCst ) ;
123
+ self . inner . loop_end . store ( loop_end, Ordering :: Release ) ;
103
124
}
104
125
105
126
pub fn offset ( & self ) -> f64 {
106
- self . offset . load ( Ordering :: SeqCst )
127
+ self . inner . offset . load ( Ordering :: Acquire )
107
128
}
108
129
109
130
pub fn set_offset ( & self , offset : f64 ) {
110
- self . offset . store ( offset, Ordering :: SeqCst ) ;
131
+ self . inner . offset . store ( offset, Ordering :: Release ) ;
111
132
}
112
133
113
134
pub fn duration ( & self ) -> f64 {
114
- self . duration . load ( Ordering :: SeqCst )
135
+ self . inner . duration . load ( Ordering :: Acquire )
115
136
}
116
137
117
138
pub fn set_duration ( & self , duration : f64 ) {
118
- self . duration . store ( duration, Ordering :: SeqCst )
139
+ self . inner . duration . store ( duration, Ordering :: Release )
119
140
}
120
141
}
121
142
0 commit comments