14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------*
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  RecognizerImpl.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#include "ESR_Session.h"
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ESR_SessionTypeImpl.h"
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "IntArrayList.h"
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "LCHAR.h"
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "passert.h"
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "plog.h"
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pstdio.h"
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pmemory.h"
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ptimestamp.h"
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_AcousticModelsImpl.h"
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_AcousticStateImpl.h"
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_GrammarImpl.h"
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_SemprocDefinitions.h"
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_SemanticResult.h"
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_SemanticResultImpl.h"
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_Recognizer.h"
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_RecognizerImpl.h"
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_RecognizerResultImpl.h"
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_SemanticResultImpl.h"
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_EventLog.h"
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "srec.h"
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MTAG NULL
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define FILTER_NBEST_BY_SEM_RESULT 1
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define AUDIO_CIRC_BUFFER_SIZE 20000
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SEMPROC_ACTIVE 1
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SAMPLE_SIZE (16 / CHAR_BIT) /* 16-bits / sample */
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* milliseconds per FRAME = 1/FRAMERATE * 1000 */
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* We multiple by 2 because we skip even frames */
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MSEC_PER_FRAME (2000/FRAMERATE)
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MAX_ENTRY_LENGTH 512
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define PREFIX_WORD     "-pau-"
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define PREFIX_WORD_LEN 5
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SUFFIX_WORD     "-pau2-"
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SUFFIX_WORD_LEN 6
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_ReturnCode SR_Recognizer_Reset_Buffers ( SR_RecognizerImpl *impl );
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Initializes recognizer properties to default values.
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Replaces setup_recognition_parameters()
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerToSessionImpl()
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Old comment: remember to keep "ca_rip.h" up to date with these parameters... */
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.max_acoustic_models", 2)); */
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Recognizer.partial_results", ESR_FALSE));
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.NBest", 1));
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.eou_threshold", 100));
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.max_altword_tokens", 400));
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.max_frames", 1000));
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.max_fsm_arcs", 3000));
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.max_fsm_nodes", 3000));
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.max_fsmnode_tokens", 1000));
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.max_hmm_tokens", 1000));
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.max_model_states", 1000));
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.max_searches", 2));
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.max_word_tokens", 1000));
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.non_terminal_timeout", 50));
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.num_wordends_per_frame", 10));
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.often", 10));
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.optional_terminal_timeout", 30));
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.reject", 500));
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.terminal_timeout", 10));
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.viterbi_prune_thresh", 5000));
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Recognizer.wordpen", 0));
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetSize_tIfEmpty("SREC.Recognizer.utterance_timeout", 400));
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("enableGetWaveform", ESR_FALSE));
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Initializes frontend properties to default values.
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Replaces load_up_parameter_list()
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerFrontendToSessionImpl()
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  IntArrayList* intList = NULL;
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_BOOL exists;
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t i;
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Old comment: Remember to keep "ca_pip.h" up to date with these parameters... */
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.mel_dim", 12));
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetSize_tIfEmpty("CREC.Frontend.samplerate", 8000));
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Frontend.premel", 0.98f));
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.lowcut", 260));  /* Hz */
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.highcut", 4000)); /* Hz */
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Frontend.window_factor", 2.0)); /* times the frame size */
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Frontend.do_skip_even_frames", ESR_FALSE)); /* 10/20 ms rate */
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Frontend.offset", 0)); /* additional */
1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Frontend.ddmel", ESR_FALSE)); /* delta-delta mel pars */
1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.forgetfactor", 40));
1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.sv6_margin", 10));
1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Frontend.rasta", ESR_FALSE));
1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Frontend.rastac0", ESR_FALSE));
1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Frontend.spectral_subtraction", ESR_FALSE));
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.spec_sub_dur", 0));
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Frontend.spec_sub_scale", 1.0));
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Frontend.do_filterbank_dump", ESR_FALSE)); /* Output is filterbank (30 floats) */
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Frontend.do_filterbank_input", ESR_FALSE)); /* Input is filterbank (30 floats) in place of audio samples */
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Frontend.do_smooth_c0", ESR_TRUE));
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Frontend.plp", ESR_FALSE)); /* Do PLP instead of MEL */
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.lpcorder", 12)); /* order of lpc analysis in plp processing */
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Frontend.warp_scale", 1.0));
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Frontend.piecewise_start", 1.0));
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Frontend.peakdecayup", -1.0)); /* If +ve, decay factor on peakpicker (low to high) */
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetFloatIfEmpty("CREC.Frontend.peakdecaydown", -1.0)); /* If +ve, decay factor on peakpicker (high to low) */
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetBoolIfEmpty("CREC.Frontend.cuberoot", ESR_FALSE)); /* Use cube root instead of log */
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.mel_offset", &exists));
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!exists)
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListCreate(&intList));
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (i = 0; i < 32; ++i)
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, IntArrayListAdd(intList, 0));
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.mel_offset", intList, TYPES_INTARRAYLIST));
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    intList = NULL;
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.mel_loop", &exists));
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!exists)
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListCreate(&intList));
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (i = 0; i < 32; ++i)
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, IntArrayListAdd(intList, 1));
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.mel_loop", intList, TYPES_INTARRAYLIST));
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    intList = NULL;
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.melA", &exists));
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!exists)
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListCreate(&intList));
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 13.2911));
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 47.2229));
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 79.2485));
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 92.1967));
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 136.3855));
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 152.2896));
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 183.3601));
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 197.4200));
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 217.8278));
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 225.6556));
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 263.3073));
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 277.193));
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.melA", intList, TYPES_INTARRAYLIST));
1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    intList = NULL;
1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.melB", &exists));
1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!exists)
1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListCreate(&intList));
1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 37.0847));
1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 91.3289));
1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 113.9995));
1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 123.0336));
1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 131.2704));
1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 128.9942));
1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 120.5267));
1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 132.0079));
1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 129.8076));
1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 126.5029));
1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 121.8519));
1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.melB", intList, TYPES_INTARRAYLIST));
2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    intList = NULL;
2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.dmelA", &exists));
2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!exists)
2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListCreate(&intList));
2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 91.6305));
2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 358.3790));
2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 527.5946));
2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 536.3163));
2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 731.2385));
2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 757.8382));
2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 939.4460));
2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 1028.4136));
2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 1071.3193));
2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 1183.7922));
2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 1303.1014));
2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 1447.7766));
2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.dmelA", intList, TYPES_INTARRAYLIST));
2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    intList = NULL;
2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.dmelB", &exists));
2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!exists)
2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListCreate(&intList));
2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.4785));
2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.3878));
2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.4029));
2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.3182));
2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.3706));
2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5394));
2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5150));
2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.4270));
2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.4871));
2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.4088));
2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.4361));
2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5449));
2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.dmelB", intList, TYPES_INTARRAYLIST));
2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    intList = NULL;
2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.ddmelA", &exists));
2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!exists)
2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListCreate(&intList));
2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 10.7381));
2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 32.6775));
2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 46.2301));
2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 51.5438));
2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 57.6636));
2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 57.0581));
2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 65.3696));
2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 70.1910));
2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 71.6751));
2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 78.2364));
2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 83.2440));
2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 89.6261));
2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.ddmelA", intList, TYPES_INTARRAYLIST));
2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    intList = NULL;
2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.ddmelB", &exists));
2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!exists)
2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListCreate(&intList));
2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5274));
2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5098));
2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5333));
2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5963));
2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5132));
2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5282));
2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5530));
2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5682));
2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.4662));
2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.4342));
2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.5235));
2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.4061));
2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.ddmelB", intList, TYPES_INTARRAYLIST));
2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    intList = NULL;
2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.rastaA", &exists));
2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!exists)
2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListCreate(&intList));
2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 7.80));
2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 37.0));
2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 54.0));
2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 57.0));
2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 84.0));
2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 86.5));
2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 98.1));
2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 127.0));
2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 153.0));
2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 160.0));
2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 188.0));
2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, (int) 199.0));
2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.rastaA", intList, TYPES_INTARRAYLIST));
3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    intList = NULL;
3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.rastaB", &exists));
3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!exists)
3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListCreate(&intList));
3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, 117));
3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, 121));
3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, 114));
3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, 111));
3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, 113));
3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, 126));
3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, 134));
3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, 130));
3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, 135));
3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, 129));
3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, 139));
3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListAdd(intList, 138));
3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.rastaB", intList, TYPES_INTARRAYLIST));
3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    intList = NULL;
3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.speech_detect", 18));
3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.speech_above", 18));
3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.ambient_within", 12));
3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.start_windback", 50));
3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.utterance_allowance", 40));
3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.speech_duration", 6));
3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.quiet_duration", 20));
3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.high_clip", 32767));
3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.low_clip", -32768));
3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.max_per10000_clip", 10));
3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.max_dc_offset", 1000));
3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.high_noise_level_bit", 11));
3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.low_speech_level_bit", 11));
3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionSetIntIfEmpty("CREC.Frontend.min_samples", 10000));
3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.spectrum_filter_freq", &exists));
3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!exists)
3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListCreate(&intList));
3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.spectrum_filter_freq", intList, TYPES_INTARRAYLIST));
3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    intList = NULL;
3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionContains("CREC.Frontend.spectrum_filter_spread", &exists));
3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!exists)
3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListCreate(&intList));
3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ESR_SessionSetProperty("CREC.Frontend.spectrum_filter_spread", intList, TYPES_INTARRAYLIST));
3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    intList = NULL;
3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (intList != NULL)
3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    intList->destroy(intList);
3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Generate legacy frontend parameter structure from ESR_Session.
3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @param impl SR_RecognizerImpl handle
3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @param params Resulting structure
3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerGetFrontendLegacyParametersImpl(CA_FrontendInputParams* params)
3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  IntArrayList* intList;
3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t size, i, size_tValue;
3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int iValue;
3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  passert(params != NULL);
3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  params->is_loaded = ESR_FALSE;
3754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.mel_dim", &params->mel_dim));
3764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetSize_t("CREC.Frontend.samplerate", &size_tValue));
3774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  params->samplerate = (int) size_tValue;
3784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetFloat("CREC.Frontend.premel", &params->pre_mel));
3794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.lowcut", &params->low_cut));
3804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.highcut", &params->high_cut));
3814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetFloat("CREC.Frontend.window_factor", &params->window_factor));
3824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetBool("CREC.Frontend.do_skip_even_frames", &params->do_skip_even_frames));
3834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetFloat("CREC.Frontend.offset", &params->offset));
3844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetBool("CREC.Frontend.ddmel", &params->do_dd_mel));
3854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.forgetfactor", &params->forget_factor));
3864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.sv6_margin", &params->sv6_margin));
3874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetBool("CREC.Frontend.rastac0", &params->do_rastac0));
3884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetBool("CREC.Frontend.spectral_subtraction", &params->do_spectral_sub));
3894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.spec_sub_dur", &params->spectral_sub_frame_dur));
3904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetFloat("CREC.Frontend.spec_sub_scale", &params->spec_sub_scale));
3914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetBool("CREC.Frontend.do_filterbank_dump", &params->do_filterbank_input));
3924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetBool("CREC.Frontend.do_filterbank_input", &params->do_filterbank_input));
3934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetBool("CREC.Frontend.do_smooth_c0", &params->do_smooth_c0));
3944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.lpcorder", &params->lpc_order));
3954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetFloat("CREC.Frontend.warp_scale", &params->warp_scale));
3964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetFloat("CREC.Frontend.piecewise_start", &params->piecewise_start));
3974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetFloat("CREC.Frontend.peakdecayup", &params->peakpickup));
3984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetFloat("CREC.Frontend.peakdecaydown", &params->peakpickdown));
3994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.mel_offset", (void **)&intList, TYPES_INTARRAYLIST));
4014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (intList == NULL)
4024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_STATE"));
4044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_STATE;
4054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, IntArrayListGetSize(intList, &size));
4074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < size; ++i)
4084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListGet(intList, i, &params->mel_offset[i]));
4094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.mel_loop", (void **)&intList, TYPES_INTARRAYLIST));
4114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (intList == NULL)
4124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_STATE"));
4144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_STATE;
4154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, IntArrayListGetSize(intList, &size));
4174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < size; ++i)
4184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListGet(intList, i, &params->mel_loop[i]));
4194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.melA", (void **)&intList, TYPES_INTARRAYLIST));
4214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, IntArrayListGetSize(intList, &size));
4224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < size; ++i)
4234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListGet(intList, i, &params->melA_scale[i]));
4244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.melB", (void **)&intList, TYPES_INTARRAYLIST));
4264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, IntArrayListGetSize(intList, &size));
4274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < size; ++i)
4284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListGet(intList, i, &params->melB_scale[i]));
4294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.dmelA", (void **)&intList, TYPES_INTARRAYLIST));
4314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, IntArrayListGetSize(intList, &size));
4324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < size; ++i)
4334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListGet(intList, i, &params->dmelA_scale[i]));
4344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.dmelB", (void **)&intList, TYPES_INTARRAYLIST));
4364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, IntArrayListGetSize(intList, &size));
4374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < size; ++i)
4384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListGet(intList, i, &params->dmelB_scale[i]));
4394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.ddmelA", (void **)&intList, TYPES_INTARRAYLIST));
4414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, IntArrayListGetSize(intList, &size));
4424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < size; ++i)
4434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListGet(intList, i, &params->ddmelA_scale[i]));
4444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.ddmelB", (void **)&intList, TYPES_INTARRAYLIST));
4464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, IntArrayListGetSize(intList, &size));
4474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < size; ++i)
4484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListGet(intList, i, &params->ddmelB_scale[i]));
4494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.rastaA", (void **)&intList, TYPES_INTARRAYLIST));
4514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, IntArrayListGetSize(intList, &size));
4524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < size; ++i)
4534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListGet(intList, i, &params->rastaA_scale[i]));
4544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.rastaB", (void **)&intList, TYPES_INTARRAYLIST));
4564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, IntArrayListGetSize(intList, &size));
4574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < size; ++i)
4584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListGet(intList, i, &params->rastaB_scale[i]));
4594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.speech_detect", &params->voice_margin));
4614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.speech_above", &params->fast_voice_margin));
4624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.ambient_within", &params->tracker_margin));
4634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.start_windback", &params->start_windback));
4644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.utterance_allowance", &params->unsure_duration));
4654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.speech_duration", &params->voice_duration));
4664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.quiet_duration", &params->quiet_duration));
4674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.high_clip", &params->high_clip));
4694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.low_clip", &params->low_clip));
4704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.max_per10000_clip", &params->max_per10000_clip));
4714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.max_dc_offset", &params->max_dc_offset));
4724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.high_noise_level_bit", &params->high_noise_level_bit));
4734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.low_speech_level_bit", &params->low_speech_level_bit));
4744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Frontend.min_samples", &params->min_samples));
4754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.spectrum_filter_freq", (void **)&intList, TYPES_INTARRAYLIST));
4774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (intList == NULL)
4784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_STATE"));
4804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_STATE;
4814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, IntArrayListGetSize(intList, &size));
4834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < size; ++i)
4844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListGet(intList, i, &iValue));
4864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    params->spectrum_filter_freq[i] = iValue;
4874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetProperty("CREC.Frontend.spectrum_filter_spread", (void **)&intList, TYPES_INTARRAYLIST));
4904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (intList == NULL)
4914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_STATE"));
4934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_STATE;
4944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, IntArrayListGetSize(intList, &size));
4964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < size; ++i)
4974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, IntArrayListGet(intList, i, &iValue));
4994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    params->spectrum_filter_spread[i] = iValue;
5004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  params->is_loaded = ESR_TRUE;
5024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
5034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
5044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
5054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
5084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Creates frontend components of SR_Recognizer.
5094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
5104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @param impl SR_RecognizerImpl handle
5114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
5124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerCreateFrontendImpl(SR_RecognizerImpl* impl)
5134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
5154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_FrontendInputParams* frontendParams;
5164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Create a frontend object */
5184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->frontend = CA_AllocateFrontend(1, 0, 1);
5194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  frontendParams = CA_AllocateFrontendParameters();
5204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_RecognizerGetFrontendLegacyParametersImpl(frontendParams));
5214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_ConfigureFrontend(impl->frontend, frontendParams);
5234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Create a wave object */
5254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->wavein = CA_AllocateWave('N');
5264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->wavein == NULL)
5274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_OUT_OF_MEMORY;
5294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
5304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
5314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_ConfigureWave(impl->wavein, impl->frontend);
5334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_ConfigureVoicingAnalysis(impl->wavein, frontendParams);
5344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_LoadCMSParameters(impl->wavein, NULL, frontendParams);
5364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Create an utterance object */
5384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->utterance = CA_AllocateUtterance();
5394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->utterance == NULL)
5404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_OUT_OF_MEMORY;
5424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
5434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
5444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_InitUtteranceForFrontend(impl->utterance, frontendParams);
5464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_AttachCMStoUtterance(impl->wavein, impl->utterance);
5474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_FreeFrontendParameters(frontendParams);
5484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
5494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
5514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->frontend != NULL)
5524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_UnconfigureFrontend(impl->frontend);
5544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_FreeFrontend(impl->frontend);
5554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->frontend = NULL;
5564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->wavein != NULL)
5584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_UnconfigureWave(impl->wavein);
5604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_FreeWave(impl->wavein);
5614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->wavein = NULL;
5624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->utterance != NULL)
5644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_ClearUtterance(impl->utterance);
5664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_FreeUtterance(impl->utterance);
5674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->utterance = NULL;
5684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (frontendParams != NULL)
5704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_FreeFrontendParameters(frontendParams);
5714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
5724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
5754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Populates legacy recognizer parameters from the session.
5764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
5774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Replaces setup_pattern_parameters()
5784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
5794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_AcousticModels_LoadLegacyRecognizerParameters(CA_RecInputParams* params)
5804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
5824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  passert(params != NULL);
5844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  params->is_loaded = ESR_FALSE;
5854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetBool("CREC.Recognizer.partial_results", &params->do_partial));
5864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.NBest", &params->top_choices));
5874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.eou_threshold", &params->eou_threshold));
5884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.max_altword_tokens", &params->max_altword_tokens));
5894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.max_frames", &params->max_frames));
5904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.max_fsm_arcs", &params->max_fsm_arcs));
5914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.max_fsm_nodes", &params->max_fsm_nodes));
5924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.max_fsmnode_tokens", &params->max_fsmnode_tokens));
5934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.max_hmm_tokens", &params->max_hmm_tokens));
5944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.max_model_states", &params->max_model_states));
5954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.max_searches", &params->max_searches));
5964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.max_word_tokens", &params->max_word_tokens));
5974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.non_terminal_timeout", &params->non_terminal_timeout));
5984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.num_wordends_per_frame", &params->num_wordends_per_frame));
5994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.often", &params->traceback_freq));
6004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.optional_terminal_timeout", &params->optional_terminal_timeout));
6014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.reject", &params->reject_score));
6024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.terminal_timeout", &params->terminal_timeout));
6034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.viterbi_prune_thresh", &params->viterbi_prune_thresh));
6044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetInt("CREC.Recognizer.wordpen", &params->word_penalty));
6054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  params->is_loaded = ESR_TRUE;
6064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
6084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
6094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
6104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
6114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerCreate(SR_Recognizer** self)
6134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
6144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl;
6154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_RecInputParams* recogParams = NULL;
6164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
6174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR recHandle[12];
6184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (self == NULL)
6204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
6214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_ARGUMENT"));
6224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
6234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl = NEW(SR_RecognizerImpl, MTAG);
6254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl == NULL)
6264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
6274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_OUT_OF_MEMORY"));
6284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_OUT_OF_MEMORY;
6294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.start = &SR_RecognizerStartImpl;
6324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.stop = &SR_RecognizerStopImpl;
6334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.destroy = &SR_RecognizerDestroyImpl;
6344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.setup = &SR_RecognizerSetupImpl;
6354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.unsetup = &SR_RecognizerUnsetupImpl;
6364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.isSetup = &SR_RecognizerIsSetupImpl;
6374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.getParameter = &SR_RecognizerGetParameterImpl;
6384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.getSize_tParameter = &SR_RecognizerGetSize_tParameterImpl;
6394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.getBoolParameter = &SR_RecognizerGetBoolParameterImpl;
6404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.setParameter = &SR_RecognizerSetParameterImpl;
6414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.setSize_tParameter = &SR_RecognizerSetSize_tParameterImpl;
6424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.setBoolParameter = &SR_RecognizerSetBoolParameterImpl;
6434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.setLockFunction = &SR_RecognizerSetLockFunctionImpl;
6444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.hasSetupRules = &SR_RecognizerHasSetupRulesImpl;
6454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.activateRule = &SR_RecognizerActivateRuleImpl;
6464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.deactivateRule = &SR_RecognizerDeactivateRuleImpl;
6474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.deactivateAllRules = &SR_RecognizerDeactivateAllRulesImpl;
6484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.isActiveRule = &SR_RecognizerIsActiveRuleImpl;
6494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.setWordAdditionCeiling = &SR_RecognizerSetWordAdditionCeilingImpl;
6504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.checkGrammarConsistency = &SR_RecognizerCheckGrammarConsistencyImpl;
6514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.getModels = &SR_RecognizerGetModelsImpl;
6524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.putAudio = &SR_RecognizerPutAudioImpl;
6534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.advance = &SR_RecognizerAdvanceImpl;
6544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.loadUtterance = &SR_RecognizerLoadUtteranceImpl;
6554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.loadWaveFile = &SR_RecognizerLoadWaveFileImpl;
6564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.logEvent = &SR_RecognizerLogEventImpl;
6574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.logToken = &SR_RecognizerLogTokenImpl;
6584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.logTokenInt = &SR_RecognizerLogTokenIntImpl;
6594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.logSessionStart = &SR_RecognizerLogSessionStartImpl;
6604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.logSessionEnd = &SR_RecognizerLogSessionEndImpl;
6614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.logWaveformData = &SR_RecognizerLogWaveformDataImpl;
6624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.isSignalClipping = &SR_RecognizerIsSignalClippingImpl;
6634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.isSignalDCOffset = &SR_RecognizerIsSignalDCOffsetImpl;
6644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.isSignalNoisy = &SR_RecognizerIsSignalNoisyImpl;
6654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.isSignalTooFewSamples = &SR_RecognizerIsSignalTooFewSamplesImpl;
6664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.isSignalTooManySamples = &SR_RecognizerIsSignalTooManySamplesImpl;
6674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.isSignalTooQuiet = &SR_RecognizerIsSignalTooQuietImpl;
6684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->frontend = NULL;
6704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->wavein = NULL;
6714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->utterance = NULL;
6724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->confidenceScorer = NULL;
6734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->recognizer = NULL;
6744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->models = NULL;
6754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->grammars = NULL;
6764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->result = NULL;
6774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->parameters = NULL;
6784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->acousticState = NULL;
6794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->audioBuffer = NULL;
6804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->buffer = NULL;
6814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->frames = impl->processed;
6824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->internalState = SR_RECOGNIZER_INTERNAL_BEGIN;
6834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->isStarted = ESR_FALSE;
6844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->isRecognizing = ESR_FALSE;
6854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->gotLastFrame = ESR_FALSE;
6864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->sampleRate = 0;
6874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->lockFunction = NULL;
6884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->lockData = NULL;
6894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->eventLog = NULL;
6904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->osi_log_level = 0;
6914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->waveformBuffer = NULL;
6924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->isSignalQualityInitialized = ESR_FALSE;
6934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->beginningOfSpeechOffset = 0;
6944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->gatedMode = ESR_TRUE;
6954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->bgsniff = 0;
6964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->isSignalClipping       = ESR_FALSE;
6974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->isSignalDCOffset       = ESR_FALSE;
6984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->isSignalNoisy          = ESR_FALSE;
6994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->isSignalTooFewSamples  = ESR_FALSE;
7004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->isSignalTooManySamples = ESR_FALSE;
7014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->isSignalTooQuiet       = ESR_FALSE;
7024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionTypeCreate(&impl->parameters));
7044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_RecognizerToSessionImpl());
7054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetSize_t(L("SREC.Recognizer.osi_log_level"), &impl->osi_log_level));
7064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* create the event log */
7084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->osi_log_level) /* do some logging if non-zero val */
7094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ESR_SessionGetProperty(L("eventlog"), (void **)&impl->eventLog, TYPES_SR_EVENTLOG));
7104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Record the OSI log event */
7124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  psprintf(recHandle, L("%p"), impl);
7134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("REC"), recHandle));
7144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIcrst")));
7154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_RecognizerFrontendToSessionImpl());
7174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_RecognizerCreateFrontendImpl(impl));
7184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = ESR_SessionGetProperty("recognizer.confidenceScorer", (void **)&impl->confidenceScorer, TYPES_CONFIDENCESCORER);
7194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc == ESR_NO_MATCH_ERROR)
7204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
7214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->confidenceScorer = CA_AllocateConfidenceScorer();
7224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (!CA_LoadConfidenceScorer(impl->confidenceScorer)) {
7244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = ESR_INVALID_STATE;
7254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(ESR_rc2str(rc));
7264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
7274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
7284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ESR_SessionSetProperty("recognizer.confidenceScorer", impl->confidenceScorer, TYPES_CONFIDENCESCORER));
7294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
7304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else if (rc != ESR_SUCCESS)
7314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
7324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
7334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
7344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
7354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  recogParams = CA_AllocateRecognitionParameters();
7374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (recogParams == NULL)
7384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
7394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_OUT_OF_MEMORY;
7404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
7414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
7424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
7434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_AcousticModels_LoadLegacyRecognizerParameters(recogParams));
7444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->recognizer = CA_AllocateRecognition();
7454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->recognizer == NULL)
7464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
7474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
7484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
7494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
7504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_ConfigureRecognition(impl->recognizer, recogParams);
7514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_FreeRecognitionParameters(recogParams);
7524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, HashMapCreate(&impl->grammars));
7534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, CircularBufferCreate(sizeof(asr_int16_t) * AUDIO_CIRC_BUFFER_SIZE, MTAG, &impl->buffer));
7544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetSize_t("CREC.Frontend.samplerate", &impl->sampleRate));
7554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->FRAME_SIZE = impl->sampleRate / FRAMERATE * SAMPLE_SIZE;
7574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ((impl->audioBuffer = MALLOC(impl->FRAME_SIZE, MTAG)) == NULL)
7594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
7604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_OUT_OF_MEMORY;
7614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
7624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
7634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* create the waveform buffer */
7654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, WaveformBuffer_Create(&impl->waveformBuffer, impl->FRAME_SIZE));
7664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetSize_t("SREC.Recognizer.utterance_timeout", &impl->utterance_timeout));
7684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* OSI logging (SUCCESS) */
7704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("REC"), recHandle));
7714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("SUCCESS"), L("ESR_SUCCESS")));
7724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIcrnd")));
7734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_AcousticStateCreateImpl(&impl->Interface));
7754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetSize_t(L("cmdline.bgsniff"), &impl->bgsniff));
7774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* gated mode == beginning of speech detection */
7784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetBool(L("cmdline.gatedmode"), &impl->gatedMode));
7794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *self = (SR_Recognizer*) impl;
7814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
7824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
7834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* OSI logging (FAILURE) */
7844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->eventLog != NULL)
7854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
7864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("REC"), recHandle);
7874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("FAILURE"), ESR_rc2str(rc));
7884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIcrnd"));
7894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
7904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (recogParams != NULL)
7924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_FreeRecognitionParameters(recogParams);
7934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.destroy(&impl->Interface);
7944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
7954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
7964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerDestroyImpl(SR_Recognizer* self)
7984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
7994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
8004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_BOOL exists; // isSetup;
8014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
8024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR recHandle[12];
8034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->result != NULL)
8054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SR_RecognizerResult_Destroy(impl->result);
8074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->result = NULL;
8084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->eventLog != NULL)
8114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* Record the OSI log event */
8134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    psprintf(recHandle, L("%p"), impl);
8144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("REC"), recHandle));
8154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIdesst")));
8164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Clean session */
8194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionContains("recognizer.confidenceScorer", &exists));
8204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (exists)
8214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ESR_SessionRemoveProperty("recognizer.confidenceScorer"));
8224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->confidenceScorer != NULL)
8244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_FreeConfidenceScorer(impl->confidenceScorer);
8264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->confidenceScorer = NULL;
8274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Clear CMS, CRS_RecognizerClose() */
8304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->wavein != NULL)
8314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ESR_BOOL isAttached, isConfigured;
8334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, CA_IsCMSAttachedtoUtterance(impl->wavein, &isAttached));
8354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (isAttached)
8364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CA_DetachCMSfromUtterance(impl->wavein, impl->utterance);
8374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, CA_IsConfiguredForAgc(impl->wavein, &isConfigured));
8394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (isConfigured)
8404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CA_ClearCMSParameters(impl->wavein);
8414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Free Utterance */
8444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->utterance != NULL)
8454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_ClearUtterance(impl->utterance);
8474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_FreeUtterance(impl->utterance);
8484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->utterance = NULL;
8494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Free WaveformBuffer */
8524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->waveformBuffer != NULL)
8534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    WaveformBuffer_Destroy(impl->waveformBuffer);
8554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->waveformBuffer = NULL;
8564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Free recognizer */
8594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*  CHKLOG(rc, self->isSetup(self, &isSetup));
8604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (isSetup)
8614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, self->unsetup(self));*/
8624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->grammars != NULL)
8634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, self->deactivateAllRules(self));
8644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->recognizer != NULL)
8654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_UnloadRecognitionModels(impl->recognizer);
8674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_UnconfigureRecognition(impl->recognizer);
8684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_FreeRecognition(impl->recognizer);
8694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->recognizer = NULL;
8704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->grammars != NULL)
8734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, HashMapDestroy(impl->grammars));
8754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->grammars = NULL;
8764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->buffer != NULL)
8794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE(impl->buffer);
8814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->buffer = NULL;
8824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->audioBuffer != NULL)
8854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE(impl->audioBuffer);
8874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->audioBuffer = NULL;
8884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Free frontend */
8914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->frontend)
8924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
8934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_UnconfigureFrontend(impl->frontend);
8944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_FreeFrontend(impl->frontend);
8954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->frontend = NULL;
8964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Free wave */
8994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->wavein)
9004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
9014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_UnconfigureWave(impl->wavein);
9024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_FreeWave(impl->wavein);
9034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->wavein = NULL;
9044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
9054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->parameters != NULL)
9074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, impl->parameters->destroy(impl->parameters));
9084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->eventLog != NULL)
9104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
9114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* OSI logging (SUCCESS) */
9124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("REC"), recHandle));
9134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("SUCCESS"), L("ESR_SUCCESS")));
9144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIdesnd")));
9154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->eventLog = NULL;
9164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
9174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->acousticState != NULL)
9194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
9204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->acousticState->destroy(self);
9214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->acousticState = NULL;
9224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
9234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(impl);
9244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
9254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
9264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
9274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
9284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode beginRecognizing(SR_RecognizerImpl* impl)
9304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
9314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_RecInputParams* recogParams;
9324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR tok[80];
9334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR* val;
9344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PTimeStamp BORT;
9354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t i, grammarSize;
9364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
9374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Setup recognizer for new utterance */
9394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  recogParams = CA_AllocateRecognitionParameters();
9404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (recogParams == NULL)
9414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
9424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_OUT_OF_MEMORY;
9434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
9444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
9454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
9464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_AcousticModels_LoadLegacyRecognizerParameters(recogParams);
9474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_BeginRecognition(impl->recognizer, NULL, 1, recogParams);
9484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_FreeRecognitionParameters(recogParams);
9494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->isRecognizing = ESR_TRUE;
9504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* OSI log the  grammars */
9524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, HashMapGetSize(impl->grammars, &grammarSize));
9534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < grammarSize; ++i)
9544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
955b3adea6f471d03c5bd728725adc7ca1cea89edfdMarcus Oakland    psprintf(tok, L("GURI%zu"), i);
9564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* use the key as the grammar URI */
9574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, HashMapGetKeyAtIndex(impl->grammars, i, &val));
9584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, tok, val));
9594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
9604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* OSI ACST acoustic state reset */
9614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("ACST"), 0));
9624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("LANG"), L("en-us")));
9634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* OSI log the start of recognition */
9654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIrcst")));
9664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* save the BORT timing (begin of recog) */
9684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PTimeStampSet(&BORT);
9694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->recogLogTimings.BORT = PTimeStampDiff(&BORT, &impl->timestamp);
9704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
9724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
9734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (recogParams != NULL)
9744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_FreeRecognitionParameters(recogParams);
9754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
9764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
9774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerStartImpl(SR_Recognizer* self)
9794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
9804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
9814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t silence_duration_in_frames;
9824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t end_of_utterance_hold_off_in_frames;
9834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t grammarCount;
9844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
9854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_BOOL enableGetWaveform = ESR_FALSE;
9864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, impl->grammars->getSize(impl->grammars, &grammarCount));
9884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->models == NULL)
9894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
9904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError("ESR_INVALID_STATE: No rule has been set up");
9914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_STATE;
9924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
9934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (grammarCount < 1)
9944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
9954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError("ESR_INVALID_STATE: No rule has been activated");
9964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_STATE;
9974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
9984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!CA_OpenWaveFromDevice(impl->wavein, DEVICE_RAW_PCM, impl->frontend->samplerate, 0, WAVE_DEVICE_RAW))
10004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
10014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_INVALID_STATE;
10024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
10034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
10044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
10054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Setup utterance */
10074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_UnlockUtteranceForInput(impl->utterance);
10084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Setup utterance */
10104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetSize_t(L("cmdline.silence_duration_in_frames"), &silence_duration_in_frames));
10114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetSize_t(L("cmdline.end_of_utterance_hold_off_in_frames"), &end_of_utterance_hold_off_in_frames));
10124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_SetEndOfUtteranceByLevelTimeout(impl->utterance, silence_duration_in_frames, end_of_utterance_hold_off_in_frames);
10134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_ResetVoicing(impl->utterance);
10154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*
10174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * NOTE: We don't actually begin the recognizer here, the beginning of speech
10184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * detector will do that.
10194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   */
10204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->gotLastFrame = ESR_FALSE;
10224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->isStarted = ESR_TRUE;
10234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->isRecognizing = ESR_FALSE;
10244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->isSignalQualityInitialized = ESR_FALSE;
10254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->internalState = SR_RECOGNIZER_INTERNAL_BEGIN;
10264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PTimeStampSet(&impl->timestamp);
10274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* reset waveform buffer at start of every recognition */
10294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, WaveformBuffer_Reset(impl->waveformBuffer));
10304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* is waveform buffering active? */
10324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = ESR_SessionGetBool(L("enableGetWaveform"), &enableGetWaveform);
10334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  // rc = impl->parameters->getBool(impl->parameters, L("enableGetWaveform"), &enableGetWaveform);
10344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc != ESR_SUCCESS && rc != ESR_NO_MATCH_ERROR)
10354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
10364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("%s: could determine whether VoiceEnrollment active or not"), ESR_rc2str(rc));
10374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
10384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
10394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (enableGetWaveform)
10404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, WaveformBuffer_SetBufferingState(impl->waveformBuffer, WAVEFORM_BUFFERING_ON_CIRCULAR));
10414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
10424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, WaveformBuffer_SetBufferingState(impl->waveformBuffer, WAVEFORM_BUFFERING_OFF));
10434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* I am going to try to open the audio waveform file here */
10454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->osi_log_level & OSI_LOG_LEVEL_AUDIO)
10464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
10474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* open a new audio waveform file */
10484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = SR_EventLogAudioOpen(impl->eventLog, L("audio/L16"), impl->sampleRate, SAMPLE_SIZE);
10494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc != ESR_SUCCESS)
10504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
10514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(L("%s: could not open the RIFF audio file"), ESR_rc2str(rc));
10524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
10534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
10544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
10554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->frames = impl->processed = 0;
10564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
10574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
10584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*  self->stop(self);*/
10594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
10604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
10614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerStopImpl(SR_Recognizer* self)
10634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
10644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
10654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_AcousticModelsImpl* modelsImpl;
10664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
10674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PLOG_DBG_API_ENTER();
10694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!impl->isStarted)
10704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
10714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* In case the user calls stop() twice */
10724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_SUCCESS;
10734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
10744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  modelsImpl = (SR_AcousticModelsImpl*) impl->models;
10754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Clean-up recognizer and utterance */
10774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  switch (impl->internalState)
10784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
10794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case SR_RECOGNIZER_INTERNAL_BEGIN:
10804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* Recognizer was never started */
10814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("MODE"), L("BEGIN")));
10824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CA_LockUtteranceFromInput(impl->utterance);
10834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
10844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->eventLog != NULL)
10854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
10864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RECOGNIZER_INTERNAL_BEGIN -> SR_RECOGNIZER_INTERNAL_END")));
10874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
10884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
10894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
10904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
10914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
10924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case SR_RECOGNIZER_INTERNAL_BOS_TIMEOUT:
10944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* Recognizer was never started */
10954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("MODE"), L("BOS_TIMEOUT")));
10964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CA_LockUtteranceFromInput(impl->utterance);
10974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
10984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->eventLog != NULL)
10994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
11004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RECOGNIZER_INTERNAL_BOS_TIMEOUT -> SR_RECOGNIZER_INTERNAL_END")));
11014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
11024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
11034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
11044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
11054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
11064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case SR_RECOGNIZER_INTERNAL_BOS_NO_MATCH:
11084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* Recognizer was never started */
11094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("MODE"), L("BOS_NO_MATCH")));
11104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CA_LockUtteranceFromInput(impl->utterance);
11114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
11124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->eventLog != NULL)
11134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
11144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RECOGNIZER_INTERNAL_BOS_NO_MATCH -> SR_RECOGNIZER_INTERNAL_END")));
11154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
11164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
11174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
11184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
11194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
11204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case SR_RECOGNIZER_INTERNAL_BOS_DETECTION:
11224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* Recognizer was never started */
11234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("MODE"), L("BOS_DETECTION")));
11244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CA_LockUtteranceFromInput(impl->utterance);
11254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
11264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->eventLog != NULL)
11274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
11284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RECOGNIZER_INTERNAL_BOS_DETECTION -> SR_RECOGNIZER_INTERNAL_END")));
11294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
11304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
11314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
11324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
11334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
11344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case SR_RECOGNIZER_INTERNAL_EOS_DETECTION:
11364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("MODE"), L("EOS_DETECTION")));
11374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CA_LockUtteranceFromInput(impl->utterance);
11384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (!CA_EndRecognition(impl->recognizer, modelsImpl->pattern, impl->utterance))
11394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
11404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        rc = ESR_INVALID_STATE;
11414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLogError(ESR_rc2str(rc));
11424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        goto CLEANUP;
11434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
11444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
11454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->eventLog != NULL)
11464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
11474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RECOGNIZER_INTERNAL_EOS_DETECTION -> SR_RECOGNIZER_INTERNAL_END")));
11484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
11494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
11504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
11514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
11524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
11534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case SR_RECOGNIZER_INTERNAL_EOI:
11554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("MODE"), L("EOI")));
11564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CA_LockUtteranceFromInput(impl->utterance);
11574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (!CA_EndRecognition(impl->recognizer, modelsImpl->pattern, impl->utterance))
11584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
11594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        rc = ESR_INVALID_STATE;
11604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLogError(ESR_rc2str(rc));
11614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        goto CLEANUP;
11624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
11634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
11644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->eventLog != NULL)
11654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
11664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RECOGNIZER_INTERNAL_EOI -> SR_RECOGNIZER_INTERNAL_END")));
11674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
11684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
11694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
11704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
11714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
11724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case SR_RECOGNIZER_INTERNAL_EOS:
11744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("MODE"), L("EOS")));
11754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CA_LockUtteranceFromInput(impl->utterance);
11764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (!CA_EndRecognition(impl->recognizer, modelsImpl->pattern, impl->utterance))
11774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
11784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        rc = ESR_INVALID_STATE;
11794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLogError(ESR_rc2str(rc));
11804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        goto CLEANUP;
11814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
11824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
11834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->eventLog != NULL)
11844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
11854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RECOGNIZER_INTERNAL_EOS -> SR_RECOGNIZER_INTERNAL_END")));
11864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
11874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
11884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
11894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
11904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
11914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case SR_RECOGNIZER_INTERNAL_END:
11934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* Recognizer already shut down */
11944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("MODE"), L("END")));
11954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
11964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    default:
11984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* Shut down recognizer */
11994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("MODE"), impl->internalState));
12004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->eventLog != NULL)
12014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
12024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("unknown state -> SR_RECOGNIZER_INTERNAL_END")));
12034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
12044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
12054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
12064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
12074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CA_LockUtteranceFromInput(impl->utterance);
12084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->isRecognizing)
12094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
12104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (!CA_EndRecognition(impl->recognizer, modelsImpl->pattern, impl->utterance))
12114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
12124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          rc = ESR_INVALID_STATE;
12134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          PLogError(ESR_rc2str(rc));
12144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          goto CLEANUP;
12154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
12164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
12174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = ESR_INVALID_STATE;
12184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(L("%s: %d"), ESR_rc2str(rc), impl->internalState);
12194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
12204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
12214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
12224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->eventLog != NULL)
12234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
12244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int n;
12254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LCHAR result[MAX_ENTRY_LENGTH];
12264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    result[0] = L('\0');
12274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    n = CA_GetUnprocessedFramesInUtterance(impl->utterance);
12294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogTokenInt(impl->eventLog, L("CA_GetUnprocessedFramesInUtterance() (x10ms)"), n));
12304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_FullResultLabel(impl->recognizer, result, MAX_ENTRY_LENGTH - 1);
12314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogToken(impl->eventLog, L("CA_FullResultLabel() (x20ms)"), result));
12324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    n = CircularBufferGetSize(impl->buffer);
12334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogTokenInt(impl->eventLog, L("CircularBufferGetSize() (samples)"), n / SAMPLE_SIZE));
12344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
12354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->lockFunction)
12364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->lockFunction(ESR_LOCK, impl->lockData);
12374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CircularBufferReset(impl->buffer);
12384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->lockFunction)
12394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->lockFunction(ESR_UNLOCK, impl->lockData);
12404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (CA_RecognitionHasResults(impl->recognizer))
12414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_ClearResults(impl->recognizer);
12424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_FlushUtteranceFrames(impl->utterance);
12434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_CalculateCMSParameters(impl->wavein);
12444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_CloseDevice(impl->wavein);
12454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* record the OSI event */
12474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIstop")));
12484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->result != NULL)
12504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
12514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_RecognizerResult_Destroy(impl->result));
12524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->result = NULL;
12534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
12544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->lockFunction)
12564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->lockFunction(ESR_LOCK, impl->lockData);
12574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->gotLastFrame = ESR_TRUE;
12584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PLOG_DBG_TRACE((L("SR_Recognizer shutdown occured")));
12594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->isStarted = ESR_FALSE;
12604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->isRecognizing = ESR_FALSE;
12614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->osi_log_level & OSI_LOG_LEVEL_AUDIO)
12624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SR_EventLogAudioClose(impl->eventLog);
12634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->recogLogTimings.BORT = 0;
12654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->recogLogTimings.DURS = 0;
12664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->recogLogTimings.EORT = 0;
12674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->recogLogTimings.EOSD = 0;
12684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->recogLogTimings.EOSS = 0;
12694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->recogLogTimings.BOSS = 0;
12704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->recogLogTimings.EOST = 0;
12714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->eos_reason = L("undefined");
12724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->lockFunction)
12744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->lockFunction(ESR_UNLOCK, impl->lockData);
12754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PLOG_DBG_API_EXIT(rc);
12764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
12774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
12784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PLOG_DBG_API_EXIT(rc);
12794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
12804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
12814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerSetupImpl(SR_Recognizer* self)
12834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
12844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
12854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_AcoustInputParams* acousticParams = NULL;
12864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_AcousticModelsImpl* modelsImpl;
12874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_AcousticModels* models;
12884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* recogImpl = NULL;
12894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_Acoustic* acoustic;
12904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t size, i;
12914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR           filenames[P_PATH_MAX];
12924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t          len;
12934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  len = P_PATH_MAX;
12954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetLCHAR ( L("cmdline.modelfiles"), filenames, &len ));
12964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_AcousticModelsLoad ( filenames, &models ));
12984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (models == NULL)
13004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
13014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(L("ESR_INVALID_STATE while finding cmdline.modelfiles"));
13024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_INVALID_STATE;
13034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
13044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  modelsImpl = (SR_AcousticModelsImpl*) models;
13054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  recogImpl = (SR_RecognizerImpl*) self;
13064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  acousticParams = NULL;
13074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_AcousticModelsGetCount(models, &size));
13094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  acousticParams = CA_AllocateAcousticParameters();
13104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (acousticParams == NULL)
13114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
13124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = ESR_OUT_OF_MEMORY;
13134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(ESR_rc2str(rc));
13144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
13154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
13164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, modelsImpl->getLegacyParameters(acousticParams));
13174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ArrayListGetSize(modelsImpl->acoustic, &size));
13184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (i = 0; i < size; ++i)
13194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
13204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, ArrayListGet(modelsImpl->acoustic, i, (void **)&acoustic));
13214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CA_LoadModelsInAcoustic(recogImpl->recognizer, acoustic, acousticParams);
13224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
13234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_FreeAcousticParameters(acousticParams);
13244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  recogImpl->models = models;
13264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, modelsImpl->setupPattern(recogImpl->models, self));
13274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
13284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP:
13294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (acousticParams != NULL)
13304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_FreeAcousticParameters(acousticParams);
13314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (recogImpl != NULL)
13324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_UnloadRecognitionModels(recogImpl->recognizer);
13334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
13344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
13354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerUnsetupImpl(SR_Recognizer* self)
13374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
13384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
13394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_AcousticModelsImpl* modelsImpl = (SR_AcousticModelsImpl*) impl->models;
13404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
13414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, modelsImpl->unsetupPattern(impl->models));
13434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_UnloadRecognitionModels(impl->recognizer);
13444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_AcousticModelsDestroy ( impl->models ));
13454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->models = NULL;
13464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
13474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP:
13484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
13494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
13504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerIsSetupImpl(SR_Recognizer* self, ESR_BOOL* isSetup)
13524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
13534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
13544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (isSetup == NULL)
13564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
13574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_ARGUMENT"));
13584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
13594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
13604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *isSetup = impl->models != NULL;
13614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
13624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
13634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerGetParameterImpl(SR_Recognizer* self, const LCHAR* key,
13654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LCHAR* value, size_t* len)
13664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
13674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
13684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
13694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = impl->parameters->getLCHAR(impl->parameters, key, value, len);
13714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc == ESR_NO_MATCH_ERROR)
13724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
13734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ESR_SessionGetLCHAR(key, value, len));
13744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_SUCCESS;
13754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
13764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else if (rc != ESR_SUCCESS)
13774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
13784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
13794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
13804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
13814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
13824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
13834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
13844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
13854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*
13874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * The get / set code is a mess. Since we only use size_t parameters, that's all
13884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * that I am going to make work. The impl->parameters don't work so you always
13894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * have to get them from the session. The impl always logs an error. SteveR
13904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
13914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerGetSize_tParameterImpl(SR_Recognizer* self, const LCHAR* key,
13934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    size_t* value)
13944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
13954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
13964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetSize_t(key, value));
13984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
13994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
14004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
14014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
14024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerGetBoolParameterImpl(SR_Recognizer* self, const LCHAR* key, ESR_BOOL* value)
14044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
14054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
14064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
14074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = impl->parameters->getBool(impl->parameters, key, value);
14094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc == ESR_NO_MATCH_ERROR)
14104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
14114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ESR_SessionGetBool(key, value));
14124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_SUCCESS;
14134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
14144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else if (rc != ESR_SUCCESS)
14154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
14164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
14174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
14184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
14194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
14204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
14214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
14224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
14234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerSetParameterImpl(SR_Recognizer* self, const LCHAR* key,
14254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LCHAR* value)
14264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
14274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
14284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR temp[256];
14294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
14304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t len = 256;
14314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = impl->parameters->getLCHAR(impl->parameters, key, temp, &len);
14334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc == ESR_SUCCESS)
14344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
14354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (LSTRCMP(temp, value) == 0)
14364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_SUCCESS;
14374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, impl->parameters->removeAndFreeProperty(impl->parameters, key));
14384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
14394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else if (rc != ESR_NO_MATCH_ERROR && rc != ESR_INVALID_RESULT_TYPE)
14404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
14414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
14424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
14434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
14444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, impl->parameters->setLCHAR(impl->parameters, key, value));
14464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
14474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
14484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
14494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
14504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*
14514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * The only set param function that is working is for the size_t parameters; and not
14524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * all of them are working, only the ones specified in the function itself. There are
14534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * two reasons for this: first most of the set functions just put the value in an unused
14544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * table that has no effect; second many of the changes need to be propogated to a specific
14554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * part of the code. This needs to be evaluated on a per parameter basis. SteveR
14564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
14574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*
14594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * This function will be used to set parameters in the session. We need to go through
14604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * the recognizer so as to propogate the values into the recognizer. We will rely on
14614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * the session to do the right thing. SteveR
14624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
14634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerSetSize_tParameterImpl(SR_Recognizer* self, const LCHAR* key,
14654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    size_t value)
14664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
14674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
14684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
14694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = ESR_SessionSetSize_t ( key, value );
14714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc == ESR_SUCCESS)
14734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
14744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if  ( LSTRCMP ( L("SREC.Recognizer.utterance_timeout"), key ) == 0 )
14754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
14764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->utterance_timeout = value;
14774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
14784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else if  ( LSTRCMP ( L("CREC.Recognizer.terminal_timeout"), key ) == 0 )
14794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
14804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->recognizer->eosd_parms->endnode_timeout = value;
14814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
14824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else if  ( LSTRCMP ( L("CREC.Recognizer.optional_terminal_timeout"), key ) == 0 )
14834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
14844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->recognizer->eosd_parms->optendnode_timeout = value;
14854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
14864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else if  ( LSTRCMP ( L("CREC.Recognizer.non_terminal_timeout"), key ) == 0 )
14874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
14884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->recognizer->eosd_parms->internalnode_timeout = value;
14894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
14904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else if  ( LSTRCMP ( L("CREC.Recognizer.eou_threshold"), key ) == 0 )
14914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
14924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->recognizer->eosd_parms->eos_costdelta = (frameID)value;
14934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->recognizer->eosd_parms->opt_eos_costdelta = (frameID)value;
14944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
14954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
14964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
14974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(L("ESR_INVALID_ARGUMENT"));
14984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = ESR_INVALID_ARGUMENT;
14994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
15004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
15014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
15024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
15034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerSetBoolParameterImpl(SR_Recognizer* self, const LCHAR* key, ESR_BOOL value)
15064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
15074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
15084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_BOOL temp;
15094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
15104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = impl->parameters->getBool(impl->parameters, key, &temp);
15124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc == ESR_SUCCESS)
15134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
15144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (temp == value)
15154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_SUCCESS;
15164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, impl->parameters->removeAndFreeProperty(impl->parameters, key));
15174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
15184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else if (rc != ESR_NO_MATCH_ERROR && rc != ESR_INVALID_RESULT_TYPE)
15194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return rc;
15204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, impl->parameters->setBool(impl->parameters, key, value));
15224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
15234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
15244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
15254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
15264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerHasSetupRulesImpl(SR_Recognizer* self, ESR_BOOL* hasSetupRules)
15284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
15294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* recogImpl = (SR_RecognizerImpl*) self;
15304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t size;
15314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
15324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (hasSetupRules == NULL)
15344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
15354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_ARGUMENT"));
15364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
15374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
15384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, HashMapGetSize(recogImpl->grammars, &size));
15394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *hasSetupRules = size > 0;
15404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
15414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
15424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
15434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
15444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerActivateRuleImpl(SR_Recognizer* self, SR_Grammar* grammar,
15464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    const LCHAR* ruleName, unsigned int weight)
15474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
15484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
15494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* grammarImpl = (SR_GrammarImpl*) grammar;
15504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_AcousticModelsImpl* modelsImpl;
15514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR grammarID[80];
15524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
15534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char *failure_reason = NULL;
15544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (grammar == NULL)
15564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
15574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (impl->eventLog)
15584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      failure_reason = "badinput";
15594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_INVALID_ARGUMENT;
15604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_ARGUMENT"));
15614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
15624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
15634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->models == NULL)
15654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
15664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    failure_reason = "nomodels";
15674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_INVALID_STATE;
15684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("acoustic models must be configured"));
15694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
15704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
15714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  modelsImpl = (SR_AcousticModelsImpl*) impl->models;
15734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (ruleName == NULL)
15754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    psprintf(grammarID, L("%p"), grammar);
15764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
15774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
15784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (LSTRLEN(ruleName) > 80)
15794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
15804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = ESR_BUFFER_OVERFLOW;
15814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(ESR_rc2str(rc));
15824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
15834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
15844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LSTRCPY(grammarID, ruleName);
15854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
15864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, HashMapPut(impl->grammars, grammarID, grammar));
15884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (CA_SetupSyntaxForRecognizer(grammarImpl->syntax, impl->recognizer))
15894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
15904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    failure_reason = "cafailed";
15914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_INVALID_STATE;
15924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_STATE"));
15934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
15944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
15954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   CHKLOG(rc, SR_Grammar_SetupRecognizer(grammar, self));
15974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  grammarImpl->isActivated = ESR_TRUE;
15984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*
16004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * If we want to log dynamically added words, then we must give the grammar a reference
16014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * to our event log. The grammar logs word additions if and only if its reference to
16024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * eventLog is non-null.
16034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   */
16044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->osi_log_level & OSI_LOG_LEVEL_ADDWD)
16054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    grammarImpl->eventLog = impl->eventLog;
16064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
16074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    grammarImpl->eventLog = NULL;
16084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = ESR_SUCCESS;
16104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
16124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->eventLog)
16134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
16144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (failure_reason)
16154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
1616b3adea6f471d03c5bd728725adc7ca1cea89edfdMarcus Oakland      SR_EventLogTokenPointer(impl->eventLog, L("igrm"), grammar);
16174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      SR_EventLogToken(impl->eventLog, L("rule"), ruleName);
16184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      SR_EventLogToken(impl->eventLog, L("rslt"), "fail");
16194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      SR_EventLogToken(impl->eventLog, L("reason"), failure_reason);
16204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      SR_EventLogEvent(impl->eventLog, L("ESRacGrm"));
16214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
16224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
16234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
1624b3adea6f471d03c5bd728725adc7ca1cea89edfdMarcus Oakland      SR_EventLogTokenPointer(impl->eventLog, L("igrm"), grammar);
16254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      SR_EventLogToken(impl->eventLog, L("rule"), ruleName);
16264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      SR_EventLogToken(impl->eventLog, L("rslt"), "ok");
16274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      SR_EventLogEvent(impl->eventLog, L("ESRacGrm"));
16284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
16294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
16304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
16314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
16324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerDeactivateRuleImpl(SR_Recognizer* self, SR_Grammar* grammar,
16344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    const LCHAR* ruleName)
16354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
16364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
16374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* grammarImpl = (SR_GrammarImpl*) grammar;
16384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR grammarID[MAX_INT_DIGITS+1];
16394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
16404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (ruleName == NULL)
16424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
16434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    psprintf(grammarID, L("%p"), grammar);
16444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, HashMapRemove(impl->grammars, grammarID));
16454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
16464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
16474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, HashMapRemove(impl->grammars, ruleName));
16484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  grammarImpl->isActivated = ESR_FALSE;
16494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
16504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
16514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
16524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
16534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerDeactivateAllRulesImpl(SR_Recognizer* self)
16554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
16564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
16574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
16584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, HashMapRemoveAll(impl->grammars));
16604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_ClearSyntaxForRecognizer(0, impl->recognizer);
16614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
16624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
16634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
16644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
16654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerIsActiveRuleImpl(SR_Recognizer* self, SR_Grammar* grammar,
16674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    const LCHAR* ruleName, ESR_BOOL* isActiveRule)
16684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
16694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
16704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR grammarID[MAX_INT_DIGITS+1];
16714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
16724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  psprintf(grammarID, L("%p"), grammar);
16744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, HashMapContainsKey(impl->grammars, (LCHAR*) &grammarID, isActiveRule));
16754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
16764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
16774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
16784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
16794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerSetWordAdditionCeilingImpl(SR_Recognizer* self, SR_Grammar* grammar)
16814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
16824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
16834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* grammarImpl = (SR_GrammarImpl*)grammar;
16844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int iRc;
16854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(!impl || !grammarImpl)
16874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
16884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  iRc = CA_CeilingSyntaxForRecognizer( grammarImpl->syntax, impl->recognizer);
16894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(iRc) return ESR_INVALID_STATE;
16904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
16924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
16934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerCheckGrammarConsistencyImpl(SR_Recognizer* self, SR_Grammar* grammar,
16954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ESR_BOOL* isConsistent)
16964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
16974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
16984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* grammarImpl;
16994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl2;
17004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  grammarImpl = (SR_GrammarImpl*) grammar;
17034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl2 = (SR_RecognizerImpl*)grammarImpl->recognizer;
17044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  // *isConsistent = grammarImpl->models == impl->models;
17054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *isConsistent = (impl2->models == impl->models);
17064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
17074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
17084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerGetModelsImpl(SR_Recognizer* self, SR_AcousticModels** pmodels)
17104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
17114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
17124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *pmodels = impl->models;
17134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
17144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
17154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerPutAudioImpl(SR_Recognizer* self, asr_int16_t* buffer, size_t* bufferSize,
17174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ESR_BOOL isLast)
17184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
17194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
17204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
17214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int    rcBufWrite;
17224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t nbWritten;
17234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (isLast == ESR_FALSE && (buffer == NULL || bufferSize == NULL))
17254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
17264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_ARGUMENT"));
17274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
17284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
17294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->lockFunction)
17314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->lockFunction(ESR_LOCK, impl->lockData);
17324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!impl->isStarted)
17334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
17344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (impl->lockFunction)
17354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->lockFunction(ESR_UNLOCK, impl->lockData);
17364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogMessage(L("ESR_INVALID_STATE: Tried pushing audio while recognizer was offline"));
17374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_STATE;
17384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
17394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->gotLastFrame)
17404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
17414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (impl->lockFunction)
17424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->lockFunction(ESR_UNLOCK, impl->lockData);
17434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogMessage(L("ESR_INVALID_STATE: isLast=TRUE"));
17444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_STATE;
17454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
17464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (buffer == NULL && isLast == ESR_FALSE)
17474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
17484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (impl->lockFunction)
17494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->lockFunction(ESR_UNLOCK, impl->lockData);
17504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_ARGUMENT: got NULL  buffer on non-terminal frame"));
17514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
17524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
17534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rcBufWrite = CircularBufferWrite(impl->buffer, buffer, *bufferSize * SAMPLE_SIZE);
17554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rcBufWrite < 0)
17564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
17574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_INVALID_STATE;
1758b3adea6f471d03c5bd728725adc7ca1cea89edfdMarcus Oakland    PLogError(L("%s: error writing to buffer (buffer=%p, available=%u)"), ESR_rc2str(rc), impl->buffer, CircularBufferGetAvailable(impl->buffer));
17594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
17604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
17614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  nbWritten = (size_t)rcBufWrite;
17634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (nbWritten % SAMPLE_SIZE != 0)
17644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
17654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    size_t amountUnwritten;
17664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* The buffer is byte-based while we're sample based. Make sure we write entire samples or not at all */
17684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    amountUnwritten = CircularBufferUnwrite(impl->buffer, nbWritten % SAMPLE_SIZE);
17694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    passert(amountUnwritten == nbWritten % SAMPLE_SIZE);
17704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    nbWritten -= amountUnwritten;
17714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
17724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  passert(nbWritten % 2 == 0); /* make sure CircularBufferSize is divisible by 2 */
17734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (nbWritten < *bufferSize * SAMPLE_SIZE)
17754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
17764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_BUFFER_OVERFLOW;
17774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef NDEBUG
17784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLOG_DBG_TRACE((L("%s: writing to circular buffer"), ESR_rc2str(rc)));
17794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
17804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *bufferSize = nbWritten / SAMPLE_SIZE;
17814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (impl->lockFunction)
17824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->lockFunction(ESR_UNLOCK, impl->lockData);
17834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
17844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
17854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->lockFunction)
17864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->lockFunction(ESR_UNLOCK, impl->lockData);
17874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (isLast)
17894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->gotLastFrame = ESR_TRUE;
17904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
17914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
17924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
17934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
17944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* utility function to sort the ArrayList of nbest list results by the score of the first
17964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   semantic result */
17974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SemanticResults_SortByScore(ArrayList *results, size_t nbestSize)
17984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
17994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
18004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ArrayList* semanticResultList;
18014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ArrayList* semanticResultList_swap;
18024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_SemanticResult* semanticResult_i;
18034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_SemanticResult* semanticResult_j;
18044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t i, j;
18054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR scoreStr[MAX_ENTRY_LENGTH] ;
18064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t scoreStrLen = MAX_ENTRY_LENGTH ;
18074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int score_i, score_j;
18084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
18094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* bubble sort */
18104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < (size_t)nbestSize; ++i)
18114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
18124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (j = i + 1; j < (size_t)nbestSize; ++j)
18134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
18144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* get for i */
18154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, ArrayListGet(results, i, (void **)&semanticResultList)); /* nbest index */
18164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, ArrayListGet(semanticResultList, 0, (void **)&semanticResult_i));      /* semresult 0 */
18174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
18184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* get for j */
18194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, ArrayListGet(results, j, (void **)&semanticResultList)); /* nbest index */
18204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, ArrayListGet(semanticResultList, 0, (void **)&semanticResult_j));      /* semresult 0 */
18214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
18224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      scoreStrLen = MAX_ENTRY_LENGTH ;
18234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, semanticResult_i->getValue(semanticResult_i, "raws", scoreStr, &scoreStrLen));
18244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, lstrtoi(scoreStr, &score_i, 10));
18254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      scoreStrLen = MAX_ENTRY_LENGTH ;
18264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, semanticResult_j->getValue(semanticResult_j, "raws", scoreStr, &scoreStrLen));
18274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, lstrtoi(scoreStr, &score_j, 10));
18284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
18294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (score_j < score_i)
18304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
18314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* need to swap */
18324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, ArrayListGet(results, i, (void **)&semanticResultList_swap)); /* put i in swap */
18334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, ArrayListSet(results, i, semanticResultList));       /* put j in i    */
18344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, ArrayListSet(results, j, semanticResultList_swap));  /* put swap in j */
18354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
18364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
18374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
18384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
18394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
18404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
18414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
18424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
18434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode filter_CA_FullResultLabel(const LCHAR* label, LCHAR *filtered_label, size_t* boss, size_t* eoss)
18444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
18454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
18464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  enum
18474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
18484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    NO_COPY,
18494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FRAME,
18504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    WORD,
18514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  } filter_state = WORD;
18524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR *dst = filtered_label;
18534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR eosBuf[16]; /* max 9999 + '\0' */
18544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR bosBuf[16]; /* max 9999 + '\0' */
18554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR* pBuf = NULL;
18564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
18574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /**
18584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * example: you want to filter this:
18594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   *
18604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * "-pau-@23 clock@97 twenty_four@125 hour@145  "
18614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   *        ^boss = 23                       ^ eoss = 145
18624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * and get this:
18634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   *
18644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * "clock twenty_four hour"
18654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   */
18664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
18674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  passert(LSTRLEN(label) > 0);
18684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  while (*label)
18694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
18704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    switch (filter_state)
18714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
18724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      case NO_COPY:
18734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (*label == L(' '))
18744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          filter_state = WORD;
18754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        else if (*label == L('@'))
18764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
18774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          filter_state = FRAME;
18784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if (pBuf == NULL)
18794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            pBuf = bosBuf;
18804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          else
18814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
18824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            *pBuf = 0;
18834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            pBuf = eosBuf;
18844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
18854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
18864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        break;
18874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      case WORD:
18884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (*label == L('@'))
18894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
18904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          *dst = L(' '); /* insert space */
18914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          dst++;
18924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          filter_state = FRAME;
18934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if (pBuf == NULL)
18944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            pBuf = bosBuf;
18954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          else
18964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
18974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            *pBuf = 0;
18984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            pBuf = eosBuf;
18994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
19004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
19014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        else
19024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
19034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          *dst = *label;
19044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          dst++;
19054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
19064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        break;
19074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      case FRAME:
19084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (*label == L(' '))
19094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          filter_state = WORD;
19104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        else
19114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
19124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          *pBuf = *label;
19134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          pBuf++;
19144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
19154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        break;
19164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
19174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    label++;
19184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
19194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *dst = 0; /* term the string */
19204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *pBuf = 0; /* term the string */
19214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
19224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* trim the end spaces */
19234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  dst--;
19244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  while (*dst == ' ')
19254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *dst-- = '\0';
19264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
19274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* set the eos signal indicated by the end pointed data */
19284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (eosBuf[0] != 0)
1929b3adea6f471d03c5bd728725adc7ca1cea89edfdMarcus Oakland    CHKLOG(rc, lstrtosize_t(eosBuf, eoss, 10));
19304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
19314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    eoss = 0;
19324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
19334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (bosBuf[0] != 0)
1934b3adea6f471d03c5bd728725adc7ca1cea89edfdMarcus Oakland    CHKLOG(rc, lstrtosize_t(bosBuf, boss, 10));
19354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
19364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    boss = 0;
19374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
19384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
19394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
19404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
19414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
19424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
19434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
19444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Populates the recognizer result if it can, otherwise it returns NO MATCH cuz no results exist
19454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
19464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * INPUT STATE: SR_RECOGNIZER_INTERNAL_EOS
19474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
19484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @param self SR_Recognizer handle
19494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @todo break up into smaller functions
19504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
19514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerCreateResultImpl(SR_Recognizer* self, SR_RecognizerStatus* status,
19524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SR_RecognizerResultType* type)
19534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
19544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR label[MAX_ENTRY_LENGTH * 2];  /* run out of buffer */
19554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define WORDID_COUNT 48 /* can be quite high for voice enrollment! */
19564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  wordID wordIDs[WORDID_COUNT];
19574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR tok[80];
19584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR waveformFilename[P_PATH_MAX];
19594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR* pkey;
19604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* pgrammar;
19614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  asr_int32_t raws; /* raw score */
19624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t iBest, nbestSize, jBest, k, grammarSize, semanticResultsSize, grammarIndex_for_iBest;
19634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR* lValue;
19644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR* lValue2;
19654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int confValue;
19664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
19674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerResultImpl* resultImpl = (SR_RecognizerResultImpl*) impl->result;
19684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_BOOL containsKey;
19694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int valid, score, recogID;
19704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR result[MAX_ENTRY_LENGTH];
19714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t len, size;
19724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t locale;
19734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int current_choice;
19744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
19754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /**
19764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * Semantic result stuff
19774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   */
19784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* a temp buffer to hold semantic results of a parse (there may be several results) */
19794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_SemanticResult* semanticResults[MAX_SEM_RESULTS];
19804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ArrayList* semanticList;
19814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ArrayList* semanticList2;
19824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_SemanticResultImpl* semanticImpl;
19834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_SemanticResultImpl* semanticImpl2;
19844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_SemanticResult* semanticResult;
19854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_SemanticResult* semanticResult2;
19864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  waveform_buffering_state_t buffering_state;
19874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
19884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_AcousticModelsImpl* modelsImpl = (SR_AcousticModelsImpl*) impl->models;
19894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
19904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PTimeStamp EORT;
19914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
19924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_LockUtteranceFromInput(impl->utterance);
19934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!CA_EndRecognition(impl->recognizer, modelsImpl->pattern, impl->utterance))
19944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
19954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_STATE"));
19964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_STATE;
19974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
19984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
19994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* check if the forward search was successful */
20004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  valid = CA_FullResultLabel(impl->recognizer, result, MAX_ENTRY_LENGTH - 1);
20014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_GetRecogID(impl->recognizer, &recogID);
20024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_FullResultScore(impl->recognizer, &score, 1);
20034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SREC_ENGINE_VERBOSE_LOGGING
20044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PLogMessage(L("R: %s type %d score %d from recognizer%d"), result, type, score, valid, recogID);
20054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PLogMessage(L("R: %s score %d from recognizer%d"), result, score, valid, recogID);
20064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
20074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef _WIN32
20084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  //pfprintf(PSTDOUT, ("R: %s type %d score %d from recognizer%d\n"), result, type, score, valid, recogID);
20094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
20104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
20114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
20124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  switch (valid)
20134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
20144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case FULL_RESULT:
20154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, filter_CA_FullResultLabel(result, label, &impl->recogLogTimings.BOSS, &impl->recogLogTimings.EOSS));
20164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SREC_ENGINE_VERBOSE_LOGGING
20174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogMessage("R: %s", result);
20184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
20194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CA_FullResultScore(impl->recognizer, (int*) &raws, 0);
20204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SREC_ENGINE_VERBOSE_LOGGING
20214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogMessage("S: %d", raws);
20224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
20234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
20244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* now that we have an endpointed result, we can parse the result transcription
20254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         to see where speech started and ended. Then we can trim off excess parts of the
20264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         recorded audio waveform (if exists) so that nametags are just the right amount of
20274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         audio
20284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      */
20294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, WaveformBuffer_GetBufferingState(impl->waveformBuffer, &buffering_state));
20304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (buffering_state != WAVEFORM_BUFFERING_OFF)
20314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
20324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, WaveformBuffer_GetSize(impl->waveformBuffer, &size));
20334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (size > 0)
20344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
20354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          rc = WaveformBuffer_ParseEndPointedResultAndTrim(impl->waveformBuffer, result, impl->FRAME_SIZE);
20364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if (rc == ESR_BUFFER_OVERFLOW)
20374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
20384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            /* Nametag EOS occured beyond end of buffer */
20394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
20404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          else if (rc != ESR_SUCCESS)
20414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
20424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            PLogError(ESR_rc2str(rc));
20434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            goto CLEANUP;
20444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
20454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
20464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
20474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
20484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
20494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case REJECT_RESULT:
20504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SREC_ENGINE_VERBOSE_LOGGING
20514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogMessage(L("R: <REJECTED>"));
20524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
20534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
20544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    default:
20554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SREC_ENGINE_VERBOSE_LOGGING
20564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogMessage(L("E: No results available"));
20574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogMessage(L("R: <FAILED>"));
20584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
20594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
20604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
20614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
20624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
20634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (valid == FULL_RESULT)
20644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
20654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* Populate SR_RecognizerResult */
20664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    resultImpl->nbestList = CA_PrepareNBestList(impl->recognizer, 10, &raws);
20674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (resultImpl->nbestList == NULL)
20684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
20694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /*
20704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       * This is not a failure. It simply means that I have not advanced far
20714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       * enough in recognition in order to obtain results (no paths in
20724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       * graph). This occurs, for instance, when a eof is reached (no more data)
20734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       * and I have not even created any paths in my graph.
20744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       */
20754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
20764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *status = SR_RECOGNIZER_EVENT_NO_MATCH;
20774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
20784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
20794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->eventLog != NULL)
20804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
20814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RecognizerCreateResultImpl() -> SR_RECOGNIZER_INTERNAL_END")));
20824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
20834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
20844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
20854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
20864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      passert(0);
20874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_SUCCESS;
20884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
20894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
20904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    nbestSize = CA_NBestListCount(resultImpl->nbestList);
20914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
20924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
20934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    nbestSize = 0;
20944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
20954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (resultImpl->results != NULL)
20964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ArrayListRemoveAll(resultImpl->results);
20974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
20984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ArrayListCreate(&resultImpl->results));
20994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (nbestSize == 0)
21004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
21014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /*
21024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     * Got empty n-best list even though the recognition was successful.
21034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     * We handle this in the same way that recog_startpt does... we consider it a no match.
21044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     * We could adjust the CREC.Recognizer.viterbi_prune_thresh to a higher level, but that
21054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     * may not fix the problem completely. We need to fix the bug in the astar search!!!
21064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     */
21074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *status = SR_RECOGNIZER_EVENT_NO_MATCH;
21084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
21094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->internalState = SR_RECOGNIZER_INTERNAL_END;
21104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (impl->eventLog != NULL)
21114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
21124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RecognizerCreateResultImpl() -> SR_RECOGNIZER_INTERNAL_END")));
21134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
21144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
21154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
21164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
21174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SREC_ENGINE_VERBOSE_LOGGING
21184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogMessage(L("ESR_INVALID_STATE: got empty n-best list even though the recognition was successful"));
21194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
21204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_SUCCESS; /* we do not want to halt the app in this case */
21214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
21224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
21234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
21244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *status = SR_RECOGNIZER_EVENT_RECOGNITION_RESULT;
21254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
21264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->internalState = SR_RECOGNIZER_INTERNAL_END;
21274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (impl->eventLog != NULL)
21284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
21294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RecognizerCreateResultImpl() -> SR_RECOGNIZER_INTERNAL_END")));
21304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
21314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
21324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
21334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
21344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
21354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
21364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /**
21374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * All grammars associated with the recognizer are considered to be active
21384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * and therefore, I do a semantic parse on each. On the first grammar that
21394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * gives one or more semantic results, I stop parsing the other grammars.
21404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   */
21414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, impl->grammars->getSize(impl->grammars, &grammarSize));
21424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT( grammarSize == 1);
21434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
21444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (iBest = 0; iBest < nbestSize; ++iBest)
21454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
21464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    len = WORDID_COUNT;
21474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (CA_NBestListGetResultWordIDs(resultImpl->nbestList, iBest, wordIDs, &len, &raws) != ESR_SUCCESS)
21484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
21494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *status = SR_RECOGNIZER_EVENT_NO_MATCH;
21504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
21514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
21524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->eventLog != NULL)
21534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
21544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("SR_RecognizerCreateResultImpl() -> SR_RECOGNIZER_INTERNAL_END")));
21554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
21564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
21574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
21584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
21594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(L("ESR_INVALID_STATE: got bad n-best list entry %d"), iBest);
21604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_INVALID_STATE;
21614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
21624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
21634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ArrayListCreate(&semanticList));
21644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, resultImpl->results->add(resultImpl->results, semanticList));
21654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
21664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    grammarIndex_for_iBest = 0;
21674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, impl->grammars->getKeyAtIndex(impl->grammars, grammarIndex_for_iBest, &pkey));
21684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, impl->grammars->get(impl->grammars, pkey, (void **)&pgrammar));
21694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
21704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_GrammarGetSize_tParameter((SR_Grammar*) pgrammar, L("locale"), &locale));
21714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    resultImpl->locale = locale;
21724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
21734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* I need to manage my semantic results external to the check parse function */
21744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (k = 0; k < MAX_SEM_RESULTS; ++k)
21754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      SR_SemanticResultCreate(&semanticResults[k]);
21764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
21774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /*
21784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       The code here tries to make the voice-enrollment more effective.
21794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       The VE grammar decodes a sequence of best phonemes, but the nbest
21804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       processing may find a better score for an alternative choice than
21814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       the score of the viterbi best choice.  The reason for this is that
21824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       alternative choices don't honor cross-word context-dependency quite
21834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       accurately.  If we choose an alternative choice then the sequence of
21844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       phoneme decoded does not correspond to the sequence of models decoded.
21854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       To counter this, we FORCIBLY make sure the top choice here is the
21864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       VITERBI top choice.
21874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    */
21884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
21894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (iBest == 0)
21904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
21914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (CA_IsEnrollmentSyntax( pgrammar->syntax)) {
21924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          /* this was voice enrollment, so let's try to replace */
21934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          // 	char* word1 = CA_NBestListGetResultWord(resultImpl->nbestList,wordIDs[0]);
21944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          // char* word2 = CA_NBestListGetResultWord(resultImpl->nbestList,wordIDs[1]);
21954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          // if (!strncmp(word1,voice_enroll_word_prefix,VEWPLEN)&&!strncmp(word2,voice_enroll_word_prefix,VEWPLEN))
21964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          len = WORDID_COUNT;
21974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          rc = CA_FullResultWordIDs(impl->recognizer, wordIDs, &len);
21984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if (rc != ESR_SUCCESS)
21994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            {
22004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              /* in case of problem with viterbi path choice, we revert back */
22014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              len = WORDID_COUNT;
22024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              rc = CA_NBestListGetResultWordIDs(resultImpl->nbestList, iBest, wordIDs, &len, &raws) ;
22034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            }
22044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
22054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
22064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
22074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LSTRCPY(label, L(""));
22084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (k = 0; wordIDs[k] != MAXwordID; ++k)
22094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
22104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        LCHAR* wordk = NULL;
22114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        wordk = CA_NBestListGetResultWord(resultImpl->nbestList,wordIDs[k]);
22124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        LSTRCAT(label, wordk);
22134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        LSTRCAT(label, L(" "));
22144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
22154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, CA_ResultStripSlotMarkers(label));
22164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    passert(LSTRCMP(label, L("")) != 0);
22174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
22184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* strip the trailing blank */
22194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    k = LSTRLEN(label) - 1;
22204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (k > 0 && label[k] == L(' '))
22214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      label[k] = 0;
22224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
22234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    semanticResultsSize = MAX_SEM_RESULTS;
22244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
22254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if SEMPROC_ACTIVE
22264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
22274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* set the literal prior to processing so that semproc can read the value
22284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       during processing */
22294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, pgrammar->semproc->flush(pgrammar->semproc));
22304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, pgrammar->semproc->setParam(pgrammar->semproc, L("literal"), label));
22314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
22324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = pgrammar->semproc->checkParseByWordID(pgrammar->semproc, pgrammar->semgraph,
22334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                               wordIDs, semanticResults, &semanticResultsSize);
22344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
22354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* rc = pgrammar->semproc->checkParse(pgrammar->semproc, pgrammar->semgraph,
22364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       label, semanticResults, &semanticResultsSize); */
22374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
22384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc != ESR_SUCCESS)
22394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
22404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        for (k = 0; k < MAX_SEM_RESULTS; ++k)
22414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
22424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            semanticResults[k]->destroy(semanticResults[k]);
22434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            semanticResults[k] = NULL;
22444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
22454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        goto CLEANUP;
22464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
22474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
22484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    semanticResultsSize = 0;
22494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
22504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* cleanup the empty ones */
22514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (k = semanticResultsSize; k < MAX_SEM_RESULTS; ++k)
22524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
22534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, semanticResults[k]->destroy(semanticResults[k]));
22544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        semanticResults[k] = NULL;
22554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
22564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
22574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* save the good ones */
22584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (k = 0; k < semanticResultsSize; ++k)
22594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
22604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /*
22614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         * Save the pointer to the semantic result that was created.
22624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         * Remember that the semantic result array only holds pointers
22634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         * and for each time that the function is called, new semantic results
22644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         * are created, and the pointers overwrite old values in the array
22654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         */
22664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, semanticList->add(semanticList, semanticResults[k]));
22674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
22684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
22694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if SEMPROC_ACTIVE
22704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (semanticResultsSize > 0)
22714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
22724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* OSI log the grammar(s) that was used in recognizing */
2273b3adea6f471d03c5bd728725adc7ca1cea89edfdMarcus Oakland        psprintf(tok, L("GURI%zd"), grammarIndex_for_iBest);
22744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("GRMR"), tok));
22754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
22764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
22774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* OSI log the grammar(s) that was used in recognizing */
22784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    psprintf(tok, L("GURI%d"), grammarIndex_for_iBest);
22794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("GRMR"), tok));
22804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
22814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
22824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* Populate semantic results for each nbest list entry */
22834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, semanticList->getSize(semanticList, &semanticResultsSize));
22844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (semanticResultsSize == 0)
22854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
22864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /*
22874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       * If there was no semantic result... then I need to create one so that I can store
22884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       * literal, conf, meaning which are default keys that must ALWAYS exist
22894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       */
22904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_SemanticResultCreate(&semanticResult));
22914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, semanticList->add(semanticList, semanticResult));
22924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      semanticResultsSize = 1;
22934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
22944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
22954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (k = 0; k < semanticResultsSize;++k)
22964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
22974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, semanticList->get(semanticList, k, (void **)&semanticResult));
22984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (semanticResult == NULL)
22994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
23004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLogError(L("nbest entry contained NULL semanticResult"), ESR_INVALID_STATE);
23014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return ESR_INVALID_STATE;
23024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
23034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
23044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      semanticImpl = (SR_SemanticResultImpl*) semanticResult;
23054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
23064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* put in the literal */
23074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      lValue = MALLOC(sizeof(LCHAR) * (LSTRLEN(label) + 1), MTAG);
23084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (lValue == NULL)
23094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
23104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLogError(L("ESR_OUT_OF_MEMORY"));
23114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return ESR_OUT_OF_MEMORY;
23124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
23134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      LSTRCPY(lValue, label);
23144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, semanticImpl->results->put(semanticImpl->results, L("literal"), lValue));
23154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
23164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* if the meaning is not set, then put in the meaning which will be the literal */
23174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, semanticImpl->results->containsKey(semanticImpl->results, L("meaning"), &containsKey));
23184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (!containsKey)
23194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
23204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        lValue = MALLOC(sizeof(LCHAR) * (LSTRLEN(label) + 1), MTAG);
23214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (lValue == NULL)
23224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
23234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          PLogError(L("ESR_OUT_OF_MEMORY"));
23244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          return ESR_OUT_OF_MEMORY;
23254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
23264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        LSTRCPY(lValue, label);
23274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, semanticImpl->results->put(semanticImpl->results, L("meaning"), lValue));
23284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
23294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
23304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* put in the raw score */
23314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      psprintf(label, L("%d"), raws);
23324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      lValue = MALLOC(sizeof(LCHAR) * (LSTRLEN(label) + 1), MTAG);
23334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (lValue == NULL)
23344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
23354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLogError(L("ESR_OUT_OF_MEMORY"));
23364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return ESR_OUT_OF_MEMORY;
23374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
23384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      LSTRCPY(lValue, label);
23394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, semanticImpl->results->put(semanticImpl->results, L("raws"), lValue));
23404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
23414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
23424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
23434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Now I have an nBest list where each entry has at least one semantic result */
23444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* What I need to do is filter out the nBest list entries which have matching
23454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     semantic results for 'meaning' */
23464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Once I have filtered out the nBest list based on this criteria, I can calculate the confidence
23474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     score and populate the result of the first entry with the raw score */
23484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
23494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if FILTER_NBEST_BY_SEM_RESULT
23504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
23514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (iBest = nbestSize-1; iBest>0; iBest--) /* do not filter out nBest entry 0 */
23524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
23534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /**
23544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     * This is the entry (indexed by i) targeted for removal
23554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     *
23564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     */
23574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
23584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* get the nBest entry which you wish to remove (if duplicate found) */
23594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ArrayListGet(resultImpl->results, iBest, (void **)&semanticList));
23604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
23614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* get the first sem_result for the entry */
23624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ArrayListGet(semanticList, 0, (void **)&semanticResult));
23634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    semanticImpl = (SR_SemanticResultImpl*) semanticResult;
23644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
23654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* get the meaning */
23664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, semanticImpl->results->get(semanticImpl->results, L("meaning"), (void **)&lValue));
23674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
23684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* get the other entries to check against (start with 0, end on the current i entry) */
23694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (jBest = 0; jBest < iBest; ++jBest)
23704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
23714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /*
23724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       * This is the entry (indexed by jBest) that we will compare with
23734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       */
23744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
23754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* get the nBest entry which you wish to compare with */
23764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, ArrayListGet(resultImpl->results, jBest, (void **)&semanticList2));
23774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
23784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, ArrayListGet(semanticList2, 0, (void **)&semanticResult2));
23794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      semanticImpl2 = (SR_SemanticResultImpl*) semanticResult2;
23804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
23814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, semanticImpl2->results->get(semanticImpl2->results, L("meaning"), (void **)&lValue2));
23824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (LSTRCMP(lValue, lValue2) == 0)
23834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
23844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* pfprintf(PSTDOUT,"duplicate sem result found %d == %d\n", iBest, jBest);
23854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        pfprintf(PSTDOUT,"removing %d\n", iBest); */
23864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
23874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* removing from the list indexed by iBest */
23884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, semanticList->remove(semanticList, semanticResult));
23894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, semanticResult->destroy(semanticResult));
23904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
23914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, resultImpl->results->remove(resultImpl->results, semanticList));
23924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, semanticList->destroy(semanticList));
23934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
23944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (!CA_NBestListRemoveResult(resultImpl->nbestList, iBest))
23954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          return ESR_ARGUMENT_OUT_OF_BOUNDS;
23964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        break;
23974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
23984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
23994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
24004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  nbestSize = CA_NBestListCount(resultImpl->nbestList);
24014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
24024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
24034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ArrayListGetSize(resultImpl->results, &nbestSize));
24044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
24054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (nbestSize)
24064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
24074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   if(CA_ComputeConfidenceValues(impl->confidenceScorer, impl->recognizer, resultImpl->nbestList))
24084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return ESR_INVALID_STATE;
24094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
24104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   for(current_choice=nbestSize-1;current_choice>=0;current_choice--)
24114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   {
24124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* get the nBest entry you want to deal with */
24134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ArrayListGet(resultImpl->results, current_choice, (void **)&semanticList));
24144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* get the first sem_result for that entry */
24154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ArrayListGet(semanticList, 0, (void **)&semanticResult));
24164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    semanticImpl = (SR_SemanticResultImpl*) semanticResult;
24174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
24184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* put in the conf value for that nBest entry */
24194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(!CA_NBestListGetResultConfidenceValue( resultImpl->nbestList, current_choice, &confValue))
24204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_ARGUMENT_OUT_OF_BOUNDS;
24214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
24224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    psprintf(label, L("%d"), confValue);
24234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    lValue = MALLOC(sizeof(LCHAR) * (LSTRLEN(label) + 1), MTAG);
24244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (lValue == NULL)
24254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
24264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLogError(L("ESR_OUT_OF_MEMORY"));
24274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return ESR_OUT_OF_MEMORY;
24284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
24294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      LSTRCPY(lValue, label);
24304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, semanticImpl->results->put(semanticImpl->results, L("conf"),lValue));
24314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
24324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("CMPT"), 0));
24334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
24344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
24354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* OSI log the end of recognition and all bufferred tokens */
24364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
24374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* OSI log end of recognition time */
24384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PTimeStampSet(&EORT);
24394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->recogLogTimings.EORT = PTimeStampDiff(&EORT, &impl->timestamp);
24404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->recogLogTimings.DURS = impl->processed * MSEC_PER_FRAME;
24414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
24424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*****************************************/
24434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* OSI Logging stuff */
24444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*****************************************/
24454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectif( impl->osi_log_level != 0)
24464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project {
24474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* get the nBest size (this size may have changed since previous set cuz of nbest list filtering) */
24484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ArrayListGetSize(resultImpl->results, &nbestSize));
24494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* OSI log the nBest list size */
24504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("NBST"), nbestSize));
24514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
24524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
24534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (iBest = 0; iBest < nbestSize; iBest++) /* loop */
24544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
24554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* get the nBest entry */
24564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ArrayListGet(resultImpl->results, iBest, (void**)&semanticList));
24574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
24584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* get the first sem_result for the entry (ther emay be many, but ignore others) */
24594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ArrayListGet(semanticList, 0, (void **)&semanticResult));
24604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    semanticImpl = (SR_SemanticResultImpl*) semanticResult;
24614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
24624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* get the meaning and OSI log it */
24634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, semanticImpl->results->get(semanticImpl->results, L("meaning"), (void **)&lValue));
24644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* OSI log RSLT (meaning) for nbest item */
24654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("RSLT"), lValue));
24664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
24674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* get the literal and OSI log it */
24684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, semanticImpl->results->get(semanticImpl->results, L("literal"), (void **)&lValue));
24694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* OSI log RAWT SPOK (literal) for nbest item */
24704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("RAWT"), lValue));
24714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("SPOK"), lValue));
24724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
24734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* get the score and OSI log it */
24744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, semanticImpl->results->get(semanticImpl->results, L("raws"), (void **)&lValue));
24754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* OSI log RAWS (score) for nbest item */
24764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("RAWS"), lValue));
24774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* get the confidence value and OSI log it */
24784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, semanticImpl->results->get(semanticImpl->results, L("conf"), (void **)&lValue));
24794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* OSI log CONF (values) for nbest item */
24804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("CONF"), lValue));
24814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
24824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
24834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* log the values */
24844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("BORT"), impl->recogLogTimings.BORT));
24854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("DURS"), impl->recogLogTimings.DURS));
24864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("EORT"), impl->recogLogTimings.EORT));
24874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("EOSD"), impl->recogLogTimings.EOSD));
24884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("EOSS"), impl->recogLogTimings.EOSS));
24894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("EOST"), impl->recogLogTimings.EOST));
24904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->osi_log_level & OSI_LOG_LEVEL_AUDIO)
24914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
24924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    len = P_PATH_MAX;
24934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogAudioGetFilename(impl->eventLog, waveformFilename, &len));
24944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("WVNM"), waveformFilename));
24954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
24964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("RSTT"), L("ok")));
24974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("RENR"), L("ok")));
24984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("ENDR"), impl->eos_reason));
24994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIrcnd")));
25004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
25014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("BOSS"), impl->recogLogTimings.BOSS)); /* extra not in OSI spec */
25024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("ESRboss")));
25034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
25044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*
25054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * Record which recognizer was the successful one (male or female)
25064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * this index refers to the order in the swimdllist file.
25074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   */
25084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, CA_GetRecogID(impl->recognizer, &recogID));
25094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("RECOG"), recogID));
25104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("ESRrcid")));
25114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
25124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Record semantic results returned by top nbestlist entry */
25134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (1)
25144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
25154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MAX_SEMANTIC_KEYS 50
25164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LCHAR* semanticKeys[MAX_SEMANTIC_KEYS];
25174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SEMANTIC_VALUE_SIZE 512
25184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LCHAR semanticValue[SEMANTIC_VALUE_SIZE];
25194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    size_t num_semanticKeys;
25204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
25214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = resultImpl->results->getSize(resultImpl->results, &nbestSize);
25224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc != ESR_SUCCESS)
25234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
25244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(ESR_rc2str(rc));
25254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto DONE;
25264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
25274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (iBest = 0; iBest < nbestSize; ++iBest) /* loop2 */
25284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
25294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = resultImpl->results->get(resultImpl->results, iBest, (void **)&semanticList);
25304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (rc != ESR_SUCCESS)
25314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
25324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLogError(ESR_rc2str(rc));
25334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        goto DONE;
25344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
25354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
25364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  /* semanticResultsSize is the number of semantic meanings, although
25374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		 ambiguous parses are not entirely supported
25384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		 num_semanticKeys    is associated to a particular parse         */
25394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
25404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = semanticList->getSize(semanticList, &semanticResultsSize);
25414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (rc != ESR_SUCCESS)
25424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
25434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLogError(ESR_rc2str(rc));
25444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        goto DONE;
25454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
25464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (k = 0; k < semanticResultsSize; ++k)
25474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
25484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		size_t iKey;
25494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        rc = semanticList->get(semanticList, k, (void **)&semanticResult);
25504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (rc != ESR_SUCCESS)
25514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
25524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          PLogError(ESR_rc2str(rc));
25534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          goto DONE;
25544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
25554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        num_semanticKeys = MAX_SEMANTIC_KEYS;
25564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        rc = semanticResult->getKeyList(semanticResult, (LCHAR**) & semanticKeys, &num_semanticKeys);
25574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (rc != ESR_SUCCESS)
25584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
25594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          PLogError(ESR_rc2str(rc));
25604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          goto DONE;
25614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
25624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
25634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        for (iKey=0; iKey<num_semanticKeys; ++iKey)
25644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
25654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          len = SEMANTIC_VALUE_SIZE;
25664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          rc = semanticResult->getValue(semanticResult, semanticKeys[iKey], (LCHAR*) &semanticValue, &len);
25674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if (rc != ESR_SUCCESS)
25684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
25694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            PLogError(ESR_rc2str(rc));
25704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            goto DONE;
25714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
25724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
25734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          rc = SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, semanticKeys[iKey], semanticValue);
25744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if (rc != ESR_SUCCESS)
25754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
25764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            PLogError(ESR_rc2str(rc));
25774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            goto DONE;
25784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
25794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
25804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
25814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
25824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("ESR_SemanticResult[0]"));
25834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc != ESR_SUCCESS)
25844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
25854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(ESR_rc2str(rc));
25864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto DONE;
25874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
25884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
25894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
25904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectDONE:
25914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
25924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
25934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->internalState = SR_RECOGNIZER_INTERNAL_END;
25944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
25954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
25964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
25974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
25984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Indicates if it is possible to push data from SREC into the internal recognizer.
25994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * If data can be pushed, ESR_CONTINUE_PROCESSING is returned.
26004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
26014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * INPUT STATES: SR_RECOGNIZER_INTERNAL_BOS_DETECTION, SR_RECOGNIZER_INTERNAL_EOS_DETECTION
26024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * OUTPUT STATES: same or SR_RECOGNIZER_INTERNAL_EOI
26034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
2604b3ebba80015c624b4fe5c24b6b2067ee4ca3dd22Edwin Vanestatic PINLINE ESR_ReturnCode canPushAudioIntoRecognizer(SR_RecognizerImpl* impl)
26054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
26064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
26074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
26084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->lockFunction)
26094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->lockFunction(ESR_LOCK, impl->lockData);
26104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
26114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* do I have enough to make a frame ? */
26124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (CircularBufferGetSize(impl->buffer) < impl->FRAME_SIZE)
26134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
26144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* Not enough data */
26154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (!impl->gotLastFrame)
26164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
26174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* not last frame, so ask for more audio */
26184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->lockFunction)
26194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        impl->lockFunction(ESR_UNLOCK, impl->lockData);
26204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_SUCCESS;
26214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
26224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
26234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
26244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* last frame, make do with what you have */
26254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->lockFunction)
26264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        impl->lockFunction(ESR_UNLOCK, impl->lockData);
26274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SREC_ENGINE_VERBOSE_LOGGING
26284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogMessage("L: Voicing END (EOI) at %d frames (%d processed)", impl->frames, impl->processed);
26294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
26304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->isRecognizing = ESR_FALSE;
26314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->recogLogTimings.EOSD = impl->frames;
26324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->eos_reason = L("EOI");
26334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->internalState = SR_RECOGNIZER_INTERNAL_EOI;
26344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->eventLog != NULL)
26354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
26364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("canPushAudioIntoRecognizer() -> SR_RECOGNIZER_INTERNAL_EOI")));
26374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
26384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
26394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
26404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
26414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_CONTINUE_PROCESSING;
26424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
26434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
26444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->lockFunction)
26454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->lockFunction(ESR_UNLOCK, impl->lockData);
26464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_CONTINUE_PROCESSING;
26474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
26484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
26494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
26504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
26514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
26524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Pushes data from SREC into the internal recognizer.
26534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
26544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * INPUT STATES: SR_RECOGNIZER_INTERNAL_BOS_DETECTION, SR_RECOGNIZER_INTERNAL_EOS_DETECTION
26554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * OUTPUT STATES: same
26564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
2657b3ebba80015c624b4fe5c24b6b2067ee4ca3dd22Edwin Vanestatic PINLINE ESR_ReturnCode pushAudioIntoRecognizer(SR_RecognizerImpl* impl, SR_RecognizerStatus* status,
26584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SR_RecognizerResultType* type,
26594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SR_RecognizerResult* result)
26604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
26614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t count;
26624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
26634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
26644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (CA_GetUnprocessedFramesInUtterance(impl->utterance) > 0 && impl->frames >= impl->bgsniff)
26654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
26664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* Don't push frames unless they're needed */
26674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
26684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* Check for leaked state */
26694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    passert(*status == SR_RECOGNIZER_EVENT_INVALID && *type == SR_RECOGNIZER_RESULT_TYPE_INVALID);
26704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_CONTINUE_PROCESSING;
26714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
26724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->lockFunction)
26734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->lockFunction(ESR_LOCK, impl->lockData);
26744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  count = CircularBufferRead(impl->buffer, impl->audioBuffer, impl->FRAME_SIZE);
26754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->lockFunction)
26764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->lockFunction(ESR_UNLOCK, impl->lockData);
26774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
26784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  WaveformBuffer_Write(impl->waveformBuffer, impl->audioBuffer, count);
26794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->osi_log_level & OSI_LOG_LEVEL_AUDIO)
26804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
26814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = SR_EventLogAudioWrite(impl->eventLog, impl->audioBuffer, count);
26824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc == ESR_BUFFER_OVERFLOW)
26834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = ESR_INVALID_STATE;
26844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc != ESR_SUCCESS)
26854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
26864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(ESR_rc2str(rc));
26874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->lockFunction)
26884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        impl->lockFunction(ESR_UNLOCK, impl->lockData);
26894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
26904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
26914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
26924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (count < impl->FRAME_SIZE)
26934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
26944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_INVALID_STATE;
26954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("%s: error reading buffer data (count=%d, frameSize=%d)"), ESR_rc2str(rc), count, impl->FRAME_SIZE);
26964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
26974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
26984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!CA_LoadSamples(impl->wavein, impl->audioBuffer, impl->sampleRate / FRAMERATE))
26994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
27004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_STATE"));
27014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_INVALID_STATE;
27024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
27034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
27044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
27054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_ConditionSamples(impl->wavein);
27064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Check for leaked state */
27074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  passert(*status == SR_RECOGNIZER_EVENT_INVALID && *type == SR_RECOGNIZER_RESULT_TYPE_INVALID);
27084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_CONTINUE_PROCESSING;
27094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
27104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
27114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
27124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
27134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
27144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * INPUT STATES: SR_RECOGNIZER_INTERNAL_BOS_DETECTION, SR_RECOGNIZER_INTERNAL_EOS_DETECTION
27154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * OUTPUT STATES: same
27164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
2717b3ebba80015c624b4fe5c24b6b2067ee4ca3dd22Edwin Vanestatic PINLINE ESR_ReturnCode generateFrameFromAudio(SR_RecognizerImpl* impl, SR_RecognizerStatus* status,
27184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SR_RecognizerResultType* type,
27194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SR_RecognizerResult* result)
27204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
27214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (CA_GetUnprocessedFramesInUtterance(impl->utterance) > 0 && impl->frames >= impl->bgsniff)
27224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
27234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* Don't create frames unless they're needed */
27244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
27254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* Check for leaked state */
27264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    passert(*status == SR_RECOGNIZER_EVENT_INVALID && *type == SR_RECOGNIZER_RESULT_TYPE_INVALID);
27274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_CONTINUE_PROCESSING;
27284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
27294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
27304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Try processing one frame */
27314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!CA_MakeFrame(impl->frontend, impl->utterance, impl->wavein))
27324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
27334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /*
27344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    * One of three cases occured:
27354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *
27364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    * - We don't have enough samples to process one frame. This should be impossible because
27374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    * pushAudioIntoRecognizer() is always called before us and will not continue if we don't
27384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    * have enough samples.
27394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *
27404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    * - The internal recognizer needs a minimum amount of audio before it'll begin generating
27414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *   frames. This is normal and we return with a success value.
27424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *
27434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    * - The recognizer skips every even frame number (for performance reasons). This is normal
27444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *   and we return with a success value.
27454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    */
27464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *status = SR_RECOGNIZER_EVENT_INCOMPLETE;
27474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
27484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_SUCCESS;
27494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
27504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ++impl->frames;
27514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Check for leaked state */
27524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  passert(*status == SR_RECOGNIZER_EVENT_INVALID && *type == SR_RECOGNIZER_RESULT_TYPE_INVALID);
27534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_CONTINUE_PROCESSING;
27544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
27554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
27564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
27574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * INPUT STATES: SR_RECOGNIZER_INTERNAL_EOS_DETECTION
27584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * OUTPUT STATES: same
27594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
2760b3ebba80015c624b4fe5c24b6b2067ee4ca3dd22Edwin Vanestatic PINLINE ESR_ReturnCode generateFrameStats(SR_RecognizerImpl* impl, SR_RecognizerStatus* status,
27614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                           SR_RecognizerResultType* type,
27624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                           SR_RecognizerResult* result)
27634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
27644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->frames < impl->bgsniff)
27654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
27664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* Wait until we have enough frames to estimate background stats */
27674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *status = SR_RECOGNIZER_EVENT_INCOMPLETE;
27684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
27694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_SUCCESS;
27704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
27714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else if (impl->frames == impl->bgsniff)
27724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_CalculateUtteranceStatistics(impl->utterance, 0, impl->bgsniff);
27734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
27744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Check for leaked state */
27754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  passert(*status == SR_RECOGNIZER_EVENT_INVALID && *type == SR_RECOGNIZER_RESULT_TYPE_INVALID);
27764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_CONTINUE_PROCESSING;
27774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
27784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
27794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
27804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * INPUT STATES: SR_RECOGNIZER_INTERNAL_EOS_DETECTION
27814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * OUTPUT STATES: same or SR_RECOGNIZER_INTERNAL_EOI, SR_RECOGNIZER_INTERNAL_EOS
27824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
2783b3ebba80015c624b4fe5c24b6b2067ee4ca3dd22Edwin Vanestatic PINLINE ESR_ReturnCode generatePatternFromFrame(SR_RecognizerImpl* impl, SR_RecognizerStatus* status,
27844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SR_RecognizerResultType* type,
27854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SR_RecognizerResult* result)
27864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
27874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_AcousticModelsImpl* modelsImpl;
27884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
27894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
27904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Run the search */
27914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  modelsImpl = (SR_AcousticModelsImpl*) impl->models;
27924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!CA_MakePatternFrame(modelsImpl->pattern, impl->utterance))
27934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
27944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *status = SR_RECOGNIZER_EVENT_NO_MATCH;
27954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
27964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->internalState = SR_RECOGNIZER_INTERNAL_END;
27974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (impl->eventLog != NULL)
27984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
27994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("generatePatternFromFrame() -> SR_RECOGNIZER_INTERNAL_END")));
28004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
28014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
28024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
28034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
28044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_STATE"));
28054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_STATE;
28064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
28074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!CA_AdvanceUtteranceFrame(impl->utterance))
28084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
28094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *status = SR_RECOGNIZER_EVENT_NO_MATCH;
28104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
28114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->internalState = SR_RECOGNIZER_INTERNAL_END;
28124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (impl->eventLog != NULL)
28134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
28144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("canPushAudioIntoRecognizer() -> SR_RECOGNIZER_INTERNAL_END")));
28154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
28164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
28174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
28184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
28194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_STATE"));
28204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_STATE;
28214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
28224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_AdvanceRecognitionByFrame(impl->recognizer, modelsImpl->pattern, impl->utterance);
28234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ++impl->processed;
28244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
28254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->lockFunction)
28264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->lockFunction(ESR_LOCK, impl->lockData);
28274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->gotLastFrame && CircularBufferGetSize(impl->buffer) < impl->FRAME_SIZE)
28284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
28294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /*
28304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     * SREC have run out of data but the underlying recognizer might have some frames
28314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     * queued for processing.
28324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     */
28334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (CA_GetUnprocessedFramesInUtterance(impl->utterance) > 0)
28344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
28354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* EOI means end of input */
28364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SREC_ENGINE_VERBOSE_LOGGING
28374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogMessage("L: Voicing END (EOI) at %d frames (%d processed)", impl->frames, impl->processed);
28384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
28394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->isRecognizing = ESR_FALSE;
28404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->recogLogTimings.EOSD = impl->frames;
28414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->eos_reason = L("EOI");
28424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->internalState = SR_RECOGNIZER_INTERNAL_EOI;
28434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->eventLog != NULL)
28444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
28454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("generatePatternFromFrame() -> SR_RECOGNIZER_INTERNAL_EOI")));
28464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
28474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
28484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
28494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
28504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
28514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
28524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
28534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SREC_ENGINE_VERBOSE_LOGGING
28544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogMessage("L: Voicing END (EOF) at %d frames (%d processed)", impl->frames, impl->processed);
28554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
28564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
28574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->isRecognizing = ESR_FALSE;
28584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->recogLogTimings.EOSD = impl->frames;
28594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->eos_reason = L("EOF");
28604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->internalState = SR_RECOGNIZER_INTERNAL_EOS;
28614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->eventLog != NULL)
28624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
28634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("generatePatternFromFrame() -> SR_RECOGNIZER_INTERNAL_EOS")));
28644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
28654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
28664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
28674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
28684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *status = SR_RECOGNIZER_EVENT_END_OF_VOICING;
28694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
28704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      passert(impl->processed == impl->frames);
28714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->lockFunction)
28724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        impl->lockFunction(ESR_UNLOCK, impl->lockData);
28734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_SUCCESS;
28744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
28754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
28764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->lockFunction)
28774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->lockFunction(ESR_UNLOCK, impl->lockData);
28784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
28794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Check for leaked state */
28804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  passert(*status == SR_RECOGNIZER_EVENT_INVALID && *type == SR_RECOGNIZER_RESULT_TYPE_INVALID);
28814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_CONTINUE_PROCESSING;
28824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
28834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
28844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
28854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
28864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
28874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Same as generatePatternFromFrame() only the buffer is known to be empty.
28884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
28894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * INPUT STATES: SR_RECOGNIZER_INTERNAL_EOI
28904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * OUTPUT STATES: same or SR_RECOGNIZER_INTERNAL_EOS
28914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
2892b3ebba80015c624b4fe5c24b6b2067ee4ca3dd22Edwin Vanestatic PINLINE ESR_ReturnCode generatePatternFromFrameEOI(SR_RecognizerImpl* impl, SR_RecognizerStatus* status,
28934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SR_RecognizerResultType* type,
28944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SR_RecognizerResult* result)
28954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
28964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_AcousticModelsImpl* modelsImpl;
28974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
28984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
28994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Run the search */
29004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  modelsImpl = (SR_AcousticModelsImpl*) impl->models;
29014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
29024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (CA_GetUnprocessedFramesInUtterance(impl->utterance) <= 0)
29034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
29044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    passert(impl->processed == impl->frames);
29054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *status = SR_RECOGNIZER_EVENT_END_OF_VOICING;
29064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
29074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->internalState = SR_RECOGNIZER_INTERNAL_EOS;
29084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_SUCCESS;
29094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
29104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
29114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!CA_MakePatternFrame(modelsImpl->pattern, impl->utterance))
29124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
29134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *status = SR_RECOGNIZER_EVENT_NO_MATCH;
29144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
29154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->internalState = SR_RECOGNIZER_INTERNAL_END;
29164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (impl->eventLog != NULL)
29174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
29184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("generatePatternFromFrameEOI() -> SR_RECOGNIZER_INTERNAL_END")));
29194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
29204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
29214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
29224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
29234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_STATE"));
29244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_STATE;
29254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
29264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!CA_AdvanceUtteranceFrame(impl->utterance))
29274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
29284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *status = SR_RECOGNIZER_EVENT_NO_MATCH;
29294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
29304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->internalState = SR_RECOGNIZER_INTERNAL_END;
29314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (impl->eventLog != NULL)
29324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
29334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("generatePatternFromFrameEOI() -> SR_RECOGNIZER_INTERNAL_END")));
29344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
29354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
29364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
29374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
29384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_STATE"));
29394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_STATE;
29404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
29414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_AdvanceRecognitionByFrame(impl->recognizer, modelsImpl->pattern, impl->utterance);
29424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ++impl->processed;
29434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
29444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->lockFunction)
29454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->lockFunction(ESR_LOCK, impl->lockData);
29464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
29474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (CA_GetUnprocessedFramesInUtterance(impl->utterance) <= 0)
29484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
29494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    passert(impl->processed == impl->frames);
29504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *status = SR_RECOGNIZER_EVENT_END_OF_VOICING;
29514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
29524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->internalState = SR_RECOGNIZER_INTERNAL_EOS;
29534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (impl->eventLog != NULL)
29544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
29554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("generatePatternFromFrameEOI() -> SR_RECOGNIZER_INTERNAL_EOS")));
29564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
29574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
29584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
29594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
29604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (impl->lockFunction)
29614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->lockFunction(ESR_UNLOCK, impl->lockData);
29624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_SUCCESS;
29634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
29644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->lockFunction)
29654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->lockFunction(ESR_UNLOCK, impl->lockData);
29664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
29674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Check for leaked state */
29684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  passert(*status == SR_RECOGNIZER_EVENT_INVALID && *type == SR_RECOGNIZER_RESULT_TYPE_INVALID);
29694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_CONTINUE_PROCESSING;
29704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
29714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->lockFunction)
29724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->lockFunction(ESR_UNLOCK, impl->lockData);
29734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
29744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
29754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
29764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
29774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
29784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * INPUT STATES: SR_RECOGNIZER_INTERNAL_EOI, SR_RECOGNIZER_INTERNAL_EOS_DETECTION
29794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * OUTPUT STATES: same or SR_RECOGNIZER_INTERNAL_EOS
29804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
29814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode detectEndOfSpeech(SR_RecognizerImpl* impl, SR_RecognizerStatus* status,
29824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                 SR_RecognizerResultType* type,
29834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                 SR_RecognizerResult* result)
29844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
29854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  EOSrc eos; /* eos means end of speech */
29864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int eos_by_level; /* eos means end of speech */
29874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PTimeStamp timestamp;
29884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
29894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_BOOL enableGetWaveform = ESR_FALSE;
29904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
29914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  eos_by_level = CA_UtteranceHasEnded(impl->utterance);
29924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (eos_by_level)
29934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
29944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    eos = SPEECH_ENDED_BY_LEVEL_TIMEOUT;
29954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
29964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
29974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
29984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    eos = CA_IsEndOfUtteranceByResults(impl->recognizer);
29994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
30004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
30014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_SessionGetBool(L("enableGetWaveform"), &enableGetWaveform);
30024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  //impl->parameters->getBool(impl->parameters, L("enableGetWaveform"), &enableGetWaveform);
30034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
30044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (eos == VALID_SPEECH_CONTINUING && enableGetWaveform && impl->waveformBuffer->overflow_count > 0)
30054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
30064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    size_t bufferSize;
30074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, WaveformBuffer_GetSize(impl->waveformBuffer, &bufferSize));
30084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogMessage("Forcing EOS due to wfbuf overflow (fr=%d,sz=%d,of=%d)", impl->frames, bufferSize, impl->waveformBuffer->overflow_count);
30094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    eos = SPEECH_TOO_LONG;
30104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
30114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
30124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (eos != VALID_SPEECH_CONTINUING)
30134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
30144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    switch (eos)
30154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
30164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      case SPEECH_ENDED:
30174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* normal */
30184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        impl->eos_reason = L("itimeout");
30194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        break;
30204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
30214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      case SPEECH_ENDED_WITH_ERROR:
30224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* error */
30234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        impl->eos_reason = L("err");
30244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        break;
30254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
30264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      case SPEECH_TOO_LONG:
30274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* timeout*/
30284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        impl->eos_reason = L("ctimeout");
30294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        break;
30304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
30314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      case SPEECH_MAYBE_ENDED:
30324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* normal */
30334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        impl->eos_reason = L("itimeout");
30344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        break;
30354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      case SPEECH_ENDED_BY_LEVEL_TIMEOUT:
30364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* normal */
30374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        impl->eos_reason = L("levelTimeout");
30384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        break;
30394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
30404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      default:
30414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* error */
30424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        impl->eos_reason = L("err");
30434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
30444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
30454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SREC_ENGINE_VERBOSE_LOGGING
30464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogMessage("L: Voicing END (EOS) at %d frames, %d processed (reason: %s)\n", impl->frames, impl->processed, impl->eos_reason);
30474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
30484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
30494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->recogLogTimings.EOSD = impl->frames; /* how many frames have been sent prior to detect EOS */
30504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PTimeStampSet(&timestamp); /* time it took to detect EOS (in millisec) */
30514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->recogLogTimings.EOST = PTimeStampDiff(&timestamp, &impl->timestamp);
30524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
30534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *status = SR_RECOGNIZER_EVENT_END_OF_VOICING;
30544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
30554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->internalState = SR_RECOGNIZER_INTERNAL_EOS;
30564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (impl->eventLog != NULL)
30574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
30584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("internalState"), L("detectEndOfSpeech() -> SR_RECOGNIZER_INTERNAL_EOS")));
30594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("reason"), impl->eos_reason));
30604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("frames"), impl->frames));
30614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogTokenSize_t_BASIC(impl->eventLog, impl->osi_log_level, L("processed"), impl->processed));
30624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SR_Recognizer")));
30634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
30644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->isRecognizing = ESR_FALSE;
30654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_SUCCESS;
30664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
30674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
30684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Check for leaked state */
30694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  passert(*status == SR_RECOGNIZER_EVENT_INVALID && *type == SR_RECOGNIZER_RESULT_TYPE_INVALID);
30704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_CONTINUE_PROCESSING;
30714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
30724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
30734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
30744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
30754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
30764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * INPUT STATES: SR_RECOGNIZER_INTERNAL_BOS_DETECTION
30774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * OUTPUT STATES: same or SR_RECOGNIZER_INTERNAL_EOS_DETECTION, SR_RECOGNIZER_INTERNAL_EOI
30784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
30794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode detectBeginningOfSpeech(SR_RecognizerImpl* impl,
30804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                       SR_RecognizerStatus* status,
30814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                       SR_RecognizerResultType* type,
30824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                       SR_RecognizerResult* result)
30834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
30844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
30854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_BOOL gatedMode;
30864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t num_windback_bytes, num_windback_frames;
30874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  waveform_buffering_state_t buffering_state;
30884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
30894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionGetBool(L("cmdline.gatedmode"), &gatedMode));
30904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
30914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (gatedMode || (!gatedMode && impl->frames < impl->bgsniff))
30924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
30934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ESR_BOOL pushable = ESR_FALSE;
30944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
30954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = canPushAudioIntoRecognizer(impl);
30964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc == ESR_SUCCESS)
30974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
30984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* Not enough samples to process one frame */
30994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (CA_GetUnprocessedFramesInUtterance(impl->utterance) <= 0)
31004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
31014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        *status = SR_RECOGNIZER_EVENT_NEED_MORE_AUDIO;
31024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
31034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return ESR_SUCCESS;
31044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
31054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
31064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else if (rc != ESR_CONTINUE_PROCESSING)
31074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return rc;
31084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else if (impl->internalState == SR_RECOGNIZER_INTERNAL_EOI)
31094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
31104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* Got end of input before beginning of speech */
31114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *status = SR_RECOGNIZER_EVENT_NO_MATCH;
31124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
31134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->internalState = SR_RECOGNIZER_INTERNAL_BOS_NO_MATCH;
31144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, impl->Interface.stop(&impl->Interface));
31154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_SUCCESS;
31164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
31174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
31184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pushable = ESR_TRUE;
31194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (pushable)
31204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
31214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = pushAudioIntoRecognizer(impl, status, type, result);
31224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* OUTPUT STATES: same or SR_RECOGNIZER_INTERNAL_EOI */
31234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (rc != ESR_CONTINUE_PROCESSING)
31244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
31254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* Not enough samples to process one frame */
31264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return rc;
31274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
31284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = generateFrameFromAudio(impl, status, type, result);
31294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* OUTPUT STATES: same */
31304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (rc != ESR_CONTINUE_PROCESSING)
31314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
31324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /*
31334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         * The internal recognizer needs a minimum amount of audio before
31344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         * it begins generating frames.
31354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         */
31364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return rc;
31374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
31384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
31394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (!CA_AdvanceUtteranceFrame(impl->utterance))
31404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
31414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(L("ESR_INVALID_STATE: Failed Advancing Utt Frame %d"), impl->frames);
31424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_INVALID_STATE;
31434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
31444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (CA_UtteranceHasVoicing(impl->utterance))
31454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
31464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* Utterance stats for Lombard if enough frames */
31474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->frames > impl->bgsniff)
31484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
31494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SREC_ENGINE_VERBOSE_LOGGING
31504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLogMessage("L:  Voicing START at %d frames", impl->frames);
31514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
31524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* OSI log the endpointed data */
31534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
31544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("BTIM"), impl->frames * MSEC_PER_FRAME));
31554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("BRGN"), 0)); /* Barge-in not supported */
31564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIendp")));
31574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
31584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, L("BOSD"), impl->frames));
31594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("ESRbosd")));
31604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
31614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (gatedMode)
31624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          CA_CalculateUtteranceStatistics(impl->utterance, (int)(impl->frames * -1), 0);
31634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        else
31644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          CA_CalculateUtteranceStatistics(impl->utterance, 0, impl->frames);
31654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
31664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
31674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* OK, we've got voicing or the end of input has occured
31684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      ** (or both, I suppose).  If we had voicing then progress
31694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      ** the recognizer, otherwise skip to the end.
31704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      ** Of course, we could be running outside 'Gated Mode'
31714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      ** so we won't have any frames processed at all yet -
31724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      ** in this case start the recognizer anyway.
31734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      */
31744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
31754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /*************************************
31764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       ** Run recognition until endOfInput **
31774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       *************************************/
31784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
31794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /*
31804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       * Initialize both recognizers first
31814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       * and disable reporting of results
31824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       */
31834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (gatedMode)
31844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
31854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /*
31864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         * We're in Gated Mode -
31874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         * Because we'll have had voicing we wind-back
31884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         * until the start of voicing (unsure region)
31894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         */
31904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        num_windback_frames = CA_SeekStartOfUtterance(impl->utterance);
31914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        impl->beginningOfSpeechOffset = impl->frames - num_windback_frames;
31924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        num_windback_bytes = num_windback_frames * impl->FRAME_SIZE * 2 /* due to skip even frames */;
31934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
31944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* pfprintf(PSTDOUT,L("audio buffer windback %d frames == %d bytes\n"), num_windback_frames, num_windback_bytes); */
31954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, WaveformBuffer_GetBufferingState(impl->waveformBuffer, &buffering_state));
31964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (buffering_state != WAVEFORM_BUFFERING_OFF)
31974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          CHKLOG(rc, WaveformBuffer_WindBack(impl->waveformBuffer, num_windback_bytes));
31984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
31994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /*
32004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         * Only transition to linear if it was previously circular (in other words if
32014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         * buffering was active in the first place)
32024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         */
32034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (buffering_state == WAVEFORM_BUFFERING_ON_CIRCULAR)
32044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          CHKLOG(rc, WaveformBuffer_SetBufferingState(impl->waveformBuffer, WAVEFORM_BUFFERING_ON_LINEAR));
32054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        impl->frames = CA_GetUnprocessedFramesInUtterance(impl->utterance);
32064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
32074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      else
32084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        impl->frames = 0;
32094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* reset the frames */
32104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->processed = 0;
32114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, beginRecognizing(impl));
32124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->internalState = SR_RECOGNIZER_INTERNAL_EOS_DETECTION;
32134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *status = SR_RECOGNIZER_EVENT_START_OF_VOICING;
32144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
32154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_SUCCESS;
32164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
32174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
32184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
32194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->frames > impl->utterance_timeout)
32204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
32214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* beginning of speech timeout */
32224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        impl->internalState = SR_RECOGNIZER_INTERNAL_BOS_TIMEOUT;
32234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        *status = SR_RECOGNIZER_EVENT_START_OF_UTTERANCE_TIMEOUT;
32244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        *type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE;
32254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        CHKLOG(rc, impl->Interface.stop(&impl->Interface));
32264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return ESR_SUCCESS;
32274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
32284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
32294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
32304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else if (!gatedMode && impl->frames >= impl->bgsniff)
32314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
32324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /*
32334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    * If not gated mode and I have processed enough frames, then start the recognizer
32344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    * right away.
32354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    */
32364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->internalState = SR_RECOGNIZER_INTERNAL_EOS_DETECTION;
32374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *status = SR_RECOGNIZER_EVENT_INCOMPLETE;
32384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
32394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
32404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* reset the frames */
32414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->frames = impl->processed = 0;
32424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, beginRecognizing(impl));
32434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_SUCCESS;
32444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
32454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *status = SR_RECOGNIZER_EVENT_INCOMPLETE;
32464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
32474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
32484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
32494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
32504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
32514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
32524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
32534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerAdvanceImpl(SR_Recognizer* self, SR_RecognizerStatus* status,
32544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                        SR_RecognizerResultType* type,
32554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                        SR_RecognizerResult** result)
32564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
32574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
32584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_BOOL pushable;
32594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
32604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
32614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (status == NULL || type == NULL || result == NULL)
32624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
32634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_ARGUMENT"));
32644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
32654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
32664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
32674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* create the result holder and save the pointer */
32684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* creation only happens once (due to the if condition) */
32694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->result == NULL)
32704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_RecognizerResult_Create(&impl->result, impl));
32714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *result = impl->result;
32724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
32734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*
32744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * The following two lines are used to detect bugs whereby we forget to set
32754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * status or type before returning
32764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   */
32774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *status = SR_RECOGNIZER_EVENT_INVALID;
32784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *type = SR_RECOGNIZER_RESULT_TYPE_INVALID;
32794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
32804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectMOVE_TO_NEXT_STATE:
32814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  switch (impl->internalState)
32824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
32834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case SR_RECOGNIZER_INTERNAL_BEGIN:
32844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->internalState = SR_RECOGNIZER_INTERNAL_BOS_DETECTION;
32854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *status = SR_RECOGNIZER_EVENT_STARTED;
32864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
32874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_SUCCESS;
32884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
32894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case SR_RECOGNIZER_INTERNAL_BOS_DETECTION:
32904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = detectBeginningOfSpeech(impl, status, type, impl->result);
32914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (rc != ESR_CONTINUE_PROCESSING)
32924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
32934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /*
32944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         * SR_RECOGNIZER_INTERNAL_BOS_DETECTION, SR_RECOGNIZER_INTERNAL_EOS_DETECTION, or
32954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         * SR_RECOGNIZER_INTERNAL_EOI
32964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         */
32974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return rc;
32984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
32994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* Leaked state */
33004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      passert(0);
33014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
33024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
33034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case SR_RECOGNIZER_INTERNAL_EOS_DETECTION:
33044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pushable = ESR_FALSE;
33054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = canPushAudioIntoRecognizer(impl);
33064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (rc == ESR_SUCCESS)
33074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
33084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* Not enough samples to process one frame */
33094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (CA_GetUnprocessedFramesInUtterance(impl->utterance) <= 0)
33104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
33114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          *status = SR_RECOGNIZER_EVENT_NEED_MORE_AUDIO;
33124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
33134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          return ESR_SUCCESS;
33144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
33154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
33164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      else if (rc != ESR_CONTINUE_PROCESSING)
33174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return rc;
33184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      else if (impl->internalState == SR_RECOGNIZER_INTERNAL_EOI)
33194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        goto MOVE_TO_NEXT_STATE;
33204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      else
33214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        pushable = ESR_TRUE;
33224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (pushable)
33234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
33244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        rc = pushAudioIntoRecognizer(impl, status, type, impl->result);
33254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (rc != ESR_CONTINUE_PROCESSING)
33264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
33274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          /* Not enough samples to process one frame */
33284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          return rc;
33294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
33304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (impl->internalState == SR_RECOGNIZER_INTERNAL_EOI)
33314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          goto MOVE_TO_NEXT_STATE;
33324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        rc = generateFrameFromAudio(impl, status, type, impl->result);
33334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (rc != ESR_CONTINUE_PROCESSING)
33344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
33354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          /*
33364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project           * The internal recognizer needs a minimum amount of audio before
33374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project           * it begins generating frames.
33384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project           */
33394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          return rc;
33404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
33414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
33424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = generateFrameStats(impl, status, type, impl->result);
33434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (rc != ESR_CONTINUE_PROCESSING)
33444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
33454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* Not enough frames to calculate stats */
33464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return rc;
33474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
33484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = generatePatternFromFrame(impl, status, type, impl->result);
33494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (rc != ESR_CONTINUE_PROCESSING)
33504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
33514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* End of speech detected */
33524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return rc;
33534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
33544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->internalState == SR_RECOGNIZER_INTERNAL_END)
33554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        goto MOVE_TO_NEXT_STATE;
33564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = detectEndOfSpeech(impl, status, type, impl->result);
33574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (rc != ESR_CONTINUE_PROCESSING)
33584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
33594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* End of speech detected */
33604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return rc;
33614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
33624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *status = SR_RECOGNIZER_EVENT_INCOMPLETE;
33634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
33644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_SUCCESS;
33654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
33664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case SR_RECOGNIZER_INTERNAL_EOI:
33674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /*
33684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       * On EOI (end of input), we need to process the remaining frames that had not
33694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       * been processed when PutAudio set the gotLastFrame flag
33704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       */
33714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = generatePatternFromFrameEOI(impl, status, type, impl->result);
33724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (rc != ESR_CONTINUE_PROCESSING)
33734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
33744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* End of speech detected */
33754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return rc;
33764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
33774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = detectEndOfSpeech(impl, status, type, impl->result);
33784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (rc != ESR_CONTINUE_PROCESSING)
33794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
33804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* End of speech detected */
33814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return rc;
33824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
33834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *status = SR_RECOGNIZER_EVENT_INCOMPLETE;
33844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *type = SR_RECOGNIZER_RESULT_TYPE_NONE;
33854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_SUCCESS;
33864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
33874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case SR_RECOGNIZER_INTERNAL_EOS:
33884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* On EOS (end of speech detected - not due to end of input), create the result */
33894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->lockFunction)
33904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        impl->lockFunction(ESR_LOCK, impl->lockData);
33914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CircularBufferReset(impl->buffer);
33924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (impl->lockFunction)
33934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        impl->lockFunction(ESR_UNLOCK, impl->lockData);
33944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, SR_RecognizerCreateResultImpl((SR_Recognizer*) impl, status, type));
33954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      impl->internalState = SR_RECOGNIZER_INTERNAL_END;
33964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_SUCCESS;
33974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
33984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case SR_RECOGNIZER_INTERNAL_END:
33994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_SUCCESS;
34004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    default:
34014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(L("ESR_INVALID_STATE"));
34024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_INVALID_STATE;
34034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
34044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
34054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
34064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
34074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
34084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
34094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
34104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerLoadUtteranceImpl(SR_Recognizer* self, const LCHAR* filename)
34114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
34124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* TODO: complete */
34134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
34144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
34154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
34164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerLoadWaveFileImpl(SR_Recognizer* self, const LCHAR* filename)
34174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
34184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* TODO: complete */
34194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
34204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
34214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
34224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerLogEventImpl(SR_Recognizer* self, const LCHAR* event)
34234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
34244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
34254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl *impl = (SR_RecognizerImpl*) self;
34264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, event));
34274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
34284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
34294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
34304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
34314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
34324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerLogTokenImpl(SR_Recognizer* self, const LCHAR* token, const LCHAR* value)
34334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
34344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
34354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl *impl = (SR_RecognizerImpl*) self;
34364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, token, value));
34374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
34384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
34394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
34404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
34414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
34424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerLogTokenIntImpl(SR_Recognizer* self, const LCHAR* token, int value)
34434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
34444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
34454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl *impl = (SR_RecognizerImpl*) self;
34464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->osi_log_level, token, value));
34474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
34484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
34494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
34504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
34514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
34524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerLogSessionStartImpl(SR_Recognizer* self, const LCHAR* sessionName)
34534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
34544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
34554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl *impl = (SR_RecognizerImpl*) self;
34564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /**
34574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  * OSI Platform logging.
34584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  * In OSR, these events are logged by the platform. We have no platform in ESR, so we
34594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * log them here.
34604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  */
34614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
34624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* call (session) start, tokens optional */
34634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIclst")));
34644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
34654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* service start, in this case SRecTest service */
34664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->osi_log_level, L("SVNM"), sessionName));
34674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIsvst")));
34684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->osi_log_level & OSI_LOG_LEVEL_BASIC)
34694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogEventSession(impl->eventLog));
34704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
34714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
34724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
34734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
34744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
34754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
34764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerLogSessionEndImpl(SR_Recognizer* self)
34774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
34784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
34794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl *impl = (SR_RecognizerImpl*) self;
34804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
34814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* OSI log end of call (session) */
34824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->osi_log_level, L("SWIclnd")));
34834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->osi_log_level & OSI_LOG_LEVEL_BASIC)
34844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogEventSession(impl->eventLog));
34854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
34864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
34874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
34884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
34894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
34904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
34914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerLogWaveformDataImpl(SR_Recognizer* self, const LCHAR* waveformFilename,
34924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    const LCHAR* transcription, const double bos,
34934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    const double eos, ESR_BOOL isInvocab)
34944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
34954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
34964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl *impl = (SR_RecognizerImpl*) self;
34974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR num[P_PATH_MAX];
34984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int frame;
34994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
35004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogToken_AUDIO(impl->eventLog, impl->osi_log_level, L("FILE"), waveformFilename));
35014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogToken_AUDIO(impl->eventLog, impl->osi_log_level, L("TRANS"), transcription));
35024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  sprintf(num, L("%.2f"), bos);
35034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogToken_AUDIO(impl->eventLog, impl->osi_log_level, L("BOS_SEC"), num));
35044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  sprintf(num, L("%.2f"), eos);
35054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogToken_AUDIO(impl->eventLog, impl->osi_log_level, L("EOS_SEC"), num));
35064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogTokenInt_AUDIO(impl->eventLog, impl->osi_log_level, L("FRAMESIZE"), impl->FRAME_SIZE));
35074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogTokenInt_AUDIO(impl->eventLog, impl->osi_log_level, L("SAMPLERATE"), impl->sampleRate));
35084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  frame = (int)(bos * impl->sampleRate * 2 /* 2 bytes per sample */) / impl->FRAME_SIZE;
35094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogTokenInt_AUDIO(impl->eventLog, impl->osi_log_level, L("BOS_FR"), frame));
35104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  frame = (int)(eos * impl->sampleRate * 2 /* 2 bytes per sample */) / impl->FRAME_SIZE;
35114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogTokenInt_AUDIO(impl->eventLog, impl->osi_log_level, L("EOS_FR"), frame));
35124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogTokenInt_AUDIO(impl->eventLog, impl->osi_log_level, L("INVOCAB"), isInvocab));
35134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_EventLogEvent_AUDIO(impl->eventLog, impl->osi_log_level, L("ESRwfrd")));
35144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
35154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
35164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
35174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
35184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
35194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerSetLockFunctionImpl(SR_Recognizer* self, SR_RecognizerLockFunction function, void* data)
35204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
35214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
35224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
35234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->lockFunction = function;
35244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->lockData = data;
35254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
35264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
35274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
35284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_ReturnCode doSignalQualityInit(SR_RecognizerImpl* impl)
35294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
35304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_DoSignalCheck(impl->wavein, &impl->isSignalClipping, &impl->isSignalDCOffset,
35314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                   &impl->isSignalNoisy, &impl->isSignalTooQuiet, &impl->isSignalTooFewSamples,
35324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                   &impl->isSignalTooManySamples);
35334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->isSignalQualityInitialized = ESR_TRUE;
35344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
35354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
35364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
35374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerIsSignalClippingImpl(SR_Recognizer* self, ESR_BOOL* isClipping)
35384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
35394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
35404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
35414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
35424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (isClipping == NULL)
35434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
35444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError("SR_RecognizerIsSignalClippingImpl", ESR_INVALID_ARGUMENT);
35454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
35464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
35474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!impl->isSignalQualityInitialized)
35484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, doSignalQualityInit(impl));
35494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *isClipping = impl->isSignalClipping;
35504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
35514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
35524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
35534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
35544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
35554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerIsSignalDCOffsetImpl(SR_Recognizer* self, ESR_BOOL* isDCOffset)
35564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
35574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
35584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
35594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
35604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (isDCOffset == NULL)
35614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
35624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError("SR_RecognizerIsSignalDCOffsetImpl", ESR_INVALID_ARGUMENT);
35634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
35644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
35654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!impl->isSignalQualityInitialized)
35664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, doSignalQualityInit(impl));
35674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *isDCOffset = impl->isSignalDCOffset;
35684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
35694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
35704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
35714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
35724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
35734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerIsSignalNoisyImpl(SR_Recognizer* self, ESR_BOOL* isNoisy)
35744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
35754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
35764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
35774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
35784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (isNoisy == NULL)
35794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
35804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError("SR_RecognizerIsSignalNoisyImpl", ESR_INVALID_ARGUMENT);
35814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
35824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
35834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!impl->isSignalQualityInitialized)
35844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, doSignalQualityInit(impl));
35854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *isNoisy = impl->isSignalNoisy;
35864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
35874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
35884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
35894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
35904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
35914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerIsSignalTooQuietImpl(SR_Recognizer* self, ESR_BOOL* isTooQuiet)
35924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
35934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
35944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
35954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
35964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (isTooQuiet == NULL)
35974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
35984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError("SR_RecognizerIsSignalTooQuietImpl", ESR_INVALID_ARGUMENT);
35994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
36004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
36014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!impl->isSignalQualityInitialized)
36024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, doSignalQualityInit(impl));
36034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *isTooQuiet = impl->isSignalTooQuiet;
36044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
36054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
36064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
36074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
36084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
36094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerIsSignalTooFewSamplesImpl(SR_Recognizer* self, ESR_BOOL* isTooFewSamples)
36104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
36114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
36124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
36134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
36144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (isTooFewSamples == NULL)
36154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
36164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError("SR_RecognizerIsSignalTooFewSamplesImpl", ESR_INVALID_ARGUMENT);
36174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
36184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
36194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!impl->isSignalQualityInitialized)
36204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, doSignalQualityInit(impl));
36214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *isTooFewSamples = impl->isSignalTooFewSamples;
36224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
36234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
36244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
36254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
36264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
36274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerIsSignalTooManySamplesImpl(SR_Recognizer* self, ESR_BOOL* isTooManySamples)
36284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
36294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_RecognizerImpl* impl = (SR_RecognizerImpl*) self;
36304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
36314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
36324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (isTooManySamples == NULL)
36334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
36344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError("SR_RecognizerIsSignalTooManySamplesImpl", ESR_INVALID_ARGUMENT);
36354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
36364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
36374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!impl->isSignalQualityInitialized)
36384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, doSignalQualityInit(impl));
36394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *isTooManySamples = impl->isSignalTooManySamples;
36404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
36414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
36424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
36434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
36444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
36454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
36464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
36474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**************************************/
36484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* Waveform Buffer stuff              */
36494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**************************************/
36504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode WaveformBuffer_Create(WaveformBuffer** waveformBuffer, size_t frame_size)
36514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
36524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
36534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  WaveformBuffer *buf;
36544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t val_size_t;
36554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int    val_int;
36564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_BOOL   exists;
36574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
36584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  buf = NEW(WaveformBuffer, L("SR_RecognizerImpl.wvfmbuf"));
36594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (buf == NULL)
36604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
36614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_OUT_OF_MEMORY;
36624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("%s: could not create WaveformBuffer"), ESR_rc2str(rc));
36634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
36644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
36654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
36664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_SessionContains(L("SREC.voice_enroll.bufsz_kB"), &exists);
36674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (exists)
36684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ESR_SessionGetSize_t(L("SREC.voice_enroll.bufsz_kB"), &val_size_t);
36694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
36704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    val_size_t = DEFAULT_WAVEFORM_BUFFER_MAX_SIZE;
36714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  val_size_t *= 1024; /* convert to kB*/
36724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, CircularBufferCreate(val_size_t, L("SR_RecognizerImpl.wvfmbuf.cbuffer"), &buf->cbuffer));
36734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
36744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_SessionContains(L("CREC.Frontend.start_windback"), &exists);
36754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (exists)
36764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ESR_SessionGetInt(L("CREC.Frontend.start_windback"), &val_int);
36774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
36784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    val_int = DEFAULT_WAVEFORM_WINDBACK_FRAMES;
36794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  val_int *= frame_size; /* convert frames to bytes */
36804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  buf->windback_buffer_sz = (size_t) val_int;
36814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  buf->windback_buffer = MALLOC(buf->windback_buffer_sz, L("SR_RecognizerImpl.wvfmbuf.windback"));
36824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (buf->windback_buffer == NULL)
36834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
36844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_OUT_OF_MEMORY;
36854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("%s: could not create Waveform windback buffer"), ESR_rc2str(rc));
36864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
36874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
36884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
36894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
36904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_SessionContains(L("SREC.voice_enroll.eos_comfort_frames"), &exists);
36914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (exists)
36924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ESR_SessionGetSize_t(L("SREC.voice_enroll.eos_comfort_frames"), &val_size_t);
36934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
36944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    val_size_t = DEFAULT_EOS_COMFORT_FRAMES;
36954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  buf->eos_comfort_frames = val_size_t;
36964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
36974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_SessionContains(L("SREC.voice_enroll.bos_comfort_frames"), &exists);
36984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (exists)
36994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ESR_SessionGetSize_t(L("SREC.voice_enroll.bos_comfort_frames"), &val_size_t);
37004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
37014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    val_size_t = DEFAULT_BOS_COMFORT_FRAMES;
37024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  buf->bos_comfort_frames = val_size_t;
37034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
37044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* initially off */
37054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  buf->state = WAVEFORM_BUFFERING_OFF;
37064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
37074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *waveformBuffer = buf;
37084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
37094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
37104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  WaveformBuffer_Destroy(buf);
37114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
37124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
37134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
37144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode WaveformBuffer_Write(WaveformBuffer* waveformBuffer, void *data, size_t num_bytes)
37154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
37164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t available_bytes;
37174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t done_bytes;
37184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
37194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* do nothing if not active */
37204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  switch (waveformBuffer->state)
37214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
37224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case WAVEFORM_BUFFERING_OFF:
37234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_SUCCESS;
37244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
37254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case WAVEFORM_BUFFERING_ON_CIRCULAR:
37264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      available_bytes = CircularBufferGetAvailable(waveformBuffer->cbuffer);
37274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (available_bytes < num_bytes)
37284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
37294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        done_bytes = CircularBufferSkip(waveformBuffer->cbuffer, num_bytes - available_bytes);
37304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (done_bytes != num_bytes - available_bytes)
37314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
37324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          PLogError("WaveformBuffer_Write: error when skipping bytes");
37334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          return ESR_INVALID_STATE;
37344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
37354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
37364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      done_bytes = CircularBufferWrite(waveformBuffer->cbuffer, data, num_bytes);
37374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (done_bytes != num_bytes)
37384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
37394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLogError("WaveformBuffer_Write: error when writing bytes");
37404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return ESR_INVALID_STATE;
37414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
37424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_SUCCESS;
37434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
37444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case WAVEFORM_BUFFERING_ON_LINEAR:
37454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      available_bytes = CircularBufferGetAvailable(waveformBuffer->cbuffer);
37464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (available_bytes < num_bytes)
37474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
37484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        waveformBuffer->overflow_count += num_bytes;
37494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return ESR_BUFFER_OVERFLOW;
37504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
37514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      done_bytes = CircularBufferWrite(waveformBuffer->cbuffer, data, num_bytes);
37524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (done_bytes != num_bytes)
37534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
37544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLogError("WaveformBuffer_Write: error when writing bytes");
37554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return ESR_INVALID_STATE;
37564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
37574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_SUCCESS;
37584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
37594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    default:
37604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError("WaveformBuffer_Write: bad control path");
37614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_INVALID_STATE;
37624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
37634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
37644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
37654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode WaveformBuffer_Read(WaveformBuffer* waveformBuffer, void *data, size_t* num_bytes)
37664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
37674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t bytes_to_read;
37684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
37694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
37704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (num_bytes == NULL)
37714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
37724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_INVALID_ARGUMENT;
37734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
37744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
37754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
37764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (waveformBuffer->overflow_count > 0)
37774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
37784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    memset(data, 0, *num_bytes);
37794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *num_bytes = 0;
37804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("WaveformBuffer_Read: previous overflow causes read to return NULL"));
37814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_SUCCESS;
37824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
37834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
37844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (waveformBuffer->read_size != 0 && *num_bytes > waveformBuffer->read_size)
37854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
37864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_OUT_OF_MEMORY: waveform buffer too small for read, increase from %d to %d"), *num_bytes, waveformBuffer->read_size);
37874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_OUT_OF_MEMORY;
37884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
37894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
37904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (waveformBuffer->read_size == 0)
37914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bytes_to_read = *num_bytes;
37924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
37934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bytes_to_read = MIN(waveformBuffer->read_size, *num_bytes);
37944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  waveformBuffer->read_size -= bytes_to_read;
37954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *num_bytes = CircularBufferRead(waveformBuffer->cbuffer, data, bytes_to_read);
37964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (*num_bytes != bytes_to_read)
37974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
37984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError("WaveformBuffer_Read: error reading buffer");
37994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_STATE;
38004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
38014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
38024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
38034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
38044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
38054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
38064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* WindBack will save the last num_bytes recorded, reset the buffer, and then load the
38074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   saved bytes at the beginning of the buffer */
38084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode WaveformBuffer_WindBack(WaveformBuffer* waveformBuffer, const size_t num_bytes)
38094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
38104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
38114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t bufferSize;
38124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
38134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (num_bytes <= 0)
38144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
38154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, WaveformBuffer_Reset(waveformBuffer));
38164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_SUCCESS;
38174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
38184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
38194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* make sure windback buffer is big enough */
38204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (num_bytes > waveformBuffer->windback_buffer_sz)
38214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
38224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_OUT_OF_MEMORY;
38234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("%s: windback buffer is too small (needed=%d, had=%d)"), ESR_rc2str(rc), num_bytes, waveformBuffer->windback_buffer_sz);
38244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
38254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
38264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
38274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, WaveformBuffer_GetSize(waveformBuffer, &bufferSize));
38284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* skip the first few bytes written */
38294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (bufferSize < num_bytes)
38304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
38314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError("bufferSize %d num_bytes %d (ESR_INVALID_STATE)\n", bufferSize, num_bytes);
38324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bufferSize = 0;
38334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
38344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
38354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
38364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bufferSize -= num_bytes;
38374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
38384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, WaveformBuffer_Skip(waveformBuffer, bufferSize));
38394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* read the last few bytes written */
38404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bufferSize = num_bytes;
38414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, WaveformBuffer_Read(waveformBuffer, waveformBuffer->windback_buffer, &bufferSize));
38424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
38434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* reset buffer */
38444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, WaveformBuffer_Reset(waveformBuffer));
38454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
38464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* rewrite the saved bytes at the beginning */
38474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, WaveformBuffer_Write(waveformBuffer, waveformBuffer->windback_buffer, bufferSize));
38484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
38494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
38504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
38514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
38524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
38534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode WaveformBuffer_Destroy(WaveformBuffer* waveformBuffer)
38544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
38554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (waveformBuffer->cbuffer)
38564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE(waveformBuffer->cbuffer);
38574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (waveformBuffer->windback_buffer)
38584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE(waveformBuffer->windback_buffer);
38594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (waveformBuffer)
38604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE(waveformBuffer);
38614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
38624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
38634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
38644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode WaveformBuffer_SetBufferingState(WaveformBuffer* waveformBuffer, waveform_buffering_state_t state)
38654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
38664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  waveformBuffer->state = state;
38674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
38684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
38694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
38704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode WaveformBuffer_GetBufferingState(WaveformBuffer* waveformBuffer, waveform_buffering_state_t* state)
38714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
38724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *state = waveformBuffer->state;
38734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
38744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
38754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
38764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
38774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @return ESR_BUFFER_OVERFLOW if nametag EOS occured beyond end of buffer
38784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
38794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode WaveformBuffer_ParseEndPointedResultAndTrim(WaveformBuffer* waveformBuffer, const LCHAR* end_pointed_result, const size_t bytes_per_frame)
38804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
38814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  const LCHAR *p;
38824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t bos_frame, eos_frame, bufferSize, read_start_offset;
38834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
38844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
38854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* potential end pointed results
38864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
38874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     -pau-@19 tape@36 scan@64 down@88 -pau2-@104
38884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     -pau-@19 tape@34 off@55 -pau2-@78
38894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     -pau-@19 tape@47 help@66 -pau2-@80
38904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     -pau-@16 tape@36 reverse@71 -pau2-@91
38914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     -pau-@21 tape@42 scan@59 down@80 -pau2-@91
38924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
38934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     what I need to extract is the integer between "-pau-@" and ' '
38944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     and the integer between '@' and " -pau2-"
38954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  */
38964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
38974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
38984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  p = LSTRSTR( end_pointed_result, PREFIX_WORD);
38994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(p) p+=PREFIX_WORD_LEN; while(p && *p == '@') p++;
3900b3adea6f471d03c5bd728725adc7ca1cea89edfdMarcus Oakland  rc = p ? lstrtosize_t(p, &bos_frame, 10) : ESR_INVALID_ARGUMENT;
39014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc == ESR_INVALID_ARGUMENT)
39024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
39034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("%s: extracting bos from text=%s"), ESR_rc2str(rc), end_pointed_result);
39044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
39054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
39064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else if (rc != ESR_SUCCESS)
39074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
39084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
39094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  p = LSTRSTR( end_pointed_result, SUFFIX_WORD);
39104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  while(p && p>end_pointed_result && p[-1]!='@') --p;
3911b3adea6f471d03c5bd728725adc7ca1cea89edfdMarcus Oakland  rc = p ? lstrtosize_t(p, &eos_frame, 10) : ESR_INVALID_ARGUMENT;
39124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc == ESR_INVALID_ARGUMENT)
39134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
39144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("%s: extracting eos from text=%s"), ESR_rc2str(rc), end_pointed_result);
39154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
39164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
39174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else if (rc != ESR_SUCCESS)
39184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
39194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
39204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bos_frame -= (bos_frame > waveformBuffer->bos_comfort_frames ? waveformBuffer->bos_comfort_frames : 0);
39214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  eos_frame += waveformBuffer->eos_comfort_frames;
39224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
39234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*
39244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * I know where speech started, so I want to skip frames 0 to bos_frame.
39254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * I also know where speech ended so I want to set the amount of frames(bytes) to read for
39264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * the nametag audio buffer (i.e. the read_size)
39274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   */
39284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
39294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  read_start_offset = bos_frame * bytes_per_frame * 2 /* times 2 because of skip even frames */;
39304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  waveformBuffer->read_size = (eos_frame - bos_frame) * bytes_per_frame * 2 /* times 2 because of skip even frames */;
39314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
39324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, WaveformBuffer_GetSize(waveformBuffer, &bufferSize));
39334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (read_start_offset + waveformBuffer->read_size > bufferSize)
39344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
39354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    waveformBuffer->overflow_count += read_start_offset + waveformBuffer->read_size - bufferSize;
39364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    passert(waveformBuffer->overflow_count > 0);
39374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogMessage(L("Warning: Voice Enrollment audio buffer overflow (spoke too much, over by %d bytes)"),
39384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                waveformBuffer->overflow_count);
39394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_BUFFER_OVERFLOW;
39404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
39414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, WaveformBuffer_Skip(waveformBuffer, read_start_offset));
39424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SREC_ENGINE_VERBOSE_LOGGING
39434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PLogMessage(L("Voice Enrollment: bos@%d, eos@%d, therefore sizeof(waveform) should be %d"), bos_frame, eos_frame, waveformBuffer->read_size);
39444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
39454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
39464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
39474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
39484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
39494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
39504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
39514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode WaveformBuffer_Reset(WaveformBuffer* waveformBuffer)
39524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
39534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CircularBufferReset(waveformBuffer->cbuffer);
39544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  waveformBuffer->overflow_count = 0;
39554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  waveformBuffer->read_size = 0;
39564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
39574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
39584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
39594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode WaveformBuffer_GetSize(WaveformBuffer* waveformBuffer, size_t* size)
39604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
39614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *size = CircularBufferGetSize(waveformBuffer->cbuffer);
39624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
39634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
39644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
39654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode WaveformBuffer_Skip(WaveformBuffer* waveformBuffer, const size_t bytes)
39664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
39674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (CircularBufferSkip(waveformBuffer->cbuffer, bytes) != (int) bytes)
39684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_STATE;
39694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
39704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
39714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
39724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
39734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
39744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_ReturnCode SR_Recognizer_Reset_Buffers ( SR_RecognizerImpl *impl )
39754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
39764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ESR_ReturnCode  reset_status;
39774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
39784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE ( impl->audioBuffer );
39794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->audioBuffer = NULL;
39804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->audioBuffer = MALLOC ( impl->FRAME_SIZE, MTAG );
39814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
39824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( impl->audioBuffer != NULL )
39834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
39844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        WaveformBuffer_Destroy ( impl->waveformBuffer );
39854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        impl->waveformBuffer = NULL;
39864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        reset_status = WaveformBuffer_Create ( &impl->waveformBuffer, impl->FRAME_SIZE );
39874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
39884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
39894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
39904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        reset_status = ESR_OUT_OF_MEMORY;
39914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
39924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ( reset_status );
39934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
39944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
39954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
39964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
39974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_ReturnCode SR_Recognizer_Validate_Sample_Rate ( size_t sample_rate )
39984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
39994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ESR_ReturnCode  validate_status;
40004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    switch ( sample_rate )
40024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
40034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        case 8000:
40044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        case 11025:
40054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        case 16000:
40064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        case 22050:
40074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            validate_status = ESR_SUCCESS;
40084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            break;
40094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        default:
40114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            validate_status = ESR_INVALID_ARGUMENT;
40124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            break;
40134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
40144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ( validate_status );
40154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
40164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_ReturnCode SR_Recognizer_Sample_Rate_Needs_Change ( size_t new_sample_rate, ESR_BOOL *needs_changing )
40204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
40214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ESR_ReturnCode  validate_status;
40224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    size_t          current_sample_rate;
40234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    validate_status = ESR_SessionGetSize_t ( "CREC.Frontend.samplerate", &current_sample_rate );
40254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( validate_status == ESR_SUCCESS )
40274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
40284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if ( new_sample_rate != current_sample_rate )
40294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            *needs_changing = ESR_TRUE;
40304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        else
40314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            *needs_changing = ESR_TRUE;
40324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
40334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ( validate_status );
40344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
40354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_ReturnCode SR_Recognizer_Change_Sample_Rate_Session_Params_8K ( void )
40394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
40404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ESR_ReturnCode  change_status;
40414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LCHAR           model_filenames [P_PATH_MAX];
40424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LCHAR           lda_filename [P_PATH_MAX];
40434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    size_t          filename_length;
40444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    filename_length = P_PATH_MAX;
40464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    change_status = ESR_SessionGetLCHAR ( L("cmdline.modelfiles8"), model_filenames, &filename_length );
40474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( change_status == ESR_SUCCESS )
40494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
40504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        filename_length = P_PATH_MAX;
40514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        change_status = ESR_SessionGetLCHAR ( L("cmdline.lda8"), lda_filename, &filename_length );
40524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* From this point on, if an error occurs, we're screwed and recovery is probably impossible */
40544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if ( change_status == ESR_SUCCESS )
40554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            {
40564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            change_status = ESR_SessionSetSize_t ( "CREC.Frontend.samplerate", 8000 );
40574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            if ( change_status == ESR_SUCCESS )
40584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                {
40594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                change_status = ESR_SessionSetInt ( "CREC.Frontend.highcut", 4000 );
40604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                if ( change_status == ESR_SUCCESS )
40624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                    {
40634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                    change_status =  ESR_SessionSetLCHAR ( L("cmdline.modelfiles"), model_filenames );
40644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                    if ( change_status == ESR_SUCCESS )
40664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                        change_status = ESR_SessionSetLCHAR ( L("cmdline.lda"), lda_filename );
40674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                    }
40684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                }
40694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            }
40704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        else
40714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            {
40724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            PLogError (L("\nMissing Parameter lda8\n"));
40734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            }
40744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
40754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
40764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
40774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLogError (L("\nMissing Parameter models8\n"));
40784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
40794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ( change_status );
40804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
40814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_ReturnCode SR_Recognizer_Change_Sample_Rate_Session_Params_11K_to_22K ( size_t sample_rate )
40854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
40864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ESR_ReturnCode  change_status;
40874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LCHAR           model_filenames [P_PATH_MAX];
40884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LCHAR           lda_filename [P_PATH_MAX];
40894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    size_t          filename_length;
40904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    filename_length = P_PATH_MAX;
40924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    change_status = ESR_SessionGetLCHAR ( L("cmdline.modelfiles11"), model_filenames, &filename_length );
40934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( change_status == ESR_SUCCESS )
40954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
40964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        filename_length = P_PATH_MAX;
40974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        change_status = ESR_SessionGetLCHAR ( L("cmdline.lda11"), lda_filename, &filename_length );
40984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
40994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* From this point on, if an error occurs, we're screwed and recovery is probably impossible */
41004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if ( change_status == ESR_SUCCESS )
41014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            {
41024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            change_status = ESR_SessionSetSize_t ( "CREC.Frontend.samplerate", sample_rate );
41034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
41044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            if ( change_status == ESR_SUCCESS )
41054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                {
41064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                change_status = ESR_SessionSetInt ( "CREC.Frontend.highcut", 5500 );
41074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
41084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                if ( change_status == ESR_SUCCESS )
41094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                    {
41104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                    change_status =  ESR_SessionSetLCHAR ( L("cmdline.modelfiles"), model_filenames );
41114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
41124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                    if ( change_status == ESR_SUCCESS )
41134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                        change_status = ESR_SessionSetLCHAR ( L("cmdline.lda"), lda_filename );
41144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                    }
41154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                }
41164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            }
41174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        else
41184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            {
41194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            PLogError (L("\nMissing Parameter lda11\n"));
41204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            }
41214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
41224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
41234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
41244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLogError (L("\nMissing Parameter models11\n"));
41254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
41264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ( change_status );
41274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
41284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
41294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
41304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
41314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_ReturnCode SR_Recognizer_Change_Sample_Rate_Session_Params ( size_t new_sample_rate )
41324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
41334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ESR_ReturnCode  change_status;
41344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
41354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( new_sample_rate == 8000 )
41364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        change_status = SR_Recognizer_Change_Sample_Rate_Session_Params_8K ( );
41374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
41384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        change_status = SR_Recognizer_Change_Sample_Rate_Session_Params_11K_to_22K ( new_sample_rate );
41394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
41404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ( change_status );
41414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
41424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
41434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
41444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
41454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Recognizer_Change_Sample_RateImpl ( SR_Recognizer *recognizer, size_t new_sample_rate )
41464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
41474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ESR_ReturnCode          change_status;
41484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ESR_BOOL                rate_needs_changing;
41494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SR_RecognizerImpl       *impl;
41504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_FrontendInputParams  *frontendParams;
41514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
41524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    change_status = SR_Recognizer_Validate_Sample_Rate ( new_sample_rate );
41534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
41544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( change_status == ESR_SUCCESS )
41554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
41564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        change_status = SR_Recognizer_Sample_Rate_Needs_Change ( new_sample_rate, &rate_needs_changing );
41574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
41584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if ( change_status == ESR_SUCCESS )
41594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            {
41604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            if ( rate_needs_changing == ESR_TRUE )
41614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                {
41624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                change_status = SR_Recognizer_Change_Sample_Rate_Session_Params ( new_sample_rate );
41634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
41644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                if ( change_status == ESR_SUCCESS )
41654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                    { // SR_RecognizerCreateFrontendImpl
41664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                    impl = (SR_RecognizerImpl *)recognizer;
41674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                    change_status = SR_RecognizerUnsetupImpl( recognizer );
41684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
41694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                    if ( change_status == ESR_SUCCESS )
41704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                        {
41714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                        CA_UnconfigureFrontend ( impl->frontend );
41724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                        frontendParams = CA_AllocateFrontendParameters ( );
41734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
41744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                        if ( frontendParams != NULL )
41754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                            {
41764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                            change_status = SR_RecognizerGetFrontendLegacyParametersImpl ( frontendParams );
41774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
41784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                            if ( change_status == ESR_SUCCESS )
41794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                {
41804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                CA_ConfigureFrontend ( impl->frontend, frontendParams );
41814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                CA_UnconfigureWave ( impl->wavein );
41824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                CA_ConfigureWave ( impl->wavein, impl->frontend );
41834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                impl->sampleRate = new_sample_rate;
41844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                impl->FRAME_SIZE = impl->sampleRate / FRAMERATE * SAMPLE_SIZE;
41854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                change_status = SR_Recognizer_Reset_Buffers ( impl );
41864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
41874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                if ( change_status == ESR_SUCCESS )
41884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                    {
41894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                    change_status = SR_RecognizerSetupImpl( recognizer );
41904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
41914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                    if ( change_status == ESR_SUCCESS )
41924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                        change_status = SR_AcousticStateReset ( recognizer );
41934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                    }
41944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                else
41954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                    {
41964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                    SR_RecognizerSetupImpl( recognizer );   /* Otherwise recognizer is in bad state */
41974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                    }
41984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                }
41994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                            CA_FreeFrontendParameters ( frontendParams );
42004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                            }
42014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                        else
42024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                            {
42034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                            SR_RecognizerSetupImpl( recognizer );   /* Otherwise recognizer is in bad state */
42044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                            change_status = ESR_OUT_OF_MEMORY;
42054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                            }
42064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                        }
42074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                    }
42084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                }
42094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            }
42104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
42114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ( change_status );
42124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
42134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
42144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4215