⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 input_sensor.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -