14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * ca_front.c * 34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Copyright 2007, 2008 Nuance Communciations, Inc. * 54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the 'License'); * 74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * you may not use this file except in compliance with the License. * 84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * You may obtain a copy of the License at * 104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 * 114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software * 134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * distributed under the License is distributed on an 'AS IS' BASIS, * 144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * See the License for the specific language governing permissions and * 164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * limitations under the License. * 174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/ 194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/************************************************************************ 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * CA_Frontend Methods 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ************************************************************************/ 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef _RTT 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdio.h> 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdlib.h> 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <string.h> 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <limits.h> 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef unix 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <unistd.h> 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <assert.h> 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "frontapi.h" 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "portable.h" 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_COMP_STATS 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid stop_front_end_clock(void); 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid start_front_end_clock(void); 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* These are front-end functions 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project*/ 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCA_Frontend *CA_AllocateFrontend(float srcscale, int offset, 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project float sinkscale) 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CA_Frontend *hFrontend = NULL; 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project TRY_CA_EXCEPT 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hFrontend = (CA_Frontend *) CALLOC_CLR(1, sizeof(CA_Frontend), "ca.hFrontend"); 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hFrontend->src_scale = srcscale; 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hFrontend->sink_scale = sinkscale; 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hFrontend->offset = offset; 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hFrontend->is_configured = False; 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hFrontend->is_filter_loaded = False; 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hFrontend->ca_rtti = CA_FRONTEND_SIGNATURE; 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (hFrontend); 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project BEG_CATCH_CA_EXCEPT; 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project END_CATCH_CA_EXCEPT(hFrontend) 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid CA_FreeFrontend(CA_Frontend *hFrontend) 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project TRY_CA_EXCEPT 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(hFrontend); 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (hFrontend->is_configured == True) 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SERVICE_ERROR(CONFIGURED_FRONTEND); 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (hFrontend->is_filter_loaded == True) 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SERVICE_ERROR(SPEC_FILTER_CONFIGURED); 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE((char *) hFrontend); 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project BEG_CATCH_CA_EXCEPT; 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project END_CATCH_CA_EXCEPT(hFrontend); 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid CA_ConfigureFrontend(CA_Frontend *hFrontend, 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CA_FrontendInputParams *hFrontArgs) 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project TRY_CA_EXCEPT 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(hFrontend); 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(hFrontArgs); 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (hFrontArgs->is_loaded == False) 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SERVICE_ERROR(FRONTEND_INPUT_NOT_LOADED); 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (hFrontend->is_configured == True) 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SERVICE_ERROR(CONFIGURED_FRONTEND); 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hFrontend->config = create_config_object() ; 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project setup_config_object(hFrontend->config, hFrontArgs); 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hFrontend->is_configured = True; 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project BEG_CATCH_CA_EXCEPT; 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project END_CATCH_CA_EXCEPT(hFrontend); 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid CA_UnconfigureFrontend(CA_Frontend *hFrontend) 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project TRY_CA_EXCEPT 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(hFrontend); 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (hFrontend->is_configured == False) 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SERVICE_ERROR(UNCONFIGURED_FRONTEND); 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project clear_config_object(hFrontend->config); 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete_config_object(hFrontend->config); 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hFrontend->config = NULL; 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hFrontend->is_configured = False; 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project BEG_CATCH_CA_EXCEPT; 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project END_CATCH_CA_EXCEPT(hFrontend); 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint CA_MakeFrame(CA_Frontend *hFrontend, CA_Utterance *hUtt, CA_Wave *hWave) 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Note: samdata has already been loaded 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int valid; 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project TRY_CA_EXCEPT 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project featdata framdata[MAX_CHAN_DIM], voicedata = 0; 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(hFrontend); 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(hUtt); 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(hWave); 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(hUtt->data.gen_utt.frame->uttDim <= MAX_CHAN_DIM); 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (hFrontend->is_configured == False) 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SERVICE_ERROR(UNCONFIGURED_FRONTEND); 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (hUtt->data.utt_type != LIVE_INPUT) 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SERVICE_ERROR(UTTERANCE_INVALID); 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_COMP_STATS 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project start_front_end_clock(); 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (hUtt->data.gen_utt.frame->haveVoiced) 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project valid = make_frame(hWave->data.channel, hFrontend->config->waveobj, 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hFrontend->config->freqobj, hFrontend->config->cepobj, 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project &hWave->voice, hWave->data.income, hWave->data.outgo, 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hWave->data.num_samples, 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project framdata, &voicedata); 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project valid = make_frame(hWave->data.channel, hFrontend->config->waveobj, 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hFrontend->config->freqobj, 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hFrontend->config->cepobj, 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project NULL, hWave->data.income, hWave->data.outgo, 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hWave->data.num_samples, 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project framdata, &voicedata); 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Ignore first 3 frames. This prevents a spike due to dc offset. 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ** This effect would normally be removed by loading the window 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ** overhang but we are not doing that (tricky). 1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (valid > 0 && hWave->data.channel->frame_count > (DELTA + 3)) 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (pushSingleFEPframe(hUtt->data.gen_utt.frame, 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project framdata, voicedata) != False) 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project valid = False; 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else valid = False; 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_COMP_STATS 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project stop_front_end_clock(); 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (valid); 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project BEG_CATCH_CA_EXCEPT; 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project END_CATCH_CA_EXCEPT(hFrontend); 1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint CA_GetFrontendUtteranceDimension(CA_Frontend *hFrontend) 1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int dim; 1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project TRY_CA_EXCEPT 1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(hFrontend); 1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(hFrontend->config); 1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (hFrontend->is_configured == False) 1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SERVICE_ERROR(UNCONFIGURED_FRONTEND); 1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* TODO: Determine the dim exactly */ 1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project dim = 2 * hFrontend->config->cepobj->mel_dim; 1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (hFrontend->config->cepobj->do_dd_mel) 1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project dim += hFrontend->config->cepobj->mel_dim; 1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (dim); 1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project BEG_CATCH_CA_EXCEPT; 1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project END_CATCH_CA_EXCEPT(hFrontend); 2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 201