• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*---------------------------------------------------------------------------*
2  *  ca_wave.c  *
3  *                                                                           *
4  *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
5  *                                                                           *
6  *  Licensed under the Apache License, Version 2.0 (the 'License');          *
7  *  you may not use this file except in compliance with the License.         *
8  *                                                                           *
9  *  You may obtain a copy of the License at                                  *
10  *      http://www.apache.org/licenses/LICENSE-2.0                           *
11  *                                                                           *
12  *  Unless required by applicable law or agreed to in writing, software      *
13  *  distributed under the License is distributed on an 'AS IS' BASIS,        *
14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
15  *  See the License for the specific language governing permissions and      *
16  *  limitations under the License.                                           *
17  *                                                                           *
18  *---------------------------------------------------------------------------*/
19 
20 /************************************************************************
21  * CA_Wave Methods
22  ************************************************************************/
23 
24 #ifndef _RTT
25 #include <stdio.h>
26 #endif
27 #include <stdlib.h>
28 #include <string.h>
29 #include <limits.h>
30 
31 #ifdef unix
32 #include <unistd.h>
33 #endif
34 #include <assert.h>
35 
36 
37 #include "frontapi.h"
38 #include "portable.h"
39 
40 /* CA_Wave functions. See simpars.c for frontend params */
41 
CA_AllocateWave(char type)42 CA_Wave *CA_AllocateWave(char type)
43 {
44   CA_Wave *hWave = NULL;
45   TRY_CA_EXCEPT
46   hWave = (CA_Wave *) CALLOC_CLR(1, sizeof(CA_Wave), "cfront.hWave");
47 #ifndef _RTT
48   hWave->data.device.file.typ = type;
49 #endif
50   hWave->data.channel = create_channel_object();
51   hWave->is_configured = False;
52   hWave->is_configuredForVoicing = False;
53   hWave->ca_rtti = CA_WAVE_SIGNATURE;
54   return (hWave);
55 
56   BEG_CATCH_CA_EXCEPT;
57   END_CATCH_CA_EXCEPT(hWave);
58 }
59 
CA_ConfigureWave(CA_Wave * hWave,CA_Frontend * hFrontend)60 void CA_ConfigureWave(CA_Wave *hWave, CA_Frontend *hFrontend)
61 {
62   TRY_CA_EXCEPT
63   ASSERT(hWave);
64   ASSERT(hFrontend);
65   ASSERT(FRAMERATE > 0);
66 
67   if (hFrontend->is_configured == False)
68     SERVICE_ERROR(UNCONFIGURED_FRONTEND);
69   if (hWave->is_configured == True)
70     SERVICE_ERROR(CONFIGURED_WAVE);
71 
72   ASSERT(hFrontend->config->waveobj->samplerate);
73 
74   hWave->data.scale  = hFrontend->src_scale;
75   hWave->data.offset = hFrontend->offset;
76   setup_channel_object(hWave->data.channel, hFrontend->config->waveobj,
77                        hFrontend->config->freqobj,
78                        hFrontend->config->cepobj);
79 
80   hWave->data.samplerate = hFrontend->config->waveobj->samplerate;
81 
82   /* Buffer size is set to one frame's worth of data */
83   create_sample_buffer(&hWave->data,
84                        hFrontend->config->waveobj->samplerate / FRAMERATE,
85                        hFrontend->config->freqobj->window_length);
86 
87   hWave->data.stats.highclip_level = hFrontend->config->waveobj->high_clip;
88   hWave->data.stats.lowclip_level  = hFrontend->config->waveobj->low_clip;
89   hWave->data.stats.max_per10000_clip =
90     hFrontend->config->waveobj->max_per10000_clip;
91   hWave->data.stats.max_dc_offset =
92     hFrontend->config->waveobj->max_dc_offset;
93   hWave->data.stats.high_noise_level_bit =
94     hFrontend->config->waveobj->high_noise_level_bit;
95   hWave->data.stats.low_speech_level_bit =
96     hFrontend->config->waveobj->low_speech_level_bit;
97   hWave->data.stats.min_samples =
98     hFrontend->config->waveobj->min_samples;
99 
100   hWave->is_configured = True;
101   return;
102 
103   BEG_CATCH_CA_EXCEPT;
104   END_CATCH_CA_EXCEPT(hWave);
105 }
106 
CA_ConfigureVoicingAnalysis(CA_Wave * hWave,CA_FrontendInputParams * hFrontPar)107 void CA_ConfigureVoicingAnalysis(CA_Wave *hWave, CA_FrontendInputParams *hFrontPar)
108 {
109   TRY_CA_EXCEPT
110 
111   hWave->voice.margin = hFrontPar->voice_margin;
112   hWave->voice.fast_margin = hFrontPar->fast_voice_margin;
113   hWave->voice.quiet_margin = hFrontPar->tracker_margin;
114   hWave->voice.voice_duration = hFrontPar->voice_duration;
115   hWave->voice.quiet_duration = hFrontPar->quiet_duration;
116   hWave->is_configuredForVoicing = True;
117   return;
118 
119   BEG_CATCH_CA_EXCEPT
120   END_CATCH_CA_EXCEPT(hWave)
121 }
122 
CA_UnconfigureWave(CA_Wave * hWave)123 void CA_UnconfigureWave(CA_Wave *hWave)
124 {
125   TRY_CA_EXCEPT
126   ASSERT(hWave);
127   if (hWave->is_configured == False)
128     SERVICE_ERROR(UNCONFIGURED_WAVE);
129 
130   clear_channel_object(hWave->data.channel);
131   free_sample_buffer(&hWave->data);
132   hWave->data.samplerate = 0;
133 
134   hWave->is_configured = False;
135 
136 /* The following is not correct in this place as it does not match where it is set to TRUE.
137  * This is needed for the sample rate change function.
138  * hWave->is_configuredForVoicing = False;
139  */
140   BEG_CATCH_CA_EXCEPT;
141   END_CATCH_CA_EXCEPT(hWave);
142 }
143 
CA_FreeWave(CA_Wave * hWave)144 void CA_FreeWave(CA_Wave *hWave)
145 {
146   TRY_CA_EXCEPT
147   ASSERT(hWave);
148 
149   if (hWave->is_configured == True)
150     SERVICE_ERROR(CONFIGURED_WAVE);
151 
152   delete_channel_object(hWave->data.channel);
153   FREE((char *) hWave);
154   return;
155   BEG_CATCH_CA_EXCEPT;
156   END_CATCH_CA_EXCEPT(hWave);
157 }
158 
CA_OpenWaveFromDevice(CA_Wave * hWave,int wave_type,int samplerate,int device_id,int device_type)159 int CA_OpenWaveFromDevice(CA_Wave *hWave,
160                           int wave_type,
161                           int samplerate,
162                           int device_id,
163                           int device_type)
164 {
165   TRY_CA_EXCEPT
166   ASSERT(hWave);
167   ASSERT(device_id >= 0);
168   ASSERT(device_type == WAVE_DEVICE_RAW);
169 
170   if (hWave->is_configured == False)
171     SERVICE_ERROR(UNCONFIGURED_WAVE);
172   if (hWave->is_configuredForVoicing == False)
173     SERVICE_ERROR(UNCONFIGURED_WAVE);
174 
175   reset_channel_object(hWave->data.channel);
176   hWave->data.wave_type = wave_type;
177   hWave->data.device_type = device_type;
178   hWave->data.device.ext.op = WAVE_DEVICE_INPUT;
179   hWave->data.samplerate = samplerate;
180   init_voicing_analysis(&hWave->voice);
181 
182   reset_sig_check(&hWave->data.stats);
183   hWave->data.do_stats = ESR_TRUE;
184 
185   return (True);
186   BEG_CATCH_CA_EXCEPT;
187   END_CATCH_CA_EXCEPT(hWave);
188 }
189 
190 
CA_DoSignalCheck(CA_Wave * hWave,ESR_BOOL * clipping,ESR_BOOL * dcoffset,ESR_BOOL * highnoise,ESR_BOOL * quietspeech,ESR_BOOL * too_few_samples,ESR_BOOL * too_many_samples)191 ESR_BOOL CA_DoSignalCheck(CA_Wave *hWave,
192                      ESR_BOOL *clipping,
193                      ESR_BOOL *dcoffset,
194                      ESR_BOOL *highnoise,
195                      ESR_BOOL *quietspeech,
196                      ESR_BOOL *too_few_samples,
197                      ESR_BOOL *too_many_samples)
198 {
199   TRY_CA_EXCEPT
200 
201   int nsam;
202   int pclowclip;
203   int pchighclip;
204   int dc_offset;
205   int amp;
206   int pc5;
207   int pc95;
208   int overflow;
209   ESR_BOOL error;
210   wave_stats *ws;
211 
212   ASSERT(hWave);
213 
214   ws = &hWave->data.stats;
215   get_sig_check(ws, &nsam, &pclowclip, &pchighclip, &dc_offset, &amp,
216                 &pc5, &pc95, &overflow);
217 
218   if ((pclowclip + pchighclip) > ws->max_per10000_clip)
219     *clipping = ESR_TRUE;
220   else     *clipping = ESR_FALSE;
221   if (abs(dc_offset) > ws->max_dc_offset) *dcoffset = ESR_TRUE;
222   else     *dcoffset = ESR_FALSE;
223   if (pc5 >= ws->high_noise_level_bit) *highnoise = ESR_TRUE;
224   else     *highnoise = ESR_FALSE;
225   if (pc95 < ws->low_speech_level_bit) *quietspeech = ESR_TRUE;
226   else     *quietspeech = ESR_FALSE;
227   if (nsam < ws->min_samples)  *too_few_samples = ESR_TRUE;
228   else     *too_few_samples = ESR_FALSE;
229   if (overflow)    *too_many_samples = ESR_TRUE;
230   else     *too_many_samples = ESR_FALSE;
231 
232   /* This is better than casting the logical expression to ESR_BOOL */
233   if (*clipping || *dcoffset || *highnoise || *quietspeech || *too_few_samples || *too_many_samples)
234   	error = ESR_TRUE;
235   else
236   	error = ESR_FALSE;
237 
238   return(error);
239 
240   BEG_CATCH_CA_EXCEPT
241   END_CATCH_CA_EXCEPT(hWave)
242 }
243 
CA_CloseDevice(CA_Wave * hWave)244 void CA_CloseDevice(CA_Wave *hWave)
245 {
246   TRY_CA_EXCEPT
247   if (hWave->is_configured == False)
248     SERVICE_ERROR(UNCONFIGURED_WAVE);
249 
250   ASSERT(hWave->data.device.ext.op == WAVE_DEVICE_INPUT);  /* because I don't have output yet! */
251 
252   return;
253   BEG_CATCH_CA_EXCEPT;
254   END_CATCH_CA_EXCEPT(hWave);
255 }
256 
257 
CA_LoadSamples(CA_Wave * hWave,samdata * pPCMData,int sampleCount)258 int CA_LoadSamples(CA_Wave *hWave,
259                    samdata *pPCMData,
260                    int sampleCount)
261 {
262   ASSERT(hWave);
263   ASSERT(pPCMData);
264 
265   TRY_CA_EXCEPT
266   if (hWave->is_configured == False)
267     SERVICE_ERROR(UNCONFIGURED_WAVE);
268   if (hWave->data.device_type != WAVE_DEVICE_RAW)
269     SERVICE_ERROR(BAD_WAV_DEVICE);
270   if (hWave->data.window_size < sampleCount)
271     SERVICE_ERROR(INCORRECT_SAMPLERATE);
272 
273   memcpy(hWave->data.income,
274          pPCMData,
275          sampleCount * sizeof(samdata));
276 
277   hWave->data.num_samples = sampleCount;
278 
279   if (hWave->data.do_stats)
280     acc_wave_stats(&hWave->data);
281 
282   return (True);
283   BEG_CATCH_CA_EXCEPT;
284   END_CATCH_CA_EXCEPT(hWave);
285 }
286 
CA_ConditionSamples(CA_Wave * hWave)287 void CA_ConditionSamples(CA_Wave *hWave)
288 {
289   TRY_CA_EXCEPT
290   int ii;
291 
292   if (hWave->is_configured == False)
293     SERVICE_ERROR(UNCONFIGURED_WAVE);
294 
295   if (hWave->data.offset != 0)
296     for (ii = 0; ii < hWave->data.num_samples; ii++)
297       hWave->data.income[ii] = RANGE(hWave->data.income[ii] +
298                                      hWave->data.offset, SHRT_MIN, SHRT_MAX);
299   if (hWave->data.scale != 1.0)
300     for (ii = 0; ii < hWave->data.num_samples; ii++)
301       hWave->data.income[ii] = (short) RANGE(hWave->data.income[ii] *
302                                              hWave->data.scale, SHRT_MIN, SHRT_MAX);
303   return;
304   BEG_CATCH_CA_EXCEPT;
305   END_CATCH_CA_EXCEPT(hWave);
306 }
307