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

📄 process_key.c

📁 1. 8623L平台
💻 C
📖 第 1 页 / 共 5 页
字号:
	else {		RMDBGLOG((ENABLE, "ERROR: invalid PSMcontext\n"));		return RM_ERROR;	}	/* we process all decoders */	for (i = 0; i < PSMcontext->validPSMContexts; i++) {		if ((PSMcontext->selectedPSMContextMask & (1<<i))) {			RMDBGLOG((DISABLE, "processing decoder %lu\n", i+1));			dcc_info = dcc_info_array[i];		}		else {			RMDBGLOG((DISABLE, "decoder %lu skipped\n", i+1));			continue;		}		#ifdef _DEBUG		oldstate = dcc_info->FSMstate;#endif		if (keyflags & SET_KEY_DEBUG) {			if (key == KEY_CMD_GET_DEBUG_INFO) {				actions->cmd = KEY_CMD_GET_DEBUG_INFO;				actions->cmdProcessed = FALSE;				RMDBGLOG((DISABLE, "goto after debugKeys!\n"));				goto out_key_debug;			} else {				handle_debug_key(dcc_info, key, &(actions->cmdProcessed));				if (actions->cmdProcessed) {					RMDBGLOG((DISABLE, "goto after debugKeys!\n"));					goto out_key_debug;				}			}		}			if (dcc_info->FSMstate == RM_PSM_Prebuffering) {			if (key == KEY_CMD_QUIT) {				fprintf(stderr, "Quitting during prebuffering...\n");				actions->cmd = RM_QUIT;				actions->cmdProcessed = FALSE;				goto out_key;			}			else {				fprintf(stderr, "commands other than 'quit' are not allowed while prebuffering, skip\n");				return RM_OK;			}		}		if (keyflags & SET_KEY_PLAYBACK) {			err = handle_playback_keys(dcc_info, actions, key);			if (err == RM_OK) {				RMDBGLOG((DISABLE, "goto after playbackKeys!\n"));				goto out_key;			}			else if (err != RM_NOTIMPLEMENTED) {				RMDBGLOG((ENABLE, "handle_playback_keys returned error!\n"));				return err;			}		}			if (keyflags & SET_KEY_AUDIO) {			if (handle_audio_keys(dcc_info, actions, key) == TRUE) {				RMDBGLOG((DISABLE, "goto after audioKeys!\n"));				goto out_key;			}		}		if (keyflags & SET_KEY_DISPLAY) {			err = handle_display_keys(dcc_info, actions, key);			if (err == RM_OK) {				RMDBGLOG((DISABLE, "goto after displayKeys!\n"));				goto out_key;			}			else if (err != RM_NOTIMPLEMENTED) {				RMDBGLOG((ENABLE, "handle_display_keys returned error!\n"));				return err;			}		}		if (keyflags & SET_KEY_SPI) {			if (handle_spi_keys(dcc_info, actions, key) == TRUE) {				RMDBGLOG((DISABLE, "goto after spiKeys!\n"));				goto out_key;			}		}		//RMDBGLOG((ENABLE, "unhandled key '%c', passing it to the application\n", key));		actions->cmdProcessed = FALSE;		keyProcessed = FALSE;		out_key:#ifdef _DEBUG		if (keyProcessed) {			char buffer[256];			switch (dcc_info->FSMstate) {			case RM_PSM_Playing:				sprintf(buffer, "state is: playing");				break;			case RM_PSM_Stopped:				sprintf(buffer, "state is: stopped");				break;			case RM_PSM_Paused:				sprintf(buffer, "state is: paused");				break;			case RM_PSM_NextPic:				sprintf(buffer, "state is: nextpic");				break;			case RM_PSM_Slow:				sprintf(buffer, "state is: slow");				break;			case RM_PSM_Fast:				sprintf(buffer, "state is: fast");				break;			case RM_PSM_IForward:				sprintf(buffer, "state is: ifwd");				break;			case RM_PSM_IRewind:				sprintf(buffer, "state is: irwd");				break;			case RM_PSM_Prebuffering:				sprintf(buffer, "state is: prebuf");				break;			case RM_PSM_IPaused:				sprintf(buffer, "state is: ipaused");				break;			case RM_PSM_INextPic:				sprintf(buffer, "state is: inextpic");				break;			case RM_PSM_Rewind:				sprintf(buffer, "state is: rewind");				break;			}					if (dcc_info->FSMstate == oldstate)				sprintf(buffer+strlen(buffer), " (unchanged)");			RMDBGLOG((ENABLE, "%s\n", buffer));							buffer[0] = '\0';			if (actions->performedActions & RM_PSM_AUDIO_STOPPED)				sprintf(buffer+strlen(buffer), "audioStopped, ");			if (actions->performedActions & RM_PSM_VIDEO_STOPPED)				sprintf(buffer+strlen(buffer), "videoStopped, ");			if (actions->performedActions & RM_PSM_DEMUX_STOPPED)				sprintf(buffer+strlen(buffer), "demuxStopped, ");			if (actions->performedActions & RM_PSM_STC_STOPPED)				sprintf(buffer+strlen(buffer), "stcStopped, ");			if (actions->toDoActions & RM_PSM_FIRST_PTS)				sprintf(buffer, "firstPTS, ");			if (actions->toDoActions & RM_PSM_RESYNC_TIMER)				sprintf(buffer+strlen(buffer), "resyncTimer, ");			if (actions->toDoActions & RM_PSM_DEMUX_IFRAME)				sprintf(buffer+strlen(buffer), "demuxIFrame, ");			if (actions->toDoActions & RM_PSM_DEMUX_NORMAL)				sprintf(buffer+strlen(buffer), "demuxNormal, ");			if (actions->toDoActions & RM_PSM_FLUSH_VIDEO)				sprintf(buffer+strlen(buffer), "flushVideo, ");			if (actions->toDoActions & RM_PSM_NORMAL_PLAY)				sprintf(buffer+strlen(buffer), "normalPlay, ");			if (actions->cmdProcessed)				sprintf(buffer+strlen(buffer), "cmdProcessed, ");			if (actions->asyncCmdPending)				sprintf(buffer+strlen(buffer), "asyncCmdPending, ");			if (!strlen(buffer))				sprintf(buffer, "none, ");			if (((!actions->cmdProcessed) && 			     (actions->cmd != RM_NONE) &&			     (actions->cmd != RM_UNKNOWN)) ||			    (actions->asyncCmdPending))				sprintf(buffer+strlen(buffer), "(app_specific_cmd), ");			RMDBGLOG((ENABLE, "flags: %s cmd=%lu, asyncCmd=%lu\n", buffer, (RMuint32)actions->cmd, (RMuint32)actions->asyncCmd));				}#endif //DEBUG	out_key_debug:		/* the key is application specific (rm_unknown) */		if (!keyProcessed)			break;	}	/* verify decoder status */	stopped = 0;	for ( i = 0; i < PSMcontext->validPSMContexts; i++) {		if ((dcc_info_array[i]->FSMstate == RM_PSM_Stopped) || 		    (dcc_info_array[i]->FSMstate == RM_PSM_Paused) ||		    (dcc_info_array[i]->FSMstate == RM_PSM_IPaused)) {			RMDBGLOG((DISABLE, "decoder %ld is %s\n", 				  i+1, 				  dcc_info_array[i]->FSMstate == RM_PSM_Stopped ? "stopped":"paused"));			stopped++;		}	}	if ((stopped == PSMcontext->validPSMContexts) && (actions->cmd == RM_NONE)) {		RMDBGLOG((ENABLE, ">>> awaiting command\n"));		goto get_key;	}	return RM_OK;}RMbool handle_spi_keys(struct dcc_context *dcc_info, struct RM_PSM_Actions *actions, RMascii key){	actions->cmdProcessed = TRUE;	switch (key) {	case KEY_CMD_CHANGE_CHANNEL:		actions->cmd = KEY_CMD_CHANGE_CHANNEL;		actions->cmdProcessed = FALSE;		break;	case KEY_CMD_PAT_INFO:		actions->cmd = KEY_CMD_PAT_INFO;		actions->cmdProcessed = FALSE;		break;	case KEY_CMD_CHANGE_PMT:		actions->cmd = KEY_CMD_CHANGE_PMT;		actions->cmdProcessed = FALSE;		break;	case KEY_CMD_SWITCH_SPI_FILE:		actions->cmd = KEY_CMD_SWITCH_SPI_FILE;		actions->cmdProcessed = FALSE;		break;	case KEY_CMD_CHANGE_AUDIO: 		if (dcc_info->RM_PSM_commands & RM_PSM_ENABLE_SWITCHAUDIO) {			RMuint32 streamNumber;							if (actions->asyncCmdPending) {				fprintf(stderr, "there's a previous async cmd(%lu) pending, ignoring\n", actions->asyncCmd);				actions->cmdProcessed = FALSE;				break;			}							fprintf(stderr, "audio stream change (select mode)\n");							fprintf(stderr, "switch to audio stream: ");			RMTermGetUint32(&streamNumber);			dcc_info->selectAudioStream = (RMint32) streamNumber;							actions->asyncCmd = RM_AUDIO_STREAM_CHANGE;			actions->asyncCmdPending = TRUE;							actions->cmdProcessed = FALSE;			break;		}		fprintf(stderr, "switchAudio command not enabled!\n");		actions->cmdProcessed = FALSE;		break;				case KEY_CMD_CHANGE_AUDIO_PID: 		if (dcc_info->RM_PSM_commands & RM_PSM_ENABLE_SWITCHAUDIO) {			actions->cmd = RM_AUDIO_STREAM_CHANGE;			actions->cmdProcessed = FALSE;			break;		}		fprintf(stderr, "switchAudio command not enabled!\n");		actions->cmdProcessed = FALSE;		break;				case KEY_CMD_CYCLE_AUDIO:		if (dcc_info->RM_PSM_commands & RM_PSM_ENABLE_SWITCHAUDIO) {			if (actions->asyncCmdPending) {				fprintf(stderr, "there's a previous async cmd(%lu) pending, ignoring\n", actions->asyncCmd);				actions->cmdProcessed = FALSE;				break;			}							fprintf(stderr, "audio stream change (cycle mode)\n");			dcc_info->selectAudioStream = -1;								actions->asyncCmd = RM_AUDIO_STREAM_CHANGE;			actions->asyncCmdPending = TRUE;							actions->cmdProcessed = FALSE;			break;		}		fprintf(stderr, "switchAudio command not enabled!\n");		actions->cmdProcessed = FALSE;		break;	case KEY_CMD_NERO_NEXT_CHAPTER:		if (dcc_info->RM_PSM_commands & RM_PSM_ENABLE_CHAPTERS) {			RMDBGLOG((ENABLE,"advance to next chapter\n"));					actions->cmd = RM_NERO_NEXT_CHAPTER;			actions->cmdProcessed = FALSE;			break;		}		fprintf(stderr, "chapters not enabled!\n");		actions->cmdProcessed = FALSE;		break;	case KEY_CMD_NERO_PREV_CHAPTER:		if (dcc_info->RM_PSM_commands & RM_PSM_ENABLE_CHAPTERS) {			RMDBGLOG((ENABLE,"go to prev chapter\n"));						actions->cmd = RM_NERO_PREV_CHAPTER;			actions->cmdProcessed = FALSE;			break;		}		fprintf(stderr, "chapters not enabled!\n");		actions->cmdProcessed = FALSE;		break;	case KEY_CMD_NERO_CYCLE_SUBTITLE:		if (dcc_info->RM_PSM_commands & RM_PSM_ENABLE_SWITCHSUBTITLE) {			RMDBGLOG((ENABLE,"switch subtitle\n"));						actions->cmd = RM_NERO_SWITCH_SUBTITLE;			actions->cmdProcessed = FALSE;			break;		}		fprintf(stderr, "subtitles not enabled!\n");		actions->cmdProcessed = FALSE;		break;	case KEY_CMD_CHANGE_VIDEO:		if (dcc_info->RM_PSM_commands & RM_PSM_ENABLE_SWITCHVIDEO) {			actions->cmd = KEY_CMD_CHANGE_VIDEO;			actions->cmdProcessed = FALSE;			break;		}		fprintf(stderr, "switchVideo command not enabled!\n");		actions->cmdProcessed = FALSE;		break;	default:		actions->cmdProcessed = FALSE;		return FALSE;	}	return TRUE;}RMstatus handle_display_keys(struct dcc_context *dcc_info, struct RM_PSM_Actions *actions, RMascii key){	RMstatus err;	RMbool update_out_window = FALSE;	actions->cmdProcessed = TRUE; //will be set to false if we dont process the key	switch (key) {	case KEY_CMD_CONTRAST_PLUS:	case KEY_CMD_CONTRAST_MINUS:		if (dcc_info->disp_info == NULL) return RM_OK;		if ((key == KEY_CMD_CONTRAST_PLUS) && (dcc_info->disp_info->contrast < 240))			dcc_info->disp_info->contrast += 16;		else if ((key == KEY_CMD_CONTRAST_MINUS) && (dcc_info->disp_info->contrast > 15))			dcc_info->disp_info->contrast -= 16;		fprintf(stderr, "Now contrast is %hu\n", dcc_info->disp_info->contrast);					while ((err = RUASetProperty(dcc_info->pRUA, DispDigitalOut, RMGenericPropertyID_Co

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -