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