blob: 4c6f66279066385f2d098c0a0dd8463b98302dc6 [file] [log] [blame]
/*---------------------------------------------------------------------------*
* ca_front.c *
* *
* Copyright 2007, 2008 Nuance Communciations, Inc. *
* *
* Licensed under the Apache License, Version 2.0 (the 'License'); *
* you may not use this file except in compliance with the License. *
* *
* You may obtain a copy of the License at *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an 'AS IS' BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
*---------------------------------------------------------------------------*/
/************************************************************************
* CA_Frontend Methods
************************************************************************/
#ifndef _RTT
#include <stdio.h>
#endif
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#ifdef unix
#include <unistd.h>
#endif
#include <assert.h>
#include "frontapi.h"
#include "portable.h"
#ifdef USE_COMP_STATS
void stop_front_end_clock(void);
void start_front_end_clock(void);
#endif
/* These are front-end functions
*/
CA_Frontend *CA_AllocateFrontend(float srcscale, int offset,
float sinkscale)
{
CA_Frontend *hFrontend = NULL;
TRY_CA_EXCEPT
hFrontend = (CA_Frontend *) CALLOC_CLR(1, sizeof(CA_Frontend), "ca.hFrontend");
hFrontend->src_scale = srcscale;
hFrontend->sink_scale = sinkscale;
hFrontend->offset = offset;
hFrontend->is_configured = False;
hFrontend->is_filter_loaded = False;
hFrontend->ca_rtti = CA_FRONTEND_SIGNATURE;
return (hFrontend);
BEG_CATCH_CA_EXCEPT;
END_CATCH_CA_EXCEPT(hFrontend)
}
void CA_FreeFrontend(CA_Frontend *hFrontend)
{
TRY_CA_EXCEPT
ASSERT(hFrontend);
if (hFrontend->is_configured == True)
SERVICE_ERROR(CONFIGURED_FRONTEND);
if (hFrontend->is_filter_loaded == True)
SERVICE_ERROR(SPEC_FILTER_CONFIGURED);
FREE((char *) hFrontend);
return;
BEG_CATCH_CA_EXCEPT;
END_CATCH_CA_EXCEPT(hFrontend);
}
void CA_ConfigureFrontend(CA_Frontend *hFrontend,
CA_FrontendInputParams *hFrontArgs)
{
TRY_CA_EXCEPT
ASSERT(hFrontend);
ASSERT(hFrontArgs);
if (hFrontArgs->is_loaded == False)
SERVICE_ERROR(FRONTEND_INPUT_NOT_LOADED);
if (hFrontend->is_configured == True)
SERVICE_ERROR(CONFIGURED_FRONTEND);
hFrontend->config = create_config_object() ;
setup_config_object(hFrontend->config, hFrontArgs);
hFrontend->is_configured = True;
return;
BEG_CATCH_CA_EXCEPT;
END_CATCH_CA_EXCEPT(hFrontend);
}
void CA_UnconfigureFrontend(CA_Frontend *hFrontend)
{
TRY_CA_EXCEPT
ASSERT(hFrontend);
if (hFrontend->is_configured == False)
SERVICE_ERROR(UNCONFIGURED_FRONTEND);
clear_config_object(hFrontend->config);
delete_config_object(hFrontend->config);
hFrontend->config = NULL;
hFrontend->is_configured = False;
return;
BEG_CATCH_CA_EXCEPT;
END_CATCH_CA_EXCEPT(hFrontend);
}
int CA_MakeFrame(CA_Frontend *hFrontend, CA_Utterance *hUtt, CA_Wave *hWave)
{
/* Note: samdata has already been loaded
*/
int valid;
TRY_CA_EXCEPT
featdata framdata[MAX_CHAN_DIM], voicedata = 0;
ASSERT(hFrontend);
ASSERT(hUtt);
ASSERT(hWave);
ASSERT(hUtt->data.gen_utt.frame->uttDim <= MAX_CHAN_DIM);
if (hFrontend->is_configured == False)
SERVICE_ERROR(UNCONFIGURED_FRONTEND);
if (hUtt->data.utt_type != LIVE_INPUT)
SERVICE_ERROR(UTTERANCE_INVALID);
#ifdef USE_COMP_STATS
start_front_end_clock();
#endif
if (hUtt->data.gen_utt.frame->haveVoiced)
valid = make_frame(hWave->data.channel, hFrontend->config->waveobj,
hFrontend->config->freqobj, hFrontend->config->cepobj,
&hWave->voice, hWave->data.income, hWave->data.outgo,
hWave->data.num_samples,
framdata, &voicedata);
else
valid = make_frame(hWave->data.channel, hFrontend->config->waveobj,
hFrontend->config->freqobj,
hFrontend->config->cepobj,
NULL, hWave->data.income, hWave->data.outgo,
hWave->data.num_samples,
framdata, &voicedata);
/* Ignore first 3 frames. This prevents a spike due to dc offset.
** This effect would normally be removed by loading the window
** overhang but we are not doing that (tricky).
*/
if (valid > 0 && hWave->data.channel->frame_count > (DELTA + 3))
{
if (pushSingleFEPframe(hUtt->data.gen_utt.frame,
framdata, voicedata) != False)
valid = False;
}
else valid = False;
#ifdef USE_COMP_STATS
stop_front_end_clock();
#endif
return (valid);
BEG_CATCH_CA_EXCEPT;
END_CATCH_CA_EXCEPT(hFrontend);
}
int CA_GetFrontendUtteranceDimension(CA_Frontend *hFrontend)
{
int dim;
TRY_CA_EXCEPT
ASSERT(hFrontend);
ASSERT(hFrontend->config);
if (hFrontend->is_configured == False)
SERVICE_ERROR(UNCONFIGURED_FRONTEND);
/* TODO: Determine the dim exactly */
dim = 2 * hFrontend->config->cepobj->mel_dim;
if (hFrontend->config->cepobj->do_dd_mel)
dim += hFrontend->config->cepobj->mel_dim;
return (dim);
BEG_CATCH_CA_EXCEPT;
END_CATCH_CA_EXCEPT(hFrontend);
}