1- use std:: { marker :: PhantomData , sync:: { atomic :: AtomicBool , Arc } } ;
1+ use std:: sync:: Arc ;
22
3- use asio_sys:: { self as asio, CallbackId } ;
3+ use asio_sys as asio;
44
55use crate :: stream:: AudioStreamHandle ;
66
77use super :: error:: AsioError ;
88
99pub struct AsioStream < Callback > {
10- playing : Arc < AtomicBool > ,
11- // driver: Arc<asio::Driver>,
12- // streams: Arc<asio::AsioStreams>,
13- callback_id : asio:: CallbackId ,
14- callback : PhantomData < Callback > ,
10+ pub driver : Arc < asio:: Driver > ,
11+ pub callback_id : asio:: CallbackId ,
12+ pub callback_retrieve : oneshot:: Sender < oneshot:: Sender < Callback > > ,
1513}
1614
1715impl < Callback > AudioStreamHandle < Callback > for AsioStream < Callback > {
18-
1916 type Error = AsioError ;
20-
17+
2118 fn eject ( self ) -> Result < Callback , Self :: Error > {
22- todo ! ( )
19+ let ( tx, rx) = oneshot:: channel ( ) ;
20+ self . callback_retrieve . send ( tx) . unwrap ( ) ;
21+ let callback = rx. recv ( ) . unwrap ( ) ;
22+ self . driver . stop ( ) ?;
23+ self . driver . remove_callback ( self . callback_id ) ;
24+ Ok ( callback)
2325 }
2426}
25-
26- impl < Callback > AsioStream < Callback > {
27- pub fn new ( playing : Arc < AtomicBool > , callback_id : CallbackId ) -> Self {
28- AsioStream { playing, callback_id, callback : PhantomData }
29- }
30-
31-
32- }
0 commit comments