@@ -117,47 +117,55 @@ impl Player {
117117 let controls = self . controls . clone ( ) ;
118118
119119 let start_played = AtomicBool :: new ( false ) ;
120-
121- let source = source
122- . speed ( 1.0 )
123- // Must be placed before pausable but after speed & delay
124- . track_position ( )
125- . pausable ( false )
126- . amplify ( 1.0 )
127- . skippable ( )
128- . stoppable ( )
129- // If you change the duration update the docs for try_seek!
130- . periodic_access ( Duration :: from_millis ( 5 ) , move |src| {
131- if controls . stopped . load ( Ordering :: SeqCst ) {
132- src. stop ( ) ;
133- * controls . position . lock ( ) . unwrap ( ) = Duration :: ZERO ;
120+ let sound_count_clone = self . sound_count . clone ( ) ;
121+
122+ let source = Done :: new (
123+ source
124+ . speed ( 1.0 )
125+ // Must be placed before pausable but after speed & delay
126+ . track_position ( )
127+ . pausable ( false )
128+ . amplify ( 1.0 )
129+ . skippable ( )
130+ . stoppable ( ) ,
131+ move |src| {
132+ if ! src. inner ( ) . skipped ( ) {
133+ sound_count_clone . fetch_sub ( 1 , Ordering :: Relaxed ) ;
134134 }
135- {
136- let mut to_clear = controls. to_clear . lock ( ) . unwrap ( ) ;
137- if * to_clear > 0 {
138- src. inner_mut ( ) . skip ( ) ;
139- * to_clear -= 1 ;
140- * controls. position . lock ( ) . unwrap ( ) = Duration :: ZERO ;
141- } else {
142- * controls. position . lock ( ) . unwrap ( ) =
143- src. inner ( ) . inner ( ) . inner ( ) . inner ( ) . get_pos ( ) ;
144- }
145- }
146- let amp = src. inner_mut ( ) . inner_mut ( ) ;
147- amp. set_factor ( * controls. volume . lock ( ) . unwrap ( ) ) ;
148- amp. inner_mut ( )
149- . set_paused ( controls. pause . load ( Ordering :: SeqCst ) ) ;
150- amp. inner_mut ( )
151- . inner_mut ( )
152- . inner_mut ( )
153- . set_factor ( * controls. speed . lock ( ) . unwrap ( ) ) ;
154- if let Some ( seek) = controls. seek . lock ( ) . unwrap ( ) . take ( ) {
155- seek. attempt ( amp)
135+ } ,
136+ )
137+ // If you change the duration update the docs for try_seek!
138+ . periodic_access ( Duration :: from_millis ( 5 ) , move |src| {
139+ if controls. stopped . load ( Ordering :: SeqCst ) {
140+ src. inner_mut ( ) . stop ( ) ;
141+ * controls. position . lock ( ) . unwrap ( ) = Duration :: ZERO ;
142+ }
143+ {
144+ let mut to_clear = controls. to_clear . lock ( ) . unwrap ( ) ;
145+ if * to_clear > 0 {
146+ src. inner_mut ( ) . inner_mut ( ) . skip ( ) ;
147+ * to_clear -= 1 ;
148+ * controls. position . lock ( ) . unwrap ( ) = Duration :: ZERO ;
149+ } else {
150+ * controls. position . lock ( ) . unwrap ( ) =
151+ src. inner ( ) . inner ( ) . inner ( ) . inner ( ) . inner ( ) . get_pos ( ) ;
156152 }
157- start_played. store ( true , Ordering :: SeqCst ) ;
158- } ) ;
153+ }
154+ let amp = src. inner_mut ( ) . inner_mut ( ) . inner_mut ( ) ;
155+ amp. set_factor ( * controls. volume . lock ( ) . unwrap ( ) ) ;
156+ amp. inner_mut ( )
157+ . set_paused ( controls. pause . load ( Ordering :: SeqCst ) ) ;
158+ amp. inner_mut ( )
159+ . inner_mut ( )
160+ . inner_mut ( )
161+ . set_factor ( * controls. speed . lock ( ) . unwrap ( ) ) ;
162+ if let Some ( seek) = controls. seek . lock ( ) . unwrap ( ) . take ( ) {
163+ seek. attempt ( amp)
164+ }
165+ start_played. store ( true , Ordering :: SeqCst ) ;
166+ } ) ;
167+
159168 self . sound_count . fetch_add ( 1 , Ordering :: Relaxed ) ;
160- let source = Done :: new ( source, self . sound_count . clone ( ) ) ;
161169 * self . sleep_until_end . lock ( ) . unwrap ( ) = Some ( self . queue_tx . append_with_signal ( source) ) ;
162170 }
163171
@@ -279,7 +287,7 @@ impl Player {
279287 pub fn clear ( & self ) {
280288 let len = self . sound_count . load ( Ordering :: SeqCst ) as u32 ;
281289 * self . controls . to_clear . lock ( ) . unwrap ( ) = len;
282- self . sleep_until_end ( ) ;
290+ self . sound_count . store ( 0 , Ordering :: Relaxed ) ;
283291 self . pause ( ) ;
284292 }
285293
@@ -294,6 +302,7 @@ impl Player {
294302 if len > * to_clear {
295303 * to_clear += 1 ;
296304 }
305+ self . sound_count . fetch_sub ( 1 , Ordering :: SeqCst ) ;
297306 }
298307
299308 /// Stops the sink by emptying the queue.
@@ -361,6 +370,23 @@ mod tests {
361370 use crate :: math:: nz;
362371 use crate :: { Player , Source } ;
363372
373+ #[ test]
374+ fn test_immediate_length_changes ( ) {
375+ let ( player, mut source) = Player :: new ( ) ;
376+
377+ player. append ( SamplesBuffer :: new ( nz ! ( 1 ) , nz ! ( 1 ) , vec ! [ 2.0 , 3.0 ] ) ) ;
378+ player. append ( SamplesBuffer :: new ( nz ! ( 1 ) , nz ! ( 1 ) , vec ! [ 1.0 , 0.5 ] ) ) ;
379+ assert_eq ! ( player. len( ) , 2 ) ;
380+ assert_eq ! ( source. next( ) , Some ( 2.0 ) ) ;
381+
382+ player. skip_one ( ) ;
383+ assert_eq ! ( player. len( ) , 1 ) ;
384+ assert_eq ! ( source. next( ) , Some ( 1.0 ) ) ;
385+
386+ player. clear ( ) ;
387+ assert_eq ! ( player. len( ) , 0 ) ;
388+ }
389+
364390 #[ test]
365391 fn test_pause_and_stop ( ) {
366392 let ( player, mut source) = Player :: new ( ) ;
0 commit comments