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