🚧 wip: I might have fixed the popping.
I was not supposed to be calling `flush` in the first placemain
							parent
							
								
									e6c157b556
								
							
						
					
					
						commit
						9c3368f28b
					
				|  | @ -121,6 +121,30 @@ impl Decoder { | |||
| 	} | ||||
| 	
 | ||||
| 	pub fn next (&mut self) -> Result <Option <AudioFrame>> { | ||||
| 		Ok (if let Some (frame) = self.pump ()? { | ||||
| 			assert_eq! (frame.rate (), 48000); | ||||
| 			assert! (frame.samples () > 0); | ||||
| 			
 | ||||
| 			let actual_bytes = frame.data (0).len (); | ||||
| 			let expected_bytes = frame.samples () * 4 * 2; | ||||
| 			
 | ||||
| 			assert! (actual_bytes >= expected_bytes); | ||||
| 			
 | ||||
| 			if actual_bytes > expected_bytes { | ||||
| 				let extra_bytes = actual_bytes - expected_bytes; | ||||
| 				let extra_samples = extra_bytes / 4 / 2; | ||||
| 				tracing::debug! ("Extra bytes: {}", extra_bytes); | ||||
| 				tracing::debug! ("Extra samples: {}", extra_samples); | ||||
| 			} | ||||
| 			
 | ||||
| 			Some (frame) | ||||
| 		} | ||||
| 		else { | ||||
| 			None | ||||
| 		}) | ||||
| 	} | ||||
| 	
 | ||||
| 	fn pump (&mut self) -> Result <Option <AudioFrame>> { | ||||
| 		loop { | ||||
| 			match self.pump_resampler ()? { | ||||
| 				Some (x) => { | ||||
|  | @ -151,15 +175,23 @@ impl Decoder { | |||
| 	} | ||||
| 	
 | ||||
| 	pub fn pump_resampler (&mut self) -> Result <Option <AudioFrame>> { | ||||
| 		let delay = match self.resampler.delay () { | ||||
| 			None => return Ok (None), | ||||
| 			Some (x) => x, | ||||
| 		}; | ||||
| 		
 | ||||
| 		let mut frame_src = AudioFrame::new ( | ||||
| 			Sample::F32 (sample::Type::Planar), | ||||
| 			0, | ||||
| 			ChannelLayout::STEREO | ||||
| 		); | ||||
| 		let mut frame_resampled = Self::new_frame (); | ||||
| 		
 | ||||
| 		// dbg! (self.resampler.delay ());
 | ||||
| 		frame_src.set_rate (44100); | ||||
| 		
 | ||||
| 		if self.resampler.delay ().is_none () { | ||||
| 			return Ok (None); | ||||
| 		} | ||||
| 		
 | ||||
| 		let _rc = self.resampler.flush (&mut frame_resampled)?; | ||||
| 		tracing::trace! ("Flushing resampler"); | ||||
| 		tracing::trace! ("delay: {:?}", delay); | ||||
| 		let _rc = self.resampler.run (&frame_src, &mut frame_resampled)?; | ||||
| 		// dbg! (&frame_resampled, rc);
 | ||||
| 		
 | ||||
| 		Ok (if frame_resampled.samples () > 0 { | ||||
|  |  | |||
							
								
								
									
										12
									
								
								src/main.rs
								
								
								
								
							
							
						
						
									
										12
									
								
								src/main.rs
								
								
								
								
							|  | @ -19,11 +19,6 @@ use anyhow::{ | |||
| 	Result, | ||||
| }; | ||||
| 
 | ||||
| use byteorder::{ | ||||
| 	ByteOrder, | ||||
| 	LittleEndian, | ||||
| }; | ||||
| 
 | ||||
| use cpal::traits::{ | ||||
| 	DeviceTrait, | ||||
| 	HostTrait, | ||||
|  | @ -57,7 +52,8 @@ fn cmd_debug_dump (args: &[String]) -> Result <()> { | |||
| 	let mut f = File::create ("pcm-dump.data")?; | ||||
| 	
 | ||||
| 	while let Some (frame) = decoder.next ()? { | ||||
| 		f.write_all (frame.data (0))?; | ||||
| 		f.write_all (&frame.data (0) [0..frame.samples () * 4 * 2])?; | ||||
| 		// f.write_all (frame.data (0))?;
 | ||||
| 	} | ||||
| 	
 | ||||
| 	Ok (()) | ||||
|  | @ -75,8 +71,6 @@ fn cmd_debug_pipe (args: &[String]) -> Result <()> { | |||
| 	
 | ||||
| 	while let Some (frame) = decoder.next ()? { | ||||
| 		sample_count += frame.samples (); | ||||
| 		assert_eq! (frame.rate (), 48000); | ||||
| 		assert! (frame.samples () > 0); | ||||
| 		// dbg! (frame, sample_count);
 | ||||
| 	} | ||||
| 	
 | ||||
|  | @ -122,7 +116,7 @@ fn cmd_play (args: &[String]) -> Result <()> { | |||
| 				while pcm_buffers.samples_available () < 12_000 { | ||||
| 					// tracing::trace! ("Decoder is trying to work...");
 | ||||
| 					match decoder.next ()? { | ||||
| 						Some (frame) => pcm_buffers.produce_bytes (frame.data (0)), | ||||
| 						Some (frame) => pcm_buffers.produce_bytes (&frame.data (0) [0..frame.samples () * 4 * 2]), | ||||
| 						None => { | ||||
| 							tracing::info! ("Finished decoding file"); | ||||
| 							break 'one_file; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 _
						_