1/*---------------------------------------------------------------------------*
2 *  utt_basi.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#include <stdlib.h>
21#include <string.h>
22#ifndef _RTT
23#include <stdio.h>
24#endif
25
26#ifdef unix
27#include <unistd.h>
28#endif
29#include <assert.h>
30
31
32#include "simapi.h"
33#include "portable.h"
34
35#include "../clib/fpi_tgt.inl"
36
37static const char utt_basi[] = "$Id: utt_basi.c,v 1.6.6.8 2007/10/15 18:06:24 dahan Exp $";
38
39
40CA_Utterance *CA_AllocateUtterance(void)
41{
42  CA_Utterance *hUtt = NULL;
43  TRY_CA_EXCEPT
44
45  hUtt = (CA_Utterance *) CALLOC_CLR(1, sizeof(CA_Utterance), "ca.hUtt");
46  hUtt->ca_rtti = CA_UTTERANCE_SIGNATURE;
47  return (hUtt);
48
49  BEG_CATCH_CA_EXCEPT
50  END_CATCH_CA_EXCEPT(hUtt)
51}
52
53
54void CA_FreeUtterance(CA_Utterance *hUtt)
55{
56  TRY_CA_EXCEPT
57  ASSERT(hUtt);
58
59  FREE((char *) hUtt);
60  return;
61
62  BEG_CATCH_CA_EXCEPT
63  END_CATCH_CA_EXCEPT(hUtt)
64}
65
66
67int CA_InitUtteranceForFrontend(CA_Utterance *hUtt,
68                                CA_FrontendInputParams *hFrontPar)
69{
70  TRY_CA_EXCEPT
71  ASSERT(hUtt);
72  ASSERT(hFrontPar > 0);
73  if (hUtt->data.utt_type != 0)
74    SERVICE_ERROR(UTTERANCE_ALREADY_INITIALISED);
75
76  init_utterance(&hUtt->data, LIVE_INPUT, 3*hFrontPar->mel_dim,  /* TODO: change to proper function */
77                 DEFAULT_BUFFER_SIZE, KEEP_FRAMES,
78                 hFrontPar->mel_dim, 1);
79  if (hFrontPar->do_skip_even_frames)
80    set_voicing_durations(&hUtt->data, hFrontPar->voice_duration / 2,
81                          hFrontPar->quiet_duration / 2,
82                          hFrontPar->unsure_duration / 2,
83                          hFrontPar->start_windback / 2);
84  else
85    set_voicing_durations(&hUtt->data, hFrontPar->voice_duration,
86                          hFrontPar->quiet_duration,
87                          hFrontPar->unsure_duration,
88                          hFrontPar->start_windback);
89  return (0);
90
91  BEG_CATCH_CA_EXCEPT
92  END_CATCH_CA_EXCEPT(hUtt)
93
94}
95
96
97void CA_ClearUtterance(CA_Utterance *hUtt)
98{
99
100  TRY_CA_EXCEPT
101  ASSERT(hUtt);
102  if (hUtt->data.utt_type == 0)
103  {
104    SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
105  }
106
107  if (hUtt->data.utt_type == LIVE_INPUT)
108  {
109    free_utterance(&hUtt->data);
110    hUtt->data.utt_type = 0;
111  }
112  else
113  {
114    SERVICE_ERROR(UTTERANCE_UNKNOWN);
115  }
116  return;
117
118  BEG_CATCH_CA_EXCEPT
119  END_CATCH_CA_EXCEPT(hUtt)
120}
121
122
123int CA_AdvanceUtteranceFrame(CA_Utterance *hUtt)
124{
125  TRY_CA_EXCEPT
126  int status_code;
127
128  ASSERT(hUtt);
129  if (hUtt->data.utt_type != LIVE_INPUT)
130    SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
131
132  status_code = advance_utterance_frame(&hUtt->data);
133  return (status_code);
134
135  BEG_CATCH_CA_EXCEPT
136  END_CATCH_CA_EXCEPT(hUtt)
137}
138
139int CA_UtteranceHasVoicing(CA_Utterance *hUtt)
140{
141  TRY_CA_EXCEPT
142  ASSERT(hUtt);
143  if (hUtt->data.utt_type != LIVE_INPUT)
144    SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
145
146  return (hUtt->data.gen_utt.frame->voicingDetected);
147
148  BEG_CATCH_CA_EXCEPT
149  END_CATCH_CA_EXCEPT(hUtt)
150}
151
152
153void CA_UnlockUtteranceForInput(CA_Utterance *hUtt)
154{
155  TRY_CA_EXCEPT
156  ASSERT(hUtt);
157  if (hUtt->data.utt_type != LIVE_INPUT)
158    SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
159  ASSERT(!isFrameBufferActive(hUtt->data.gen_utt.frame));
160  startFrameCollection(hUtt->data.gen_utt.frame);
161  return;
162
163  BEG_CATCH_CA_EXCEPT
164  END_CATCH_CA_EXCEPT(hUtt)
165}
166
167
168void CA_LockUtteranceFromInput(CA_Utterance *hUtt)
169{
170  TRY_CA_EXCEPT
171  ASSERT(hUtt);
172  if (hUtt->data.utt_type != LIVE_INPUT)
173    SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
174  ASSERT(isFrameBufferActive(hUtt->data.gen_utt.frame));
175
176
177  stopFrameCollection(hUtt->data.gen_utt.frame);
178  return;
179
180  BEG_CATCH_CA_EXCEPT
181  END_CATCH_CA_EXCEPT(hUtt)
182}
183
184
185void CA_ResetVoicing(CA_Utterance *hUtt)
186{
187  TRY_CA_EXCEPT
188  ASSERT(hUtt);
189  if (hUtt->data.utt_type != LIVE_INPUT)
190    SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
191
192  clearEndOfUtterance(hUtt->data.gen_utt.frame);
193  clearC0Entries(hUtt->data.gen_utt.frame);
194  startFrameCollection(hUtt->data.gen_utt.frame);
195  return;
196
197  BEG_CATCH_CA_EXCEPT
198  END_CATCH_CA_EXCEPT(hUtt)
199}
200
201
202void CA_FlushUtteranceFrames(CA_Utterance *hUtt)
203{
204  TRY_CA_EXCEPT
205  ASSERT(hUtt);
206  if (hUtt->data.utt_type != LIVE_INPUT)
207    SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
208
209  setRECframePtr(hUtt->data.gen_utt.frame, 0, 0);
210  releaseBlockedFramesInBuffer(hUtt->data.gen_utt.frame);
211  hUtt->data.gen_utt.last_push = NULL;
212  return;
213
214  BEG_CATCH_CA_EXCEPT
215  END_CATCH_CA_EXCEPT(hUtt)
216}
217
218
219void CA_SetEndOfUtteranceByLevelTimeout(CA_Utterance *hUtt, long timeout, long holdOff)
220{
221  TRY_CA_EXCEPT
222  ASSERT(hUtt);
223  if (hUtt->data.utt_type != LIVE_INPUT)
224    SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
225
226  setupEndOfUtterance(hUtt->data.gen_utt.frame, timeout, holdOff);
227  return;
228
229  BEG_CATCH_CA_EXCEPT
230  END_CATCH_CA_EXCEPT(hUtt)
231}
232
233
234int CA_UtteranceHasEnded(CA_Utterance *hUtt)
235{
236  TRY_CA_EXCEPT
237  ASSERT(hUtt);
238  if (hUtt->data.utt_type != LIVE_INPUT)
239    SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
240
241  return (utterance_ended(&hUtt->data));
242
243  BEG_CATCH_CA_EXCEPT
244  END_CATCH_CA_EXCEPT(hUtt)
245}
246