14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------*
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  AcousticModelsImpl.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#ifndef lint
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* lint */
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ESR_Session.h"
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "IntArrayList.h"
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "LCHAR.h"
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "passert.h"
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "plog.h"
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pmemory.h"
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_AcousticModels.h"
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_AcousticModelsImpl.h"
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pstdio.h"
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_EventLog.h"
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MTAG NULL
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define CHKINTARRAY(rc, list, operation) rc = operation; \
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc!=ESR_SUCCESS) \
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  { \
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    IntArrayListDestroy(list); \
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    list = NULL; \
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc)); \
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return rc; \
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Initializes acoustic-models properties to default values.
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Replaces setup_acoustic_parameters()
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_AcousticModels_ToSession()
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Acoustic.dimen", 16));
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Acoustic.skip", 5));
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Acoustic.stay", 5));
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Acoustic.whole_skip", 10));
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Acoustic.whole_stay", 10));
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Acoustic.durscale", 5));
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Acoustic.frame_period", 10));
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Acoustic.minvar", 1));
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Acoustic.maxvar", 64000));
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Acoustic.load_all_at_once", ESR_FALSE));
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetLCHARIfEmpty("CREC.Acoustic.load_models", L("all")));
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Initializes pattern properties to default values.
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Replaces setup_pattern_parameters()
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_AcousticModels_PatternToSession()
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Old comment: Remember to keep "ca_pip.h" up to date with these parameters... */
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.dimen", 16));
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.whole_dimen", 0));
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.start", 0));
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Pattern.chelt_imelda", ESR_FALSE));
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.vfrlimit", 100));
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.vfrthresh", 0));
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Pattern.mix_score_scale", 0.46f));
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Pattern.imelda_scale", 16));
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Pattern.uni_score_scale", 0.46f));
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Pattern.uni_score_offset", 0));
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.forget_speech", 40));
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.forget_background", 100));
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.rel_low", 15));
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.rel_high", 30));
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Gap: longest stop gap */
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.gap_period", 16));
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Click: longest isolated high-amplitude insert in silence */
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.click_period", 6));
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Breath: longest isolated medium amplitude */
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.breath_period", 50));
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.extend_annotation", 0));
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.min_initial_quiet_frames", 0));
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.min_annotation_frames", 0));
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.max_annotation_frames", 800));
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.min_segment_rel_c0", 800));
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.delete_leading_segments", 0));
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.leading_segment_min_frames", 0));
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.leading_segment_max_frames", 20));
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.leading_segment_min_silence_gap_frames", 20));
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.leading_segment_accept_if_not_found", 0));
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if DO_SUBTRACTED_SEGMENTATION
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.snr_holdoff", 0));
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.min_acceptable_snr", 0));
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.param", 0));
1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.beep_size", 0));
1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Pattern.beep_threshold", 0));
1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Populates legacy pattern parameters from the session.
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Replaces setup_pattern_parameters()
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_AcousticModels_LoadLegacyPatternParameters(CA_PatInputParams* params)
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  passert(params != NULL);
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  params->is_loaded = ESR_FALSE;
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.dimen", &params->dimen));
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.whole_dimen", &params->whole_dimen));
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.start", &params->feat_start));
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetFloat("CREC.Pattern.mix_score_scale", &params->mix_score_scale));
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetFloat("CREC.Pattern.imelda_scale", &params->imelda_scale));
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetFloat("CREC.Pattern.uni_score_scale", &params->uni_score_scale));
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetFloat("CREC.Pattern.uni_score_offset", &params->uni_score_offset));
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.forget_speech", &params->forget_speech));
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.forget_background", &params->forget_background));
1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.rel_low", &params->rel_low));
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.rel_high", &params->rel_high));
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.gap_period", &params->gap_period));
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.click_period", &params->click_period));
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.breath_period", &params->breath_period));
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.extend_annotation", &params->extend_annotation));
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.min_initial_quiet_frames", &params->min_initial_quiet_frames));
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.min_annotation_frames", &params->min_annotation_frames));
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.max_annotation_frames", &params->max_annotation_frames));
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.min_segment_rel_c0", &params->min_segment_rel_c0));
1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.delete_leading_segments", &params->delete_leading_segments));
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.leading_segment_min_frames", &params->leading_segment_min_frames));
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.leading_segment_max_frames", &params->leading_segment_max_frames));
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.leading_segment_min_silence_gap_frames", &params->leading_segment_min_silence_gap_frames));
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.leading_segment_accept_if_not_found", &params->leading_segment_accept_if_not_found));
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if DO_SUBTRACTED_SEGMENTATION
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.snr_holdoff", &params->snr_holdoff));
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.min_acceptable_snr", &params->min_acceptable_snr));
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.param", &params->param));
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.beep_size", &params->beep_size));
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Pattern.beep_threshold", &params->beep_threshold));
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  params->is_loaded = ESR_TRUE;
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Generate legacy AcousticModels parameter structure from ESR_Session.
1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @param params Resulting structure
1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_AcousticModels_GetLegacyParameters(CA_AcoustInputParams* params)
1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t maxLabel = MAX_LABEL;
1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  passert(params != NULL);
1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  params->is_loaded = ESR_FALSE;
1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Acoustic.dimen", &params->dimen));
1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Acoustic.skip", &params->skip_penalty));
2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Acoustic.stay", &params->stay_penalty));
2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Acoustic.whole_skip", &params->whole_skip_penalty));
2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Acoustic.whole_stay", &params->whole_stay_penalty));
2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Acoustic.durscale", &params->dur_scale));
2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Acoustic.frame_period", &params->frame_period));
2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Acoustic.minvar", &params->min_var));
2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Acoustic.maxvar", &params->max_var));
2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetBool("CREC.Acoustic.load_all_at_once", &params->load_all));
2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetLCHAR("CREC.Acoustic.load_models", params->load_models, &maxLabel));
2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  params->is_loaded = ESR_TRUE;
2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint LogArbdataVersion(unsigned int ver)
2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_EventLog* eventLog;
2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t osi_log_level = 0;
2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_BOOL exists = ESR_FALSE;
2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionExists(&exists));
2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (exists)
2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_SessionGetProperty(L("eventlog"), (void **)&eventLog, TYPES_SR_EVENTLOG);
2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ((rc != ESR_NO_MATCH_ERROR) && (rc != ESR_SUCCESS))
2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(ESR_rc2str(rc));
2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (eventLog)
2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = ESR_SessionGetSize_t(L("SREC.Recognizer.osi_log_level"), &osi_log_level);
2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if ((rc != ESR_NO_MATCH_ERROR) && (rc != ESR_SUCCESS))
2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLogError(ESR_rc2str(rc));
2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        goto CLEANUP;
2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (osi_log_level > 0)
2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        rc = SR_EventLogTokenSize_t(eventLog, L("VER"), ver);
2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        rc = SR_EventLogEvent(eventLog, L("ESRarbd"));
2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 0;
2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_AcousticModelsLoad(const LCHAR* filename, SR_AcousticModels** self)
2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int use_image;
2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR arbfile[P_PATH_MAX];
2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_AcoustInputParams* acousticParams;
2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_Acoustic* acoustic;
2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR modelFilename[P_PATH_MAX];
2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_AcousticModelsImpl* impl;
2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t len;
2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl = NEW(SR_AcousticModelsImpl, MTAG);
2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl == NULL)
2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_OUT_OF_MEMORY"));
2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_OUT_OF_MEMORY;
2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.destroy = &SR_AcousticModels_Destroy;
2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.save = &SR_AcousticModels_Save;
2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.setParameter = &SR_AcousticModels_SetParameter;
2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.getParameter = &SR_AcousticModels_GetParameter;
2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.getCount = &SR_AcousticModels_GetCount;
2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.getID = &SR_AcousticModels_GetID;
2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.setID = &SR_AcousticModels_SetID;
2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.getArbdata = &SR_AcousticModels_GetArbdata;
2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->setupPattern = &SR_AcousticModels_SetupPattern;
2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->unsetupPattern = &SR_AcousticModels_UnsetupPattern;
2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->getLegacyParameters = &SR_AcousticModels_GetLegacyParameters;
2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->parameters = NULL;
2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->pattern = NULL;
2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->acoustic = NULL;
2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->arbdata = NULL;
2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->contents = NULL;
2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->size = 0;
2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  acousticParams = NULL;
2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  acoustic = NULL;
2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = SR_AcousticModels_PatternToSession();
2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc != ESR_SUCCESS)
2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = SR_AcousticModels_ToSession();
2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc != ESR_SUCCESS)
2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = ArrayListCreate(&impl->acoustic);
3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc != ESR_SUCCESS)
3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  acousticParams = CA_AllocateAcousticParameters();
3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (acousticParams == NULL)
3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_OUT_OF_MEMORY;
3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = impl->getLegacyParameters(acousticParams);
3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc != ESR_SUCCESS)
3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = ESR_SessionGetInt(L("cmdline.use_image"), &use_image);
3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc != ESR_SUCCESS)
3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  while (ESR_TRUE)
3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int i;
3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // skip space to next relative pathname
3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    while (LISSPACE(*filename)) filename++;
3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (*filename == L('\0')) break;
3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // copy the relative pathname
3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (i = 0; *filename != L('\0') && !LISSPACE(*filename); i++)
3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      modelFilename[i] = *filename++;
3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    modelFilename[i] = L('\0');
3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (LSTRLEN(modelFilename) == 0 || modelFilename[0] == '#')
3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      continue;
3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = lstrtrim(modelFilename);
3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc != ESR_SUCCESS)
3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(ESR_rc2str(rc));
3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    len = P_PATH_MAX;
3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ESR_SessionPrefixWithBaseDirectory(modelFilename, &len));
3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    acoustic = CA_AllocateAcoustic();
3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (acoustic == NULL)
3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = ESR_OUT_OF_MEMORY;
3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(ESR_rc2str(rc));
3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (use_image == 1)
3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = ESR_INVALID_STATE;
3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(ESR_rc2str(rc));
3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else if (use_image == 2)
3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (!CA_LoadAcousticSub(acoustic, modelFilename, 0))
3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        rc = ESR_INVALID_STATE;
3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLogError(ESR_rc2str(rc));
3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        goto CLEANUP;
3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
3764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
3774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            /* TODO: Is this being used? */
3784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (!CA_LoadAcousticSub(acoustic, modelFilename, acousticParams))
3794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
3804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        rc = ESR_INVALID_STATE;
3814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLogError(ESR_rc2str(rc));
3824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        goto CLEANUP;
3834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
3844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ArrayListAdd(impl->acoustic, acoustic);
3864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc != ESR_SUCCESS)
3874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
3884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(ESR_rc2str(rc));
3894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
3904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  len = P_PATH_MAX;
3944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = ESR_SessionGetLCHAR(L("cmdline.arbfile"), (LCHAR*) & arbfile, &len);
3954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc != ESR_SUCCESS)
3964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
3974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
3984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
3994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  len = P_PATH_MAX;
4014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionPrefixWithBaseDirectory(arbfile, &len));
4024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->arbdata = CA_LoadArbdata(arbfile);
4034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->arbdata == NULL)
4044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_OUT_OF_MEMORY;
4064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
4074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  len = CA_ArbdataGetModelVersionID(impl->arbdata);
4094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LogArbdataVersion(len);
4104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_FreeAcousticParameters(acousticParams);
4124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *self = (SR_AcousticModels*) impl;
4134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
4154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
4164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (acousticParams != NULL)
4174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_FreeAcousticParameters(acousticParams);
4184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.destroy(&impl->Interface);
4194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
4204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
4214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_AcousticModels_Destroy(SR_AcousticModels* self)
4234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
4244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_AcousticModelsImpl* impl = (SR_AcousticModelsImpl*) self;
4254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_Acoustic* acoustic;
4264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
4274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t size, i;
4284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->pattern != NULL)
4304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, impl->acoustic->getSize(impl->acoustic, &size));
4324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (i = 0; i < size; ++i)
4334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
4344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, impl->acoustic->get(impl->acoustic, i, (void **)&acoustic));
4354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CA_ClearPatternForAcoustic(impl->pattern, acoustic);
4364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_UnloadPattern(impl->pattern);
4384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_FreePattern(impl->pattern);
4394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->pattern = NULL;
4404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->acoustic != NULL)
4434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, impl->acoustic->getSize(impl->acoustic, &size));
4454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (i = 0; i < size; ++i)
4464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
4474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, impl->acoustic->get(impl->acoustic, 0, (void **)&acoustic));
4484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, impl->acoustic->removeAtIndex(impl->acoustic, 0));
4494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* Free acoustic models */
4514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CA_UnloadAcoustic(acoustic);
4524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CA_FreeAcoustic(acoustic);
4534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, impl->acoustic->destroy(impl->acoustic));
4564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->acoustic = NULL;
4574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->arbdata != NULL)
4604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_FreeArbdata(impl->arbdata);
4624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->arbdata = NULL;
4634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(impl);
4664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
4674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
4684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
4694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
4704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_AcousticModels_Save(SR_AcousticModels* self, const LCHAR* filename)
4724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
4734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*SR_AcousticModelsImpl* impl = (SR_AcousticModelsImpl*) self;*/
4744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* CA_WriteAcousticImage(impl->acoustic, filename, 0); */
4764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
4774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
4784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_AcousticModels_SetParameter(SR_AcousticModels* self, const LCHAR* key, LCHAR* value)
4804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
4814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_AcousticModelsImpl* impl = (SR_AcousticModelsImpl*) self;
4824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR* temp;
4834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
4844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = HashMapGet(impl->parameters, key, (void **)&temp);
4864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc == ESR_SUCCESS)
4874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* Key already exists, remove old value if necessary */
4894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (LSTRCMP(temp, value) == 0)
4904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_SUCCESS;
4914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, HashMapRemove(impl->parameters, key));
4924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE(temp);
4934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else if (rc != ESR_NO_MATCH_ERROR)
4954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
4974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
4984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Allocate and put new key */
5014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  temp = MALLOC(sizeof(LCHAR) * (LSTRLEN(value) + 1), MTAG);
5024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (temp == NULL)
5034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_OUT_OF_MEMORY;
5054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
5064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
5074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, impl->parameters->put(impl->parameters, key, temp));
5094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
5104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
5114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(temp);
5124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
5134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_AcousticModels_GetParameter(SR_AcousticModels* self, const LCHAR* key, LCHAR* value, size_t* len)
5164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_AcousticModelsImpl* impl = (SR_AcousticModelsImpl*) self;
5184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR* temp;
5194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
5204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = HashMapGet(impl->parameters, key, (void **)&temp);
5224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc == ESR_NO_MATCH_ERROR)
5234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ESR_SessionGetLCHAR(key, value, len));
5244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc != ESR_SUCCESS)
5254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
5274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return rc;
5284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (LSTRLEN(temp) + 1 > *len)
5304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *len = LSTRLEN(temp) + 1;
5324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_BUFFER_OVERFLOW"));
5334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_BUFFER_OVERFLOW;
5344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *len = LSTRLEN(temp) + 1;
5364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LSTRCPY(value, temp);
5374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
5384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
5394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
5404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_AcousticModels_GetCount(SR_AcousticModels* self, size_t* size)
5434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_AcousticModelsImpl* impl = (SR_AcousticModelsImpl*) self;
5454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
5464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ArrayListGetSize(impl->acoustic, size));
5484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
5494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
5504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
5514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_AcousticModels_GetID(SR_AcousticModels* self, size_t index,
5544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                       SR_AcousticModelID* id, size_t* size)
5554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* TODO: complete */
5574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
5584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_AcousticModels_SetID(SR_AcousticModels* self, size_t index,
5614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                       SR_AcousticModelID* id)
5624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* TODO: complete */
5644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
5654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid* SR_AcousticModels_GetArbdata(SR_AcousticModels* self)
5684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	SR_AcousticModelsImpl* impl = (SR_AcousticModelsImpl*)self;
5704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	return impl? (void*)impl->arbdata : NULL;
5714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
5744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * When AcousticModels are associated with a Recognizer, they initialize their
5754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Pattern objects using that Recognizer.
5764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
5774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @param self SR_AcousticModels handle
5784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @param recognizer The recognizer
5794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
5804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_AcousticModels_SetupPattern(SR_AcousticModels* self,
5814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SR_Recognizer* recognizer)
5824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_PatInputParams* patternParams = NULL;
5844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR mulname[P_PATH_MAX];
5854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR ldaname[P_PATH_MAX];
5864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* recog;
5874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_AcousticModelsImpl* impl = (SR_AcousticModelsImpl*) self;
5884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_Acoustic* acoustic;
5894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t i, size, len;
5904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int dimen;
5914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
5924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_BOOL isPatternLoaded = ESR_FALSE;
5934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (recognizer == NULL)
5954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_ARGUMENT"));
5974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
5984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  recog = (SR_RecognizerImpl*) recognizer;
6004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->pattern = CA_AllocatePattern();
6024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->pattern == NULL)
6034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
6044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_OUT_OF_MEMORY;
6054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
6064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
6074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  patternParams = CA_AllocatePatternParameters();
6094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (patternParams == NULL)
6104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
6114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_OUT_OF_MEMORY;
6124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
6134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
6144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_AcousticModels_LoadLegacyPatternParameters(patternParams));
6174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  dimen = CA_GetFrontendUtteranceDimension(recog->frontend);
6184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LSTRCPY(mulname, L(""));
6204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  len = P_PATH_MAX;
6224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetLCHAR(L("cmdline.lda"), (LCHAR*) &ldaname, &len));
6234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  len = P_PATH_MAX;
6244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionPrefixWithBaseDirectory(ldaname, &len));
6254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_LoadPattern(impl->pattern, patternParams, dimen, mulname, ldaname);
6274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  isPatternLoaded = ESR_TRUE;
6284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, impl->acoustic->getSize(impl->acoustic, &size));
6294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < size; ++i)
6304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
6314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, impl->acoustic->get(impl->acoustic, i, (void **)&acoustic));
6324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_SetupPatternForAcoustic(impl->pattern, acoustic);
6334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_FreePatternParameters(patternParams);
6354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
6364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
6374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->pattern != NULL)
6384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
6394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (isPatternLoaded == ESR_TRUE)
6404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CA_UnloadPattern(impl->pattern);
6414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_FreePattern(impl->pattern);
6424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (patternParams != NULL)
6444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_FreePatternParameters(patternParams);
6454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
6464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
6474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
6494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * When AcousticModels are deassociated with a Recognizer, they deinitialize their
6504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Pattern objects.
6514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
6524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @param self SR_AcousticModels handle
6534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
6544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_AcousticModels_UnsetupPattern(SR_AcousticModels* self)
6554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
6564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_AcousticModelsImpl* impl = (SR_AcousticModelsImpl*) self;
6574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_Acoustic* acoustic;
6584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t i, size;
6594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
6604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, impl->acoustic->getSize(impl->acoustic, &size));
6624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < size; ++i)
6634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
6644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, impl->acoustic->get(impl->acoustic, i, (void **)&acoustic));
6654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_ClearPatternForAcoustic(impl->pattern, acoustic);
6664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_UnloadPattern(impl->pattern);
6684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_FreePattern(impl->pattern);
6694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->pattern = NULL;
6704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
6714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
6724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
6734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
674