void CA_UnloadAcoustic(CA_Acoustic *hAcoust) { TRY_CA_EXCEPT ASSERT(hAcoust); if (hAcoust->is_loaded == False) SERVICE_ERROR(ACOUSTIC_NOT_LOADED); if (hAcoust->swimodel) { free_swimodel(hAcoust->swimodel); hAcoust->swimodel = 0; hAcoust->is_loaded = False; return; } else SERVICE_ERROR(ACOUSTIC_NOT_LOADED); return; BEG_CATCH_CA_EXCEPT END_CATCH_CA_EXCEPT(hAcoust) }
const SWIModel* load_swimodel(const char *filename) { int i; SWIModel *swimodel = NULL; const void* file = NULL; #ifdef SREC_ENGINE_VERBOSE_LOGGING PLogMessage("load_swimodel: loaded %s", filename); #endif swimodel = (SWIModel*) CALLOC(1, sizeof(SWIModel), "clib.models.base"); if (mmap_zip(filename, &swimodel->mmap_zip_data, &swimodel->mmap_zip_size)) { PLogError("load_swimodel: mmap_zip failed for %s\n", filename); goto CLEANUP; } file = swimodel->mmap_zip_data; swimodel->num_hmmstates = *(const short*)file; file += sizeof(short); swimodel->num_dims = *(const short*)file; file += sizeof(short); swimodel->num_pdfs = *(const short*)file; file += sizeof(short); SWIhmmState* hmmstates = (SWIhmmState*) CALLOC(swimodel->num_hmmstates, sizeof(SWIhmmState), "clib.models.states"); swimodel->hmmstates = hmmstates; const short* num_pdfs_in_model = (const short*)file; file += sizeof(short) * swimodel->num_hmmstates; swimodel->allmeans = (const featdata*)file; file += sizeof(featdata) * swimodel->num_pdfs * swimodel->num_dims; swimodel->allweights = (const wtdata*)file; file += sizeof(wtdata) * swimodel->num_pdfs; swimodel->avg_state_durations = (const featdata*)file; file += sizeof(featdata) * swimodel->num_hmmstates; if (file > swimodel->mmap_zip_data + swimodel->mmap_zip_size) { PLogError("load_swimodel: not enough data in %s", filename); goto CLEANUP; } #ifdef SREC_ENGINE_VERBOSE_LOGGING PLogMessage("loaded models %s num_hmmstates %d num_dims %d num_pdfs %d weights[0] %d\n", filename, swimodel->num_hmmstates, swimodel->num_dims, swimodel->num_pdfs, *swimodel->allweights); #endif const featdata* mean_ptr = swimodel->allmeans; const wtdata* weight_ptr = swimodel->allweights; for (i = 0;i < swimodel->num_hmmstates;i++) { hmmstates[i].num_pdfs = num_pdfs_in_model[i]; hmmstates[i].means = mean_ptr; hmmstates[i].weights = weight_ptr; mean_ptr += swimodel->num_dims * num_pdfs_in_model[i]; weight_ptr += num_pdfs_in_model[i]; } return swimodel; CLEANUP: free_swimodel(swimodel); return NULL; }