1 /**
2     \fn ADM_audioResample.h
3     \brief Wrapper around libsamplerate
4 
5 
6 */
7 #include "ADM_default.h"
8 #include "ADM_coreAudio.h"
9 #include "ADM_audioResample.h"
10 #include "ADM_libsamplerate/samplerate.h"
11 #include <math.h>
12 
13 
14 /**
15     \fn ADM_resample
16     \brief
17 */
ADM_resample(void)18 ADM_resample::ADM_resample(void)
19 {
20     fromFrequency=0;
21     toFrequency=0;
22     nbChannels=0;
23     context=NULL;
24 }
25 
26 #define CONTEXT ((SRC_STATE* )context)
27 
28 /**
29     \fn init
30     \brief
31     @param from    : Starting frequency
32     @param to      : Ending frequency
33     @param channel : Nb Channel
34 */
init(uint32_t from,uint32_t to,uint32_t channel)35 bool ADM_resample::init(uint32_t from, uint32_t to, uint32_t channel)
36 {
37 int er=0;
38 
39     ratio=to;
40     ratio/=from;
41     if(true!=src_is_valid_ratio (ratio))
42     {
43         printf("[SRC] Invalid ratio %lf\n",ratio);
44         return false;
45     }
46 
47     printf("[SRC] Creating %u->%u, with %d channels\n",from,to,channel);
48     fromFrequency=from;
49     toFrequency=to;
50     nbChannels=channel;
51     context=(void *)src_new (SRC_SINC_FASTEST*0+1*SRC_SINC_MEDIUM_QUALITY, channel, &er) ;
52     if(!context)
53     {
54         printf("[SRC] Error :%d\n",er);
55         return false;
56     }
57     ADM_assert(!src_set_ratio (CONTEXT,ratio)) ;
58     //
59     return true;
60 }
61 /**
62     \fn ~ ADM_resample
63     \brief Destructor
64 */
~ADM_resample(void)65 ADM_resample::~ADM_resample(void)
66 {
67     if(context)
68         src_delete (CONTEXT) ;
69      context=NULL;
70     printf("[SRC] Deleted\n");
71 }
72 /**
73     \fn  reset
74     \brief Reset the downsampler. Call it when you start resampling a new "file"
75 */
reset(void)76 bool ADM_resample::reset(void)
77 {
78     ADM_assert(context);
79     src_reset (CONTEXT);
80     return true;
81 
82 }
83 /**
84     \fn process
85     \brief convert samples
86     @param  from : Pointer to incoming sample
87     @param  to   : Pointer to generated sample
88     @param  nbSample : Nb of incoming sample
89     @param  maxOutSample : Max # of generated sample
90     @param  sampleProdiced : Nb of produced sample
91     @return bool
92 
93 */
process(float * from,float * to,uint32_t nbSample,uint32_t maxOutSample,uint32_t * sampleProcessed,uint32_t * outNbSample)94 bool ADM_resample::process(float *from, float *to, uint32_t nbSample,uint32_t maxOutSample, uint32_t *sampleProcessed, uint32_t *outNbSample)
95 {
96     SRC_DATA block;
97     block.data_in=from;
98     block.data_out=to;
99     block.input_frames=nbSample;
100     block.output_frames=maxOutSample;
101     block.input_frames_used=0;
102     block.output_frames_gen=0;
103     block.end_of_input=0;
104     block.src_ratio=ratio;
105     int er=src_process (CONTEXT,&block);
106     if(er)
107     {
108         printf("[SRC] Error :%d->%s\n",er,src_strerror(er));
109         return false;
110     }
111     *sampleProcessed=block.input_frames_used;
112     *outNbSample=block.output_frames_gen;
113     return true;
114 }
115 //EOF
116