1 /***************************************************************************
2 Sox
3 ***************************************************************************/
4
5
6 /***************************************************************************
7 * *
8 * This program is free software; you can redistribute it and/or modify *
9 * it under the terms of the GNU General Public License as published by *
10 * the Free Software Foundation; either version 2 of the License, or *
11 * (at your option) any later version. *
12 * *
13 ***************************************************************************/
14
15 #include "ADM_default.h"
16
17 #include "ADM_audioFilter.h"
18 #include "audiofilter_SRC.h"
19 /**
20 \fn AUDMAudioFilterSrc
21
22 */
AUDMAudioFilterSrc(AUDMAudioFilter * instream,uint32_t tgt)23 AUDMAudioFilterSrc::AUDMAudioFilterSrc(AUDMAudioFilter *instream,uint32_t tgt):AUDMAudioFilter (instream)
24 {
25
26 targetFrequency=tgt;
27 _previous->rewind(); // rewind
28 printf("[FilterSrc] Creating from %d Hz to %d Hz\n",_wavHeader.frequency,targetFrequency);
29 if(_wavHeader.frequency==targetFrequency)
30 {
31 engaged=0;
32 return;
33 }
34 int org=_previous->getInfo()->frequency;
35 if(true!=resampler.init(org,tgt,_wavHeader.channels))
36 {
37 printf("[AudioFilter Resample] Init failed! \n");
38 engaged=0;
39 return;
40 }
41 engaged=1;
42 _wavHeader.frequency= targetFrequency;
43 printf("[AudioFilter Resample] Init done. \n");
44 };
45
~AUDMAudioFilterSrc()46 AUDMAudioFilterSrc::~AUDMAudioFilterSrc()
47 {
48 printf("[AudioFilter Resample] Destroying\n");
49 };
50
51 #define BLK_SIZE 512
52 //_____________________________________________
fill(uint32_t max,float * output,AUD_Status * status)53 uint32_t AUDMAudioFilterSrc::fill(uint32_t max,float *output,AUD_Status *status)
54 {
55 if(!engaged)
56 {
57 return _previous->fill(max, output,status);
58
59 }
60 uint32_t snboutput=0;
61 // BLK_SIZE sample will generate blockOut sample*channel
62 float blockOutf=BLK_SIZE*_wavHeader.channels*_wavHeader.frequency;
63 blockOutf/=_previous->getInfo()->frequency;
64 uint32_t blockOut=(uint32_t)(blockOutf);
65
66 // Roundup to the next # channels
67 blockOut=(blockOut+_wavHeader.channels-1)/_wavHeader.channels;
68 blockOut*=_wavHeader.channels;
69
70 while(max>blockOut)
71 {
72 // Fill incoming buffer
73 shrink();
74 fillIncomingBuffer(status);
75 if(_head==_tail)
76 {
77 *status=AUD_END_OF_STREAM;
78 return snboutput;
79 }
80 ADM_assert(_tail>=_head);
81 uint32_t nb_in=(_tail-_head)/(_wavHeader.channels); // Nb Sample
82 if(nb_in>BLK_SIZE) nb_in=BLK_SIZE;
83 if(!nb_in)
84 {
85 printf("[Resampler]Not enough audio\n");
86 return snboutput;
87 }
88 // We have one BLK_SIZE incoming
89 uint32_t maxSample=BLK_SIZE*4; // FIXME!
90 uint32_t nbOut=0;
91 uint32_t nbIn=nb_in;
92 uint32_t nbInTaken=0;
93 float *from,*to;
94 from=_incomingBuffer.at(_head);
95 to=output;
96 if(true!=resampler.process(from,to,
97 nbIn,
98 maxSample,
99 &nbInTaken,
100 &nbOut))
101 {
102 *status=AUD_END_OF_STREAM;
103 return snboutput;
104 }
105
106 _head=_head+(nbInTaken*_wavHeader.channels);
107 snboutput+=nbOut*_wavHeader.channels;
108 output+=nbOut*_wavHeader.channels;
109 max-=nbOut*_wavHeader.channels;
110 }
111 return snboutput;
112 }
113 //EOF
114