14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------*
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  ca_cms.c                                                                 *
34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Copyright 2007, 2008 Nuance Communciations, Inc.                         *
54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the 'License');          *
74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  you may not use this file except in compliance with the License.         *
84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  You may obtain a copy of the License at                                  *
104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0                           *
114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software      *
134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  distributed under the License is distributed on an 'AS IS' BASIS,        *
144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  See the License for the specific language governing permissions and      *
164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  limitations under the License.                                           *
174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/
194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/************************************************************************
214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * CA_Wave Methods
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ************************************************************************/
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef _RTT
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdio.h>
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdlib.h>
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <string.h>
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <limits.h>
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef unix
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <unistd.h>
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <assert.h>
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "frontapi.h"
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "portable.h"
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "swicms.h"
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SET_RCSID
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic const char *rcsid = 0 ? (const char *) &rcsid :
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                           "$Id: ca_cms.c,v 1.7.6.11 2008/05/27 16:08:28 dahan Exp $";
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode CA_SetCMSParameters ( CA_Wave *hWave, const LCHAR *param_string )
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode set_status;
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ( hWave != NULL )
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    set_status = swicms_set_cmn ( hWave->data.channel->swicms, param_string );
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    set_status = ESR_INVALID_STATE;
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ( set_status );
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode CA_GetCMSParameters ( CA_Wave *hWave, LCHAR *param_string, size_t* len )
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode get_status;
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ( hWave != NULL )
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    get_status = swicms_get_cmn ( hWave->data.channel->swicms, param_string, len );
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    get_status = ESR_INVALID_STATE;
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ( get_status );
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid CA_ReLoadCMSParameters(CA_Wave *hWave, const char *basename)
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(hWave);
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (hWave->is_configuredForAgc == False)
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SERVICE_ERROR(UNCONFIGURED_CMS_AND_AGC);
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!basename) {
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if( swicms_init(hWave->data.channel->swicms) )
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      SERVICE_ERROR(UNEXPECTED_DATA_ERROR);
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SERVICE_ERROR(FEATURE_NOT_SUPPORTED);
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid CA_SaveCMSParameters(CA_Wave *hWave, const char *basename)
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	SERVICE_ERROR(FEATURE_NOT_SUPPORTED);
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid CA_LoadCMSParameters(CA_Wave *hWave, const char *basename,
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                          CA_FrontendInputParams *hFrontArgs)
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  TRY_CA_EXCEPT
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if !defined(_RTT)
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(hWave);
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* ASSERT (basename); */
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(hFrontArgs);
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (hWave->is_configuredForAgc == True)
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SERVICE_ERROR(CONFIGURED_CMS_AND_AGC);
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (hWave->is_attached == True)
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SERVICE_ERROR(ATTACHED_CMS_AND_AGC);
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hWave->data.channel->channorm = create_channel_normalization();
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* load_channel_parameters (basename, hWave->data.channel->channorm);
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     not used anymore, rather we spec this is the parfile directly */
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hWave->data.channel->channorm->dim = MAX_CHAN_DIM;
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  setup_channel_normalization(hWave->data.channel->channorm,
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                              hWave->data.channel->spchchan,
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if NORM_IN_IMELDA
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                              hFrontArgs->mel_dim * 3, /* TODO: find appropriate number */
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                              hFrontArgs->mel_dim,
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                              hFrontArgs->forget_factor);
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hWave->data.channel->mel_dim = hFrontArgs->mel_dim; /* TODO: more checks */
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hWave->data.channel->swicms = (swicms_norm_info*)CALLOC(1, sizeof(swicms_norm_info), "cfront.swicms");
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if( swicms_init(hWave->data.channel->swicms) )
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SERVICE_ERROR(UNEXPECTED_DATA_ERROR);
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hWave->is_configuredForAgc = True;
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  log_report("Channel normalization or RTT not in module\n");
1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SERVICE_ERROR(FEATURE_NOT_SUPPORTED);
1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  BEG_CATCH_CA_EXCEPT;
1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  END_CATCH_CA_EXCEPT(hFrontend);
1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid CA_ClearCMSParameters(CA_Wave *hWave)
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  TRY_CA_EXCEPT
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if NORM_IN_IMELDA
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int dim = hWave->data.channel->mel_dim * 3;
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int dim = hWave->data.channel->mel_dim;
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(hWave);
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (hWave->is_configuredForAgc == False)
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SERVICE_ERROR(UNCONFIGURED_CMS_AND_AGC);
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (hWave->is_attached == True)
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SERVICE_ERROR(ATTACHED_CMS_AND_AGC);
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  clear_channel_normalization(hWave->data.channel->spchchan, dim);
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  destroy_channel_normalization(hWave->data.channel->channorm);
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hWave->data.channel->channorm = NULL;
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hWave->is_configuredForAgc = False;
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(hWave->data.channel->swicms);
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  BEG_CATCH_CA_EXCEPT;
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  END_CATCH_CA_EXCEPT(hWave);
1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid CA_AttachCMStoUtterance(CA_Wave *hWave, CA_Utterance *hUtt)
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Link the utt's spchchan to the wave object's. This is checked in AGC fn
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      to ensure that the correct Utt & Wave objects have been supplied.
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  */
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  TRY_CA_EXCEPT
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(hUtt);
1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(hWave);
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (hWave->is_configuredForAgc == False)
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SERVICE_ERROR(UNCONFIGURED_CMS_AND_AGC);
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (hWave->is_attached == True)
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SERVICE_ERROR(ATTACHED_CMS_AND_AGC);
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(hWave->data.channel->channorm);
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hUtt->data.gen_utt.spchchan = hWave->data.channel->spchchan;
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hUtt->data.gen_utt.channorm = hWave->data.channel->channorm;
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hUtt->data.gen_utt.swicms  = hWave->data.channel->swicms;
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hUtt->data.gen_utt.do_channorm = True;
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if NORM_IN_IMELDA       /* TODO: find appropriate number */
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hUtt->data.gen_utt.num_chan = 3 * hWave->data.channel->mel_dim;
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hUtt->data.gen_utt.num_chan = hWave->data.channel->mel_dim;
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hWave->is_configuredForAgc = True;
1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hWave->is_attached = True;
1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  BEG_CATCH_CA_EXCEPT;
1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  END_CATCH_CA_EXCEPT(hFrontend);
1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode CA_IsCMSAttachedtoUtterance(CA_Wave* hWave, ESR_BOOL* isAttached)
1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (hWave == NULL || isAttached == NULL)
1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *isAttached = hWave->is_attached;
1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode CA_IsConfiguredForAgc(CA_Wave* hWave, ESR_BOOL* isConfigured)
1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (hWave == NULL || isConfigured == NULL)
1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *isConfigured = hWave->is_configuredForAgc;
2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid CA_DetachCMSfromUtterance(CA_Wave *hWave, CA_Utterance *hUtt)
2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  TRY_CA_EXCEPT
2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(hWave);
2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (hWave->is_configuredForAgc == False)
2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SERVICE_ERROR(UNCONFIGURED_CMS_AND_AGC);
2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (hUtt && hUtt->data.gen_utt.do_channorm == False)
2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SERVICE_ERROR(UTTERANCE_INVALID);
2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (hWave->is_attached == False)
2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SERVICE_ERROR(UNATTACHED_CMS_AND_AGC);
2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (hWave->data.channel->spchchan && hUtt->data.gen_utt.spchchan
2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      && hWave->data.channel->spchchan != hUtt->data.gen_utt.spchchan)
2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    log_report("Mismatched channel and utterance\n");
2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SERVICE_ERROR(BAD_CHANNEL);
2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  } /* TODO: find a better code */
2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hUtt->data.gen_utt.channorm = NULL;
2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hUtt->data.gen_utt.spchchan = NULL;
2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hUtt->data.gen_utt.do_channorm = False;
2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hWave->is_attached = False;
2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  BEG_CATCH_CA_EXCEPT;
2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  END_CATCH_CA_EXCEPT(hWave)
2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid CA_CalculateCMSParameters(CA_Wave *hWave)
2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  TRY_CA_EXCEPT
2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (hWave->is_configuredForAgc == False)
2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SERVICE_ERROR(UNCONFIGURED_CMS_AND_AGC);
2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (hWave->is_attached == False)
2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SERVICE_ERROR(UNATTACHED_CMS_AND_AGC);
2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  estimate_normalization_parameters(hWave->data.channel->channorm,
2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                    hWave->data.channel->spchchan,
2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if NORM_IN_IMELDA       /* TODO: find appropriate number */
2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                    hWave->data.channel->mel_dim * 3);
2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                    hWave->data.channel->mel_dim);
2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  BEG_CATCH_CA_EXCEPT;
2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  END_CATCH_CA_EXCEPT(hWave);
2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
251