/**
* @file param_malloc.c
*
*
* @brief 特徴パラメータ構造体のメモリ管理
*
*
*
* @brief Memory management of input parameter vector structure.
*
*
* @author Akinobu Lee
* @date Fri Aug 3 14:09:39 2007
*
* $Revision: 1.4 $
*
*/
/*
* Copyright (c) 1991-2012 Kawahara Lab., Kyoto University
* Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology
* Copyright (c) 2005-2012 Julius project team, Nagoya Institute of Technology
* All rights reserved
*/
#include
#include
/**
* Initialize the content of the parameter data.
*
* @param p [out] parameter data
*/
void
param_init_content(HTK_Param *p)
{
p->samplenum = 0;
}
/**
* Allocate vector area for required length and frames. Allocate memory if
* not yet, or expand it if already allocated but not sufficient. If
* sufficient amount is already allocated, do nothing.
* The allocation are updated by HTK_PARAM_INCREMENT_STEP_FRAME step to avoid
* numerous re-allocation
*
* @param p [i/o] parameter data
* @param samplenum [in] required number of frames
* @param veclen [in] required length of vector
*
* @return TRUE on success, FALSE on failure.
*/
boolean
param_alloc(HTK_Param *p, unsigned int samplenum, short veclen)
{
unsigned int t;
VECT **new;
unsigned int newlen;
if (p->parvec == NULL) {
/* at least some length should be allocated */
if (samplenum < HTK_PARAM_INCREMENT_STEP_FRAME) {
p->samplenum_alloc = HTK_PARAM_INCREMENT_STEP_FRAME;
} else {
p->samplenum_alloc = samplenum;
}
/* first time: just allocate veclen x samplenum */
p->parvec = (VECT **)mybmalloc2(sizeof(VECT *) * p->samplenum_alloc, &(p->mroot));
for(t=0;tsamplenum_alloc;t++) {
p->parvec[t] = (VECT *)mybmalloc2(sizeof(VECT) * veclen, &(p->mroot));
}
p->veclen_alloc = veclen;
} else {
/* already allocated */
/* check required vector length */
if (veclen > p->veclen_alloc) {
jlog("Error: param_malloc: longer vector required, re-allocate all\n");
jlog("Error: param_malloc: allocated = %d, required = %d\n", p->veclen_alloc, veclen);
return FALSE;
}
if (samplenum > p->samplenum_alloc) {
/* need frame expansion */
newlen = p->samplenum_alloc;
while(newlen < samplenum) newlen += HTK_PARAM_INCREMENT_STEP_FRAME;
//jlog("Debug: param_malloc: parvec extend to %d\n", newlen);
new = (VECT **)mybmalloc2(sizeof(VECT *) * newlen, &(p->mroot));
for(t = 0; t < p->samplenum_alloc; t++) {
new[t] = p->parvec[t];
}
for(t = p->samplenum_alloc; t < newlen; t++) {
new[t] = (VECT *)mybmalloc2(sizeof(VECT) * p->veclen_alloc, &(p->mroot));
}
p->parvec = new;
p->samplenum_alloc = newlen;
}
}
return TRUE;
}
/**
* Free and clear the content of the parameter data
*
* @param p [out] parameter data
*/
void
param_free_content(HTK_Param *p)
{
mybfree2(&(p->mroot));
p->parvec = NULL;
p->samplenum_alloc = 0;
param_init_content(p);
}
/**
* Allocate a new parameter.
*
* @return pointer to the newly allocated area.
*/
HTK_Param *
new_param()
{
HTK_Param *new;
new = (HTK_Param *)mymalloc(sizeof(HTK_Param));
new->mroot = NULL;
new->parvec = NULL;
new->samplenum_alloc = 0;
param_init_content(new);
return(new);
}
/**
* Free the HTK parameter structure.
*
* @param pinfo [in] parameter data to be destroyed.
*/
void
free_param(HTK_Param *pinfo)
{
param_free_content(pinfo);
free(pinfo);
}