@@ -132,8 +132,17 @@ impl Track {
132132 } )
133133 }
134134
135- pub fn encode_frame ( & mut self ) -> AudioFrame {
135+ pub fn encode_frame ( & mut self ) -> Result < AudioFrame , ( ) > {
136136 const pcm_length: usize = 960 ;
137+
138+ if pcm_length * ( self . position + 1 ) >= self . samples . len ( ) {
139+ println ! (
140+ "encode_frame was about to run out of samples at pos {}" ,
141+ self . position
142+ ) ;
143+ return Err ( ( ) ) ;
144+ }
145+
137146 let mut pcm = [ 0.0 ; pcm_length] ;
138147
139148 for i in 0 ..pcm_length {
@@ -143,10 +152,10 @@ impl Track {
143152 let x = self . encoder . encode_vec_float ( & pcm, 256 ) . unwrap ( ) ;
144153 self . position += 1 ;
145154
146- AudioFrame {
155+ Ok ( AudioFrame {
147156 frame : self . position as u32 ,
148157 data : x,
149- }
158+ } )
150159 }
151160}
152161
@@ -172,8 +181,14 @@ impl Player {
172181 let mut pcm = vec ! [ 0.0 ; 960 ] ;
173182 self . decoder . decode_float ( & frame, & mut pcm, false ) . unwrap ( ) ;
174183
175- // copy to ringbuffer
176- self . buffer . lock ( ) . unwrap ( ) . push_slice ( & pcm) ;
184+ let mut buffer = self . buffer . lock ( ) . unwrap ( ) ;
185+ if buffer. len ( ) < buffer. free_len ( ) {
186+ // copy to ringbuffer
187+ buffer. push_slice ( & pcm) ;
188+ } else {
189+ // otherwise just discard i guess
190+ println ! ( "player buffer full... discarding :/" )
191+ }
177192 }
178193
179194 pub fn play ( & mut self ) {
@@ -214,13 +229,41 @@ impl Player {
214229 // dont let it be dropped
215230 self . stream = Some ( stream) ;
216231 }
232+
233+ pub fn pause ( & mut self ) {
234+ assert ! ( self . stream. is_some( ) ) ;
235+ self . stream . as_mut ( ) . unwrap ( ) . pause ( ) . unwrap ( ) ;
236+ }
237+
238+ pub fn resume ( & mut self ) {
239+ assert ! ( self . stream. is_some( ) ) ;
240+ self . stream . as_mut ( ) . unwrap ( ) . play ( ) . unwrap ( ) ;
241+ }
242+
243+ pub fn clear ( & mut self ) {
244+ self . buffer . lock ( ) . unwrap ( ) . clear ( ) ;
245+ }
246+
247+ pub fn ready ( & self ) -> bool {
248+ let buffer = self . buffer . lock ( ) . unwrap ( ) ;
249+ buffer. len ( ) > 48000 * 2 // 2s...
250+ }
217251}
218252
219253// callback when the audio output needs more data
220254fn write_audio < T : Sample > (
221255 out_data : & mut [ f32 ] ,
222256 _: & cpal:: OutputCallbackInfo ,
223- buffer : & Arc < Mutex < Ringbuf > > ,
257+ buffer_mutex : & Arc < Mutex < Ringbuf > > ,
224258) {
225- buffer. lock ( ) . unwrap ( ) . pop_slice ( out_data) ;
259+ let mut buffer = buffer_mutex. lock ( ) . unwrap ( ) ;
260+ if out_data. len ( ) < buffer. len ( ) {
261+ buffer. pop_slice ( out_data) ;
262+ } else {
263+ // uhhhh
264+ println ! ( "write_audio: buffer underrun!! (but no panic)" ) ;
265+ }
266+ if buffer. len ( ) < 48000 * 2 - 1000 {
267+ println ! ( "write_audio: buffer has {} left" , buffer. len( ) ) ;
268+ }
226269}
0 commit comments