1 2 /*---------------------------------------------------------------------------* 3 * SRecTest.c * 4 * * 5 * Copyright 2007, 2008 Nuance Communciations, Inc. * 6 * * 7 * Licensed under the Apache License, Version 2.0 (the 'License'); * 8 * you may not use this file except in compliance with the License. * 9 * * 10 * You may obtain a copy of the License at * 11 * http://www.apache.org/licenses/LICENSE-2.0 * 12 * * 13 * Unless required by applicable law or agreed to in writing, software * 14 * distributed under the License is distributed on an 'AS IS' BASIS, * 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 16 * See the License for the specific language governing permissions and * 17 * limitations under the License. * 18 * * 19 *---------------------------------------------------------------------------*/ 20 21 #ifdef _WIN32 22 #else 23 #include <sys/select.h> 24 #endif 25 26 #ifdef _WIN32 27 #include "signal.h" 28 #include "direct.h" 29 #endif 30 31 #include "passert.h" 32 #include "ESR_CommandLine.h" 33 #include "ESR_Session.h" 34 #include "LCHAR.h" 35 #include "PFile.h" 36 #include "PFileSystem.h" 37 #include "PANSIFileSystem.h" 38 //#include "PMemoryFileSystem.h" 39 #include "plog.h" 40 #include "pmemory.h" 41 #include "ptypes.h" 42 #include "string.h" 43 #include "stdio.h" 44 #include "stdlib.h" 45 #if defined(APP_ENABLE_TIMER) 46 #include "ptimer.h" 47 #endif 48 #include "SR_Grammar.h" 49 #include "SR_Recognizer.h" 50 #include "SR_RecognizerResult.h" 51 #include "SR_Session.h" 52 #include "SR_Vocabulary.h" 53 #include "SR_AcousticState.h" 54 #include "SR_Nametag.h" 55 #include "PStackSize.h" 56 57 // #define ACCURACY_TESTING 58 #ifdef ACCURACY_TESTING 59 #include "SR_GrammarImpl.h" 60 #include "SR_SemanticProcessorImpl.h" 61 #endif 62 63 #include "srec_test_config.h" 64 65 //Define this in makefile 66 //#define _DEBUGHEAP 67 68 69 #if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32) 70 #include <crtdbg.h> 71 #endif 72 73 74 #define LOG_BUFFER_SIZE 512 75 #define MAX_AUDIO_BUFFER_SIZE 10240 76 #define DEFAULT_AUDIO_BUFFER_SIZE 256 77 #define MAX_LINE_LENGTH 1024 78 #define TRANSCRIPTION_SIZE 512 79 #define MAX_SCORE_LENGTH 5 80 #define MAX_NUM_REC_CONTEXTS 4 81 82 #ifdef PFILE_VIRTUAL_SUPPORT 83 extern const FileRecord pFileRecTable[]; 84 extern const unsigned char pFileStart0[]; 85 #endif /* #ifdef PFILE_VIRTUAL_SUPPORT */ 86 87 typedef enum 88 { 89 SENTENCE_BEGIN, 90 SENTENCE_BEGIN_BRACKET_BEGIN, 91 SENTENCE_BEGIN_BRACKET_END, 92 SENTENCE_MIDDLE, 93 SENTENCE_MIDDLE_BRACKET_BEGIN, 94 SENTENCE_MIDDLE_BRACKET_END, 95 SENTENCE_MIDDLE_WITH_SPACE 96 } SENTENCE_CLEANING_STATES; 97 98 99 100 typedef enum 101 { 102 ForcedRecModeNotSet = -1, 103 ForcedRecModeOff=0, 104 ForcedRecModeOneTime, 105 ForcedRecModeOn 106 } ForcedRecMode; 107 108 109 typedef enum 110 { 111 ERROR_LEVEL_CRITICAL = 0, 112 ERROR_LEVEL_HIGH, 113 ERROR_LEVEL_MODERATE, 114 ERROR_LEVEL_LOW 115 } SREC_TEST_ERROR_LEVELS; 116 117 118 typedef struct 119 { 120 LCHAR grammar_path [P_PATH_MAX]; /* File path of the grammar. */ 121 LCHAR grammarID [P_PATH_MAX]; /* ID of the grammar. */ 122 LCHAR ruleName [P_PATH_MAX]; /* rule name of the grammar. */ 123 SR_Grammar* grammar; /* grammar. */ 124 ESR_BOOL is_ve_grammar; /* Is voice-enrollment grammar or not */ 125 } APPL_GRAMMAR_DATA; 126 127 128 129 typedef struct ApplicationData_t 130 { 131 int argc; /* The number of command-line arguments. */ 132 LCHAR **argv; /* The command-line argument values. */ 133 ESR_Locale locale; /* Current application locale. */ 134 SR_Recognizer *recognizer; /* The current recognizer. */ 135 SR_RecognizerResult *result; /* The last recognition result. */ 136 SR_Vocabulary *vocabulary; /* The current vocabulary. */ 137 SR_Nametag *nametag; /* The nametag generated by the last recognition. */ 138 SR_Nametags *nametags; /* The active nametag collection. */ 139 APPL_GRAMMAR_DATA grammars [MAX_NUM_REC_CONTEXTS]; /* Grammar data */ 140 int grammarCount; /* The number of grammars. */ 141 int active_grammar_num; /* The index number of the active grammar. */ 142 const asr_int16_t *raw_waveform; /*Points to raw waveform returned from voice enrollment */ 143 size_t raw_waveform_size; /* Size of above wave_form */ 144 asr_int16_t audio_buffer [MAX_AUDIO_BUFFER_SIZE]; 145 unsigned int audio_buffer_requested_size; 146 unsigned int num_samples_read; 147 LCHAR raw_waveform_filename [P_PATH_MAX]; /* Name of file of saved waveform data. */ 148 PFile *raw_waveform_file; /* Pointer to file of saved waveform data. */ 149 LCHAR transcription [MAX_LINE_LENGTH]; 150 ForcedRecMode forced_rec_mode; 151 } ApplicationData; 152 153 154 155 static int srec_test_get_run_params ( unsigned int *num_shutdown_loops, unsigned int *num_continuous_run_loops ); 156 static int srec_test_init_application_data ( ApplicationData *applicationData, int arg_count, LCHAR *arg_vals [] ); 157 static int srec_test_init_file_system ( int arg_count, LCHAR *arg_vals [] ); 158 static int srec_test_init_logging_system ( int arg_count, LCHAR *arg_vals [], PLogger *logger ); 159 static int srec_test_init_memory_system ( unsigned int srec_test_heap_size ); 160 static int srec_test_init_system ( unsigned int srec_test_heap_size, PLogger* logger, int arg_count, LCHAR *arg_vals [] ); 161 static int srec_test_run_test_execute ( ApplicationData *applicationData ); 162 static int srec_test_run_test_init ( ApplicationData *applicationData ); 163 static int srec_test_run_test ( ApplicationData *applicationData ); 164 static int srec_test_shutdown_file_system ( void ); 165 static int srec_test_shutdown_logging_system ( PLogger *logger ); 166 static int srec_test_shutdown_memory_system ( void ); 167 static int srec_test_recognize_nist_file ( SR_Grammar *active_grammar, ApplicationData *data, FILE *results_file, 168 LCHAR *command_text, size_t *recognition_count ); 169 static int srec_test_recognize_pcm_file ( SR_Grammar *active_grammar, ApplicationData *data, FILE *results_file, 170 LCHAR *command_text, size_t *recognition_count ); 171 static void srec_test_log_recognition_failure ( ApplicationData *data ); 172 173 174 175 static ESR_BOOL interrupted = ESR_FALSE; 176 177 /* static ESR_BOOL no_enroll = ESR_FALSE; //BJP */ 178 179 int signal_handler_SIGINT(int v) 180 { 181 interrupted = ESR_TRUE; 182 return 0; 183 } 184 185 186 187 ESR_ReturnCode myDSMCallback(LCHAR* functionName, LCHAR** argv, size_t argc, void* value, LCHAR* result, size_t* resultSize) 188 { 189 LCHAR* meaning; 190 191 PLOG_DBG_TRACE((L("myDSMCallback(%s) invoked\n"), functionName)); 192 if ((LSTRCMP(functionName, "myDSMCallback")!=0) || (argc > 1)) 193 { 194 /* Unsupported semantic function */ 195 return ESR_INVALID_STATE; 196 } 197 if (argc > 0) 198 meaning = argv[0]; 199 else 200 meaning = L(""); 201 lstrtrim(meaning); 202 LSTRLWR(meaning); 203 204 if (LISDIGIT(*meaning)) 205 { 206 /* Penalize meaning starting with "<digit>" */ 207 if (*resultSize < LSTRLEN(L("1000"))+1) 208 { 209 *resultSize = LSTRLEN(L("1000"))+1; 210 return ESR_BUFFER_OVERFLOW; 211 } 212 LSTRCPY(result, "1000"); 213 *resultSize = LSTRLEN(L("1000"))+1; 214 return ESR_SUCCESS; 215 } 216 if (*resultSize < LSTRLEN(L("0"))+1) 217 { 218 *resultSize = LSTRLEN(L("0"))+1; 219 return ESR_BUFFER_OVERFLOW; 220 } 221 LSTRCPY(result, "0"); 222 *resultSize = LSTRLEN(L("0"))+1; 223 return ESR_SUCCESS; 224 } 225 226 227 228 void srec_test_log_error ( unsigned int error_id, SREC_TEST_ERROR_LEVELS error_level, LCHAR *error_text ) 229 { 230 231 switch ( error_level ) 232 { 233 case ERROR_LEVEL_CRITICAL: 234 LPRINTF ( "Critical Level Error %s\n", error_text ); 235 break; 236 237 case ERROR_LEVEL_HIGH: 238 LPRINTF ( "High Level Error %s\n", error_text ); 239 break; 240 241 case ERROR_LEVEL_MODERATE: 242 LPRINTF ( "Moderate Level Error %s\n", error_text ); 243 break; 244 245 case ERROR_LEVEL_LOW: 246 LPRINTF ( "Low Level Error %s\n", error_text ); 247 break; 248 249 default: 250 LPRINTF ( "Unknown Level Error %d : %s\n", error_level, error_text ); 251 break; 252 } 253 } 254 255 256 257 void srec_test_delete_grammar ( ApplicationData *data, int grammar_num ) 258 { 259 LCHAR log_buffer[LOG_BUFFER_SIZE]; 260 261 if ( grammar_num < data->grammarCount ) 262 { 263 if ( ( data->grammarCount - grammar_num ) > 1 ) 264 { 265 memmove ( &data->grammars [grammar_num], &data->grammars [data->grammarCount - 1], 266 ( data->grammarCount - grammar_num - 1 ) * sizeof ( APPL_GRAMMAR_DATA ) ); 267 if ( grammar_num > data->active_grammar_num ) 268 data->active_grammar_num--; 269 } 270 data->grammarCount--; 271 } 272 else 273 { 274 LSPRINTF ( log_buffer, L("Internal Error Grammar TableCorrupt : Grammar %d Does Not Exist"), grammar_num ); 275 srec_test_log_error ( 0, ERROR_LEVEL_CRITICAL, log_buffer ); 276 } 277 } 278 279 280 281 static void srec_test_get_active_grammar ( ApplicationData *data, SR_Grammar **active_grammar ) 282 { 283 284 if ( data->active_grammar_num >= 0 ) 285 *active_grammar = data->grammars [data->active_grammar_num].grammar; 286 else 287 *active_grammar = NULL; 288 } 289 290 291 292 static void srec_test_get_active_grammar_data ( ApplicationData *data, APPL_GRAMMAR_DATA **active_grammar_data ) 293 { 294 295 if ( data->active_grammar_num >= 0 ) 296 *active_grammar_data = &data->grammars [data->active_grammar_num]; 297 else 298 *active_grammar_data = NULL; 299 } 300 301 302 303 static ESR_BOOL srec_test_get_grammar_from_id ( ApplicationData *data, char *grammar_id, 304 int *grammar_index, ESR_BOOL *is_active, ESR_BOOL *is_ve_grammar ) 305 { 306 ESR_BOOL found_grammar; 307 int grammar_counter; 308 309 found_grammar = ESR_FALSE; 310 grammar_counter = 0; 311 312 while ( ( found_grammar == ESR_FALSE ) && ( grammar_counter < data->grammarCount ) ) 313 { 314 if ( strcmp ( grammar_id, data->grammars [grammar_counter].grammarID ) == 0 ) 315 { 316 *grammar_index = grammar_counter; 317 *is_ve_grammar = data->grammars [grammar_counter].is_ve_grammar; 318 319 if ( grammar_counter == data->active_grammar_num ) 320 *is_active = ESR_TRUE; 321 else 322 *is_active = ESR_FALSE; 323 found_grammar = ESR_TRUE; 324 } 325 else 326 { 327 grammar_counter++; 328 } 329 } 330 return ( found_grammar ); 331 } 332 333 334 335 static int srec_test_get_empty_grammar_index ( ApplicationData *data, unsigned int *grammar_index ) 336 { 337 int get_status; 338 339 if ( data->grammarCount < MAX_NUM_REC_CONTEXTS ) 340 { 341 get_status = 0; 342 *grammar_index = data->grammarCount; 343 } 344 else 345 { 346 get_status = -1; 347 } 348 return ( get_status ); 349 } 350 351 352 353 ESR_ReturnCode ShutdownSession ( void ) 354 { 355 ESR_ReturnCode shutdown_status; 356 357 shutdown_status = SR_SessionDestroy ( ); 358 359 return ( shutdown_status ); 360 } 361 362 363 364 ESR_ReturnCode InitSession ( int argc, LCHAR *argv [] ) 365 { 366 ESR_ReturnCode init_status; 367 LCHAR path[P_PATH_MAX]; 368 size_t len; 369 370 len = P_PATH_MAX; 371 init_status = ESR_CommandLineGetValue ( argc, (const char **)argv, L("parfile"), path, &len ); 372 373 if ( init_status == ESR_SUCCESS ) 374 { 375 init_status = SR_SessionCreate ( path ); 376 377 if ( init_status == ESR_SUCCESS ) 378 { 379 /* Command-line options always override PAR file options */ 380 init_status = ESR_SessionImportCommandLine ( argc, argv ); 381 382 if ( init_status != ESR_SUCCESS ) 383 { 384 SR_SessionDestroy ( ); 385 /* Log Here */ 386 } 387 } 388 else 389 { 390 /* Log Here */ 391 } 392 } 393 else 394 { 395 srec_test_log_error ( 0, ERROR_LEVEL_CRITICAL, L("Parfile Nmae Not Specified on Command Line") ); 396 } 397 return ( init_status ); 398 } 399 400 401 402 ESR_ReturnCode ShutdownGrammarUnload ( ApplicationData *data, unsigned int grammar_num ) 403 { 404 ESR_ReturnCode shutdown_status; 405 406 shutdown_status = SR_GrammarDestroy ( data->grammars [grammar_num].grammar ); 407 408 return ( shutdown_status ); 409 } 410 411 412 413 ESR_ReturnCode SetupGrammarLoad ( ApplicationData *data, unsigned int grammar_num ) 414 { 415 ESR_ReturnCode setup_status; 416 417 setup_status = SR_GrammarLoad (data->grammars [grammar_num].grammar_path, &data->grammars [grammar_num].grammar ); 418 419 if ( setup_status == ESR_SUCCESS ) 420 { 421 setup_status = SR_GrammarSetupVocabulary ( data->grammars [grammar_num].grammar, data->vocabulary ); 422 423 if ( setup_status == ESR_SUCCESS ) 424 { 425 setup_status = SR_GrammarSetupRecognizer( data->grammars [grammar_num].grammar, data->recognizer ); 426 427 if ( setup_status == ESR_SUCCESS ) 428 { 429 setup_status = SR_GrammarSetDispatchFunction ( data->grammars [grammar_num].grammar, L("myDSMCallback"), NULL, myDSMCallback ); 430 431 if ( setup_status != ESR_SUCCESS ) 432 SR_GrammarDestroy ( data->grammars [grammar_num].grammar ); 433 } 434 else 435 { 436 SR_GrammarDestroy ( data->grammars [grammar_num].grammar ); 437 } 438 } 439 else 440 { 441 SR_GrammarDestroy ( data->grammars [grammar_num].grammar ); 442 } 443 } 444 return ( setup_status ); 445 } 446 447 448 449 ESR_ReturnCode SetupGrammarActivate ( ApplicationData *data, unsigned int grammar_num ) 450 { 451 ESR_ReturnCode setup_status; 452 setup_status = SR_RecognizerActivateRule ( data->recognizer, data->grammars [grammar_num].grammar, data->grammars [grammar_num].ruleName, 1 ); 453 return ( setup_status ); 454 } 455 456 457 458 #ifdef ACCURACY_TESTING 459 ESR_ReturnCode srec_test_parse (SR_Grammar *grammar, const LCHAR* trans, LCHAR* meaning, size_t *len); 460 #endif 461 462 /** 463 * Parses source string and copies the first whitespace-delimited token into destination. 464 * 465 * @param source Source string to parse 466 * @param target Target string to copy into 467 * @param charsRead [in] Size of target buffer. 468 * [out] Number of characters read up to end of token. 469 * If the return code is ESR_BUFFER_OVERFLOW, the required length is 470 * returned in this variable. 471 */ 472 int getFirstToken(LCHAR* source, LCHAR* target, size_t* charsRead) 473 { 474 LCHAR* beginning = source; 475 LCHAR* ending; 476 477 /* Skip whitespace */ 478 for (; *beginning!=L('\0') && LISSPACE(*beginning); ++beginning); 479 if (*beginning==L('\0')) 480 return ( -1 ); /* invalid command syntax */ 481 482 if(*beginning == '\"') { 483 beginning++; 484 for (ending=beginning; *ending!=L('\0') && *ending!='\"'; ++ending); 485 *ending = L(' '); 486 } else { 487 /* Find next whitespace */ 488 for (ending=beginning; *ending!=L('\0') && !LISSPACE(*ending); ++ending); 489 } 490 if ((size_t) (ending-beginning) > *charsRead) 491 { 492 *charsRead = ending-beginning; 493 return ( -1 ); 494 } 495 *charsRead = ending-source; 496 LSTRNCPY(target, beginning, ending-beginning); 497 target[ending-beginning] = L('\0'); 498 return ( 0 ); 499 } 500 501 502 503 int srec_test_get_five_command_items ( LCHAR *command_start, size_t first_max_command_size, LCHAR *first_command, 504 size_t second_max_command_size, LCHAR *second_command, 505 size_t third_max_command_size, LCHAR *third_command, 506 size_t fourth_max_command_size, LCHAR *fourth_command, 507 size_t fifth_max_command_size, LCHAR *fifth_command, 508 size_t *actual_commands, LCHAR **command_end ) 509 { 510 int get_status; 511 512 get_status = getFirstToken ( command_start, first_command, &first_max_command_size ); 513 514 if ( get_status == ESR_SUCCESS ) 515 { 516 get_status = getFirstToken ( command_start + first_max_command_size, second_command, &second_max_command_size ); 517 518 if ( get_status == ESR_SUCCESS ) 519 { 520 get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size, 521 third_command, &third_max_command_size ); 522 if ( get_status == ESR_SUCCESS ) 523 { 524 get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size + third_max_command_size, 525 fourth_command, &fourth_max_command_size ); 526 if ( get_status == ESR_SUCCESS ) 527 { 528 get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size + third_max_command_size + fourth_max_command_size, 529 fifth_command, &fifth_max_command_size ); 530 if ( get_status == ESR_SUCCESS ) 531 { 532 if ( command_end != NULL ) 533 *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size + fourth_max_command_size + fifth_max_command_size; 534 if ( actual_commands != NULL ) 535 *actual_commands = 5; 536 } 537 else 538 { 539 if ( command_end != NULL ) 540 *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size + fourth_max_command_size; 541 if ( actual_commands != NULL ) 542 *actual_commands = 4; 543 } 544 } 545 else 546 { 547 if ( command_end != NULL ) 548 *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size; 549 if ( actual_commands != NULL ) 550 *actual_commands = 3; 551 } 552 } 553 else 554 { 555 if ( command_end != NULL ) 556 *command_end = command_start + first_max_command_size + second_max_command_size; 557 if ( actual_commands != NULL ) 558 *actual_commands = 2; 559 } 560 } 561 else 562 { 563 if ( command_end != NULL ) 564 *command_end = command_start + first_max_command_size; 565 if ( actual_commands != NULL ) 566 *actual_commands = 1; 567 } 568 } 569 else 570 { 571 if ( command_end != NULL ) 572 *command_end = command_start; 573 if ( actual_commands != NULL ) 574 *actual_commands = 0; 575 } 576 return ( get_status ); 577 } 578 579 580 581 int srec_test_get_four_command_items ( LCHAR *command_start, size_t first_max_command_size, LCHAR *first_command, 582 size_t second_max_command_size, LCHAR *second_command, 583 size_t third_max_command_size, LCHAR *third_command, 584 size_t fourth_max_command_size, LCHAR *fourth_command, 585 size_t *actual_commands, LCHAR **command_end ) 586 { 587 int get_status; 588 589 get_status = getFirstToken ( command_start, first_command, &first_max_command_size ); 590 591 if ( get_status == ESR_SUCCESS ) 592 { 593 get_status = getFirstToken ( command_start + first_max_command_size, second_command, &second_max_command_size ); 594 595 if ( get_status == ESR_SUCCESS ) 596 { 597 get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size, 598 third_command, &third_max_command_size ); 599 if ( get_status == ESR_SUCCESS ) 600 { 601 get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size + third_max_command_size, 602 fourth_command, &fourth_max_command_size ); 603 if ( get_status == ESR_SUCCESS ) 604 { 605 if ( command_end != NULL ) 606 *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size + fourth_max_command_size; 607 if ( actual_commands != NULL ) 608 *actual_commands = 4; 609 } 610 else 611 { 612 if ( command_end != NULL ) 613 *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size; 614 if ( actual_commands != NULL ) 615 *actual_commands = 3; 616 } 617 } 618 else 619 { 620 if ( command_end != NULL ) 621 *command_end = command_start + first_max_command_size + second_max_command_size; 622 if ( actual_commands != NULL ) 623 *actual_commands = 2; 624 } 625 } 626 else 627 { 628 if ( command_end != NULL ) 629 *command_end = command_start + first_max_command_size; 630 if ( actual_commands != NULL ) 631 *actual_commands = 1; 632 } 633 } 634 else 635 { 636 if ( command_end != NULL ) 637 *command_end = command_start; 638 if ( actual_commands != NULL ) 639 *actual_commands = 0; 640 } 641 return ( get_status ); 642 } 643 644 645 646 int srec_test_get_three_command_items ( LCHAR *command_start, size_t first_max_command_size, LCHAR *first_command, 647 size_t second_max_command_size, LCHAR *second_command, 648 size_t third_max_command_size, LCHAR *third_command, 649 size_t *actual_commands, LCHAR **command_end ) 650 { 651 int get_status; 652 653 get_status = getFirstToken ( command_start, first_command, &first_max_command_size ); 654 655 if ( get_status == ESR_SUCCESS ) 656 { 657 get_status = getFirstToken ( command_start + first_max_command_size, second_command, &second_max_command_size ); 658 659 if ( get_status == ESR_SUCCESS ) 660 { 661 get_status = getFirstToken ( command_start + first_max_command_size + second_max_command_size, 662 third_command, &third_max_command_size ); 663 if ( get_status == ESR_SUCCESS ) 664 { 665 if ( command_end != NULL ) 666 *command_end = command_start + first_max_command_size + second_max_command_size + third_max_command_size; 667 if ( actual_commands != NULL ) 668 *actual_commands = 3; 669 } 670 else 671 { 672 if ( command_end != NULL ) 673 *command_end = command_start + first_max_command_size + second_max_command_size; 674 if ( actual_commands != NULL ) 675 *actual_commands = 2; 676 } 677 } 678 else 679 { 680 if ( command_end != NULL ) 681 *command_end = command_start + first_max_command_size; 682 if ( actual_commands != NULL ) 683 *actual_commands = 1; 684 } 685 } 686 else 687 { 688 if ( command_end != NULL ) 689 *command_end = command_start; 690 if ( actual_commands != NULL ) 691 *actual_commands = 0; 692 } 693 return ( get_status ); 694 } 695 696 697 698 int srec_test_get_two_command_items ( LCHAR *command_start, size_t first_max_command_size, LCHAR *first_command, 699 size_t second_max_command_size, LCHAR *second_command, 700 size_t *actual_commands, LCHAR **command_end ) 701 { 702 int get_status; 703 704 get_status = getFirstToken ( command_start, first_command, &first_max_command_size ); 705 706 if ( get_status == ESR_SUCCESS ) 707 { 708 get_status = getFirstToken ( command_start + first_max_command_size, second_command, &second_max_command_size ); 709 710 if ( get_status == ESR_SUCCESS ) 711 { 712 if ( command_end != NULL ) 713 *command_end = command_start + first_max_command_size + second_max_command_size; 714 if ( actual_commands != NULL ) 715 *actual_commands = 2; 716 } 717 else 718 { 719 if ( command_end != NULL ) 720 *command_end = command_start + first_max_command_size; 721 if ( actual_commands != NULL ) 722 *actual_commands = 1; 723 } 724 } 725 else 726 { 727 if ( command_end != NULL ) 728 *command_end = command_start; 729 if ( actual_commands != NULL ) 730 *actual_commands = 0; 731 } 732 return ( get_status ); 733 } 734 735 736 737 int srec_test_get_one_command_item ( LCHAR *command_start, size_t max_command_size, LCHAR *command, LCHAR **command_end ) 738 { 739 int get_status; 740 741 get_status = getFirstToken ( command_start, command, &max_command_size ); 742 743 if ( get_status == ESR_SUCCESS ) 744 { 745 if ( command_end != NULL ) 746 *command_end = command_start + max_command_size; 747 } 748 return ( get_status ); 749 } 750 751 752 753 /** 754 * Execute TCP-file commands. 755 * 756 * @param text String containing command 757 * @param recognizer The recognizer 758 */ 759 //static int words_added = 0; 760 761 #if defined(APP_ENABLE_TIMER) 762 static PTimer *addWordTimer = NULL; 763 static PTimer *compileTimer = NULL; 764 #endif 765 766 767 768 int srec_test_reset_slots ( SR_Grammar *active_grammar ) 769 { 770 int reset_status; 771 ESR_ReturnCode esr_status; 772 773 if ( active_grammar != NULL ) 774 { 775 reset_status = 0; 776 esr_status = SR_GrammarResetAllSlots ( active_grammar ); 777 778 if ( esr_status != ESR_SUCCESS ) 779 { 780 reset_status = -1; 781 /* Log Here */ 782 } 783 } 784 else 785 { 786 reset_status = -1; 787 /* Log Here */ 788 } 789 return ( reset_status ); 790 } 791 792 793 794 int srec_test_add_word ( SR_Grammar *active_grammar, LCHAR *command_text ) 795 { 796 int add_status; 797 ESR_ReturnCode esr_status; 798 LCHAR slot [MAX_LINE_LENGTH]; 799 LCHAR word [MAX_LINE_LENGTH]; 800 LCHAR pron [MAX_LINE_LENGTH]; 801 LCHAR weight [MAX_UINT_DIGITS+1]; 802 LCHAR semanticTag [MAX_LINE_LENGTH]; 803 int weightNumber; 804 int convert_string_to_num; 805 806 if ( active_grammar != NULL ) 807 { 808 add_status = srec_test_get_five_command_items ( command_text, MAX_LINE_LENGTH, slot, 809 MAX_LINE_LENGTH, word, MAX_LINE_LENGTH, pron, 810 MAX_UINT_DIGITS + 1, weight, MAX_LINE_LENGTH, 811 semanticTag, NULL, NULL ); 812 if ( add_status == 0 ) 813 { 814 convert_string_to_num = lstrtoi (weight, &weightNumber, 10 ); 815 816 if ( convert_string_to_num == 0 ) 817 { 818 #if defined(APP_ENABLE_TIMER) 819 PTimerStart ( addWordTimer ); 820 #endif 821 pron[ strlen(pron)+1] = 0; // make sure we have double-null! 822 esr_status = SR_GrammarAddWordToSlot ( active_grammar, slot, word, pron, weightNumber, semanticTag ); 823 #if defined(APP_ENABLE_TIMER) 824 PTimerStop(addWordTimer); 825 #endif 826 if ( esr_status != ESR_SUCCESS ) 827 { 828 add_status = -1; 829 /* Log Here */ 830 } 831 } 832 else 833 { 834 add_status = -1; 835 /* Log Here */ 836 } 837 } 838 else 839 { 840 add_status = -1; 841 /* Log Here */ 842 } 843 } 844 else 845 { 846 add_status = -1; 847 srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, "No Grammar Activated" ); 848 } 849 return ( add_status ); 850 } 851 852 853 854 int srec_test_compile_active_context ( SR_Grammar *active_grammar ) 855 { 856 int compile_status; 857 ESR_ReturnCode esr_status; 858 859 if ( active_grammar != NULL ) 860 { 861 compile_status = 0; 862 #if defined(APP_ENABLE_TIMER) 863 PTimerStart ( compileTimer ); 864 #endif 865 esr_status = SR_GrammarCompile( active_grammar ); 866 #if defined(APP_ENABLE_TIMER) 867 PTimerStop ( compileTimer ); 868 #endif 869 if ( esr_status != ESR_SUCCESS ) 870 { 871 compile_status = -1; 872 /* Log Here */ 873 } 874 } 875 else 876 { 877 compile_status = -1; 878 srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, L("No Active Grammar To Compile") ); 879 } 880 return ( compile_status ); 881 } 882 883 884 885 int srec_test_load_grammar_data_from_command ( ApplicationData *data, unsigned int grammar_num, LCHAR *command_text ) 886 { 887 int get_status; 888 ESR_ReturnCode esr_status; 889 LCHAR path [P_PATH_MAX]; 890 LCHAR id [P_PATH_MAX]; 891 LCHAR rule [P_PATH_MAX]; 892 LCHAR ve_marker [P_PATH_MAX]; 893 size_t path_length; 894 895 get_status = srec_test_get_four_command_items ( command_text, P_PATH_MAX, path, P_PATH_MAX, id, 896 P_PATH_MAX, rule, P_PATH_MAX, ve_marker, NULL, NULL ); 897 if ( get_status == 0 ) 898 { 899 path_length = P_PATH_MAX; 900 esr_status = ESR_SessionPrefixWithBaseDirectory ( path, &path_length ); 901 902 if ( esr_status == ESR_SUCCESS ) 903 { 904 LSTRCPY ( data->grammars [grammar_num].grammar_path, path ); 905 LSTRCPY ( data->grammars [grammar_num].grammarID, id ); 906 LSTRCPY ( data->grammars [grammar_num].ruleName, rule ); 907 908 if ( LSTRCMP ( ve_marker, L("ve") ) ==0 ) 909 data->grammars [grammar_num].is_ve_grammar = ESR_TRUE; 910 else if ( LSTRCMP ( ve_marker, L("not_ve") ) ==0 ) 911 data->grammars [grammar_num].is_ve_grammar = ESR_FALSE; 912 else 913 { 914 get_status = -1; 915 /* Log Here */ 916 } 917 } 918 else 919 { 920 get_status = -1; 921 /* Log Here */ 922 } 923 } 924 else 925 { 926 /* Log Here */ 927 } 928 return ( get_status ); 929 } 930 931 932 933 int srec_test_load_context ( ApplicationData *data, LCHAR *command_text ) 934 { 935 int load_status; 936 ESR_ReturnCode esr_status; 937 unsigned int open_grammar; 938 939 load_status = srec_test_get_empty_grammar_index ( data, &open_grammar ); 940 941 if ( load_status == 0 ) 942 { 943 load_status = srec_test_load_grammar_data_from_command ( data, open_grammar, command_text ); 944 945 if ( load_status == 0 ) 946 { 947 esr_status = SetupGrammarLoad ( data, open_grammar ); 948 949 if ( esr_status == ESR_SUCCESS ) 950 { 951 LPRINTF(L("Grammar Loaded\n")); 952 data->grammarCount++; 953 } 954 else 955 { 956 load_status = -1; 957 /* Log Here */ 958 } 959 } 960 else 961 { 962 /* Log Here */ 963 } 964 } 965 else 966 { 967 srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Maximum Number Of Grammars Already Loaded") ); 968 } 969 return ( load_status ); 970 } 971 972 973 974 int srec_test_free_context ( SR_Grammar *active_grammar, ApplicationData *data, LCHAR *command_text ) 975 { 976 int free_status; 977 ESR_ReturnCode esr_status; 978 int grammar_num; 979 ESR_BOOL found_grammar; 980 ESR_BOOL grammar_is_active; 981 ESR_BOOL grammar_is_ve; 982 LCHAR grammar_id [P_PATH_MAX]; 983 984 free_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, grammar_id, NULL ); 985 986 if ( free_status == 0 ) 987 { 988 found_grammar = srec_test_get_grammar_from_id ( data, grammar_id, &grammar_num, &grammar_is_active, &grammar_is_ve ); 989 990 if ( found_grammar == ESR_TRUE ) 991 { 992 if ( grammar_is_active == ESR_TRUE ) 993 { 994 if ( grammar_is_ve == ESR_TRUE ) 995 { 996 esr_status = ESR_SessionSetBool("enableGetWaveform", ESR_FALSE); 997 //esr_status = SR_RecognizerSetBoolParameter ( data->recognizer, L("enableGetWaveform"), ESR_FALSE ); 998 999 if ( esr_status != ESR_SUCCESS ) 1000 { 1001 free_status = -1; 1002 /* Log Here */ 1003 } 1004 } 1005 else 1006 { 1007 esr_status = ESR_SUCCESS; 1008 } 1009 if ( esr_status == ESR_SUCCESS ) 1010 { 1011 esr_status = SR_RecognizerDeactivateRule ( data->recognizer, data->grammars [data->active_grammar_num].grammar, 1012 data->grammars [data->active_grammar_num].ruleName ); 1013 if ( esr_status == ESR_SUCCESS ) 1014 { 1015 data->active_grammar_num = -1; 1016 } 1017 else 1018 { 1019 free_status = -1; 1020 /* Log Here */ 1021 } 1022 } 1023 } 1024 else 1025 { 1026 free_status = -1; 1027 /* Log Here */ 1028 } 1029 } 1030 else 1031 { 1032 free_status = -1; 1033 /* Log Here */ 1034 } 1035 } 1036 else 1037 { 1038 /* Log Here */ 1039 } 1040 return ( free_status ); 1041 } 1042 1043 1044 1045 int srec_test_unload_context ( ApplicationData *data, LCHAR *command_text ) 1046 { 1047 int unload_status; 1048 ESR_ReturnCode esr_status; 1049 int grammar_num; 1050 ESR_BOOL found_grammar; 1051 ESR_BOOL grammar_is_active; 1052 ESR_BOOL grammar_is_ve; 1053 LCHAR grammar_id [P_PATH_MAX]; 1054 1055 unload_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, grammar_id, NULL ); 1056 1057 if ( unload_status == 0 ) 1058 { 1059 found_grammar = srec_test_get_grammar_from_id ( data, grammar_id, &grammar_num, &grammar_is_active, &grammar_is_ve ); 1060 1061 if ( found_grammar == ESR_TRUE ) 1062 { 1063 if ( grammar_is_active == ESR_FALSE ) 1064 { 1065 esr_status = SR_GrammarDestroy ( data->grammars [grammar_num].grammar ); 1066 1067 if ( esr_status != ESR_SUCCESS ) 1068 { 1069 unload_status = -1; 1070 /* Log Here */ 1071 } 1072 srec_test_delete_grammar ( data, grammar_num ); 1073 } 1074 else 1075 { 1076 unload_status = -1; 1077 /* Log Here */ 1078 } 1079 } 1080 else 1081 { 1082 unload_status = -1; 1083 /* Log Here */ 1084 } 1085 } 1086 else 1087 { 1088 /* Log Here */ 1089 } 1090 return ( unload_status ); 1091 } 1092 1093 1094 1095 int srec_test_use_context ( SR_Grammar *active_grammar, ApplicationData *data, LCHAR *command_text ) 1096 { 1097 int use_status; 1098 ESR_ReturnCode esr_status; 1099 int grammar_num; 1100 ESR_BOOL found_grammar; 1101 ESR_BOOL grammar_is_active; 1102 ESR_BOOL grammar_is_ve; 1103 LCHAR grammar_id [P_PATH_MAX]; 1104 1105 if ( active_grammar == NULL ) 1106 { 1107 use_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, grammar_id, NULL ); 1108 1109 if ( use_status == 0 ) 1110 { 1111 found_grammar = srec_test_get_grammar_from_id ( data, grammar_id, &grammar_num, &grammar_is_active, &grammar_is_ve ); 1112 1113 if ( found_grammar == ESR_TRUE ) 1114 { 1115 esr_status = SR_RecognizerActivateRule ( data->recognizer, data->grammars [grammar_num].grammar, 1116 data->grammars [grammar_num].ruleName, 1 ); 1117 if ( esr_status == ESR_SUCCESS ) 1118 { 1119 if ( data->grammars [grammar_num].is_ve_grammar == ESR_TRUE ) 1120 { 1121 esr_status = ESR_SessionSetBool("enableGetWaveform", ESR_TRUE); 1122 //esr_status = SR_RecognizerSetBoolParameter ( data->recognizer, L("enableGetWaveform"), ESR_TRUE ); 1123 1124 if ( esr_status == ESR_SUCCESS ) 1125 { 1126 data->active_grammar_num = (int)grammar_num; 1127 } 1128 else 1129 { 1130 use_status = -1; 1131 /* Log Here */ 1132 SR_RecognizerDeactivateRule ( data->recognizer, data->grammars [grammar_num].grammar, 1133 data->grammars [grammar_num].ruleName ); 1134 } 1135 } 1136 else 1137 { 1138 data->active_grammar_num = (int)grammar_num; 1139 } 1140 } 1141 else 1142 { 1143 use_status = -1; 1144 /* Log Here */ 1145 } 1146 } 1147 else 1148 { 1149 use_status = -1; 1150 /* Log Here */ 1151 } 1152 } 1153 else 1154 { 1155 use_status = -1; 1156 /* Log Here */ 1157 } 1158 } 1159 else 1160 { 1161 use_status = -1; 1162 PLogError("ERROR: context_use ignored, use context_free first!"); 1163 /* Log Here */ 1164 } 1165 return ( use_status ); 1166 } 1167 1168 1169 1170 int srec_test_save_context ( SR_Grammar *active_grammar, LCHAR *command_text ) 1171 { 1172 int save_status; 1173 ESR_ReturnCode esr_status; 1174 LCHAR file_name [P_PATH_MAX]; 1175 1176 if ( active_grammar != NULL ) 1177 { 1178 save_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, file_name, NULL ); 1179 1180 if ( save_status == 0 ) 1181 { 1182 esr_status = SR_GrammarSave ( active_grammar, file_name ); 1183 1184 if ( esr_status != ESR_SUCCESS ) 1185 { 1186 save_status = -1; 1187 /* Log Here */ 1188 } 1189 } 1190 else 1191 { 1192 /* Log Here */ 1193 } 1194 } 1195 else 1196 { 1197 save_status = -1; 1198 srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, "No Grammar Activated" ); 1199 } 1200 return ( save_status ); 1201 } 1202 1203 1204 1205 int srec_test_get_size_t_parameter ( ApplicationData *data, LCHAR *command_text ) 1206 { 1207 int get_status; 1208 ESR_ReturnCode esr_status; 1209 LCHAR key [P_PATH_MAX]; 1210 size_t value; 1211 1212 get_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, key, NULL ); 1213 1214 if ( get_status == 0 ) 1215 { 1216 esr_status = SR_RecognizerGetSize_tParameter ( data->recognizer, key, &value ); 1217 1218 if ( esr_status == ESR_SUCCESS ) 1219 { 1220 printf ( "Get Parameter : %s : %u\n", key, value ); 1221 } 1222 else 1223 { 1224 get_status = -1; 1225 /* Log Here */ 1226 } 1227 } 1228 return ( get_status ); 1229 } 1230 1231 1232 1233 int srec_test_set_size_t_parameter ( ApplicationData *data, LCHAR *command_text ) 1234 { 1235 int set_status; 1236 ESR_ReturnCode esr_status; 1237 LCHAR key [P_PATH_MAX]; 1238 LCHAR value [MAX_UINT_DIGITS+1]; 1239 int value_as_number; 1240 int convert_string_to_num; 1241 1242 set_status = srec_test_get_two_command_items ( command_text, P_PATH_MAX, key, 1243 MAX_UINT_DIGITS + 1, value, NULL, NULL ); 1244 if ( set_status == 0 ) 1245 { 1246 convert_string_to_num = lstrtoi ( value, &value_as_number, 10 ); 1247 1248 if ( convert_string_to_num == 0 ) 1249 { 1250 if ( value_as_number > 0 ) 1251 { 1252 esr_status = SR_RecognizerSetSize_tParameter ( data->recognizer, key, (size_t)value_as_number ); 1253 1254 if ( esr_status != ESR_SUCCESS ) 1255 { 1256 set_status = -1; 1257 /* Log Here */ 1258 } 1259 } 1260 else 1261 { 1262 set_status = -1; 1263 /* Log Here */ 1264 } 1265 } 1266 else 1267 { 1268 set_status = -1; 1269 /* Log Here */ 1270 } 1271 } 1272 return ( set_status ); 1273 } 1274 1275 1276 1277 int srec_test_voice_enroll ( SR_Grammar *active_grammar, ApplicationData *data, LCHAR *command_text ) 1278 { 1279 int enroll_status; 1280 ESR_ReturnCode esr_status; 1281 LCHAR slot [P_PATH_MAX]; 1282 LCHAR nametagID [P_PATH_MAX]; 1283 LCHAR weight [MAX_UINT_DIGITS+1]; 1284 int weightNumber; 1285 int convert_string_to_num; 1286 1287 if ( active_grammar != NULL ) 1288 { 1289 if ( data->nametag != NULL ) 1290 { 1291 enroll_status = srec_test_get_three_command_items ( command_text, P_PATH_MAX, slot, P_PATH_MAX, nametagID, 1292 MAX_UINT_DIGITS + 1, weight, NULL, NULL ); 1293 if ( enroll_status == 0 ) 1294 { 1295 convert_string_to_num = lstrtoi ( weight, &weightNumber, 10 ); 1296 1297 if ( convert_string_to_num == 0 ) 1298 { 1299 esr_status = SR_NametagSetID ( data->nametag, nametagID ); 1300 1301 if ( esr_status == ESR_SUCCESS ) 1302 { 1303 LCHAR value[MAX_LINE_LENGTH]; 1304 LSPRINTF( value,"V='%s';",nametagID); 1305 esr_status = SR_GrammarAddNametagToSlot ( active_grammar, slot, data->nametag, weightNumber, value ); 1306 if ( esr_status != ESR_SUCCESS ) 1307 { 1308 enroll_status = -1; 1309 /* Log Here */ 1310 } 1311 } 1312 else 1313 { 1314 enroll_status = -1; 1315 /* Log Here */ 1316 } 1317 } 1318 else 1319 { 1320 enroll_status = -1; 1321 /* Log Here */ 1322 } 1323 } 1324 else 1325 { 1326 /* Log Here */ 1327 } 1328 } 1329 else 1330 { 1331 enroll_status = -1; 1332 /* Log Here */ 1333 } 1334 } 1335 else 1336 { 1337 enroll_status = -1; 1338 srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, "No Grammar Activated" ); 1339 } 1340 return ( enroll_status ); 1341 } 1342 1343 1344 1345 int srec_test_load_nametags ( ApplicationData *data, LCHAR *command_text ) 1346 { 1347 int load_status; 1348 ESR_ReturnCode esr_status; 1349 LCHAR file_name [P_PATH_MAX]; 1350 1351 load_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, file_name, NULL ); 1352 1353 if ( load_status == 0 ) 1354 { 1355 esr_status = SR_NametagsLoad ( data->nametags, file_name ); 1356 1357 if ( esr_status != ESR_SUCCESS ) 1358 { 1359 load_status = -1; 1360 /* Log Here */ 1361 } 1362 } 1363 else 1364 { 1365 load_status = -1; 1366 /* Log Here */ 1367 } 1368 return ( load_status ); 1369 } 1370 1371 1372 1373 int srec_test_save_nametags ( ApplicationData *data, LCHAR *command_text ) 1374 { 1375 int save_status; 1376 ESR_ReturnCode esr_status; 1377 LCHAR file_name [P_PATH_MAX]; 1378 1379 save_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, file_name, NULL ); 1380 1381 if ( save_status == 0 ) 1382 { 1383 esr_status = SR_NametagsSave ( data->nametags, file_name ); 1384 1385 if ( esr_status != ESR_SUCCESS ) 1386 { 1387 save_status = -1; 1388 /* Log Here */ 1389 } 1390 } 1391 else 1392 { 1393 save_status = -1; 1394 /* Log Here */ 1395 } 1396 return ( save_status ); 1397 } 1398 1399 1400 1401 int srec_test_clear_nametags ( ApplicationData *data ) 1402 { 1403 int clear_status; 1404 ESR_ReturnCode esr_status; 1405 1406 clear_status = 0; 1407 esr_status = SR_NametagsDestroy ( data->nametags ); 1408 1409 if ( esr_status == ESR_SUCCESS ) 1410 { 1411 data->nametags = NULL; 1412 esr_status = SR_NametagsCreate ( &data->nametags ); 1413 1414 if ( esr_status != ESR_SUCCESS ) 1415 { 1416 clear_status = -1; 1417 /* Log Here */ 1418 } 1419 } 1420 else 1421 { 1422 clear_status = -1; 1423 /* Log Here */ 1424 } 1425 return ( clear_status ); 1426 } 1427 1428 1429 1430 int srec_test_add_to_nametags ( ApplicationData *data, LCHAR *command_text ) 1431 { 1432 int add_status; 1433 ESR_ReturnCode esr_status; 1434 LCHAR nametagID [P_PATH_MAX]; 1435 1436 if ( data->nametag != NULL ) 1437 { 1438 add_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, nametagID, NULL ); 1439 1440 if ( add_status == 0 ) 1441 { 1442 esr_status = SR_NametagSetID ( data->nametag, nametagID ); 1443 1444 if ( esr_status == ESR_SUCCESS ) 1445 { 1446 esr_status = SR_NametagsAdd ( data->nametags, data->nametag ); 1447 1448 if ( esr_status == ESR_SUCCESS ) 1449 { 1450 data->nametag = NULL; 1451 } 1452 else 1453 { 1454 add_status = -1; 1455 /* Log Here */ 1456 } 1457 } 1458 else 1459 { 1460 add_status = -1; 1461 /* Log Here */ 1462 } 1463 } 1464 else 1465 { 1466 add_status = -1; 1467 /* Log Here */ 1468 } 1469 } 1470 else 1471 { 1472 add_status = -1; 1473 /* Log Here */ 1474 } 1475 return ( add_status ); 1476 } 1477 1478 1479 int srec_test_voice_enroll_nametags ( SR_Grammar *active_grammar, ApplicationData *data, LCHAR *command_text ) 1480 { 1481 int enroll_status; 1482 ESR_ReturnCode esr_status; 1483 LCHAR slot [P_PATH_MAX]; 1484 SR_Nametag *nametag; 1485 size_t nametags_size; 1486 size_t current_nametag; 1487 1488 if ( active_grammar != NULL ) 1489 { 1490 enroll_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, slot, NULL ); 1491 1492 if ( enroll_status == 0 ) 1493 { 1494 esr_status = SR_NametagsGetSize (data->nametags, &nametags_size ); 1495 1496 if ( esr_status == ESR_SUCCESS ) 1497 { 1498 current_nametag = 0; 1499 1500 while ( ( current_nametag < nametags_size ) && ( esr_status == ESR_SUCCESS ) ) 1501 { 1502 esr_status = SR_NametagsGetAtIndex ( data->nametags, current_nametag, &nametag ); 1503 1504 if ( esr_status == ESR_SUCCESS ) 1505 { 1506 esr_status = SR_GrammarAddNametagToSlot ( active_grammar, slot, nametag, 0, NULL ); 1507 1508 if ( esr_status == ESR_SUCCESS ) 1509 { 1510 current_nametag++; 1511 } 1512 else 1513 { 1514 enroll_status = -1; 1515 /* Log Here */ 1516 } 1517 } 1518 else 1519 { 1520 enroll_status = -1; 1521 /* Log Here */ 1522 } 1523 } 1524 } 1525 else 1526 { 1527 enroll_status = -1; 1528 /* Log Here */ 1529 } 1530 } 1531 else 1532 { 1533 /* Log Here */ 1534 } 1535 } 1536 else 1537 { 1538 enroll_status = -1; 1539 srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, "No Grammar Activated" ); 1540 } 1541 return ( enroll_status ); 1542 } 1543 1544 1545 1546 int srec_test_set_audio_size ( ApplicationData *data, LCHAR *command_text ) 1547 { 1548 int set_status; 1549 LCHAR new_size [P_PATH_MAX]; 1550 int size_as_number; 1551 int convert_string_to_num; 1552 1553 set_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, new_size, NULL ); 1554 1555 if ( set_status == 0 ) 1556 { 1557 convert_string_to_num = lstrtoi ( new_size, &size_as_number, 10 ); 1558 1559 if ( convert_string_to_num == 0 ) 1560 { 1561 if ( ( size_as_number > 0 ) && ( size_as_number <= MAX_AUDIO_BUFFER_SIZE ) ) 1562 { 1563 data->audio_buffer_requested_size = size_as_number; 1564 LPRINTF ( L("Audio Size Set To %d\n"), size_as_number ); 1565 } 1566 else 1567 { 1568 set_status = -1; 1569 /* Log Here */ 1570 } 1571 } 1572 else 1573 { 1574 set_status = -1; 1575 /* Log Here */ 1576 } 1577 } 1578 return ( set_status ); 1579 } 1580 1581 1582 #ifdef _WIN32 1583 int srec_test_sleep ( LCHAR *command_text ) 1584 { 1585 1586 return ( - 1 ); 1587 } 1588 #else 1589 int srec_test_sleep ( LCHAR *command_text ) 1590 { 1591 int sleep_status; 1592 struct timeval sleep_time_struct; 1593 LCHAR sleep_time [P_PATH_MAX]; 1594 int time_as_number; 1595 int convert_string_to_num; 1596 1597 sleep_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, sleep_time, NULL ); 1598 1599 if ( sleep_status == 0 ) 1600 { 1601 convert_string_to_num = lstrtoi ( sleep_time, &time_as_number, 10 ); 1602 1603 if ( convert_string_to_num == 0 ) 1604 { 1605 sleep_time_struct.tv_sec = time_as_number; 1606 sleep_time_struct.tv_usec = 0; 1607 select ( 0, NULL, NULL, NULL, &sleep_time_struct ); 1608 } 1609 else 1610 { 1611 sleep_status = -1; 1612 /* Log Here */ 1613 } 1614 } 1615 return ( sleep_status ); 1616 } 1617 #endif 1618 1619 1620 int srec_test_change_sample_rate ( ApplicationData *data, LCHAR *command_text ) 1621 { 1622 int change_status; 1623 ESR_ReturnCode esr_status; 1624 LCHAR new_rate [P_PATH_MAX]; 1625 int rate_as_number; 1626 int convert_string_to_num; 1627 1628 change_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, new_rate, NULL ); 1629 1630 if ( change_status == 0 ) 1631 { 1632 convert_string_to_num = lstrtoi ( new_rate, &rate_as_number, 10 ); 1633 1634 if ( convert_string_to_num == 0 ) 1635 { 1636 esr_status = SR_Recognizer_Change_Sample_Rate ( data->recognizer, rate_as_number ); 1637 1638 if ( esr_status != ESR_SUCCESS ) 1639 { 1640 change_status = -1; 1641 /* Log Here */ 1642 } 1643 } 1644 else 1645 { 1646 change_status = -1; 1647 /* Log Here */ 1648 } 1649 } 1650 if ( change_status == 0 ) 1651 printf ( "\nSuccessfully Set Sample Rate To : %s\n", new_rate ); 1652 else 1653 printf ( "\nFailed To Set Sample Rate To : %s\n", new_rate ); 1654 return ( change_status ); 1655 } 1656 1657 1658 1659 int srec_test_set_acousticstate ( ApplicationData *data, LCHAR *command_text ) 1660 { 1661 int set_status; 1662 ESR_ReturnCode esr_status; 1663 LCHAR state_string [P_PATH_MAX]; 1664 1665 set_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, state_string, NULL ); 1666 1667 if ( set_status == 0 ) 1668 { 1669 esr_status = SR_AcousticStateSet ( data->recognizer, state_string ); 1670 1671 if ( esr_status != ESR_SUCCESS ) 1672 { 1673 set_status = -1; 1674 /* Log Here */ 1675 } 1676 } 1677 else 1678 { 1679 /* Log Here */ 1680 } 1681 return ( set_status ); 1682 } 1683 1684 1685 1686 int srec_test_get_acousticstate ( ApplicationData *data ) 1687 { 1688 int get_status; 1689 ESR_ReturnCode esr_status; 1690 LCHAR state_string[1000]; 1691 size_t len; 1692 1693 get_status = 0; 1694 len = sizeof(state_string); 1695 esr_status = SR_AcousticStateGet ( data->recognizer, state_string, &len ); 1696 1697 if ( esr_status == ESR_SUCCESS ) 1698 { 1699 printf ( "Acoustic State :\n%s\n", state_string ); 1700 } 1701 else 1702 { 1703 get_status = -1; 1704 /* Log Here */ 1705 } 1706 return ( get_status ); 1707 } 1708 1709 1710 1711 int srec_test_reset_acousticstate ( ApplicationData *data ) 1712 { 1713 int reset_status; 1714 ESR_ReturnCode esr_status; 1715 1716 reset_status = 0; 1717 esr_status = SR_AcousticStateReset ( data->recognizer ); 1718 1719 if ( esr_status != ESR_SUCCESS ) 1720 { 1721 reset_status = -1; 1722 /* Log Here */ 1723 } 1724 return ( reset_status ); 1725 } 1726 1727 1728 1729 int srec_test_set_forced_rec_mode ( ApplicationData *data, LCHAR *command_text ) 1730 { 1731 int set_status; 1732 LCHAR mode[P_PATH_MAX]; 1733 1734 set_status = srec_test_get_one_command_item ( command_text, P_PATH_MAX, mode, NULL ); 1735 1736 if ( set_status == 0 ) 1737 { 1738 if ( LSTRCMP ( mode, L("one_time") ) == 0 ) 1739 { 1740 data->forced_rec_mode = ForcedRecModeOneTime; 1741 } 1742 else if ( LSTRCMP ( mode, L("off") ) == 0 ) 1743 { 1744 data->forced_rec_mode = ForcedRecModeOff; 1745 } 1746 else if ( LSTRCMP ( mode, L("on") ) == 0 ) 1747 { 1748 data->forced_rec_mode = ForcedRecModeOn; 1749 } 1750 else 1751 { 1752 set_status = -1; 1753 /* Log Here */ 1754 } 1755 } 1756 return ( set_status ); 1757 } 1758 1759 1760 1761 int srec_test_execute_command ( ApplicationData *data, LCHAR *text, FILE *results_file, size_t *recognition_count ) 1762 { 1763 int execute_status; 1764 LCHAR *current_command_start; 1765 LCHAR *current_end_command; 1766 LCHAR command [MAX_LINE_LENGTH]; 1767 SR_Grammar *active_grammar; 1768 LCHAR log_buffer [LOG_BUFFER_SIZE]; 1769 1770 srec_test_get_active_grammar ( data, &active_grammar ); 1771 current_command_start = text; 1772 execute_status = srec_test_get_one_command_item ( current_command_start, MAX_LINE_LENGTH, command, ¤t_end_command ); 1773 1774 if ( execute_status == 0 ) 1775 { 1776 if( data->nametag 1777 && ((LSTRCMP(command, "recognize_nist")==0) || (LSTRCMP(command, "recognize_pcm")==0)) ) { 1778 /* if there is a nametag held in memory, and we don't make use of it, then 1779 let's destroy it here */ 1780 SR_NametagDestroy( data->nametag); 1781 data->nametag = NULL; 1782 } 1783 1784 if ( LSTRCMP ( command, L("recognize_nist") ) == 0 ) 1785 execute_status = srec_test_recognize_nist_file ( active_grammar, data, results_file, 1786 current_end_command, recognition_count ); 1787 else if ( LSTRCMP ( command, L("recognize_pcm") ) == 0 ) 1788 execute_status = srec_test_recognize_pcm_file ( active_grammar, data, results_file, 1789 current_end_command, recognition_count ); 1790 else if ( LSTRCMP ( command, L("context_load") ) == 0 ) 1791 execute_status = srec_test_load_context ( data, current_end_command ); 1792 else if ( LSTRCMP ( command, L("context_use") ) == 0 ) 1793 execute_status = srec_test_use_context ( active_grammar, data, current_end_command ); 1794 else if ( LSTRCMP ( command, L("context_free") ) == 0 ) 1795 execute_status = srec_test_free_context ( active_grammar, data, current_end_command ); 1796 else if ( LSTRCMP ( command, L("context_unload") ) == 0 ) 1797 execute_status = srec_test_unload_context ( data, current_end_command ); 1798 else if ( LSTRCMP ( command, L("addwords_from_nametags") ) == 0 ) 1799 execute_status = srec_test_voice_enroll_nametags ( active_grammar, data, current_end_command ); 1800 else if ( LSTRCMP ( command, L("resetslots") ) == 0 ) 1801 execute_status = srec_test_reset_slots ( active_grammar ); 1802 else if ( LSTRCMP ( command, L("addword") ) == 0 ) 1803 execute_status = srec_test_add_word ( active_grammar, current_end_command ); 1804 else if ( LSTRCMP ( command, L("context_compile") ) == 0 ) 1805 execute_status = srec_test_compile_active_context ( active_grammar ); 1806 else if ( LSTRCMP ( command, L("context_save") ) == 0 ) 1807 execute_status = srec_test_save_context ( active_grammar, current_end_command ); 1808 else if ( LSTRCMP ( command, L("addword_from_last_nametag") ) == 0 ) 1809 execute_status = srec_test_voice_enroll ( active_grammar, data, current_end_command ); 1810 else if ( LSTRCMP ( command, L("load_nametags") ) == 0 ) 1811 execute_status = srec_test_load_nametags ( data, current_end_command ); 1812 else if ( LSTRCMP ( command, L("save_nametags") ) == 0 ) 1813 execute_status = srec_test_save_nametags ( data, current_end_command ); 1814 else if ( LSTRCMP ( command, L("clear_nametags") ) ==0 ) 1815 execute_status = srec_test_clear_nametags ( data ); 1816 else if ( LSTRCMP ( command, L("add_to_nametags") ) == 0 ) 1817 execute_status = srec_test_add_to_nametags ( data, current_end_command ); 1818 else if ( LSTRCMP ( command, L("acousticstate_set") ) == 0 ) 1819 execute_status = srec_test_set_acousticstate ( data, current_end_command ); 1820 else if ( LSTRCMP ( command, L("acousticstate_get") ) == 0 ) 1821 execute_status = srec_test_get_acousticstate ( data ); 1822 else if ( LSTRCMP ( command, L("acousticstate_reset") ) == 0 ) 1823 execute_status = srec_test_reset_acousticstate ( data ); 1824 else if ( LSTRCMP ( command, L("forced_rec") ) == 0 ) 1825 execute_status = srec_test_set_forced_rec_mode ( data, current_end_command ); 1826 else if ( LSTRCMP ( command, L("change_sample_rate") ) == 0 ) 1827 execute_status = srec_test_change_sample_rate ( data, current_end_command ); 1828 else if ( LSTRCMP ( command, L("set_size_t_parameter") ) == 0 ) 1829 execute_status = srec_test_set_size_t_parameter ( data, current_end_command ); 1830 else if ( LSTRCMP ( command, L("get_size_t_parameter") ) == 0 ) 1831 execute_status = srec_test_get_size_t_parameter ( data, current_end_command ); 1832 else if ( LSTRCMP ( command, L("set_audio_size") ) == 0 ) 1833 execute_status = srec_test_set_audio_size ( data, current_end_command ); 1834 else if ( LSTRCMP ( command, L("sleep") ) == 0 ) 1835 execute_status = srec_test_sleep ( current_end_command ); 1836 else if ( *( command ) == L('#') ) 1837 execute_status = 0; /* Comment in file just skip */ 1838 else 1839 { 1840 execute_status = -1; 1841 LSPRINTF ( log_buffer, L("Unknown Command %s"), command ); 1842 srec_test_log_error ( 0, ERROR_LEVEL_MODERATE, log_buffer ); 1843 } 1844 } 1845 else 1846 { 1847 /* Log Here */ 1848 } 1849 return ( execute_status ); 1850 } 1851 1852 1853 1854 int srec_test_open_command_file ( PFile **command_file ) 1855 { 1856 int open_status; 1857 ESR_ReturnCode esr_status; 1858 LCHAR file_name [P_PATH_MAX]; 1859 size_t len; 1860 1861 open_status = 0; 1862 len = P_PATH_MAX; 1863 esr_status = ESR_SessionGetLCHAR ( L("cmdline.tcp"), file_name, &len ); 1864 1865 if ( esr_status == ESR_SUCCESS ) 1866 { 1867 len = P_PATH_MAX; 1868 esr_status = ESR_SessionPrefixWithBaseDirectory ( file_name, &len ); 1869 1870 if ( esr_status == ESR_SUCCESS ) 1871 { 1872 *command_file = pfopen ( file_name, L("r") ); 1873 1874 if ( *command_file == NULL ) 1875 { 1876 open_status = -1; 1877 LPRINTF(L("\nError opening command file %s\n"), file_name); 1878 } 1879 } 1880 else 1881 { 1882 open_status = -1; 1883 LPRINTF(L("\nError finding command file\n")); 1884 } 1885 } 1886 else 1887 { 1888 open_status = -1; 1889 /* Log Here */ 1890 } 1891 return ( open_status ); 1892 } 1893 1894 1895 1896 void srec_test_close_command_file ( PFile *command_file ) 1897 { 1898 1899 pfclose ( command_file ); 1900 } 1901 1902 1903 1904 void srec_test_close_audio_file ( PFile *audio_file ) 1905 { 1906 1907 pfclose ( audio_file ); 1908 } 1909 1910 1911 1912 int srec_test_open_results_file ( FILE **results_file ) 1913 { 1914 int open_status; 1915 ESR_ReturnCode esr_status; 1916 LCHAR file_name [P_PATH_MAX]; 1917 size_t len; 1918 1919 open_status = 0; 1920 len = P_PATH_MAX; 1921 esr_status = ESR_SessionGetLCHAR ( L("cmdline.results"), file_name, &len ); 1922 1923 if ( esr_status == ESR_SUCCESS ) 1924 { 1925 *results_file = fopen ( file_name, L("w") ); 1926 1927 if ( ( *results_file ) == NULL ) 1928 { 1929 open_status = -1; 1930 /* Log Here */ 1931 } 1932 } 1933 else 1934 { 1935 open_status = -1; 1936 /* Log Here */ 1937 } 1938 return ( open_status ); 1939 } 1940 1941 1942 1943 void srec_test_close_results_file ( FILE *results_file ) 1944 { 1945 1946 fclose ( results_file ); 1947 } 1948 1949 1950 1951 int srec_test_process_commands ( ApplicationData *data ) 1952 { 1953 int process_status; 1954 PFile *command_file; 1955 FILE *results_file; 1956 LCHAR *got_line_ok; 1957 LCHAR linebuffer [MAX_LINE_LENGTH]; 1958 size_t recognition_count; 1959 1960 recognition_count = 0; 1961 process_status = srec_test_open_command_file ( &command_file ); 1962 1963 if ( process_status == 0 ) 1964 { 1965 process_status = srec_test_open_results_file ( &results_file ); 1966 1967 if ( process_status == 0 ) 1968 { 1969 do 1970 { 1971 got_line_ok = pfgets ( linebuffer, MAX_LINE_LENGTH, command_file ); 1972 1973 if ( got_line_ok != NULL ) 1974 srec_test_execute_command ( data, linebuffer, results_file, &recognition_count ); 1975 } 1976 while ( ( got_line_ok != NULL ) && ( process_status == 0 ) ); 1977 if( data->nametag ) { 1978 SR_NametagDestroy( data->nametag); 1979 data->nametag = NULL; 1980 } 1981 1982 1983 srec_test_close_results_file ( results_file ); 1984 } 1985 srec_test_close_command_file ( command_file ); 1986 } 1987 return ( process_status ); 1988 } 1989 1990 1991 1992 int srec_test_open_pcm_file ( LCHAR *file_name, PFile **pcm_file ) 1993 { 1994 int open_status; 1995 ESR_ReturnCode esr_status; 1996 int lstr_result; 1997 LCHAR file_path [P_PATH_MAX]; 1998 size_t len; 1999 2000 open_status = 0; 2001 len = P_PATH_MAX; 2002 esr_status = ESR_SessionGetLCHAR ( L("cmdline.datapath"), file_path, &len ); 2003 2004 if ( esr_status == ESR_SUCCESS ) 2005 { 2006 len = P_PATH_MAX; 2007 esr_status = ESR_SessionPrefixWithBaseDirectory ( file_path, &len ); 2008 2009 if ( esr_status == ESR_SUCCESS ) 2010 { 2011 esr_status = pf_convert_backslashes_to_forwardslashes ( file_path ); 2012 2013 if ( esr_status == ESR_SUCCESS ) 2014 { 2015 len = P_PATH_MAX; 2016 lstr_result = lstrinsert ( file_path, file_name, 0, &len ); 2017 2018 if ( lstr_result == 0 ) 2019 { 2020 *pcm_file = pfopen ( file_name, L("rb") ); 2021 2022 if ( ( *pcm_file ) == NULL ) 2023 { 2024 open_status = -1; 2025 } 2026 } 2027 else 2028 { 2029 open_status = -1; 2030 /* Log Here */ 2031 } 2032 } 2033 else 2034 { 2035 open_status = -1; 2036 /* Log Here */ 2037 } 2038 } 2039 else 2040 { 2041 open_status = -1; 2042 /* Log Here */ 2043 } 2044 } 2045 else 2046 { 2047 open_status = -1; 2048 /* Log Here */ 2049 } 2050 if(open_status) PLogError( ("Error: while opening %s\n"), file_name); 2051 return ( open_status ); 2052 } 2053 2054 2055 2056 int srec_test_open_nist_file ( LCHAR *file_name, PFile **nist_file ) 2057 { 2058 int open_status; 2059 ESR_ReturnCode esr_status; 2060 int lstr_result; 2061 LCHAR file_path [P_PATH_MAX]; 2062 size_t len; 2063 2064 open_status = 0; 2065 len = P_PATH_MAX; 2066 esr_status = ESR_SessionGetLCHAR ( L("cmdline.datapath"), file_path, &len ); 2067 2068 if ( esr_status == ESR_SUCCESS ) 2069 { 2070 len = P_PATH_MAX; 2071 esr_status = ESR_SessionPrefixWithBaseDirectory ( file_path, &len ); 2072 2073 if ( esr_status == ESR_SUCCESS ) 2074 { 2075 esr_status = pf_convert_backslashes_to_forwardslashes ( file_path ); 2076 2077 if(file_path[ LSTRLEN(file_path)-1] != L('/')) 2078 LSTRCAT(file_path,L("/")); 2079 2080 if ( esr_status == ESR_SUCCESS ) 2081 { 2082 len = P_PATH_MAX; 2083 lstr_result = lstrinsert ( file_path, file_name, 0, &len ); 2084 2085 if ( lstr_result == 0 ) 2086 { 2087 *nist_file = pfopen ( file_name, L("rb") ); 2088 2089 if ( ( *nist_file ) != NULL ) 2090 { 2091 esr_status = pfseek ( *nist_file, 1024, SEEK_SET ); 2092 2093 if ( esr_status != ESR_SUCCESS ) 2094 { 2095 open_status = -1; 2096 } 2097 } 2098 else 2099 { 2100 open_status = -1; 2101 } 2102 } 2103 else 2104 { 2105 open_status = -1; 2106 /* Log Here */ 2107 } 2108 } 2109 else 2110 { 2111 open_status = -1; 2112 /* Log Here */ 2113 } 2114 } 2115 else 2116 { 2117 open_status = -1; 2118 /* Log Here */ 2119 } 2120 } 2121 else 2122 { 2123 open_status = -1; 2124 /* Log Here */ 2125 } 2126 if(open_status) PLogError( ("Error: while opening %s\n"), file_name); 2127 return ( open_status ); 2128 } 2129 2130 2131 2132 int srec_test_get_audio_from_file ( PFile *audio_file, ApplicationData *data, ESR_BOOL *hit_eof ) 2133 { 2134 int get_status; 2135 int eof_status; 2136 2137 get_status = 0; 2138 data->num_samples_read = pfread ( data->audio_buffer, sizeof ( asr_int16_t ), data->audio_buffer_requested_size, audio_file ); 2139 2140 if ( data->num_samples_read > 0 ) 2141 { 2142 *hit_eof = ESR_FALSE; 2143 } 2144 else 2145 { 2146 eof_status = pfeof ( audio_file ); 2147 2148 if ( eof_status == 0 ) 2149 { 2150 get_status = -1; 2151 /* Log Here */ 2152 } 2153 else 2154 { 2155 *hit_eof = ESR_TRUE; 2156 } 2157 } 2158 return ( get_status ); 2159 } 2160 2161 2162 2163 int srec_test_feed_recognizer ( ApplicationData *data, ESR_BOOL hit_eof, SR_RecognizerStatus *esr_recog_status, SR_RecognizerResultType *result_type ) 2164 { 2165 int feed_status; 2166 ESR_ReturnCode esr_status; 2167 2168 feed_status = 0; 2169 esr_status = SR_RecognizerPutAudio ( data->recognizer, data->audio_buffer, &data->num_samples_read, hit_eof ); 2170 2171 if ( esr_status == ESR_SUCCESS ) 2172 { 2173 do 2174 { 2175 esr_status = SR_RecognizerAdvance ( data->recognizer, esr_recog_status, result_type, &data->result ); 2176 2177 if ( esr_status != ESR_SUCCESS ) 2178 { 2179 feed_status = -1; 2180 *esr_recog_status = SR_RECOGNIZER_EVENT_STOPPED; 2181 *result_type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE; 2182 /* Log Here */ 2183 } 2184 } 2185 while ( ( *esr_recog_status ) == SR_RECOGNIZER_EVENT_INCOMPLETE ); 2186 } 2187 else 2188 { 2189 feed_status = -1; 2190 /* Log Here */ 2191 } 2192 return ( feed_status ); 2193 } 2194 2195 2196 2197 int srec_test_flush_audio ( ApplicationData *data, SR_RecognizerStatus *esr_recog_status, SR_RecognizerResultType *result_type ) 2198 { 2199 int flush_status; 2200 ESR_ReturnCode esr_status; 2201 2202 flush_status = 0; 2203 2204 while ( ( *result_type ) != SR_RECOGNIZER_RESULT_TYPE_COMPLETE ) 2205 { 2206 esr_status = SR_RecognizerAdvance ( data->recognizer, esr_recog_status, result_type, &data->result ); 2207 2208 if ( esr_status != ESR_SUCCESS ) 2209 { 2210 flush_status = -1; 2211 *esr_recog_status = SR_RECOGNIZER_EVENT_STOPPED; 2212 *result_type = SR_RECOGNIZER_RESULT_TYPE_COMPLETE; 2213 /* Log Here */ 2214 } 2215 } 2216 return ( flush_status ); 2217 } 2218 2219 2220 2221 int srec_test_process_start_timeout ( ApplicationData *data, FILE *results_file ) 2222 { 2223 int process_status; 2224 ESR_ReturnCode esr_status; 2225 size_t utterance_timeout; 2226 2227 process_status = 0; 2228 esr_status = ESR_SessionGetSize_t ( L("SREC.Recognizer.utterance_timeout"), &utterance_timeout ); 2229 2230 if ( esr_status == ESR_SUCCESS ) 2231 { 2232 LFPRINTF ( results_file, L("E: utterance_timeout %lu\n"), (unsigned long)utterance_timeout ); 2233 LFPRINTF ( results_file, L("R: <FAILED>\n") ); 2234 LPRINTF ( L("\n-------------------------------------\n") ); 2235 LPRINTF ( L("E: utterance_timeout %lu\n"), (unsigned long)utterance_timeout ); 2236 LPRINTF ( L("R: <FAILED>\n") ); 2237 LPRINTF ( L("-------------------------------------\n\n") ); 2238 } 2239 else 2240 { 2241 process_status = -1; 2242 /* Log Here */ 2243 } 2244 srec_test_log_recognition_failure ( data ); 2245 2246 return ( process_status ); 2247 } 2248 2249 2250 int srec_test_write_and_log_wave_form_file ( ApplicationData *data, size_t recognition_count ) 2251 { 2252 int write_status; 2253 ESR_ReturnCode esr_status; 2254 LCHAR *wave_filename; 2255 2256 write_status = 0; 2257 LSPRINTF ( data->raw_waveform_filename, L("a%lu__%s.raw"), (unsigned long)recognition_count, data->transcription ); 2258 wave_filename = data->raw_waveform_filename; 2259 2260 while ( *wave_filename ) 2261 { 2262 if ( *wave_filename == ' ') 2263 *wave_filename = '_'; 2264 wave_filename++; 2265 } 2266 /* just write to file for now... for testing purposes */ 2267 LPRINTF ( L("Dumping audio waveform to file %s\n"), data->raw_waveform_filename ); 2268 data->raw_waveform_file = pfopen ( data->raw_waveform_filename, L("wb") ); 2269 2270 if ( data->raw_waveform_file != NULL ) 2271 { 2272 pfwrite ( (void*)data->raw_waveform, 1, data->raw_waveform_size, data->raw_waveform_file ); 2273 pfclose ( data->raw_waveform_file ); 2274 /* log the filename in the ESR log */ 2275 esr_status = SR_RecognizerLogToken ( data->recognizer, "WVFMFILENAME", data->raw_waveform_filename ); 2276 2277 if ( esr_status != ESR_SUCCESS ) 2278 { 2279 write_status = -1; 2280 /* Log Here */ 2281 } 2282 } 2283 else 2284 { 2285 write_status = -1; 2286 /* Log Here */ 2287 } 2288 return ( write_status ); 2289 } 2290 2291 2292 2293 int srec_test_process_nbest_list ( ApplicationData *data, FILE *results_file ) 2294 { 2295 int process_status; 2296 ESR_ReturnCode esr_status; 2297 size_t nbestSize; 2298 size_t nbest_num; 2299 LCHAR linebuffer [MAX_LINE_LENGTH]; 2300 size_t line_length; 2301 2302 process_status = 0; 2303 /* At least one semantic result exists */ 2304 LPRINTF ( L("\n\n----------------------------------------------\n") ); 2305 2306 LPRINTF ( L("TRANSCRIPTION : '%s'\n"), data->transcription ); 2307 esr_status = SR_RecognizerResultGetSize (data->result, &nbestSize ); 2308 2309 if ( esr_status == ESR_SUCCESS ) 2310 { 2311 for ( nbest_num = 0; nbest_num < nbestSize; nbest_num++ ) 2312 { 2313 line_length = MAX_LINE_LENGTH; 2314 esr_status = SR_RecognizerResultGetValue ( data->result, nbest_num, L("literal"), linebuffer, &line_length ); 2315 2316 if ( esr_status == ESR_SUCCESS ) 2317 { 2318 LPRINTF ( L("LITERAL[%2lu] : '%s'\n"), (unsigned long)nbest_num, linebuffer ); 2319 line_length = MAX_LINE_LENGTH; 2320 esr_status = SR_RecognizerResultGetValue ( data->result, nbest_num, L("meaning"), linebuffer, &line_length ); 2321 2322 if ( esr_status != ESR_SUCCESS ) 2323 { 2324 linebuffer [0] = L('\0') ; 2325 } 2326 LPRINTF ( L("MEANING[%2lu] : '%s'\n"), (unsigned long)nbest_num, linebuffer ); 2327 2328 line_length = MAX_LINE_LENGTH; 2329 esr_status = SR_RecognizerResultGetValue (data->result, nbest_num , L("conf"), linebuffer, &line_length ); 2330 if ( esr_status == ESR_SUCCESS ) 2331 { 2332 LPRINTF ( L("CONFIDENCE VALUE : '%s'\n"), linebuffer ); 2333 } 2334 else 2335 { 2336 process_status = -1; 2337 /* Log Here */ 2338 } 2339 2340 line_length = MAX_LINE_LENGTH; 2341 esr_status = SR_RecognizerResultGetValue (data->result, nbest_num, L("raws"), linebuffer, &line_length ); 2342 2343 if ( esr_status == ESR_SUCCESS ) 2344 { 2345 LPRINTF ( L("RAW SCORE[%2lu] : '%s'\n"), (unsigned long)nbest_num, linebuffer); 2346 } 2347 else 2348 { 2349 process_status = -1; 2350 /* Log Here */ 2351 } 2352 #ifdef SREC_ENGINE_VERBOSE_LOGGING 2353 if(1) { 2354 /* get ALL key value pairs */ 2355 LCHAR *keys[32], keysdata[128*32]; 2356 size_t k,key_count = sizeof(keys)/sizeof(keys[0]); 2357 for(k=0;k<key_count;k++) keys[k] = &keysdata[128*k]; 2358 // esr_status = SR_RecognizerResultGetKeyCount(data->result, nbest_num, &key_count); 2359 esr_status = SR_RecognizerResultGetKeyList(data->result, nbest_num, (LCHAR**)keys, &key_count); 2360 if(esr_status == ESR_SUCCESS) { 2361 for (k=0; k<key_count; k++) { 2362 LCHAR value[128]; 2363 size_t valuelen = sizeof(value)/sizeof(value[0]); 2364 esr_status = SR_RecognizerResultGetValue( data->result, nbest_num, keys[k], value, &valuelen); 2365 if(esr_status==ESR_SUCCESS) 2366 LPRINTF( L("%s[%2lu] : '%s'\n"), keys[k], (unsigned long)nbest_num, value); 2367 } 2368 } 2369 } 2370 #endif 2371 LPRINTF ( L("\n")); 2372 } 2373 else 2374 { 2375 process_status = -1; 2376 /* Log Here */ 2377 } 2378 } 2379 } 2380 else 2381 { 2382 process_status = -1; 2383 /* Log Here */ 2384 } 2385 2386 LPRINTF ( L("----------------------------------------------\n\n") ); 2387 return ( process_status ); 2388 } 2389 2390 2391 2392 int srec_test_process_recognition ( ApplicationData *data, FILE *results_file, size_t recognition_count ) 2393 { 2394 int process_status; 2395 ESR_ReturnCode esr_status; 2396 APPL_GRAMMAR_DATA *grammar_data; 2397 LCHAR linebuffer [MAX_LINE_LENGTH]; 2398 size_t line_length; 2399 2400 process_status = 0; 2401 srec_test_get_active_grammar_data ( data, &grammar_data ); 2402 2403 do { 2404 line_length = MAX_LINE_LENGTH; 2405 esr_status = SR_RecognizerResultGetValue ( data->result, 0, L("literal"), linebuffer, &line_length ); 2406 2407 if ( esr_status != ESR_SUCCESS ) break; 2408 LFPRINTF ( results_file, L("R: %s\n"), linebuffer ); 2409 line_length = MAX_LINE_LENGTH; 2410 esr_status = SR_RecognizerResultGetValue ( data->result, 0, L("conf"), linebuffer, &line_length ); 2411 2412 if ( esr_status != ESR_SUCCESS ) break; 2413 2414 LFPRINTF ( results_file, L("S: %s\n"), linebuffer); 2415 LPRINTF ( L("S: %s\n"), linebuffer); 2416 srec_test_process_nbest_list ( data, results_file ); 2417 /* 2418 * SR_RecognizerResultGetWaveform will return pointer to buffer holding 2419 * audio data in it. This buffer is NOT under the application's control 2420 * and MUST only be read from. 2421 */ 2422 if ( grammar_data->is_ve_grammar == ESR_TRUE ) 2423 { 2424 esr_status = SR_NametagCreate ( data->result, L("dummyID"), &data->nametag ); 2425 if(esr_status != ESR_SUCCESS) { 2426 LPRINTF ( L("VoiceEnrollment=>FAILURE\n") ); 2427 break; 2428 } 2429 LPRINTF ( L("VoiceEnrollment=>SUCCESS\n") ); 2430 if(1) { 2431 const char* value = NULL; 2432 size_t len, len2; 2433 char* value2; 2434 /* this is to mimic what might happen in a real application */ 2435 esr_status = SR_NametagGetValue( data->nametag, &value, &len); 2436 value2 = (char*)CALLOC(len, sizeof(char), "srectest.nametag"); 2437 len2 = len; 2438 memcpy( value2, value, len); 2439 esr_status = SR_NametagDestroy(data->nametag); 2440 data->nametag = NULL; 2441 if(esr_status != ESR_SUCCESS) break; 2442 /* in a real application we would save the nametag value someplace 2443 along with the data->raw_waveform, then retrieve it and create a 2444 nametag from that value */ 2445 esr_status = SR_NametagCreateFromValue( L("dummyID"), value2, len2, &data->nametag); 2446 FREE( value2); 2447 value2 = NULL; 2448 } 2449 if ( esr_status != ESR_SUCCESS ) break; 2450 2451 esr_status = SR_RecognizerResultGetWaveform ( data->result, &data->raw_waveform, &data->raw_waveform_size ); 2452 if( esr_status != ESR_SUCCESS ) break; 2453 2454 if ( data->raw_waveform ) 2455 { 2456 process_status = srec_test_write_and_log_wave_form_file ( data, recognition_count ); 2457 2458 if ( process_status == 0 ) 2459 { 2460 esr_status = SR_RecognizerLogEvent ( data->recognizer, "ESRve" ); 2461 } 2462 else { 2463 esr_status = ESR_INVALID_STATE; 2464 } 2465 } 2466 } 2467 process_status = 0; 2468 } while(0); 2469 if( esr_status != ESR_SUCCESS) { 2470 process_status = -1; 2471 /* Log Here */ 2472 } 2473 return ( process_status ); 2474 } 2475 2476 2477 2478 int srec_test_process_recognition_fail ( ApplicationData *data ) 2479 { 2480 int process_status; 2481 ESR_ReturnCode esr_status; 2482 APPL_GRAMMAR_DATA *grammar_data; 2483 ESR_BOOL reason_status; 2484 2485 process_status = 0; 2486 srec_test_get_active_grammar_data ( data, &grammar_data ); 2487 LPRINTF(L("*** no match in recognition***\n")); 2488 2489 if ( grammar_data->is_ve_grammar == ESR_TRUE ) 2490 { 2491 data->nametag = NULL; 2492 LPRINTF ( L("VoiceEnrollement = FAILED : \n") ); 2493 } 2494 esr_status = SR_RecognizerIsSignalClipping ( data->recognizer, &reason_status ); 2495 2496 if ( esr_status == ESR_SUCCESS ) 2497 { 2498 if ( reason_status == ESR_TRUE ) 2499 LPRINTF ( L("- Signal is clipping\n") ); 2500 } 2501 else 2502 { 2503 process_status = -1; 2504 /* Log Here */ 2505 } 2506 esr_status = SR_RecognizerIsSignalDCOffset ( data->recognizer, &reason_status ); 2507 2508 if ( esr_status == ESR_SUCCESS ) 2509 { 2510 if ( reason_status == ESR_TRUE ) 2511 LPRINTF ( L("- Signal is DC-offset\n") ); 2512 } 2513 else 2514 { 2515 process_status = -1; 2516 /* Log Here */ 2517 } 2518 esr_status = SR_RecognizerIsSignalNoisy ( data->recognizer, &reason_status ); 2519 2520 if ( esr_status == ESR_SUCCESS ) 2521 { 2522 if ( reason_status == ESR_TRUE ) 2523 LPRINTF ( L("- Signal is noisy\n") ); 2524 } 2525 else 2526 { 2527 process_status = -1; 2528 /* Log Here */ 2529 } 2530 esr_status = SR_RecognizerIsSignalTooFewSamples ( data->recognizer, &reason_status ); 2531 2532 if ( esr_status == ESR_SUCCESS ) 2533 { 2534 if ( reason_status == ESR_TRUE ) 2535 LPRINTF ( L("- Signal has too few samples\n") ); 2536 } 2537 else 2538 { 2539 process_status = -1; 2540 /* Log Here */ 2541 } 2542 esr_status = SR_RecognizerIsSignalTooManySamples ( data->recognizer, &reason_status ); 2543 2544 if ( esr_status == ESR_SUCCESS ) 2545 { 2546 if ( reason_status == ESR_TRUE ) 2547 LPRINTF ( L("- Signal has too many samples\n") ); 2548 } 2549 else 2550 { 2551 process_status = -1; 2552 /* Log Here */ 2553 } 2554 esr_status = SR_RecognizerIsSignalTooQuiet ( data->recognizer, &reason_status ); 2555 2556 if ( esr_status == ESR_SUCCESS ) 2557 { 2558 if ( reason_status == ESR_TRUE ) 2559 LPRINTF ( L("- Signal is too quiet\n") ); 2560 } 2561 else 2562 { 2563 process_status = -1; 2564 /* Log Here */ 2565 } 2566 srec_test_log_recognition_failure ( data ); 2567 return ( process_status ); 2568 } 2569 2570 2571 2572 int srec_test_process_recognition_unsupported_case ( ApplicationData *data, FILE *results_file ) 2573 { 2574 int process_status; 2575 2576 process_status = 0; 2577 LFPRINTF ( results_file, L("E: No results available\n") ); 2578 LFPRINTF ( results_file, L("R: <FAILED>\n") ); 2579 srec_test_log_recognition_failure ( data ); 2580 2581 return ( process_status ); 2582 } 2583 2584 2585 2586 static void srec_test_log_recognition_failure ( ApplicationData *data ) 2587 { 2588 2589 LPRINTF(L("----------------------------------------------\n")); 2590 LPRINTF(L("TRANSCRIPTION : '%s'\n"), data->transcription); 2591 LPRINTF(L("<NO-RESULTS>\n")); 2592 LPRINTF(L("----------------------------------------------\n\n")); 2593 } 2594 2595 2596 2597 int srec_test_process_results ( ApplicationData *data, SR_RecognizerStatus esr_recog_status, 2598 FILE *results_file, size_t recognition_count ) 2599 { 2600 int process_status; 2601 2602 switch ( esr_recog_status ) 2603 { 2604 case SR_RECOGNIZER_EVENT_START_OF_UTTERANCE_TIMEOUT: 2605 process_status = srec_test_process_start_timeout ( data, results_file ); 2606 break; 2607 2608 case SR_RECOGNIZER_EVENT_RECOGNITION_RESULT: 2609 process_status = srec_test_process_recognition ( data, results_file, recognition_count ); 2610 break; 2611 2612 case SR_RECOGNIZER_EVENT_NO_MATCH: 2613 process_status = srec_test_process_recognition_fail ( data ); 2614 break; 2615 2616 default: 2617 process_status = srec_test_process_recognition_unsupported_case ( data, results_file ); 2618 break; 2619 } 2620 return ( process_status ); 2621 } 2622 2623 2624 2625 int srec_test_log_reco_from_file_data ( SR_Grammar *active_grammar, ApplicationData *data, LCHAR *waveform, LCHAR *bos, LCHAR *eos, LCHAR *transcription ) 2626 { 2627 int log_status; 2628 ESR_ReturnCode esr_status; 2629 size_t result_count; 2630 ESR_BOOL got_results; 2631 size_t transcription_length; 2632 2633 log_status = 0; 2634 LSPRINTF ( data->transcription, "%s", transcription ); 2635 transcription_length = LSTRLEN ( data->transcription ); 2636 2637 while ( ( *( data->transcription + transcription_length - 1 ) == '\n' ) || 2638 ( *( data->transcription + transcription_length - 1 ) == '\r' ) ) 2639 { 2640 *( data->transcription + transcription_length - 1 ) = '\0'; 2641 transcription_length--; 2642 } 2643 LPRINTF ( L("D: %s\nC: %s\n"), waveform, data->transcription ); 2644 2645 esr_status = SR_GrammarCheckParse ( active_grammar, data->transcription, 0, &result_count ); 2646 2647 if ( esr_status == ESR_SUCCESS ) 2648 { 2649 if ( result_count > 0 ) 2650 { 2651 #ifdef ACCURACY_TESTING 2652 LCHAR meaning[MAX_LINE_LENGTH] = { 0 }; 2653 size_t len = MAX_LINE_LENGTH; 2654 got_results = ESR_TRUE; 2655 LPRINTF ( L("Sem (%lu): invocab=1\n"), (unsigned long)result_count ); 2656 srec_test_parse ( active_grammar, transcription, meaning, &len); 2657 if(LSTRLEN(meaning)>0) 2658 LPRINTF( L("CSem: %s\n"), meaning); 2659 #else 2660 got_results = ESR_TRUE; 2661 LPRINTF ( L("Sem (%lu): invocab=1\n"), (unsigned long)result_count ); 2662 #endif 2663 } 2664 else 2665 { 2666 got_results = ESR_FALSE; 2667 LPRINTF ( L("Sem: <NO INTERPRETATION FOUND>\n") ); 2668 LPRINTF ( L("CSem: <NO INTERPRETATION FOUND>\n") ); 2669 } 2670 esr_status = SR_RecognizerLogWaveformData ( data->recognizer, waveform, data->transcription, atof ( bos ), atof ( eos ), got_results ); 2671 2672 if ( esr_status != ESR_SUCCESS ) 2673 { 2674 log_status = -1; 2675 /* Log Here */ 2676 } 2677 } 2678 else 2679 { 2680 log_status = -1; 2681 /* Log Here */ 2682 } 2683 2684 return ( log_status ); 2685 } 2686 2687 2688 2689 static int srec_test_recognize_pcm_file ( SR_Grammar *active_grammar, ApplicationData *data, FILE *results_file, 2690 LCHAR *command_text, size_t *recognition_count ) 2691 { 2692 int recognize_status; 2693 ESR_ReturnCode esr_status; 2694 SR_RecognizerStatus esr_recog_status; 2695 SR_RecognizerResultType result_type; 2696 LCHAR *transcription; 2697 LCHAR waveform [MAX_LINE_LENGTH]; 2698 LCHAR bos [MAX_LINE_LENGTH]; 2699 LCHAR eos [MAX_LINE_LENGTH]; 2700 PFile *waveform_file; 2701 ESR_BOOL hit_eof; 2702 2703 if ( active_grammar != NULL ) 2704 { 2705 recognize_status = srec_test_get_three_command_items ( command_text, MAX_LINE_LENGTH, waveform, 2706 MAX_LINE_LENGTH, bos, MAX_LINE_LENGTH, 2707 eos, NULL, &transcription ); 2708 while( *transcription == ' ' ) transcription++; 2709 if ( recognize_status == 0 ) 2710 { 2711 recognize_status = srec_test_log_reco_from_file_data ( active_grammar, data, waveform, bos, eos, transcription ); 2712 2713 if ( recognize_status == 0 ) 2714 { 2715 if(LSTRCMP(bos,"0") || LSTRCMP(eos,"0")) { 2716 PLogError( ("Error: non-zero BOS and non-zero EOS are not supported\n")); 2717 return -1; 2718 } 2719 recognize_status = srec_test_open_pcm_file ( waveform, &waveform_file ); 2720 2721 if ( recognize_status == 0 ) 2722 { 2723 if ( ( data->forced_rec_mode == ForcedRecModeOn ) || ( data->forced_rec_mode == ForcedRecModeOneTime ) ) 2724 SR_GrammarAllowOnly ( active_grammar, data->transcription ); 2725 esr_status = SR_RecognizerStart ( data->recognizer ); 2726 2727 if ( esr_status == ESR_SUCCESS ) 2728 { 2729 ( *recognition_count )++; 2730 hit_eof = ESR_FALSE; 2731 2732 do 2733 { 2734 recognize_status = srec_test_get_audio_from_file ( waveform_file, data, &hit_eof ); 2735 2736 if ( recognize_status == 0 ) 2737 recognize_status = srec_test_feed_recognizer ( data, hit_eof, &esr_recog_status, &result_type ); 2738 } 2739 while ( ( hit_eof == ESR_FALSE ) && ( result_type != SR_RECOGNIZER_RESULT_TYPE_COMPLETE ) && ( recognize_status == 0 ) ); 2740 2741 if ( recognize_status == 0 ) 2742 { 2743 recognize_status = srec_test_flush_audio ( data, &esr_recog_status, &result_type ); 2744 2745 if ( recognize_status == 0 ) 2746 { 2747 recognize_status = srec_test_process_results ( data, esr_recog_status, 2748 results_file, *recognition_count ); 2749 } 2750 } 2751 esr_status = SR_RecognizerStop ( data->recognizer ); 2752 2753 if (esr_status == ESR_SUCCESS ) 2754 { 2755 LPRINTF ( L("Recognizer has been stopped\n") ); 2756 } 2757 else 2758 { 2759 recognize_status = -1; 2760 LPRINTF ( L("Recognizer has failed to stop\n") ); 2761 } 2762 } 2763 if ( data->forced_rec_mode == ForcedRecModeOneTime ) 2764 { 2765 data->forced_rec_mode = ForcedRecModeOff; 2766 SR_GrammarAllowAll ( active_grammar ); 2767 } 2768 srec_test_close_audio_file ( waveform_file ); 2769 } 2770 } 2771 } 2772 } 2773 else 2774 { 2775 recognize_status = -1; 2776 /* Log Here */ 2777 } 2778 return ( recognize_status ); 2779 } 2780 2781 2782 2783 static int srec_test_recognize_nist_file ( SR_Grammar *active_grammar, ApplicationData *data, FILE *results_file, 2784 LCHAR *command_text, size_t *recognition_count ) 2785 { 2786 int recognize_status; 2787 ESR_ReturnCode esr_status; 2788 SR_RecognizerStatus esr_recog_status; 2789 SR_RecognizerResultType result_type; 2790 LCHAR *transcription; 2791 LCHAR waveform [MAX_LINE_LENGTH]; 2792 LCHAR bos [MAX_LINE_LENGTH]; 2793 LCHAR eos [MAX_LINE_LENGTH]; 2794 PFile *waveform_file; 2795 ESR_BOOL hit_eof; 2796 2797 if ( active_grammar != NULL ) 2798 { 2799 recognize_status = srec_test_get_three_command_items ( command_text, MAX_LINE_LENGTH, waveform, 2800 MAX_LINE_LENGTH, bos, MAX_LINE_LENGTH, 2801 eos, NULL, &transcription ); 2802 while( *transcription == ' ' ) transcription++; 2803 if ( recognize_status == 0 ) 2804 { 2805 recognize_status = srec_test_log_reco_from_file_data ( active_grammar, data, waveform, bos, eos, transcription ); 2806 2807 if ( recognize_status == 0 ) 2808 { 2809 if(LSTRCMP(bos,"0") || LSTRCMP(eos,"0")) { 2810 PLogError( ("Error: non-zero BOS and non-zero EOS are not supported\n")); 2811 return -1; 2812 } 2813 recognize_status = srec_test_open_nist_file ( waveform, &waveform_file ); 2814 2815 if ( recognize_status == 0 ) 2816 { 2817 if ( ( data->forced_rec_mode == ForcedRecModeOn ) || ( data->forced_rec_mode == ForcedRecModeOneTime ) ) 2818 SR_GrammarAllowOnly ( active_grammar, data->transcription ); 2819 esr_status = SR_RecognizerStart ( data->recognizer ); 2820 2821 if ( esr_status == ESR_SUCCESS ) 2822 { 2823 ( *recognition_count )++; 2824 hit_eof = ESR_FALSE; 2825 2826 do 2827 { 2828 recognize_status = srec_test_get_audio_from_file ( waveform_file, data, &hit_eof ); 2829 2830 if ( recognize_status == 0 ) 2831 recognize_status = srec_test_feed_recognizer ( data, hit_eof, &esr_recog_status, &result_type ); 2832 } 2833 while ( ( hit_eof == ESR_FALSE ) && ( result_type != SR_RECOGNIZER_RESULT_TYPE_COMPLETE ) && ( recognize_status == 0 ) ); 2834 2835 if ( recognize_status == 0 ) 2836 { 2837 recognize_status = srec_test_flush_audio ( data, &esr_recog_status, &result_type ); 2838 2839 if ( recognize_status == 0 ) 2840 { 2841 recognize_status = srec_test_process_results ( data, esr_recog_status, 2842 results_file, *recognition_count ); 2843 } 2844 } 2845 } 2846 esr_status = SR_RecognizerStop ( data->recognizer ); 2847 2848 if (esr_status == ESR_SUCCESS ) 2849 { 2850 LPRINTF ( L("Recognizer has been stopped\n") ); 2851 } 2852 else 2853 { 2854 recognize_status = -1; 2855 LPRINTF ( L("Recognizer has failed to stop\n") ); 2856 } 2857 if ( data->forced_rec_mode == ForcedRecModeOneTime ) 2858 { 2859 data->forced_rec_mode = ForcedRecModeOff; 2860 SR_GrammarAllowAll ( active_grammar ); 2861 } 2862 srec_test_close_audio_file ( waveform_file ); 2863 } 2864 } 2865 } 2866 } 2867 else 2868 { 2869 recognize_status = -1; 2870 /* Log Here */ 2871 } 2872 return ( recognize_status ); 2873 } 2874 2875 2876 2877 #define STACK_SIZE (1024 * 200) 2878 2879 #ifdef _WIN32 2880 /* disable optimization for the next functions as the compiler optimizes away the assignment to mySTACK[i] */ 2881 #pragma optimize("", off) 2882 2883 static void initStack() 2884 { 2885 int mySTACK[STACK_SIZE]; 2886 { 2887 /* This extra block is to ensure that local variables of the function occur after buffer mySTACK. */ 2888 int i; 2889 2890 for (i = 0; i < STACK_SIZE; ++i) 2891 { 2892 mySTACK[i] = 0xDEADBEEF; 2893 } 2894 } 2895 } 2896 2897 static int analyzeStack() 2898 { 2899 int mySTACK[STACK_SIZE]; 2900 { 2901 2902 /* This extra block is to ensure that local variables of the function occur after buffer mySTACK. */ 2903 int i, j; 2904 2905 for (i = STACK_SIZE - 1; i >= 0; --i) 2906 { 2907 if (mySTACK[i] == 0xDEADBEEF) 2908 { 2909 /* This might be a candidate for the end of stack marker, or it could be 2910 some value that is equal to our marker. To ensure reliability of 2911 this candidate, we will make sure that all remaining entries int the 2912 stack are also equal to DEADBEEF. 2913 */ 2914 for (j = i - 1; j >= 0; --j) 2915 { 2916 if (mySTACK[j] != 0xDEADBEEF) 2917 { 2918 i = j; 2919 break; 2920 } 2921 } 2922 if (j < 0) break; 2923 } 2924 } 2925 2926 if (i < 0) 2927 return -1; 2928 else 2929 return (STACK_SIZE - 1 - i) * sizeof(int); 2930 } 2931 } 2932 2933 /* restore optmization settings to what they used to be. */ 2934 #pragma optimize("", on) 2935 #endif 2936 2937 2938 #ifdef ACCURACY_TESTING 2939 static void srec_test_clean_up_sentence ( char* sentence ) 2940 { 2941 int clean_up_status; 2942 int sentence_finished; 2943 SENTENCE_CLEANING_STATES current_state; 2944 char *current_input; 2945 char *current_output; 2946 2947 clean_up_status = 0; 2948 sentence_finished = 0; 2949 current_state = SENTENCE_BEGIN; 2950 current_input = sentence; 2951 current_output = sentence; 2952 strtok( sentence, "\n\r"); 2953 2954 do 2955 { 2956 switch ( *current_input ) 2957 { 2958 case '\0': 2959 switch ( current_state ) 2960 { 2961 case SENTENCE_BEGIN: 2962 break; 2963 2964 case SENTENCE_BEGIN_BRACKET_BEGIN: /* Is this error condition */ 2965 *current_output = '\0'; 2966 clean_up_status = -1; 2967 break; 2968 2969 case SENTENCE_BEGIN_BRACKET_END: 2970 *current_output = '\0'; 2971 break; 2972 2973 case SENTENCE_MIDDLE: 2974 *current_output = '\0'; 2975 break; 2976 2977 case SENTENCE_MIDDLE_BRACKET_BEGIN: /* Is this error condition */ 2978 *( current_output - 1 ) = '\0'; 2979 clean_up_status = -1; 2980 break; 2981 2982 case SENTENCE_MIDDLE_BRACKET_END: 2983 *( current_output - 1 ) = '\0'; 2984 break; 2985 2986 case SENTENCE_MIDDLE_WITH_SPACE: 2987 *( current_output - 1 ) = '\0'; 2988 break; 2989 2990 default: 2991 *current_output = '\0'; 2992 /* Log error */ 2993 break; 2994 } 2995 sentence_finished = 1; 2996 break; 2997 2998 case ' ': 2999 switch ( current_state ) 3000 { 3001 case SENTENCE_BEGIN: 3002 break; 3003 3004 case SENTENCE_BEGIN_BRACKET_BEGIN: 3005 break; 3006 3007 case SENTENCE_BEGIN_BRACKET_END: 3008 break; 3009 3010 case SENTENCE_MIDDLE: 3011 *current_output = ' '; 3012 current_output++; 3013 current_state = SENTENCE_MIDDLE_WITH_SPACE; 3014 break; 3015 3016 case SENTENCE_MIDDLE_BRACKET_BEGIN: /* Is this error condition */ 3017 break; 3018 3019 case SENTENCE_MIDDLE_BRACKET_END: 3020 break; 3021 3022 case SENTENCE_MIDDLE_WITH_SPACE: 3023 break; 3024 3025 default: 3026 *current_output = '\0'; 3027 clean_up_status = -1; 3028 /* Log error */ 3029 break; 3030 } 3031 current_input++; 3032 break; 3033 3034 case '[': 3035 switch ( current_state ) 3036 { 3037 case SENTENCE_BEGIN: 3038 current_state = SENTENCE_BEGIN_BRACKET_BEGIN; 3039 break; 3040 3041 case SENTENCE_BEGIN_BRACKET_BEGIN: 3042 *current_output = '\0'; 3043 clean_up_status = -1; 3044 /* Log error */ 3045 break; 3046 3047 case SENTENCE_BEGIN_BRACKET_END: 3048 current_state = SENTENCE_BEGIN_BRACKET_BEGIN; 3049 break; 3050 3051 case SENTENCE_MIDDLE: 3052 *current_output = ' '; 3053 current_output++; 3054 current_state = SENTENCE_MIDDLE_BRACKET_BEGIN; 3055 break; 3056 3057 case SENTENCE_MIDDLE_BRACKET_BEGIN: /* Is this error condition */ 3058 *current_output = '\0'; 3059 clean_up_status = -1; 3060 /* Log error */ 3061 break; 3062 3063 case SENTENCE_MIDDLE_BRACKET_END: 3064 current_state = SENTENCE_MIDDLE_BRACKET_BEGIN; 3065 break; 3066 3067 case SENTENCE_MIDDLE_WITH_SPACE: 3068 current_state = SENTENCE_MIDDLE_BRACKET_BEGIN; 3069 break; 3070 3071 default: 3072 *current_output = '\0'; 3073 clean_up_status = -1; 3074 /* Log error */ 3075 break; 3076 } 3077 current_input++; 3078 break; 3079 3080 case ']': 3081 switch ( current_state ) 3082 { 3083 case SENTENCE_BEGIN: 3084 *current_output = '\0'; 3085 clean_up_status = -1; 3086 /* Log error */ 3087 break; 3088 3089 case SENTENCE_BEGIN_BRACKET_BEGIN: 3090 current_state = SENTENCE_BEGIN_BRACKET_END; 3091 break; 3092 3093 case SENTENCE_BEGIN_BRACKET_END: 3094 *current_output = '\0'; 3095 clean_up_status = -1; 3096 /* Log error */ 3097 break; 3098 3099 case SENTENCE_MIDDLE: 3100 *current_output = '\0'; 3101 clean_up_status = -1; 3102 /* Log error */ 3103 break; 3104 3105 case SENTENCE_MIDDLE_BRACKET_BEGIN: /* Is this error condition */ 3106 current_state = SENTENCE_MIDDLE_BRACKET_END; 3107 break; 3108 3109 case SENTENCE_MIDDLE_BRACKET_END: 3110 *current_output = '\0'; 3111 clean_up_status = -1; 3112 /* Log error */ 3113 break; 3114 3115 case SENTENCE_MIDDLE_WITH_SPACE: 3116 *current_output = '\0'; 3117 clean_up_status = -1; 3118 /* Log error */ 3119 break; 3120 3121 default: 3122 *current_output = '\0'; 3123 clean_up_status = -1; 3124 /* Log error */ 3125 break; 3126 } 3127 current_input++; 3128 break; 3129 3130 default: 3131 switch ( current_state ) 3132 { 3133 case SENTENCE_BEGIN: 3134 *current_output = *current_input; 3135 current_output++; 3136 current_state = SENTENCE_MIDDLE; 3137 break; 3138 3139 case SENTENCE_BEGIN_BRACKET_BEGIN: 3140 break; 3141 3142 case SENTENCE_BEGIN_BRACKET_END: 3143 *current_output = *current_input; 3144 current_output++; 3145 current_state = SENTENCE_MIDDLE; 3146 break; 3147 3148 case SENTENCE_MIDDLE: 3149 *current_output = *current_input; 3150 current_output++; 3151 current_state = SENTENCE_MIDDLE; 3152 break; 3153 3154 case SENTENCE_MIDDLE_BRACKET_BEGIN: 3155 break; 3156 3157 case SENTENCE_MIDDLE_BRACKET_END: 3158 *current_output = *current_input; 3159 current_output++; 3160 current_state = SENTENCE_MIDDLE; 3161 break; 3162 3163 case SENTENCE_MIDDLE_WITH_SPACE: 3164 *current_output = *current_input; 3165 current_output++; 3166 current_state = SENTENCE_MIDDLE; 3167 break; 3168 3169 default: 3170 *current_output = '\0'; 3171 clean_up_status = -1; 3172 /* Log error */ 3173 break; 3174 } 3175 current_input++; 3176 break; 3177 } 3178 } 3179 while ( ( sentence_finished == 0 ) && ( clean_up_status == 0 ) ); 3180 } 3181 3182 3183 3184 ESR_ReturnCode srec_test_parse ( SR_Grammar* grammar, const LCHAR* trans, LCHAR* meaning, size_t *len ) 3185 { 3186 ESR_ReturnCode parse_status; 3187 char cleaned_trans[TRANSCRIPTION_SIZE]; 3188 SR_SemanticResult *semanticResults; 3189 size_t result_count; 3190 3191 result_count = 0; 3192 strcpy( cleaned_trans, trans ); 3193 srec_test_clean_up_sentence ( cleaned_trans ); 3194 3195 /* create the result holders, initially not greater than MAX */ 3196 parse_status = SR_SemanticResultCreate ( &semanticResults ); 3197 3198 if ( parse_status == ESR_SUCCESS ) 3199 { 3200 result_count = 1; 3201 parse_status = SR_SemanticProcessor_Flush( ( (SR_GrammarImpl*)grammar )->semproc ); 3202 3203 if ( parse_status == ESR_SUCCESS ) 3204 { 3205 parse_status = SR_SemanticProcessor_SetParam( ((SR_GrammarImpl*)grammar)->semproc, L("literal"), cleaned_trans ); 3206 3207 if ( parse_status == ESR_SUCCESS ) 3208 { 3209 parse_status = SR_GrammarCheckParse( grammar, cleaned_trans, &semanticResults, (size_t*)&result_count ); 3210 3211 if ( parse_status == ESR_SUCCESS ) 3212 { 3213 if ( result_count < 1 ) 3214 { 3215 LSTRCPY ( meaning, L("") ); 3216 SR_SemanticResultDestroy( semanticResults); 3217 parse_status = ESR_NO_MATCH_ERROR; 3218 } 3219 else 3220 { 3221 parse_status = SR_SemanticResultGetValue ( semanticResults, "meaning", meaning, len); 3222 SR_SemanticResultDestroy( semanticResults); 3223 } 3224 } 3225 } 3226 } 3227 } 3228 return ( parse_status ); 3229 } 3230 #endif 3231 3232 3233 static int srec_test_get_run_params ( unsigned int *num_shutdown_loops, unsigned int *num_continuous_run_loops ) 3234 { 3235 int get_status; 3236 3237 get_status = get_num_srec_test_shutdown_times ( num_shutdown_loops ); 3238 3239 if ( get_status == 0 ) 3240 get_status = get_num_srec_test_continuous_loops ( num_continuous_run_loops ); 3241 3242 return ( get_status ); 3243 } 3244 3245 3246 3247 static int srec_test_shutdown_application_data ( ApplicationData *applicationData ) 3248 { 3249 int init_status; 3250 int i; 3251 3252 init_status = 0; 3253 3254 applicationData->argc = 0; 3255 applicationData->argv = NULL; 3256 applicationData->locale = -1; 3257 3258 if (applicationData->recognizer != NULL) 3259 { 3260 srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Failed To Cleanup Recognizer") ); 3261 /* SR_RecognizerLogSessionEnd ( applicationData->recognizer ); 3262 SR_RecognizerDestroy ( applicationData->recognizer );*/ 3263 applicationData->recognizer = NULL; 3264 applicationData->result = NULL; // this was deallocated by SR_RecognizerDestroy() 3265 } 3266 3267 if (applicationData->vocabulary != NULL) 3268 { 3269 srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Failed To Cleanup Vocabulary") ); 3270 /* SR_VocabularyDestroy(applicationData->vocabulary); 3271 applicationData->vocabulary = NULL;*/ 3272 } 3273 3274 if (applicationData->nametag != NULL) 3275 { 3276 srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Failed To Cleanup NameTag") ); 3277 /* SR_NametagDestroy(applicationData->nametag); 3278 applicationData->nametag = NULL;*/ 3279 } 3280 3281 if (applicationData->nametags != NULL) 3282 { 3283 srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Failed To Cleanup NameTagSet") ); 3284 /* SR_NametagsDestroy(applicationData->nametags); 3285 applicationData->nametags = NULL;*/ 3286 } 3287 3288 for (i = 0; i < applicationData->grammarCount; ++i) 3289 srec_test_log_error ( 0, ERROR_LEVEL_HIGH, L("Failed To Cleanup Grammar") ); 3290 /* 3291 if ( applicationData->grammars [i] != NULL ) 3292 { 3293 printf ( "!!!!!!!! %d Grammars Not Destroyed !!!!!!!!!!!!\n", i ); 3294 SR_GrammarDestroy(applicationData->grammars[i]); 3295 applicationData->grammars[i] = NULL; 3296 } 3297 } 3298 3299 applicationData->activeGrammar = -1; 3300 applicationData->activeRule = NULL; 3301 applicationData->voiceEnrollment = NULL; 3302 */ 3303 applicationData->raw_waveform = NULL; 3304 applicationData->raw_waveform_filename [0] = L( '\0' ); 3305 applicationData->raw_waveform_file = NULL; 3306 applicationData->transcription[0] = L( '\0' ); 3307 applicationData->forced_rec_mode = ForcedRecModeNotSet; 3308 3309 return ( init_status ); 3310 } 3311 3312 3313 3314 static int srec_test_init_application_data ( ApplicationData *applicationData, int arg_count, LCHAR *arg_vals [] ) 3315 { 3316 int init_status; 3317 3318 init_status = 0; 3319 applicationData->argc = arg_count; 3320 applicationData->argv = arg_vals; 3321 applicationData->locale = -1; 3322 applicationData->recognizer = NULL; 3323 applicationData->result = NULL; 3324 applicationData->vocabulary = NULL; 3325 applicationData->nametag = NULL; 3326 applicationData->nametags = NULL; 3327 applicationData->grammarCount = 0; /* No need to initialize arrays, index is 0 */ 3328 applicationData->active_grammar_num = -1; 3329 /* applicationData->activeRule = NULL; 3330 applicationData-> = applicationData->voiceEnrollment = NULL;*/ 3331 applicationData->audio_buffer_requested_size = DEFAULT_AUDIO_BUFFER_SIZE; 3332 applicationData->raw_waveform = NULL; 3333 applicationData->raw_waveform_filename [0] = L( '\0' ); 3334 applicationData->raw_waveform_file = NULL; 3335 applicationData->transcription[0] = L( '\0' ); 3336 applicationData->forced_rec_mode = ForcedRecModeNotSet; 3337 return ( init_status ); 3338 } 3339 3340 3341 static int srec_test_run_test_shutdown_session ( ApplicationData *applicationData ) 3342 { 3343 int shutdown_status; 3344 3345 shutdown_status = 0; 3346 3347 SR_RecognizerUnsetup ( applicationData->recognizer); // releases acoustic models 3348 SR_RecognizerDestroy ( applicationData->recognizer ); 3349 applicationData->recognizer = NULL; 3350 ShutdownSession ( ); 3351 3352 return ( shutdown_status ); 3353 } 3354 3355 3356 3357 static int srec_test_run_test_init_session ( ApplicationData *applicationData ) 3358 { 3359 int run_status; 3360 ESR_ReturnCode esr_status; 3361 3362 run_status = 0; 3363 LPRINTF(L("\nCreate Recognizer:\n")); 3364 LPRINTF(L(" InitSession()\n")); 3365 esr_status = InitSession ( applicationData->argc, applicationData->argv ); 3366 3367 if ( esr_status == ESR_SUCCESS ) 3368 { 3369 LPRINTF(L(" SR_RecognizerCreate()\n")); 3370 esr_status = SR_RecognizerCreate ( &applicationData->recognizer ); 3371 3372 if ( esr_status != ESR_SUCCESS ) 3373 { 3374 ShutdownSession ( ); 3375 run_status = -1; 3376 /* Log Here */ 3377 } else { 3378 LPRINTF(L(" SR_RecognizerSetup()\n")); 3379 esr_status = SR_RecognizerSetup ( applicationData->recognizer); 3380 if ( esr_status != ESR_SUCCESS ) 3381 { 3382 ShutdownSession ( ); 3383 run_status = -1; 3384 /* Log Here */ 3385 } 3386 } 3387 } 3388 return ( run_status ); 3389 } 3390 3391 3392 static int srec_test_run_test_shutdown_vocab_grammar ( ApplicationData *applicationData ) 3393 { 3394 int shutdown_status; 3395 3396 shutdown_status = 0; 3397 SR_RecognizerLogSessionEnd ( applicationData->recognizer ); 3398 /* SR_GrammarDestroy ( applicationData->grammars [0].grammar ); 3399 applicationData->grammars [0].grammar = NULL;*/ 3400 SR_VocabularyDestroy ( applicationData->vocabulary ); 3401 applicationData->vocabulary = NULL; 3402 3403 return ( shutdown_status ); 3404 } 3405 3406 3407 3408 static int srec_test_run_test_init_vocab_grammar ( ApplicationData *applicationData ) 3409 { 3410 int run_status; 3411 ESR_ReturnCode esr_status; 3412 LCHAR filename[P_PATH_MAX]; 3413 size_t len; 3414 3415 run_status = 0; 3416 /* Create vocabulary object and associate with grammar */ 3417 LPRINTF(L("Create vocabulary object and associate with grammar:\n")); 3418 len = P_PATH_MAX; 3419 esr_status = ESR_SessionGetLCHAR ( L("cmdline.vocabulary"), filename, &len ); 3420 3421 if ( esr_status == ESR_SUCCESS ) 3422 { 3423 LPRINTF(L(" SR_VocabularyLoad()\n")); 3424 esr_status = SR_VocabularyLoad ( filename, &applicationData->vocabulary ); 3425 3426 if ( esr_status == ESR_SUCCESS ) 3427 { 3428 LPRINTF(L(" SR_VocabularyGetLanguage()\n")); 3429 esr_status = SR_VocabularyGetLanguage ( applicationData->vocabulary, &applicationData->locale ); 3430 3431 if ( esr_status == ESR_SUCCESS ) 3432 { 3433 /* start a new log session */ 3434 LPRINTF( L("Start a new log session:\n") ); 3435 LPRINTF( L(" SR_RecognizerLogSessionStart()\n") ); 3436 esr_status = SR_RecognizerLogSessionStart ( applicationData->recognizer, L("SRecTest.session1") ); 3437 3438 if ( esr_status != ESR_SUCCESS ) 3439 { 3440 SR_VocabularyDestroy ( applicationData->vocabulary ); 3441 applicationData->vocabulary = NULL; 3442 run_status = -1; 3443 /* Log here */ 3444 } 3445 } 3446 else 3447 { 3448 SR_VocabularyDestroy ( applicationData->vocabulary ); 3449 applicationData->vocabulary = NULL; 3450 run_status = -1; 3451 /* Log Here */ 3452 } 3453 } 3454 else 3455 { 3456 run_status = -1; 3457 /* Log Here */ 3458 } 3459 } 3460 else 3461 { 3462 run_status = -1; 3463 /* Log Here */ 3464 } 3465 return ( run_status ); 3466 } 3467 3468 3469 3470 static int srec_test_run_test_shutdown ( ApplicationData *applicationData ) 3471 { 3472 int shutdown_status; 3473 3474 shutdown_status = srec_test_run_test_shutdown_vocab_grammar ( applicationData ); 3475 3476 if ( shutdown_status == 0 ) 3477 shutdown_status = srec_test_run_test_shutdown_session ( applicationData ); 3478 return ( shutdown_status ); 3479 } 3480 3481 3482 static int srec_test_run_test_init ( ApplicationData *applicationData ) 3483 { 3484 int run_status; 3485 3486 run_status = srec_test_run_test_init_session ( applicationData ); 3487 3488 if ( run_status == 0 ) 3489 { 3490 run_status = srec_test_run_test_init_vocab_grammar ( applicationData ); 3491 3492 if ( run_status != 0 ) 3493 { 3494 srec_test_run_test_shutdown_session ( applicationData ); 3495 } 3496 } 3497 else 3498 { 3499 srec_test_run_test_shutdown_session ( applicationData ); 3500 } 3501 return ( run_status ); 3502 } 3503 3504 3505 3506 static int srec_test_run_test_execute ( ApplicationData *applicationData ) 3507 { 3508 int run_status; 3509 ESR_ReturnCode esr_status; 3510 3511 run_status = 0; 3512 applicationData->nametag = NULL; 3513 3514 LPRINTF(L("Recognize:\n")); 3515 LPRINTF(L(" SR_NametagsCreate()\n")); 3516 esr_status = SR_NametagsCreate ( &applicationData->nametags ); 3517 3518 if ( esr_status == ESR_SUCCESS ) 3519 { 3520 run_status = srec_test_process_commands ( applicationData ); 3521 SR_NametagsDestroy ( applicationData->nametags ); 3522 applicationData->nametags = NULL; 3523 3524 if ( run_status != 0 ) 3525 { 3526 /* Log Here */ 3527 } 3528 } 3529 else 3530 { 3531 run_status = -1; 3532 /* Log Here */ 3533 } 3534 return ( run_status ); 3535 } 3536 3537 3538 3539 static int srec_test_run_test ( ApplicationData *applicationData ) 3540 { 3541 int run_status; 3542 3543 run_status = srec_test_run_test_init ( applicationData ); 3544 3545 if ( run_status == 0 ) 3546 { 3547 run_status = srec_test_run_test_execute ( applicationData ); 3548 srec_test_run_test_shutdown ( applicationData ); 3549 } 3550 return ( run_status ); 3551 } 3552 3553 3554 3555 static int srec_test_shutdown_memory_system ( void ) 3556 { 3557 int shutdown_status; 3558 3559 shutdown_status = 0; 3560 PMemShutdown ( ); 3561 3562 return ( shutdown_status ); 3563 } 3564 3565 3566 3567 static int srec_test_init_memory_system ( unsigned int srec_test_heap_size ) 3568 { 3569 int init_status; 3570 ESR_ReturnCode esr_status; 3571 3572 init_status = 0; 3573 esr_status = PMemInit ( ); 3574 3575 if ( esr_status == ESR_SUCCESS ) 3576 { 3577 PSTACK_SIZE_INIT ( ); /* I don't know what this is, it should probably have a status */ 3578 } 3579 else 3580 { 3581 init_status = -1; 3582 /* Log Here */ 3583 } 3584 return ( init_status ); 3585 } 3586 3587 3588 3589 static int srec_test_shutdown_file_system ( void ) 3590 { 3591 int shutdown_status; 3592 3593 shutdown_status = 0; 3594 3595 return ( shutdown_status ); 3596 } 3597 3598 3599 3600 static int srec_test_init_file_system ( int arg_count, LCHAR *arg_vals [] ) 3601 { 3602 int init_status; 3603 3604 init_status = 0; 3605 return ( init_status ); 3606 } 3607 3608 3609 3610 static int srec_test_shutdown_logging_system ( PLogger *logger ) 3611 { 3612 int shutdown_status; 3613 3614 shutdown_status = 0; 3615 PLogShutdown ( ); 3616 3617 return ( shutdown_status ); 3618 } 3619 3620 3621 3622 static int srec_test_init_logging_system ( int arg_count, LCHAR *arg_vals [], PLogger *logger ) 3623 { 3624 int init_status; 3625 ESR_ReturnCode esr_status; 3626 3627 init_status = 0; 3628 esr_status = PLogCreateFileLogger ( PSTDOUT, &logger ); 3629 3630 if ( esr_status == ESR_SUCCESS ) 3631 { 3632 esr_status = PLogInit ( logger, 0 ); 3633 3634 if ( esr_status != ESR_SUCCESS ) 3635 { 3636 /* pfclose ( (struct PFile_t *)logger ); I'm not sure this is correct, check with Gili */ 3637 init_status = -1; 3638 /* Log Here */ 3639 } 3640 } 3641 else 3642 { 3643 init_status = -1; 3644 /* Log Here */ 3645 } 3646 return ( init_status ); 3647 } 3648 3649 3650 3651 static int srec_test_shutdown_system ( PLogger *logger ) 3652 { 3653 int shutdown_status; 3654 3655 shutdown_status = srec_test_shutdown_logging_system ( logger ); 3656 3657 if ( shutdown_status == 0 ) 3658 { 3659 shutdown_status = srec_test_shutdown_file_system ( ); 3660 3661 if ( shutdown_status == 0 ) 3662 shutdown_status = srec_test_shutdown_memory_system ( ); 3663 } 3664 return ( shutdown_status ); 3665 } 3666 3667 3668 3669 3670 static int srec_test_init_system ( unsigned int srec_test_heap_size, PLogger* logger, int arg_count, LCHAR *arg_vals [] ) 3671 { 3672 int init_status; 3673 3674 /* register signal handler so cleanup works on CTRL-C (Win32) */ 3675 #ifdef _WIN32 3676 signal(SIGINT, signal_handler_SIGINT); 3677 #endif 3678 init_status = srec_test_init_memory_system ( srec_test_heap_size ); 3679 3680 if ( init_status == 0 ) 3681 { 3682 init_status = srec_test_init_file_system ( arg_count, arg_vals ); 3683 3684 if ( init_status == 0 ) 3685 { 3686 init_status = srec_test_init_logging_system ( arg_count, arg_vals, logger ); 3687 3688 if ( init_status != 0 ) 3689 { 3690 srec_test_shutdown_file_system ( ); 3691 srec_test_shutdown_memory_system ( ); 3692 } 3693 } 3694 else 3695 { 3696 srec_test_shutdown_memory_system ( ); 3697 } 3698 } 3699 return ( init_status ); 3700 } 3701 3702 3703 3704 #if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32) 3705 _CrtMemState s0,s1,s2; 3706 3707 3708 3709 void OutputDivider( void ) 3710 { 3711 3712 _RPT1(_CRT_WARN, "%s", "********************************************************************\n"); 3713 } 3714 3715 3716 3717 void OutputNewline( void ) 3718 { 3719 3720 _RPT1(_CRT_WARN, "%s", "\n"); 3721 } 3722 #endif 3723 3724 3725 3726 #if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32) 3727 void initialize_heap_logging ( void ) 3728 { 3729 3730 _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); 3731 _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT); 3732 _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE); 3733 _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT); 3734 _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE); 3735 _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT); 3736 _CrtMemCheckpoint(&s0); 3737 } 3738 #endif 3739 3740 3741 3742 #if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32) 3743 void execute_heap_logging ( void ) 3744 { 3745 OutputNewline(); 3746 OutputDivider(); 3747 _RPT1(_CRT_WARN, "%s", "After cleanup, before exiting main()\n"); 3748 OutputDivider(); 3749 _CrtMemCheckpoint(&s1); 3750 _CrtMemDifference(&s2, &s0, &s1); 3751 _CrtMemDumpStatistics(&s2); 3752 OutputNewline(); 3753 OutputDivider(); 3754 _RPT1(_CRT_WARN, "%s", "Checking for memory leaks...\n"); 3755 OutputDivider(); 3756 _CrtDumpMemoryLeaks(); 3757 } 3758 #endif 3759 3760 3761 3762 int main(int argc, LCHAR* argv [] ) 3763 { 3764 int test_status; 3765 unsigned int num_shutdown_loops; 3766 unsigned int current_shutdown_loop; 3767 unsigned int num_continuous_run_loops; 3768 unsigned int current_continuous_run_loop; 3769 unsigned int srec_test_heap_size; 3770 3771 #ifdef _WIN32 3772 initStack(); 3773 #endif 3774 { 3775 /* This extra block is there to get a more precise estimate of the stack 3776 depth. This way we also make sure that the local variables of main are 3777 taken into acount when estimating the stack size. 3778 */ 3779 ApplicationData applicationData; 3780 PLogger* logger; 3781 3782 srec_test_heap_size = ( 4 * 1024 * 1024 ); 3783 logger = NULL; 3784 test_status = srec_test_get_run_params ( &num_shutdown_loops, &num_continuous_run_loops ); 3785 3786 if ( test_status == 0 ) 3787 { 3788 current_shutdown_loop = 0; 3789 3790 while ( ( current_shutdown_loop < num_shutdown_loops )/* && ( test_status == 0 )*/ ) 3791 { 3792 #if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32) 3793 initialize_heap_logging ( ); 3794 #endif 3795 test_status = srec_test_init_system ( srec_test_heap_size, logger, argc, argv ); 3796 3797 if ( test_status == 0 ) 3798 { 3799 current_continuous_run_loop = 0; 3800 3801 while ( ( current_continuous_run_loop < num_continuous_run_loops ) && ( test_status == 0 ) ) 3802 { 3803 test_status = srec_test_init_application_data ( &applicationData, argc, argv ); 3804 3805 if ( test_status == 0 ) 3806 { 3807 test_status = srec_test_run_test ( &applicationData ); 3808 srec_test_shutdown_application_data ( &applicationData ); 3809 } 3810 current_continuous_run_loop++; 3811 } 3812 test_status = srec_test_shutdown_system ( logger ); 3813 } 3814 current_shutdown_loop++; 3815 #if defined(_DEBUGHEAP) && defined(_DEBUG) && defined(WIN32) 3816 execute_heap_logging ( ); 3817 #endif 3818 } 3819 } 3820 } 3821 3822 return ( test_status ); 3823 } 3824 3825 3826