static int event_delete(espeak_EVENT* event) { ENTER("event_delete"); event_display(event); if(event==NULL) { return 0; } switch(event->type) { case espeakEVENT_MSG_TERMINATED: event_notify(event); break; case espeakEVENT_MARK: case espeakEVENT_PLAY: if(event->id.name) { free((void*)(event->id.name)); } break; default: break; } free(event); return 1; }
static espeak_EVENT* event_copy (espeak_EVENT* event) { ENTER("event_copy"); if (event==NULL) { return NULL; } espeak_EVENT* a_event=(espeak_EVENT*)malloc(sizeof(espeak_EVENT)); if (a_event) { memcpy(a_event, event, sizeof(espeak_EVENT)); switch(event->type) { case espeakEVENT_MARK: case espeakEVENT_PLAY: if (event->id.name) { a_event->id.name = strdup(event->id.name); } break; default: break; } } event_display(a_event); return a_event; }
espeak_ERROR event_declare (espeak_EVENT* event) { ENTER("event_declare"); event_display(event); if (!event) { return EE_INTERNAL_ERROR; } int a_status = pthread_mutex_lock(&my_mutex); espeak_ERROR a_error = EE_OK; if (!a_status) { SHOW_TIME("event_declare > locked\n"); espeak_EVENT* a_event = event_copy(event); a_error = push(a_event); if (a_error != EE_OK) { event_delete(a_event); } SHOW_TIME("event_declare > unlocking\n"); a_status = pthread_mutex_unlock(&my_mutex); } // TBD: remove the comment // reminder: code in comment. // This wait can lead to an underrun // // if (!a_status && !my_event_is_running && (a_error == EE_OK)) // { // // quit when command is actually started // // (for possible forthcoming 'end of command' checks) SHOW_TIME("event_declare > post my_sem_start_is_required\n"); sem_post(&my_sem_start_is_required); // int val=1; // while (val) // { // usleep(50000); // TBD: event? // sem_getvalue(&my_sem_start_is_required, &val); // } // } if (a_status != 0) { a_error = EE_INTERNAL_ERROR; } return a_error; }
static void event_notify(espeak_EVENT* event) { ENTER("event_notify"); static unsigned int a_old_uid = 0; espeak_EVENT events[2]; memcpy(&events[0],event,sizeof(espeak_EVENT)); // the event parameter in the callback function should be an array of eventd memcpy(&events[1],event,sizeof(espeak_EVENT)); events[1].type = espeakEVENT_LIST_TERMINATED; // ... terminated by an event type=0 if (event && my_callback) { event_display(event); switch(event->type) { case espeakEVENT_SENTENCE: my_callback(NULL, 0, events); a_old_uid = event->unique_identifier; break; case espeakEVENT_MSG_TERMINATED: case espeakEVENT_MARK: case espeakEVENT_WORD: case espeakEVENT_END: case espeakEVENT_PHONEME: { // jonsd - I'm not sure what this is for. gilles says it's for when Gnome Speech reads a file of blank lines if (a_old_uid != event->unique_identifier) { espeak_EVENT_TYPE a_new_type = events[0].type; events[0].type = espeakEVENT_SENTENCE; my_callback(NULL, 0, events); events[0].type = a_new_type; usleep(50000); } my_callback(NULL, 0, events); a_old_uid = event->unique_identifier; } break; default: case espeakEVENT_LIST_TERMINATED: case espeakEVENT_PLAY: break; } } }
/***************************************************************************** Routine: void event_specialkey(int key, int x, int y) returns : void Description : CallBack function for KeyHit *****************************************************************************/ void event_specialkey(int key, int x, int y) { switch(key) { case GLUT_KEY_PAGE_UP : framerate = framerate*TRICK_MODE_FAST_FWD; if (framerate > TRICK_MODE_MAXFRAMERATE) framerate = TRICK_MODE_MAXFRAMERATE; frameinterval = (int)((float)1000*(framenum)/framerate)-(int)((float)1000*(framenum-1)/framerate); nLastTime = -frameinterval; nTime = 0; break; case GLUT_KEY_PAGE_DOWN : framerate = framerate/TRICK_MODE_FAST_FWD; if (framerate< TRICK_MODE_MINFRAMERATE) framerate = TRICK_MODE_MINFRAMERATE; frameinterval = (int)((float)1000*(framenum)/framerate)-(int)((float)1000*(framenum-1)/framerate); nLastTime = -frameinterval; nTime = 0; break; case GLUT_KEY_RIGHT : framerate = framerate*TRICK_MODE_FAST_FWD; if (framerate > TRICK_MODE_MAXFRAMERATE) framerate = TRICK_MODE_MAXFRAMERATE; frameinterval = (int)((float)1000*(framenum)/framerate)-(int)((float)1000*(framenum-1)/framerate); nLastTime = -frameinterval; nTime = 0; break; case GLUT_KEY_LEFT : framerate = framerate/TRICK_MODE_FAST_FWD; if (framerate< TRICK_MODE_MINFRAMERATE) framerate = TRICK_MODE_MINFRAMERATE; frameinterval = (int)((float)1000*(framenum)/framerate)-(int)((float)1000*(framenum-1)/framerate); nLastTime = -frameinterval; nTime = 0; break; case GLUT_KEY_HOME : if(!feof(infile1)) fseek(infile1, 0, SEEK_SET); else { fclose(infile1); fopen(infile1_name, "rb"); fseek(infile1, 0, SEEK_SET); } if(bTwoFiles) { if(!feof(infile2)) fseek(infile2, 0, SEEK_SET); else { fclose(infile2); fopen(infile2_name, "rb"); fseek(infile2, 0, SEEK_SET); } } framenum = 0; running = 0; GenTexture(); nLastTime = -frameinterval; nTime = 0; break; default: break; } event_display(); glutPostRedisplay(); }