@@ -132,29 +132,53 @@ fn play(_menu: &menu::Menu<Ctx>, _item: &menu::Item<Ctx>, args: &[&str], ctx: &m
132132 embedded_sdmmc:: Mode :: ReadOnly ,
133133 ) ?;
134134
135+ osprintln ! ( "Press Q to quit, P to pause/unpause..." ) ;
136+
135137 let api = API . get ( ) ;
136138
137139 let mut buffer = & mut scratch[ 0 ..4096 ] ;
138140 let mut bytes = 0 ;
139141 let mut delta = 0 ;
140142
141- while !file. eof ( ) {
142- let bytes_read = mgr. read ( & mut volume, & mut file, & mut buffer) ?;
143- let mut buffer = & buffer[ 0 ..bytes_read] ;
144- while !buffer. is_empty ( ) {
145- let slice = bios:: FfiByteSlice :: new ( buffer) ;
146- let played = unsafe { ( api. audio_output_data ) ( slice) . unwrap ( ) } ;
147- buffer = & buffer[ played..] ;
148- delta += played;
149- if delta > 48000 {
150- bytes += delta;
151- delta = 0 ;
143+ let mut pause = false ;
144+ ' playback: while !file. eof ( ) {
145+ if !pause {
146+ let bytes_read = mgr. read ( & mut volume, & mut file, & mut buffer) ?;
147+ let mut buffer = & buffer[ 0 ..bytes_read] ;
148+ while !buffer. is_empty ( ) {
149+ let slice = bios:: FfiByteSlice :: new ( buffer) ;
150+ let played = unsafe { ( api. audio_output_data ) ( slice) . unwrap ( ) } ;
151+ buffer = & buffer[ played..] ;
152+ delta += played;
153+ if delta > 48000 {
154+ bytes += delta;
155+ delta = 0 ;
156+ let milliseconds = bytes / ( ( 48000 / 1000 ) * 4 ) ;
157+ osprint ! (
158+ "\r Played: {}.{:03} s" ,
159+ milliseconds / 1000 ,
160+ milliseconds % 1000
161+ ) ;
162+ }
163+ }
164+ }
165+
166+ let mut buffer = [ 0u8 ; 16 ] ;
167+ let count = { crate :: STD_INPUT . lock ( ) . get_data ( & mut buffer) } ;
168+ for b in & buffer[ 0 ..count] {
169+ if * b == b'q' || * b == b'Q' {
170+ osprintln ! ( "\n Quitting playback!" ) ;
171+ break ' playback;
172+ } else if ( * b == b'p' || * b == b'P' ) && pause {
173+ pause = false ;
174+ } else if ( * b == b'p' || * b == b'P' ) && !pause {
152175 let milliseconds = bytes / ( ( 48000 / 1000 ) * 4 ) ;
153176 osprint ! (
154- "\r Played : {}:{} ms " ,
177+ "\r Paused : {}.{:03} s " ,
155178 milliseconds / 1000 ,
156179 milliseconds % 1000
157180 ) ;
181+ pause = true ;
158182 }
159183 }
160184 }
0 commit comments