@@ -318,11 +318,11 @@ enum InnerState {
318318
319319 /// Each input Stream that has not been dropped has its callbacks in an element of this Vec.
320320 /// The last element is guaranteed to not be None.
321- input_callbacks : Vec < Option < InputCallbacks > > ,
321+ input_callbacks : ( usize , HashMap < usize , InputCallbacks > ) ,
322322
323323 /// Each output Stream that has not been dropped has its callbacks in an element of this Vec.
324324 /// The last element is guaranteed to not be None.
325- output_callbacks : Vec < Option < OutputCallbacks > > ,
325+ output_callbacks : ( usize , HashMap < usize , OutputCallbacks > ) ,
326326
327327 /// Whether the runner thread was spawned yet.
328328 thread_spawned : bool ,
@@ -440,20 +440,16 @@ impl InnerState {
440440 ref mut wakeup_sender,
441441 ..
442442 } => {
443- for ( i, cbs) in output_callbacks. iter_mut ( ) . enumerate ( ) {
444- if cbs. is_none ( ) {
445- * cbs = Some ( callbacks) ;
446- return Ok ( i) ;
447- }
448- }
449443 // If there were previously no callbacks, wakeup the runner thread.
450- if input_callbacks. len ( ) == 0 && output_callbacks. len ( ) == 0 {
444+ if input_callbacks. 1 . len ( ) == 0 && output_callbacks. 1 . len ( ) == 0 {
451445 if let Some ( ref sender) = wakeup_sender {
452446 let _ = sender. send ( ( ) ) ;
453447 }
454448 }
455- output_callbacks. push ( Some ( callbacks) ) ;
456- Ok ( output_callbacks. len ( ) - 1 )
449+ let index = output_callbacks. 0 ;
450+ output_callbacks. 1 . insert ( index, callbacks) ;
451+ output_callbacks. 0 = index + 1 ;
452+ Ok ( index)
457453 }
458454 _ => Err ( backend_specific_error ( "device is not in a running state" ) ) ,
459455 }
@@ -466,15 +462,7 @@ impl InnerState {
466462 InnerState :: Running {
467463 ref mut output_callbacks,
468464 ..
469- } => {
470- let cbs = output_callbacks[ index] . take ( ) . unwrap ( ) ;
471- while output_callbacks. len ( ) > 0
472- && output_callbacks[ output_callbacks. len ( ) - 1 ] . is_none ( )
473- {
474- output_callbacks. pop ( ) ;
475- }
476- Ok ( cbs)
477- }
465+ } => Ok ( output_callbacks. 1 . remove ( & index) . unwrap ( ) ) ,
478466 _ => Err ( backend_specific_error ( "device is not in a running state" ) ) ,
479467 }
480468 }
@@ -489,20 +477,16 @@ impl InnerState {
489477 ref mut wakeup_sender,
490478 ..
491479 } => {
492- for ( i, cbs) in input_callbacks. iter_mut ( ) . enumerate ( ) {
493- if cbs. is_none ( ) {
494- * cbs = Some ( callbacks) ;
495- return Ok ( i) ;
496- }
497- }
498480 // If there were previously no callbacks, wakeup the runner thread.
499- if input_callbacks. len ( ) == 0 && output_callbacks. len ( ) == 0 {
481+ if input_callbacks. 1 . len ( ) == 0 && output_callbacks. 1 . len ( ) == 0 {
500482 if let Some ( ref sender) = wakeup_sender {
501483 let _ = sender. send ( ( ) ) ;
502484 }
503485 }
504- input_callbacks. push ( Some ( callbacks) ) ;
505- Ok ( input_callbacks. len ( ) - 1 )
486+ let index = input_callbacks. 0 ;
487+ input_callbacks. 1 . insert ( index, callbacks) ;
488+ input_callbacks. 0 = index + 1 ;
489+ Ok ( index)
506490 }
507491 _ => Err ( backend_specific_error ( "device is not in a running state" ) ) ,
508492 }
@@ -515,15 +499,7 @@ impl InnerState {
515499 InnerState :: Running {
516500 ref mut input_callbacks,
517501 ..
518- } => {
519- let cbs = input_callbacks[ index] . take ( ) . unwrap ( ) ;
520- while input_callbacks. len ( ) > 0
521- && input_callbacks[ input_callbacks. len ( ) - 1 ] . is_none ( )
522- {
523- input_callbacks. pop ( ) ;
524- }
525- Ok ( cbs)
526- }
502+ } => Ok ( input_callbacks. 1 . remove ( & index) . unwrap ( ) ) ,
527503 _ => Err ( backend_specific_error ( "device is not in a running state" ) ) ,
528504 }
529505 }
@@ -537,15 +513,11 @@ impl InnerState {
537513 ..
538514 } => {
539515 let e = e. into ( ) ;
540- for cbs in input_callbacks {
541- if let Some ( cbs) = cbs {
542- ( cbs. error_callback ) ( e. clone ( ) ) ;
543- }
516+ for cbs in input_callbacks. 1 . values_mut ( ) {
517+ ( cbs. error_callback ) ( e. clone ( ) ) ;
544518 }
545- for cbs in output_callbacks {
546- if let Some ( cbs) = cbs {
547- ( cbs. error_callback ) ( e. clone ( ) ) ;
548- }
519+ for cbs in output_callbacks. 1 . values_mut ( ) {
520+ ( cbs. error_callback ) ( e. clone ( ) ) ;
549521 }
550522 }
551523 _ => { } // Drop the error
@@ -596,8 +568,8 @@ impl InnerState {
596568 buffer_size,
597569 par,
598570 sample_rate_map : tmp,
599- input_callbacks : vec ! [ ] ,
600- output_callbacks : vec ! [ ] ,
571+ input_callbacks : ( 0 , HashMap :: new ( ) ) ,
572+ output_callbacks : ( 0 , HashMap :: new ( ) ) ,
601573 thread_spawned : false ,
602574 wakeup_sender : None ,
603575 } ;
@@ -618,6 +590,17 @@ impl InnerState {
618590 }
619591 }
620592 }
593+
594+ fn has_streams ( & self ) -> bool {
595+ match self {
596+ InnerState :: Running {
597+ ref input_callbacks,
598+ ref output_callbacks,
599+ ..
600+ } => input_callbacks. 1 . len ( ) > 0 || output_callbacks. 1 . len ( ) > 0 ,
601+ _ => false ,
602+ }
603+ }
621604}
622605
623606impl Drop for InnerState {
@@ -1070,13 +1053,11 @@ impl Drop for Stream {
10701053
10711054 match * inner_state {
10721055 InnerState :: Running {
1073- ref input_callbacks,
1074- ref output_callbacks,
10751056 ref thread_spawned,
10761057 ref wakeup_sender,
10771058 ..
10781059 } => {
1079- if input_callbacks . len ( ) == 0 && output_callbacks . len ( ) == 0 && * thread_spawned {
1060+ if !inner_state . has_streams ( ) && * thread_spawned {
10801061 // Wake up runner thread so it can shut down
10811062 if let Some ( ref sender) = wakeup_sender {
10821063 let _ = sender. send ( ( ) ) ;
@@ -1093,13 +1074,11 @@ impl Drop for Device {
10931074 let inner_state = self . inner_state . lock ( ) . unwrap ( ) ;
10941075 match * inner_state {
10951076 InnerState :: Running {
1096- ref input_callbacks,
1097- ref output_callbacks,
10981077 ref thread_spawned,
10991078 ref wakeup_sender,
11001079 ..
11011080 } => {
1102- if input_callbacks . len ( ) == 0 && output_callbacks . len ( ) == 0 && * thread_spawned {
1081+ if !inner_state . has_streams ( ) && * thread_spawned {
11031082 // Wake up runner thread so it can shut down
11041083 if let Some ( ref sender) = wakeup_sender {
11051084 let _ = sender. send ( ( ) ) ;
0 commit comments