📄 input_sensor.c
字号:
if ((mo!=st->mo) || !st->registered){ if (mo!=st->mo) { if (st->mo) IS_Unregister(st); st->mo = mo; } if (st->is->enabled) IS_Register(node); else return; } else if (!st->is->enabled) { IS_Unregister(st); st->mo = NULL; return; }#if GPAC_HTK_DEMO /*turn audio analyse on/off*/ if (!st->is_dec || !st->is_dec->od_man) return; odm = st->is_dec->od_man; assert(odm->codec && (odm->codec->type == GF_STREAM_INTERACT)); /*get IS dec*/ is_dec = odm->codec->decio->privateStack; StartHTK(is_dec);#endif}/* input sensor DDF generations (user interface)*/void gf_term_mouse_input(GF_Terminal *term, GF_EventMouse *event){ s32 X, Y; u32 left_but_down, middle_but_down, right_but_down; SFFloat wheel_pos; u32 i; GF_Codec *cod; GF_BitStream *bs; GF_SLHeader slh; char *buf; u32 buf_size; Fixed bX, bY; if (!term || !gf_list_count(term->input_streams)) return; X = event->x; Y = event->y; left_but_down = middle_but_down = right_but_down = 0; wheel_pos = 0; switch (event->type) { case GF_EVENT_MOUSEDOWN: if (event->button==GF_MOUSE_RIGHT) right_but_down = 2; else if (event->button==GF_MOUSE_MIDDLE) middle_but_down = 2; else if (event->button==GF_MOUSE_LEFT) left_but_down = 2; break; case GF_EVENT_MOUSEUP: if (event->button==GF_MOUSE_RIGHT) right_but_down = 1; else if (event->button==GF_MOUSE_MIDDLE) middle_but_down = 1; else if (event->button==GF_MOUSE_LEFT) left_but_down = 1; break; case GF_EVENT_MOUSEWHEEL: wheel_pos = event->wheel_pos; break; case GF_EVENT_MOUSEMOVE: break; default: return; } /*get BIFS coordinates*/ gf_sr_map_point(term->renderer, X, Y, &bX, &bY); bs = gf_bs_new(NULL, 0, GF_BITSTREAM_WRITE); /*If wheel is specified disable X and Y (bug from MS wheel handling)*/ if (wheel_pos) { gf_bs_write_int(bs, 0, 1); } else { gf_bs_write_int(bs, 1, 1); gf_bs_write_float(bs, FIX2FLT(bX)); gf_bs_write_float(bs, FIX2FLT(bY)); } gf_bs_write_int(bs, left_but_down ? 1 : 0, 1); if (left_but_down) gf_bs_write_int(bs, left_but_down-1, 1); gf_bs_write_int(bs, middle_but_down ? 1 : 0, 1); if (middle_but_down) gf_bs_write_int(bs, middle_but_down-1, 1); gf_bs_write_int(bs, right_but_down ? 1 : 0, 1); if (right_but_down) gf_bs_write_int(bs, right_but_down-1, 1); if (wheel_pos==0) { gf_bs_write_int(bs, 0, 1); } else { gf_bs_write_int(bs, 1, 1); gf_bs_write_float(bs, FIX2FLT(wheel_pos) ); } gf_bs_align(bs); gf_bs_get_content(bs, &buf, &buf_size); gf_bs_del(bs); memset(&slh, 0, sizeof(GF_SLHeader)); slh.accessUnitStartFlag = slh.accessUnitEndFlag = 1; slh.compositionTimeStampFlag = 1; /*note we could use an exact TS but it's not needed: since the input is generated locally we want it to be decoded as soon as possible, thus using 0 emulates permanent seeking on InputSensor stream, hence forces input frame resync*/ slh.compositionTimeStamp = 0; /*get all IS Mouse decoders and send frame*/ i=0; while ((cod = (GF_Codec*)gf_list_enum(term->input_streams, &i))) { ISPriv *is = (ISPriv *)cod->decio->privateStack; if (is->type==IS_Mouse) { GF_Channel *ch = (GF_Channel *)gf_list_get(cod->inChannels, 0); gf_es_receive_sl_packet(ch->service, ch, buf, buf_size, &slh, GF_OK); } } free(buf);}void gf_term_keyboard_input(GF_Terminal *term, u32 key_code, u32 hw_code, Bool isKeyUp){ u32 i; GF_BitStream *bs; GF_SLHeader slh; char *buf; X_KeySensor *n; u32 buf_size; u32 actionKey = 0; u32 shiftKeyDown, controlKeyDown, altKeyDown; GF_Codec *cod; s32 keyPressed, keyReleased, actionKeyPressed, actionKeyReleased; if (!term || (!gf_list_count(term->input_streams) && !gf_list_count(term->x3d_sensors)) ) return; memset(&slh, 0, sizeof(GF_SLHeader)); slh.accessUnitStartFlag = slh.accessUnitEndFlag = 1; slh.compositionTimeStampFlag = 1; /*cf above*/ slh.compositionTimeStamp = 0; bs = gf_bs_new(NULL, 0, GF_BITSTREAM_WRITE); shiftKeyDown = controlKeyDown = altKeyDown = 0; keyPressed = keyReleased = actionKeyPressed = actionKeyReleased = 0; /*key-sensor codes*/ switch (key_code) { case GF_KEY_F1: actionKey = 1; break; case GF_KEY_F2: actionKey = 2; break; case GF_KEY_F3: actionKey = 3; break; case GF_KEY_F4: actionKey = 4; break; case GF_KEY_F5: actionKey = 5; break; case GF_KEY_F6: actionKey = 6; break; case GF_KEY_F7: actionKey = 7; break; case GF_KEY_F8: actionKey = 8; break; case GF_KEY_F9: actionKey = 9; break; case GF_KEY_F10: actionKey = 10; break; case GF_KEY_F11: actionKey = 11; break; case GF_KEY_F12: actionKey = 12; break; case GF_KEY_HOME: actionKey = 13; break; case GF_KEY_END: actionKey = 14; break; case GF_KEY_PAGEUP: actionKey = 15; break; case GF_KEY_PAGEDOWN: actionKey = 16; break; case GF_KEY_UP: actionKey = 17; break; case GF_KEY_DOWN: actionKey = 18; break; case GF_KEY_LEFT: actionKey = 19; break; case GF_KEY_RIGHT: actionKey = 20; break; case GF_KEY_SHIFT: actionKey = 0; shiftKeyDown = isKeyUp ? 1 : 2; break; case GF_KEY_CONTROL: actionKey = 0; controlKeyDown = isKeyUp ? 1 : 2; break; case GF_KEY_ALT: actionKey = 0; altKeyDown = isKeyUp ? 1 : 2; break; default: actionKey = 0; break; } if (actionKey) { if (isKeyUp) actionKeyReleased = actionKey; else actionKeyPressed = actionKey; } else { /*handle numeric pad*/ if ((key_code>=GF_KEY_0) && (key_code<=GF_KEY_9) ) { key_code = key_code + 0x30 - GF_KEY_0; } else key_code = hw_code; if (isKeyUp) keyReleased = key_code; else keyPressed = key_code; } gf_bs_write_int(bs, keyPressed ? 1 : 0, 1); if (keyPressed) gf_bs_write_int(bs, keyPressed, 32); gf_bs_write_int(bs, keyReleased ? 1 : 0, 1); if (keyReleased) gf_bs_write_int(bs, keyReleased, 32); gf_bs_write_int(bs, actionKeyPressed ? 1 : 0, 1); if (actionKeyPressed) gf_bs_write_int(bs, actionKeyPressed, 32); gf_bs_write_int(bs, actionKeyReleased ? 1 : 0, 1); if (actionKeyReleased) gf_bs_write_int(bs, actionKeyReleased, 32); gf_bs_write_int(bs, shiftKeyDown ? 1 : 0 , 1); if (shiftKeyDown) gf_bs_write_int(bs, shiftKeyDown-1, 1); gf_bs_write_int(bs, controlKeyDown ? 1 : 0 , 1); if (controlKeyDown) gf_bs_write_int(bs, controlKeyDown-1, 1); gf_bs_write_int(bs, altKeyDown ? 1 : 0 , 1); if (altKeyDown) gf_bs_write_int(bs, altKeyDown, 1); gf_bs_align(bs); gf_bs_get_content(bs, &buf, &buf_size); gf_bs_del(bs); /*get all IS keySensor decoders and send frame*/ i=0; while ((cod = (GF_Codec*)gf_list_enum(term->input_streams, &i))) { ISPriv *is = (ISPriv *)cod->decio->privateStack; if (is->type==IS_KeySensor) {// GF_Channel *ch = gf_list_get(cod->inChannels, 0);// gf_es_receive_sl_packet(ch->service, ch, buf, buf_size, &slh, GF_OK); IS_ProcessData((GF_SceneDecoder*)cod->decio, buf, buf_size, 0, 0, 0); } } free(buf); i=0; while ((n = (X_KeySensor*)gf_list_enum(term->x3d_sensors, &i))) { u16 tc[2]; u32 len; char szStr[10]; const unsigned short *ptr; if (gf_node_get_tag((GF_Node*)n) != TAG_X3D_KeySensor) continue; if (!n->enabled) return; if (keyPressed) { if (n->keyPress.buffer) free(n->keyPress.buffer); tc[0] = keyPressed; tc[1] = 0; ptr = tc; len = gf_utf8_wcstombs(szStr, 10, &ptr); n->keyPress.buffer = (char*)malloc(sizeof(char) * (len+1)); memcpy(n->keyPress.buffer, szStr, sizeof(char) * len); n->keyPress.buffer[len] = 0; gf_node_event_out_str((GF_Node *)n, "keyPress"); } if (keyReleased) { if (n->keyRelease.buffer) free(n->keyRelease.buffer); tc[0] = keyReleased; tc[1] = 0; ptr = tc; len = gf_utf8_wcstombs(szStr, 10, &ptr); n->keyRelease.buffer = (char*)malloc(sizeof(char) * (len+1)); memcpy(n->keyRelease.buffer, szStr, sizeof(char) * len); n->keyRelease.buffer[len] = 0; gf_node_event_out_str((GF_Node *)n, "keyRelease"); } if (actionKeyPressed) { n->actionKeyPress = actionKeyPressed; gf_node_event_out_str((GF_Node *)n, "actionKeyPress"); } if (actionKeyReleased) { n->actionKeyRelease = actionKeyReleased; gf_node_event_out_str((GF_Node *)n, "actionKeyRelease"); } if (shiftKeyDown) { n->shiftKey = (shiftKeyDown-1) ? 1 : 0; gf_node_event_out_str((GF_Node *)n, "shiftKey"); } if (controlKeyDown) { n->controlKey = (controlKeyDown-1) ? 1 : 0; gf_node_event_out_str((GF_Node *)n, "controlKey"); } if (altKeyDown) { n->altKey= (altKeyDown-1) ? 1 : 0; gf_node_event_out_str((GF_Node *)n, "altKey"); } if (keyPressed || actionKeyPressed || (shiftKeyDown-1) || (controlKeyDown-1) || (altKeyDown-1)) { if (!n->isActive) { n->isActive = 1; gf_node_event_out_str((GF_Node *)n, "isActive"); } } else if (n->isActive) { n->isActive = 0; gf_node_event_out_str((GF_Node *)n, "isActive"); } }}void gf_term_string_input(GF_Terminal *term, u32 character){ u32 i; GF_BitStream *bs; GF_SLHeader slh; X_StringSensor *n; GF_Codec *cod; char *buf; u32 buf_size; if (!character || !term) return; if (!gf_list_count(term->input_streams) && !gf_list_count(term->x3d_sensors)) return; memset(&slh, 0, sizeof(GF_SLHeader)); slh.accessUnitStartFlag = slh.accessUnitEndFlag = 1; slh.compositionTimeStampFlag = 1; /*cf above*/ slh.compositionTimeStamp = 0; /*get all IS StringSensor decoders and send frame*/ i=0; while ((cod = (GF_Codec*)gf_list_enum(term->input_streams, &i))) { ISPriv *is = (ISPriv *)cod->decio->privateStack; if (is->type==IS_StringSensor) { GF_Channel *ch = (GF_Channel *)gf_list_get(cod->inChannels, 0); is->enteredText[is->text_len] = character; is->text_len += 1; /*write empty DDF*/ bs = gf_bs_new(NULL, 0, GF_BITSTREAM_WRITE); gf_bs_write_int(bs, 0, 1); gf_bs_write_int(bs, 0, 1); gf_bs_align(bs); gf_bs_get_content(bs, &buf, &buf_size); gf_bs_del(bs); gf_es_receive_sl_packet(ch->service, ch, buf, buf_size, &slh, GF_OK); free(buf); } } /*get all X3D StringSensors*/ i=0; while ((n = (X_StringSensor*)gf_list_enum(term->x3d_sensors, &i))) { StringSensorStack *st; char szStr[5000]; const unsigned short *ptr; u32 len; if (gf_node_get_tag((GF_Node*)n) != TAG_X3D_StringSensor) continue; if (!n->enabled) continue; st = (StringSensorStack *) gf_node_get_private((GF_Node *)n); if (character=='\b') { if (n->deletionAllowed && st->text_len) { st->text_len -= 1; st->enteredText[st->text_len] = 0; ptr = st->enteredText; len = gf_utf8_wcstombs(szStr, 10, &ptr); if (n->enteredText.buffer) free(n->enteredText.buffer); szStr[len] = 0; n->enteredText.buffer = strdup(szStr); gf_node_event_out_str((GF_Node *)n, "enteredText"); } } else if (character=='\r') { if (n->finalText.buffer) free(n->finalText.buffer); n->finalText.buffer = n->enteredText.buffer; n->enteredText.buffer = strdup(""); st->text_len = 0; gf_node_event_out_str((GF_Node *)n, "enteredText"); gf_node_event_out_str((GF_Node *)n, "finalText"); } else { st->enteredText[st->text_len] = character; st->text_len += 1; st->enteredText[st->text_len] = 0; ptr = st->enteredText; len = gf_utf8_wcstombs(szStr, 10, &ptr); if (n->enteredText.buffer) free(n->enteredText.buffer); szStr[len] = 0; n->enteredText.buffer = strdup(szStr); gf_node_event_out_str((GF_Node *)n, "enteredText"); } }}void DestroyKeySensor(GF_Node *node, void *rs, Bool is_destroy){ if (is_destroy) { GF_Terminal *term = (GF_Terminal *) gf_node_get_private(node); gf_list_del_item(term->x3d_sensors, node); }}void InitKeySensor(GF_InlineScene *is, GF_Node *node){ gf_node_set_private(node, is->root_od->term); gf_node_set_callback_function(node, DestroyKeySensor); gf_list_add(is->root_od->term->x3d_sensors, node);}void DestroyStringSensor(GF_Node *node, void *rs, Bool is_destroy){ if (is_destroy) { StringSensorStack *st = (StringSensorStack *) gf_node_get_private(node); gf_list_del_item(st->term->x3d_sensors, node); free(st); }}void InitStringSensor(GF_InlineScene *is, GF_Node *node){ StringSensorStack*st; GF_SAFEALLOC(st, StringSensorStack) st->term = is->root_od->term; gf_node_set_private(node, st); gf_node_set_callback_function(node, DestroyStringSensor); gf_list_add(is->root_od->term->x3d_sensors, node);}#if GPAC_HTK_DEMOu32 RunHTKDec(void *par){ GF_BitStream *bs; char *szWord; s32 word_index; u32 len, val, i; Float word_score; GF_SLHeader slh; GF_Codec *cod; unsigned char *buf; u32 buf_size; ISPriv *is_dec = (ISPriv *)par;// while (is_dec->htk_running) HTK_DoDetection(); szWord = HTK_GetWord(); word_index = HTK_GetWordIndex(); word_score = HTK_GetWordScore(); bs = gf_bs_new(NULL, 0, GF_BITSTREAM_WRITE); /*HTK sensor buffer format: SFString - SFInt32 - SFFloat*/ gf_bs_write_int(bs, 1, 1); len = strlen(szWord); val = gf_get_bit_size(len); gf_bs_write_int(bs, val, 5); gf_bs_write_int(bs, len, val); for (i=0; i<len; i++) gf_bs_write_int(bs, szWord[i], 8); gf_bs_write_int(bs, 1, 1); gf_bs_write_int(bs, word_index, 32); gf_bs_write_int(bs, 1, 1); gf_bs_write_float(bs, word_score); gf_bs_align(bs); gf_bs_get_content(bs, &buf, &buf_size); gf_bs_del(bs); memset(&slh, 0, sizeof(GF_SLHeader)); slh.accessUnitStartFlag = slh.accessUnitEndFlag = 1; slh.compositionTimeStamp = 0; /*get all IS keySensor decoders and send frame*/ i=0; while ((cod = gf_list_enum(is_dec->scene->root_od->term->input_streams, &i))) { ISPriv *is = cod->decio->privateStack; if (is != is_dec) continue; if (is->type==IS_HTKSensor) { GF_Channel *ch = gf_list_get(cod->inChannels, 0); gf_es_receive_sl_packet(ch->service, ch, buf, buf_size, &slh, GF_OK); } } free(buf); is_dec->htk_running = 0; return 0;}void StartHTK(ISPriv *is_dec){ u32 j; Bool run; ISStack *st; run = 0; j=0; while ((st = gf_list_enum(is_dec->is_nodes, &j))) { if (st->is->enabled) { run = 1; break; } } if (is_dec->htk_running && run) return; if (!is_dec->htk_running && !run) return; is_dec->htk_running = run; if (run) { HTK_SetDictionary(is_dec->szHTKPath); gf_th_run(is_dec->th, RunHTKDec, is_dec); }}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -