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