| 1 | /** \file |
| 2 | Sample buffer that resamples from input clock rate to output sample rate */ |
| 3 | |
| 4 | /* blip_buf $vers */ |
| 5 | #ifndef BLIP_BUF_H |
| 6 | #define BLIP_BUF_H |
| 7 | |
| 8 | #ifdef __cplusplus |
| 9 | extern "C" { |
| 10 | #endif |
| 11 | |
| 12 | /** First parameter of most functions is blip_t*, or const blip_t* if nothing |
| 13 | is changed. */ |
| 14 | typedef struct blip_t blip_t; |
| 15 | |
| 16 | /** Creates new buffer that can hold at most sample_count samples. Sets rates |
| 17 | so that there are blip_max_ratio clocks per sample. Returns pointer to new |
| 18 | buffer, or NULL if insufficient memory. */ |
| 19 | blip_t* blip_new( int sample_count ); |
| 20 | |
| 21 | /** Sets approximate input clock rate and output sample rate. For every |
| 22 | clock_rate input clocks, approximately sample_rate samples are generated. */ |
| 23 | void blip_set_rates( blip_t*, double clock_rate, double sample_rate ); |
| 24 | |
| 25 | enum { /** Maximum clock_rate/sample_rate ratio. For a given sample_rate, |
| 26 | clock_rate must not be greater than sample_rate*blip_max_ratio. */ |
| 27 | blip_max_ratio = 1 << 20 }; |
| 28 | |
| 29 | /** Clears entire buffer. Afterwards, blip_samples_avail() == 0. */ |
| 30 | void blip_clear( blip_t* ); |
| 31 | |
| 32 | /** Adds positive/negative delta into buffer at specified clock time. */ |
| 33 | void blip_add_delta( blip_t*, unsigned int clock_time, int delta ); |
| 34 | |
| 35 | /** Same as blip_add_delta(), but uses faster, lower-quality synthesis. */ |
| 36 | void blip_add_delta_fast( blip_t*, unsigned int clock_time, int delta ); |
| 37 | |
| 38 | /** Length of time frame, in clocks, needed to make sample_count additional |
| 39 | samples available. */ |
| 40 | int blip_clocks_needed( const blip_t*, int sample_count ); |
| 41 | |
| 42 | enum { /** Maximum number of samples that can be generated from one time frame. */ |
| 43 | blip_max_frame = 4000 }; |
| 44 | |
| 45 | /** Makes input clocks before clock_duration available for reading as output |
| 46 | samples. Also begins new time frame at clock_duration, so that clock time 0 in |
| 47 | the new time frame specifies the same clock as clock_duration in the old time |
| 48 | frame specified. Deltas can have been added slightly past clock_duration (up to |
| 49 | however many clocks there are in two output samples). */ |
| 50 | void blip_end_frame( blip_t*, unsigned int clock_duration ); |
| 51 | |
| 52 | /** Number of buffered samples available for reading. */ |
| 53 | int blip_samples_avail( const blip_t* ); |
| 54 | |
| 55 | /** Reads and removes at most 'count' samples and writes them to 'out'. If |
| 56 | 'stereo' is true, writes output to every other element of 'out', allowing easy |
| 57 | interleaving of two buffers into a stereo sample stream. Outputs 16-bit signed |
| 58 | samples. Returns number of samples actually read. */ |
| 59 | int blip_read_samples( blip_t*, short out [], int count, int stereo ); |
| 60 | |
| 61 | /** Frees buffer. No effect if NULL is passed. */ |
| 62 | void blip_delete( blip_t* ); |
| 63 | |
| 64 | |
| 65 | /* Deprecated */ |
| 66 | typedef blip_t blip_buffer_t; |
| 67 | |
| 68 | #ifdef __cplusplus |
| 69 | } |
| 70 | #endif |
| 71 | |
| 72 | #endif |
| 73 | |