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