blob: 02561075db3f395571547b78892f60122406e228 [file] [log] [blame]
/*---------------------------------------------------------------------------*
* utt_basi.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. *
* *
*---------------------------------------------------------------------------*/
#include <stdlib.h>
#include <string.h>
#ifndef _RTT
#include <stdio.h>
#endif
#ifdef unix
#include <unistd.h>
#endif
#include <assert.h>
#include "simapi.h"
#include "portable.h"
#include "../clib/fpi_tgt.inl"
static const char utt_basi[] = "$Id: utt_basi.c,v 1.6.6.8 2007/10/15 18:06:24 dahan Exp $";
CA_Utterance *CA_AllocateUtterance(void)
{
CA_Utterance *hUtt = NULL;
TRY_CA_EXCEPT
hUtt = (CA_Utterance *) CALLOC_CLR(1, sizeof(CA_Utterance), "ca.hUtt");
hUtt->ca_rtti = CA_UTTERANCE_SIGNATURE;
return (hUtt);
BEG_CATCH_CA_EXCEPT
END_CATCH_CA_EXCEPT(hUtt)
}
void CA_FreeUtterance(CA_Utterance *hUtt)
{
TRY_CA_EXCEPT
ASSERT(hUtt);
FREE((char *) hUtt);
return;
BEG_CATCH_CA_EXCEPT
END_CATCH_CA_EXCEPT(hUtt)
}
int CA_InitUtteranceForFrontend(CA_Utterance *hUtt,
CA_FrontendInputParams *hFrontPar)
{
TRY_CA_EXCEPT
ASSERT(hUtt);
ASSERT(hFrontPar > 0);
if (hUtt->data.utt_type != 0)
SERVICE_ERROR(UTTERANCE_ALREADY_INITIALISED);
init_utterance(&hUtt->data, LIVE_INPUT, 3*hFrontPar->mel_dim, /* TODO: change to proper function */
DEFAULT_BUFFER_SIZE, KEEP_FRAMES,
hFrontPar->mel_dim, 1);
if (hFrontPar->do_skip_even_frames)
set_voicing_durations(&hUtt->data, hFrontPar->voice_duration / 2,
hFrontPar->quiet_duration / 2,
hFrontPar->unsure_duration / 2,
hFrontPar->start_windback / 2);
else
set_voicing_durations(&hUtt->data, hFrontPar->voice_duration,
hFrontPar->quiet_duration,
hFrontPar->unsure_duration,
hFrontPar->start_windback);
return (0);
BEG_CATCH_CA_EXCEPT
END_CATCH_CA_EXCEPT(hUtt)
}
void CA_ClearUtterance(CA_Utterance *hUtt)
{
TRY_CA_EXCEPT
ASSERT(hUtt);
if (hUtt->data.utt_type == 0)
{
SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
}
if (hUtt->data.utt_type == LIVE_INPUT)
{
free_utterance(&hUtt->data);
hUtt->data.utt_type = 0;
}
else
{
SERVICE_ERROR(UTTERANCE_UNKNOWN);
}
return;
BEG_CATCH_CA_EXCEPT
END_CATCH_CA_EXCEPT(hUtt)
}
int CA_AdvanceUtteranceFrame(CA_Utterance *hUtt)
{
TRY_CA_EXCEPT
int status_code;
ASSERT(hUtt);
if (hUtt->data.utt_type != LIVE_INPUT)
SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
status_code = advance_utterance_frame(&hUtt->data);
return (status_code);
BEG_CATCH_CA_EXCEPT
END_CATCH_CA_EXCEPT(hUtt)
}
int CA_UtteranceHasVoicing(CA_Utterance *hUtt)
{
TRY_CA_EXCEPT
ASSERT(hUtt);
if (hUtt->data.utt_type != LIVE_INPUT)
SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
return (hUtt->data.gen_utt.frame->voicingDetected);
BEG_CATCH_CA_EXCEPT
END_CATCH_CA_EXCEPT(hUtt)
}
void CA_UnlockUtteranceForInput(CA_Utterance *hUtt)
{
TRY_CA_EXCEPT
ASSERT(hUtt);
if (hUtt->data.utt_type != LIVE_INPUT)
SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
ASSERT(!isFrameBufferActive(hUtt->data.gen_utt.frame));
startFrameCollection(hUtt->data.gen_utt.frame);
return;
BEG_CATCH_CA_EXCEPT
END_CATCH_CA_EXCEPT(hUtt)
}
void CA_LockUtteranceFromInput(CA_Utterance *hUtt)
{
TRY_CA_EXCEPT
ASSERT(hUtt);
if (hUtt->data.utt_type != LIVE_INPUT)
SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
ASSERT(isFrameBufferActive(hUtt->data.gen_utt.frame));
stopFrameCollection(hUtt->data.gen_utt.frame);
return;
BEG_CATCH_CA_EXCEPT
END_CATCH_CA_EXCEPT(hUtt)
}
void CA_ResetVoicing(CA_Utterance *hUtt)
{
TRY_CA_EXCEPT
ASSERT(hUtt);
if (hUtt->data.utt_type != LIVE_INPUT)
SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
clearEndOfUtterance(hUtt->data.gen_utt.frame);
clearC0Entries(hUtt->data.gen_utt.frame);
startFrameCollection(hUtt->data.gen_utt.frame);
return;
BEG_CATCH_CA_EXCEPT
END_CATCH_CA_EXCEPT(hUtt)
}
void CA_FlushUtteranceFrames(CA_Utterance *hUtt)
{
TRY_CA_EXCEPT
ASSERT(hUtt);
if (hUtt->data.utt_type != LIVE_INPUT)
SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
setRECframePtr(hUtt->data.gen_utt.frame, 0, 0);
releaseBlockedFramesInBuffer(hUtt->data.gen_utt.frame);
hUtt->data.gen_utt.last_push = NULL;
return;
BEG_CATCH_CA_EXCEPT
END_CATCH_CA_EXCEPT(hUtt)
}
void CA_SetEndOfUtteranceByLevelTimeout(CA_Utterance *hUtt, long timeout, long holdOff)
{
TRY_CA_EXCEPT
ASSERT(hUtt);
if (hUtt->data.utt_type != LIVE_INPUT)
SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
setupEndOfUtterance(hUtt->data.gen_utt.frame, timeout, holdOff);
return;
BEG_CATCH_CA_EXCEPT
END_CATCH_CA_EXCEPT(hUtt)
}
int CA_UtteranceHasEnded(CA_Utterance *hUtt)
{
TRY_CA_EXCEPT
ASSERT(hUtt);
if (hUtt->data.utt_type != LIVE_INPUT)
SERVICE_ERROR(UTTERANCE_NOT_INITIALISED);
return (utterance_ended(&hUtt->data));
BEG_CATCH_CA_EXCEPT
END_CATCH_CA_EXCEPT(hUtt)
}