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

📄 jiemian.c

📁 fs2410下借用SDL.FFMPEG库实现一个触摸屏的播放器程序。请参照源码在相应目录下自己放置一个要播放的MPG文件。
💻 C
字号:
/***********************************************************该程序为界面控制程序,并设置为开机自动运行,类似于mp4开机画面,点击屏幕相应区域,转入相应的功能处理模块。在该程序中调度执行播放器程序,mp3播放程序,图片浏览程序。相应功能程序关闭后,重新载入开机画面,并重新等待下一次触摸操作。************************************************************/#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>#include "s3c2410_ts.h"#include <sys/wait.h>#include <SDL/SDL.h>#include <avcodec.h>#include <avformat.h>#include <stdio.h>#include <unistd.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/types.h>void *thread1(void *);//触摸屏信号处理函数声明;int fileno0=5;//文件描述符初值;int STATE_MODE=50;//初始全局状态值;SDL_Surface *screen=SDL_SetVideoMode(320, 240, 16, SDL_SWSURFACE);//screen为屏幕显示的基础框架;int i=0;   //状态位,用于判断SDL是否退出,从而决定是否重新初始化SDL;int num=2; //计数器,若程序主界面退出区域的点             //击次数为num,则整个程序退出;/***************************************************************************界面程序主函数。其中创建触摸屏信号控制子线程,并根据触摸屏信号,转入相应功能模块进程执行,执行完毕返回主界面进程;***************************************************************************/int main(){      	pthread_t t_b;	int oldtype;	void ShowBMP(char *file,SDL_Surface *screen,int x, int y);   //图片显示函数声明;	pthread_create(&t_b,NULL,thread1,(void *)NULL); //创建触摸屏信号处理线程t_b;	while(1)	{		if(i==1)                                 			screen=SDL_SetVideoMode(320, 240, 16, SDL_SWSURFACE);//screen初始化;		if(num==0)                                  //计数器,用于判断主界面程序是不是要退出;				break;	      while(1)				{       						 if(STATE_MODE == 50)				{ ShowBMP("/qinbo/test.bmp",screen,0, 0);} //显示开机界面图片;/*********************************************************************************点击触摸屏相应区域并对全局状态变量赋值以后,根据全局变量,调度相应的功能进程模块,共有三个功能:视频播放,音频播放,图片浏览*********************************************************************************/ 			if(STATE_MODE == 10)				{	SDL_Quit();//SDL退出;					i=0;             //SDL退出,标志位置0;										pthread_cancel(t_b);//取消触摸屏信号处理线程					SDL_Delay(300);//延时操作,保证相应操作能够完成;					if(vfork()==0){execvp("/usr/./qinbo1",NULL);}//子进程,调用视频播放程序						else	{          //父进程							wait(NULL);//等待视频播放进程结束							i=1;							STATE_MODE=50;//将全局状态变量恢复初值,及显示开机图片这一操作对应的状态							pthread_create(&t_b,NULL,thread1,(void *)NULL);//重建触摸屏信号处理线程							printf("back into the main process!\n");							}break;				}			 if (STATE_MODE == 20)				{					SDL_Quit();//SDL退出;					i=0;             //SDL退出,标志位置0;										pthread_cancel(t_b);//取消触摸屏信号处理线程					SDL_Delay(300);//延时操作,保证相应操作能够完成;					if(vfork()==0){execvp("/usr/./mp3",NULL);}//子进程,调用mp3播放程序						else	{      //父进程							wait(NULL);//等待mp3播放进程结束							i=1;							STATE_MODE=50;//将全局状态变量恢复初值,及显示开机图片这一操作对应的状态							pthread_create(&t_b,NULL,thread1,(void *)NULL);//重建触摸屏信号处理线程							printf("back into the main process!\n");							}break;								}			 if (STATE_MODE == 30)				{ 					SDL_Quit(); //SDL退出;    					i=0;           //SDL退出,标志位置0;										pthread_cancel(t_b);//取消触摸屏信号处理线程					SDL_Delay(300);//延时操作,保证相应操作能够完成;					if(vfork()==0){execvp("/usr/./pic",NULL);}//子进程,调用执行图片浏览程序						else	{     //父进程							wait(NULL);//等待图片浏览进程结束							i=1;							STATE_MODE=50;  //将全局状态变量恢复初值,及显示开机图片这一操作对应的状态							pthread_create(&t_b,NULL,thread1,(void *)NULL);//重建触摸屏信号处理线程							printf("back into the main process!\n");							}break;				}			 if (STATE_MODE == 40)        //此状态标志为界面程序退出状态				{printf("again4!\n"); 				STATE_MODE=50;        //将全局状态变量恢复初值,及显示开机图片这一操作对应的状态				num--;                //当值为0时,整个界面程序退出				break;				}					}	}	printf("all over!\n");	close(fileno0);	SDL_Quit();       exit(0);  //整个程序结束,退出!}/****************************************************************触摸平操作实时响应线程,对触摸屏信号进行区域判断,并对全局状态变量STATE_MODE赋值*****************************************************************/void *thread1(void *junk){		int fangdou_flag =1; //触摸屏防抖标志位,只对连续有效点的第一个点响应;	fileno0 = open("/dev/ts",O_RDONLY);//打开触摸屏;
       if (fileno0 == -1) {
                printf("open device error!\n");//打印错误信息;
        	  return NULL;
                              }
	TS_EVENT ev0;//触摸屏相应数据结构;
    	memset(&ev0, 0, sizeof(struct s3c2410_ts_event));
			while(1)		{
		if(read(fileno0, &ev0, sizeof(struct s3c2410_ts_event)))//读取触摸屏信号;			{                     double i_tmp=2.984,j_tmp=3.708;                      ev0.x=(unsigned int)((986-ev0.x)/i_tmp);       //触摸屏校准;			 ev0.y=(unsigned int)((948-ev0.y)/j_tmp);			if ((ev0.pressure)&&(fangdou_flag==1))         //触摸屏防抖标志位为1时相应;				{                        printf("x= %d, y= %d, flag=0x%04x\n", ev0.x, ev0.y, ev0.pressure);		       		if ((ev0.y>=80)&&(ev0.y<=160))					{					if     ((ev0.x>=20)&&(ev0.x<=100))STATE_MODE=10;    //触摸屏视频播放区域;					else if(ev0.x>120&&ev0.x<=200) STATE_MODE = 20;     //触摸屏mp3播放区域;					else if((ev0.x>220)&&(ev0.x<=300)) STATE_MODE = 30; //触摸屏图片浏览区域;					}				else if((ev0.y>=0)&&(ev0.y<=20)&&(ev0.x>0)&&(ev0.x<=20)) STATE_MODE = 40;//触摸屏界面程序退出区域;                          fangdou_flag = 0; //连续有效点中除第一个点的其余点无效;							}				if(ev0.pressure == 0)//新的连续有效点产生;				fangdou_flag = 1;//触摸屏防抖标志位置1;			 }   	       		} 
       return 0;}/********************************************************************************SDL显示BMP图片函数。无延时。screen为屏幕显示的基础框架。(x,y)为图片显示坐标原点。********************************************************************************/void ShowBMP(char *file,SDL_Surface *screen,int x, int y){        if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {       //SDL初始化;        fprintf(stderr, "can not initialize SDL: %s\n", SDL_GetError());//打印错误信息;        exit(1);    }if ( screen==NULL ) {        fprintf(stderr, "无法设置3200x240的视频模式:%s\n", SDL_GetError());        exit(1); 	}    SDL_Surface *image;    SDL_Rect dest;    image = SDL_LoadBMP(file);// 将BMP文件加载到一个surface    if ( image == NULL ) {        fprintf(stderr, "无法加载 %s: %s\n", file, SDL_GetError());//打印错误信息;        return;    	}    dest.x = x;            //Blit到屏幕surface;onto the screen surface;    dest.y = y;            // 这时不能锁住surface;    dest.w = image->w;    dest.h = image->h;    SDL_BlitSurface(image, NULL, screen, &dest);    SDL_UpdateRects(screen, 1, &dest);    SDL_FreeSurface(image); //释放图片;}

⌨️ 快捷键说明

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