| 
									
										
										
										
											2021-05-12 04:58:55 -04:00
										 |  |  | /** \file
 | 
					
						
							|  |  |  | Sample buffer that resamples from input clock rate to output sample rate */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* blip_buf $vers */ | 
					
						
							|  |  |  | #ifndef BLIP_BUF_H 
 | 
					
						
							|  |  |  | #define BLIP_BUF_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-29 16:25:23 -04:00
										 |  |  | // MODIFIED by tildearrow:
 | 
					
						
							|  |  |  | // - add option to disable high-pass filter
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-12 04:58:55 -04:00
										 |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | 	extern "C" { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** First parameter of most functions is blip_t*, or const blip_t* if nothing
 | 
					
						
							|  |  |  | is changed. */ | 
					
						
							|  |  |  | typedef struct blip_t blip_t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** Creates new buffer that can hold at most sample_count samples. Sets rates
 | 
					
						
							|  |  |  | so that there are blip_max_ratio clocks per sample. Returns pointer to new | 
					
						
							|  |  |  | buffer, or NULL if insufficient memory. */ | 
					
						
							|  |  |  | blip_t* blip_new( int sample_count ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-29 16:25:23 -04:00
										 |  |  | /** (tildearrow) sets whether to enable high-pass filter. */ | 
					
						
							|  |  |  | void blip_set_dc( blip_t*, unsigned char enable ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-12 04:58:55 -04:00
										 |  |  | /** Sets approximate input clock rate and output sample rate. For every
 | 
					
						
							|  |  |  | clock_rate input clocks, approximately sample_rate samples are generated. */ | 
					
						
							|  |  |  | void blip_set_rates( blip_t*, double clock_rate, double sample_rate ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | enum { /** Maximum clock_rate/sample_rate ratio. For a given sample_rate,
 | 
					
						
							|  |  |  | clock_rate must not be greater than sample_rate*blip_max_ratio. */ | 
					
						
							|  |  |  | blip_max_ratio = 1 << 20 }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** Clears entire buffer. Afterwards, blip_samples_avail() == 0. */ | 
					
						
							|  |  |  | void blip_clear( blip_t* ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** Adds positive/negative delta into buffer at specified clock time. */ | 
					
						
							|  |  |  | void blip_add_delta( blip_t*, unsigned int clock_time, int delta ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** Same as blip_add_delta(), but uses faster, lower-quality synthesis. */ | 
					
						
							|  |  |  | void blip_add_delta_fast( blip_t*, unsigned int clock_time, int delta ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** Length of time frame, in clocks, needed to make sample_count additional
 | 
					
						
							|  |  |  | samples available. */ | 
					
						
							|  |  |  | int blip_clocks_needed( const blip_t*, int sample_count ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | enum { /** Maximum number of samples that can be generated from one time frame. */ | 
					
						
							|  |  |  | blip_max_frame = 4000 }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** Makes input clocks before clock_duration available for reading as output
 | 
					
						
							|  |  |  | samples. Also begins new time frame at clock_duration, so that clock time 0 in | 
					
						
							|  |  |  | the new time frame specifies the same clock as clock_duration in the old time | 
					
						
							|  |  |  | frame specified. Deltas can have been added slightly past clock_duration (up to | 
					
						
							|  |  |  | however many clocks there are in two output samples). */ | 
					
						
							|  |  |  | void blip_end_frame( blip_t*, unsigned int clock_duration ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** Number of buffered samples available for reading. */ | 
					
						
							|  |  |  | int blip_samples_avail( const blip_t* ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** Reads and removes at most 'count' samples and writes them to 'out'. If
 | 
					
						
							|  |  |  | 'stereo' is true, writes output to every other element of 'out', allowing easy | 
					
						
							|  |  |  | interleaving of two buffers into a stereo sample stream. Outputs 16-bit signed | 
					
						
							|  |  |  | samples. Returns number of samples actually read.  */ | 
					
						
							|  |  |  | int blip_read_samples( blip_t*, short out [], int count, int stereo ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** Frees buffer. No effect if NULL is passed. */ | 
					
						
							|  |  |  | void blip_delete( blip_t* ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Deprecated */ | 
					
						
							|  |  |  | typedef blip_t blip_buffer_t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |