1 /* Simple resampler based on bsnes's ruby audio library */ 2 3 #ifndef __RESAMPLER_H 4 #define __RESAMPLER_H 5 6 #include "ring_buffer.h" 7 8 class Resampler : public ring_buffer 9 { 10 public: 11 virtual void clear (void) = 0; 12 virtual void time_ratio (double) = 0; 13 virtual void read (short *, int) = 0; 14 virtual int avail (void) = 0; 15 Resampler(int num_samples)16 Resampler (int num_samples) : ring_buffer (num_samples << 1) 17 { 18 } 19 ~Resampler()20 ~Resampler () 21 { 22 } 23 24 inline bool push(short * src,int num_samples)25 push (short *src, int num_samples) 26 { 27 if (max_write () < num_samples) 28 return false; 29 30 !num_samples || ring_buffer::push ((unsigned char *) src, num_samples << 1); 31 32 return true; 33 } 34 35 inline int space_empty(void)36 space_empty (void) const 37 { 38 return buffer_size - size; 39 } 40 41 inline int space_filled(void)42 space_filled (void) const 43 { 44 return size; 45 } 46 47 inline int max_write(void)48 max_write (void) const 49 { 50 return space_empty () >> 1; 51 } 52 53 inline void resize(int num_samples)54 resize (int num_samples) 55 { 56 ring_buffer::resize (num_samples << 1); 57 } 58 }; 59 60 #endif /* __RESAMPLER_H */ 61