2010-09-25 15:46:12 +00:00
|
|
|
/* Simple resampler based on bsnes's ruby audio library */
|
|
|
|
|
|
|
|
#ifndef __RESAMPLER_H
|
|
|
|
#define __RESAMPLER_H
|
|
|
|
|
|
|
|
#include "ring_buffer.h"
|
|
|
|
|
|
|
|
class Resampler : public ring_buffer
|
|
|
|
{
|
|
|
|
public:
|
2010-09-25 16:46:06 +00:00
|
|
|
virtual void clear (void) = 0;
|
|
|
|
virtual void time_ratio (double) = 0;
|
|
|
|
virtual void read (short *, int) = 0;
|
|
|
|
virtual int avail (void) = 0;
|
2016-09-27 20:25:37 +00:00
|
|
|
|
2010-09-25 15:46:12 +00:00
|
|
|
Resampler (int num_samples) : ring_buffer (num_samples << 1)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2017-09-09 11:12:33 +00:00
|
|
|
virtual ~Resampler ()
|
2010-09-25 15:46:12 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2010-09-25 16:46:06 +00:00
|
|
|
inline bool
|
2010-09-25 15:46:12 +00:00
|
|
|
push (short *src, int num_samples)
|
|
|
|
{
|
|
|
|
if (max_write () < num_samples)
|
|
|
|
return false;
|
|
|
|
|
2010-09-25 16:46:06 +00:00
|
|
|
!num_samples || ring_buffer::push ((unsigned char *) src, num_samples << 1);
|
2010-09-25 15:46:12 +00:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2010-09-25 16:46:06 +00:00
|
|
|
inline int
|
2016-09-27 20:25:37 +00:00
|
|
|
space_empty (void) const
|
2010-09-25 16:46:06 +00:00
|
|
|
{
|
|
|
|
return buffer_size - size;
|
|
|
|
}
|
2016-09-27 20:25:37 +00:00
|
|
|
|
2010-09-25 16:46:06 +00:00
|
|
|
inline int
|
2016-09-27 20:25:37 +00:00
|
|
|
space_filled (void) const
|
2010-09-25 16:46:06 +00:00
|
|
|
{
|
|
|
|
return size;
|
|
|
|
}
|
2016-09-27 20:25:37 +00:00
|
|
|
|
2010-09-25 16:46:06 +00:00
|
|
|
inline int
|
2016-09-27 20:25:37 +00:00
|
|
|
max_write (void) const
|
2010-09-25 15:46:12 +00:00
|
|
|
{
|
|
|
|
return space_empty () >> 1;
|
|
|
|
}
|
|
|
|
|
2010-09-25 16:46:06 +00:00
|
|
|
inline void
|
2010-09-25 15:46:12 +00:00
|
|
|
resize (int num_samples)
|
|
|
|
{
|
|
|
|
ring_buffer::resize (num_samples << 1);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* __RESAMPLER_H */
|