当前位置:   article > 正文

基于ARM开发板实现电子相册以及音乐播放器_基于开发板的电子相册

基于开发板的电子相册

电子相册功能:滑动切换、自动播放、无操作自动播放

音乐播放器:上下首、播放、停止、音乐播放过程实时调节音量(alsa库) 

  1. 对文件夹里文件类型的检测
  1. struct input_event ts;//触摸屏结构体
  2. typedef struct lian
  3. {
  4. char* date;
  5. struct lian* next;
  6. struct lian* to;
  7. }pnode;
  8. pnode* p;
  9. int fd,f;//屏幕,触摸屏
  10. //初始化
  11. pnode* chu()
  12. {
  13. pnode* p;
  14. p=(pnode*)malloc(sizeof(pnode));
  15. if(p==NULL)
  16. {
  17. printf("创建失败\n");
  18. return NULL;
  19. }
  20. p->date="1";
  21. p->next=p->to=NULL;
  22. return p;
  23. }
  24. //创建节点
  25. pnode* jie(char* ch)
  26. {
  27. pnode* h;
  28. h=(pnode*)malloc(sizeof(pnode));
  29. h->date=(char*)malloc(strlen(ch)+1);
  30. strcpy(h->date,ch);
  31. h->next=NULL;
  32. h->to=NULL;
  33. return h;
  34. }
  35. //插入
  36. void cha(pnode* p,char* ch)
  37. {
  38. pnode* hp;
  39. pnode* s;
  40. hp=p;
  41. s=jie(ch);
  42. while(hp->next!=NULL)
  43. {
  44. hp=hp->next;
  45. }
  46. s->next=hp->next;
  47. s->to=hp;
  48. hp->next=s;
  49. }
  50. //便利
  51. void bian(pnode* p)
  52. {
  53. pnode* hnode;
  54. hnode=p->next;
  55. while(hnode!=NULL)
  56. {
  57. printf("%s\n",hnode->date);
  58. hnode=hnode->next;
  59. }
  60. }
  61. //文件
  62. int file_s(char* ch,pnode* p)
  63. {
  64. char* k;
  65. k=strrchr(ch,'.');
  66. if(k==NULL)
  67. return -1;
  68. if(strcmp(k,".bmp")==0||strcmp(k,".jpeg")==0||strcmp(k,".jpg")==0||strcmp(k,".mp3")==0)
  69. {
  70. cha(p,ch);
  71. }
  72. return 0;
  73. }
  74. //文件夹
  75. int dir_s(char* ch,pnode* p)
  76. {
  77. char src[N];
  78. DIR* d;
  79. d=opendir(ch);
  80. if(d==NULL)
  81. {
  82. printf("文件夹打开失败\n");
  83. return -1;
  84. }
  85. struct dirent* di=NULL;
  86. while(di=readdir(d))
  87. {
  88. if(strncmp(di->d_name,".",1)==0)
  89. continue;
  90. memset(src,0,sizeof(N));
  91. sprintf(src,"%s/%s",ch,di->d_name);
  92. if(di->d_type==DT_DIR)
  93. {
  94. dir_s(src,p);
  95. }
  96. else
  97. {
  98. file_s(src,p);
  99. }
  100. }
  101. closedir(d);
  102. return 0;
  103. }
  104. //检测文件类型
  105. int jian_dir(char* jia,pnode* p)
  106. {
  107. struct stat st;
  108. stat(jia,&st);//获取文件信息
  109. if(S_ISDIR(st.st_mode))
  110. {
  111. printf("文件夹\n");
  112. dir_s(jia,p);
  113. }
  114. else
  115. {
  116. printf("文件\n");
  117. file_s(jia,p);
  118. }
  119. return 0;
  120. }

电子相册

  1. //触摸屏点击
  2. void get_dian(int* x,int* y)
  3. {
  4. while(1)
  5. {
  6. read(f,&ts,sizeof(struct input_event));
  7. if(ts.type==3&&ts.code==0)
  8. *x=ts.value;
  9. if(ts.type==3&&ts.code==1)
  10. *y=ts.value;
  11. if(ts.type==3&&ts.code==ABS_PRESSURE&&ts.value==0)
  12. {
  13. printf("%d %d",*x,*y);
  14. break;
  15. }
  16. }
  17. }
  18. //触摸屏左右滑
  19. int get_xy(int* x1,int* y1,int* x2,int* y2)
  20. {
  21. int cnt=0;
  22. while(1)
  23. {
  24. read(f,&ts,sizeof(struct input_event));
  25. if(ts.type==3&&ts.code==0&&cnt==0)
  26. *x1=ts.value;
  27. if(ts.type==3&&ts.code==1&&cnt==0)
  28. {
  29. *y1=ts.value;
  30. cnt=1;
  31. }
  32. if(ts.type==3&&ts.code==0&&cnt==1)
  33. *x2=ts.value;
  34. if(ts.type==3&&ts.code==1&&cnt==1)
  35. {
  36. *y2=ts.value;
  37. }
  38. if(ts.type==3&&ts.code==ABS_PRESSURE&&ts.value==0)
  39. {
  40. break;
  41. }
  42. }
  43. return 0;
  44. }
  45. //自动播放函数
  46. void* zi()
  47. {
  48. printf("开始自动播放\n");
  49. char* j;
  50. int dpan;
  51. zshi=1;
  52. if(p->next==NULL)
  53. {
  54. printf("已是最后一张\n");
  55. return NULL;
  56. }
  57. while(p->next!=NULL)
  58. {
  59. if(nao==1)
  60. {
  61. bmp_s("./fan.bmp",0,0);
  62. zshi=0;
  63. nao=0;
  64. break;
  65. }
  66. sleep(2);
  67. p=p->next;
  68. j=strrchr(p->date,'.');
  69. if(strcmp(j,".bmp")==0)
  70. {
  71. printf("打开bmp\n");
  72. sleep(2);
  73. if(nao==1)
  74. {
  75. zshi=0;
  76. nao=0;
  77. break;
  78. }
  79. bai();
  80. bmp_s(p->date,0,0);
  81. }
  82. else if(strcmp(j,".jpg")==0)
  83. {
  84. sleep(2);
  85. if(nao==1)
  86. {
  87. zshi=0;
  88. nao=0;
  89. break;
  90. }
  91. bai();
  92. jpeg_s(p->date);
  93. }
  94. }
  95. printf("退出自动播放\n");
  96. bmp_s("./fan.bmp",0,0);
  97. zshi=0;
  98. }
  99. //定时器处理函数
  100. void sig()
  101. {
  102. printf("判定\n");
  103. if(nao==0&&zshi==0)
  104. {
  105. zi();
  106. }
  107. else if(nao==1)
  108. {
  109. nao=0;
  110. }
  111. printf("nao=%d\n",nao);
  112. }
  113. //定时器
  114. void* ding_s()
  115. {
  116. printf("定时器生成\n");
  117. //int ret;
  118. //dx=pthread_self();
  119. while(1)
  120. {
  121. signal(SIGALRM,sig);
  122. alarm(5);
  123. sleep(5);
  124. }
  125. }
  126. //图片左右滑动切换
  127. int qie(pnode** p)
  128. {
  129. bai();
  130. pthread_t zd;//自动播放线程
  131. char* jk;
  132. if((*p)->date=="1")
  133. *p=(*p)->next;
  134. jk=strrchr((*p)->date,'.');
  135. if(strcmp(jk,".bmp")==0)
  136. {
  137. bmp_s((*p)->date,0,0);
  138. bmp_s("./fan.bmp",0,0);
  139. }
  140. else
  141. {
  142. jpeg_s((*p)->date);
  143. bmp_s("./fan.bmp",0,0);
  144. }
  145. //注册定时器
  146. pthread_create(&dx,NULL,ding_s,NULL);
  147. while(1)
  148. {
  149. get_xy(&hx1,&hy1,&hx2,&hy2);
  150. nao=1;
  151. printf("hx1=%d hx2=%d hy1=%d hy2=%d\n",hx1,hx2,hy1,hy2);
  152. if(hy1-hy2>=150&&(hx1-hx2>=-30||hx1-hx2<=30))
  153. {
  154. nao=0;
  155. pthread_create(&zd,NULL,zi,NULL);
  156. //zi(p);
  157. }
  158. if(hy1-hy2<=-150)
  159. {
  160. break;
  161. }
  162. if(hx1>0&&hx1<80&&hy1>0&&hy1<80)
  163. {
  164. break;
  165. }
  166. if(hx1<hx2)
  167. {
  168. if((*p)->to==NULL||(*p)->to->date=="1")
  169. {
  170. printf("已是第一张图片\n");
  171. continue;
  172. }
  173. printf("上一张\n");
  174. (*p)=(*p)->to;
  175. jk=strrchr((*p)->date,'.');
  176. if(strcmp(jk,".bmp")==0)
  177. {
  178. bai();
  179. bmp_s((*p)->date,0,0);
  180. bmp_s("./fan.bmp",0,0);
  181. }
  182. else
  183. {
  184. bai();
  185. jpeg_s((*p)->date);
  186. bmp_s("./fan.bmp",0,0);
  187. }
  188. }
  189. else if(hx1>hx2)
  190. {
  191. if((*p)->next==NULL)
  192. {
  193. printf("已是最后一张\n");
  194. continue;
  195. }
  196. printf("下一张\n");
  197. *p=(*p)->next;
  198. jk=strrchr((*p)->date,'.');
  199. if(strcmp(jk,".bmp")==0)
  200. {
  201. bai();
  202. bmp_s((*p)->date,0,0);
  203. bmp_s("./fan.bmp",0,0);
  204. }
  205. else
  206. {
  207. bai();
  208. jpeg_s((*p)->date);
  209. bmp_s("./fan.bmp",0,0);
  210. }
  211. }
  212. }
  213. pthread_cancel(dx);
  214. return 0;
  215. }

音乐播放器

  1. //混音器
  2. void volume1(int vol)
  3. {
  4. snd_mixer_t* mixer;
  5. snd_mixer_selem_id_t* sid;
  6. snd_mixer_elem_t* elem;
  7. long min,max,volume;
  8. int err;
  9. //打开设备
  10. err=snd_mixer_open(&mixer,0);
  11. if(err<0)
  12. {
  13. printf("打开失败\n");
  14. exit(1);
  15. }
  16. //打开默认的混音器控制器
  17. err=snd_mixer_attach(mixer,"default");
  18. if(err<0)
  19. {
  20. printf("打开控制器失败\n");
  21. snd_mixer_close(mixer);
  22. exit(1);
  23. }
  24. //加载混音器控制器
  25. err=snd_mixer_load(mixer);
  26. if(err<0)
  27. {
  28. printf("加载失败\n");
  29. snd_mixer_close(mixer);
  30. exit(1);
  31. }
  32. //获取控制器元素
  33. snd_mixer_selem_id_alloca(&sid);
  34. snd_mixer_selem_id_set_index(sid,0);
  35. snd_mixer_selem_id_set_name(sid,"Master");
  36. elem=snd_mixer_find_selem(mixer,sid);
  37. if(!elem)
  38. {
  39. printf("获取元素失败\n");
  40. snd_mixer_close(mixer);
  41. exit(1);
  42. }
  43. //获取音量范围
  44. snd_mixer_selem_get_playback_volume_range(elem,&min,&max);
  45. //设置音量
  46. volume=(vol*max)/100;
  47. snd_mixer_selem_set_playback_volume_all(elem,volume);
  48. snd_mixer_close(mixer);
  49. }
  50. //播放器
  51. void bo(pnode** mp,char* m,pnode* mm)
  52. {
  53. bmp_s("./bao.bmp",0,0);
  54. int x2,y2;
  55. int i=0;
  56. char mh[1024]={0};
  57. if(boqi==0)
  58. {
  59. system("madplay music/*.mp3 -z &");
  60. boqi=1;
  61. }
  62. *mp=(*mp)->next;
  63. while(1)
  64. {
  65. get_dian(&x2,&y2);
  66. //播放
  67. if(x2>236&&x2<316&&y2>400&&y2<473)
  68. {
  69. system("killall -CONT madplay &");
  70. }
  71. //暂停
  72. if(x2>707&&x2<792&&y2>400&&y2<476)
  73. {
  74. system("killall -STOP madplay &");
  75. }
  76. //上一首
  77. else if(x2>23&&x2<78&&y2>402&&y2<469)
  78. {
  79. if((*mp)->to==NULL||(*mp)->to->date=="1")
  80. {
  81. printf("已是第一首\n");
  82. }
  83. else
  84. {
  85. bzero(mh,sizeof(mh));
  86. (*mp)=(*mp)->to;
  87. sprintf(mh,"killall madplay && madplay -z %s &",(*mp)->date);
  88. system(mh);
  89. }
  90. }
  91. //下一首
  92. else if(x2>146&&x2<204&&y2>400&&y2<467)
  93. {
  94. if((*mp)->next==NULL)
  95. {
  96. printf("已是最后一首\n");
  97. }
  98. else
  99. {
  100. system("killall -9 madplay &");
  101. usleep(10000);
  102. bzero(mh,sizeof(mh));
  103. (*mp)=(*mp)->next;
  104. sprintf(mh,"madplay %s &",(*mp)->date);
  105. system(mh);
  106. }
  107. }
  108. //加音量
  109. else if(x2>403&&x2<477&&y2>400&&y2<471)
  110. {
  111. vol+=5;
  112. printf("加音量\n");
  113. volume1(vol);
  114. }
  115. //减音量
  116. else if(x2>557&&x2<634&&y2>396&&y2<471)
  117. {
  118. vol-=5;
  119. printf("减音量\n");
  120. volume1(vol);
  121. }
  122. //退出音乐界面
  123. else if(x2>0&&x2<80&&y2>0&&y2<80)
  124. {
  125. break;
  126. }
  127. //关闭退出
  128. else if(x2>696&&x2<800&&y2>0&&y2<102)
  129. {
  130. boqi=0;
  131. system("killall -9 madplay &");
  132. break;
  133. }
  134. }
  135. }

源码(C语言):

  1. #include<stdio.h>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. #include<linux/input.h>
  6. #include<sys/types.h>
  7. #include<sys/stat.h>
  8. #include<fcntl.h>
  9. #include<sys/mman.h>
  10. #include<unistd.h>
  11. #include<signal.h>
  12. #include<dirent.h>
  13. #include<errno.h>
  14. #include<sys/ioctl.h>
  15. #include<linux/ioctl.h>
  16. #include<sys/soundcard.h>
  17. #include<alsa/asoundlib.h>
  18. #include<signal.h>
  19. #include<pthread.h>
  20. #include"jpeglib.h"
  21. #define N 10000
  22. pthread_t dx;
  23. int f;
  24. int hx1,hx2,hy1,hy2;
  25. int boqi=0;
  26. int vol=50;
  27. int nao=0,zshi=0;
  28. struct input_event ts;//触摸屏结构体
  29. typedef struct lian
  30. {
  31. char* date;
  32. struct lian* next;
  33. struct lian* to;
  34. }pnode;
  35. pnode* p;
  36. int fd,f;//屏幕,触摸屏
  37. //初始化
  38. pnode* chu()
  39. {
  40. pnode* p;
  41. p=(pnode*)malloc(sizeof(pnode));
  42. if(p==NULL)
  43. {
  44. printf("创建失败\n");
  45. return NULL;
  46. }
  47. p->date="1";
  48. p->next=p->to=NULL;
  49. return p;
  50. }
  51. //创建节点
  52. pnode* jie(char* ch)
  53. {
  54. pnode* h;
  55. h=(pnode*)malloc(sizeof(pnode));
  56. h->date=(char*)malloc(strlen(ch)+1);
  57. strcpy(h->date,ch);
  58. h->next=NULL;
  59. h->to=NULL;
  60. return h;
  61. }
  62. //插入
  63. void cha(pnode* p,char* ch)
  64. {
  65. pnode* hp;
  66. pnode* s;
  67. hp=p;
  68. s=jie(ch);
  69. while(hp->next!=NULL)
  70. {
  71. hp=hp->next;
  72. }
  73. s->next=hp->next;
  74. s->to=hp;
  75. hp->next=s;
  76. }
  77. //便利
  78. void bian(pnode* p)
  79. {
  80. pnode* hnode;
  81. hnode=p->next;
  82. while(hnode!=NULL)
  83. {
  84. printf("%s\n",hnode->date);
  85. hnode=hnode->next;
  86. }
  87. }
  88. //全白
  89. void bai()
  90. {
  91. int* m_p;
  92. m_p=(int*)mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
  93. int i;
  94. for(i=0;i<800*480;i++)
  95. *(m_p+i)=0xffffffff;
  96. munmap(m_p,800*480*4);
  97. return ;
  98. }
  99. //混音器
  100. void volume1(int vol)
  101. {
  102. snd_mixer_t* mixer;
  103. snd_mixer_selem_id_t* sid;
  104. snd_mixer_elem_t* elem;
  105. long min,max,volume;
  106. int err;
  107. //打开设备
  108. err=snd_mixer_open(&mixer,0);
  109. if(err<0)
  110. {
  111. printf("打开失败\n");
  112. exit(1);
  113. }
  114. //打开默认的混音器控制器
  115. err=snd_mixer_attach(mixer,"default");
  116. if(err<0)
  117. {
  118. printf("打开控制器失败\n");
  119. snd_mixer_close(mixer);
  120. exit(1);
  121. }
  122. //加载混音器控制器
  123. err=snd_mixer_load(mixer);
  124. if(err<0)
  125. {
  126. printf("加载失败\n");
  127. snd_mixer_close(mixer);
  128. exit(1);
  129. }
  130. //获取控制器元素
  131. snd_mixer_selem_id_alloca(&sid);
  132. snd_mixer_selem_id_set_index(sid,0);
  133. snd_mixer_selem_id_set_name(sid,"Master");
  134. elem=snd_mixer_find_selem(mixer,sid);
  135. if(!elem)
  136. {
  137. printf("获取元素失败\n");
  138. snd_mixer_close(mixer);
  139. exit(1);
  140. }
  141. //获取音量范围
  142. snd_mixer_selem_get_playback_volume_range(elem,&min,&max);
  143. //设置音量
  144. volume=(vol*max)/100;
  145. snd_mixer_selem_set_playback_volume_all(elem,volume);
  146. snd_mixer_close(mixer);
  147. }
  148. //音量函数
  149. void volume(int vols)
  150. {
  151. int MIX_fd;//文件描述符
  152. int iLeft=vols;//左声道
  153. int iRight=vols;//右声道
  154. int Lev;
  155. Lev=(iRight<<8)+iLeft;
  156. printf("%d\n",Lev);
  157. MIX_fd=open("/dev/mixer",O_RDWR);//打开混音器
  158. if(MIX_fd==-1)
  159. {
  160. printf("打开混音器失败\n");
  161. exit(1);
  162. }
  163. //设置
  164. if(ioctl(MIX_fd,MIXER_WRITE(SOUND_MIXER_VOLUME),&Lev)==-1)
  165. {
  166. printf("设置失败\n");
  167. exit(1);
  168. }
  169. //读取
  170. if(ioctl(MIX_fd,MIXER_READ(SOUND_MIXER_VOLUME),&Lev)==-1)
  171. {
  172. printf("读取失败\n");
  173. exit(1);
  174. }
  175. close(MIX_fd);
  176. }
  177. //文件
  178. int file_s(char* ch,pnode* p)
  179. {
  180. char* k;
  181. k=strrchr(ch,'.');
  182. if(k==NULL)
  183. return -1;
  184. if(strcmp(k,".bmp")==0||strcmp(k,".jpeg")==0||strcmp(k,".jpg")==0||strcmp(k,".mp3")==0)
  185. {
  186. cha(p,ch);
  187. }
  188. return 0;
  189. }
  190. //文件夹
  191. int dir_s(char* ch,pnode* p)
  192. {
  193. char src[N];
  194. DIR* d;
  195. d=opendir(ch);
  196. if(d==NULL)
  197. {
  198. printf("文件夹打开失败\n");
  199. return -1;
  200. }
  201. struct dirent* di=NULL;
  202. while(di=readdir(d))
  203. {
  204. if(strncmp(di->d_name,".",1)==0)
  205. continue;
  206. memset(src,0,sizeof(N));
  207. sprintf(src,"%s/%s",ch,di->d_name);
  208. if(di->d_type==DT_DIR)
  209. {
  210. dir_s(src,p);
  211. }
  212. else
  213. {
  214. file_s(src,p);
  215. }
  216. }
  217. closedir(d);
  218. return 0;
  219. }
  220. //检测文件类型
  221. int jian_dir(char* jia,pnode* p)
  222. {
  223. struct stat st;
  224. stat(jia,&st);//获取文件信息
  225. if(S_ISDIR(st.st_mode))
  226. {
  227. printf("文件夹\n");
  228. dir_s(jia,p);
  229. }
  230. else
  231. {
  232. printf("文件\n");
  233. file_s(jia,p);
  234. }
  235. return 0;
  236. }
  237. //bmp图片
  238. int bmp_s(char* ch,int x,int y)
  239. {
  240. int b,w,h;
  241. int * m_p;
  242. char* b_p;
  243. b=open(ch,O_RDWR);
  244. if(b==-1)
  245. {
  246. perror("open error");
  247. return -1;
  248. }
  249. lseek(b,18,SEEK_SET);
  250. read(b,&w,4);
  251. lseek(b,22,SEEK_SET);
  252. read(b,&h,4);
  253. //printf("w=%d h=%d\n",w,h);
  254. //映射屏幕
  255. m_p=(int *)mmap(NULL,800*480*4,PROT_READ|PROT_WRITE|PROT_EXEC,MAP_SHARED,fd,0);
  256. //映射图片
  257. b_p=(char*)mmap(NULL,w*h*3+54,PROT_READ|PROT_WRITE,MAP_SHARED,b,0);
  258. int i,j;
  259. int bm[w*h];
  260. for(i=0;i<w*h;i++)
  261. {
  262. bm[i]=*(b_p+54+3*i+0)|*(b_p+54+3*i+1)<<8|*(b_p+54+3*i+2)<<16;
  263. }
  264. //颠倒
  265. for(i=0;i<h;i++)
  266. {
  267. if(i+y<0)
  268. continue;
  269. if(i+y>=480||i+y==(h+y))
  270. break;
  271. for(j=0;j<w;j++)
  272. {
  273. if(j+x<0)
  274. continue;
  275. if(j+x>=800||j+x==(w+x))
  276. break;
  277. *(m_p+(y+i)*800+j+x)=bm[(h-1-i)*w+j];
  278. }
  279. }
  280. munmap(m_p,800*480*4);
  281. munmap(b_p,w*h*3+54);
  282. close(b);
  283. return 0;
  284. }
  285. //jpeg图片
  286. //jpeg图片
  287. int jpeg_s(char* che)
  288. {
  289. FILE* j;
  290. int i;
  291. unsigned char* buf;
  292. int (*j_mp)[800];
  293. //屏幕映射
  294. j_mp=(int (*)[800])mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
  295. struct jpeg_decompress_struct jp;
  296. struct jpeg_error_mgr jer;
  297. jp.err=jpeg_std_error(&jer);
  298. jpeg_create_decompress(&jp);
  299. j=fopen(che,"rb");
  300. if(j==NULL)
  301. {
  302. printf("无法打开\n");
  303. return -1;
  304. }
  305. jpeg_stdio_src(&jp,j);
  306. jpeg_read_header(&jp,TRUE);
  307. //设置
  308. jp.scale_num=1;
  309. jp.scale_denom=1;
  310. jp.out_color_space=JCS_RGB;
  311. jpeg_start_decompress(&jp);
  312. buf=(unsigned char*)malloc(jp.output_width*jp.output_components);
  313. int kk[jp.output_width][jp.output_height];
  314. while(jp.output_height>jp.output_scanline)
  315. {
  316. memset(buf,0,sizeof(buf));
  317. jpeg_read_scanlines(&jp,&buf,1);
  318. for(i=0;i<jp.output_width;i++)
  319. {
  320. kk[jp.output_scanline-1][i]=*(buf+3*i+0)<<16|*(buf+3*i+1)<<8|*(buf+3*i+2);
  321. }
  322. if(jp.output_scanline-1<480&&jp.output_height>(jp.output_scanline-1))
  323. {
  324. for(i=0;i<jp.output_width&&i<800;i++)
  325. j_mp[jp.output_scanline-1][i]=kk[jp.output_scanline-1][i];
  326. }
  327. }
  328. jpeg_finish_decompress(&jp);
  329. jpeg_destroy_decompress(&jp);
  330. munmap(j_mp,480*800*4);
  331. fclose(j);
  332. return 0;
  333. }
  334. //检测链表的mp3文件,然后进行图片的映射
  335. void mp3_s(pnode* mp,pnode* bmp_m)
  336. {
  337. char mp_s[100];
  338. int x=0,y=80;
  339. while(mp->next!=NULL)
  340. {
  341. bzero(mp_s,sizeof(mp_s));
  342. mp=mp->next;
  343. int len=strlen(mp->date)-4;
  344. strncpy(mp_s,mp->date,len);
  345. printf("%s\n",mp_s);
  346. while(bmp_m->next!=NULL)
  347. {
  348. y+=45;
  349. bmp_m=bmp_m->next;
  350. if(strncmp(mp_s,bmp_m->date,len)==0)
  351. {
  352. bmp_s(bmp_m->date,x,y);
  353. }
  354. }
  355. }
  356. }
  357. //触摸屏点击
  358. void get_dian(int* x,int* y)
  359. {
  360. while(1)
  361. {
  362. read(f,&ts,sizeof(struct input_event));
  363. if(ts.type==3&&ts.code==0)
  364. *x=ts.value;
  365. if(ts.type==3&&ts.code==1)
  366. *y=ts.value;
  367. if(ts.type==3&&ts.code==ABS_PRESSURE&&ts.value==0)
  368. {
  369. printf("%d %d",*x,*y);
  370. break;
  371. }
  372. }
  373. }
  374. //触摸屏左右滑
  375. int get_xy(int* x1,int* y1,int* x2,int* y2)
  376. {
  377. int cnt=0;
  378. while(1)
  379. {
  380. read(f,&ts,sizeof(struct input_event));
  381. if(ts.type==3&&ts.code==0&&cnt==0)
  382. *x1=ts.value;
  383. if(ts.type==3&&ts.code==1&&cnt==0)
  384. {
  385. *y1=ts.value;
  386. cnt=1;
  387. }
  388. if(ts.type==3&&ts.code==0&&cnt==1)
  389. *x2=ts.value;
  390. if(ts.type==3&&ts.code==1&&cnt==1)
  391. {
  392. *y2=ts.value;
  393. }
  394. if(ts.type==3&&ts.code==ABS_PRESSURE&&ts.value==0)
  395. {
  396. break;
  397. }
  398. }
  399. return 0;
  400. }
  401. //播放器
  402. void bo(pnode** mp,char* m,pnode* mm)
  403. {
  404. bmp_s("./bao.bmp",0,0);
  405. int x2,y2;
  406. int i=0;
  407. char mh[1024]={0};
  408. if(boqi==0)
  409. {
  410. system("madplay music/*.mp3 -z &");
  411. boqi=1;
  412. }
  413. *mp=(*mp)->next;
  414. while(1)
  415. {
  416. get_dian(&x2,&y2);
  417. //播放
  418. if(x2>236&&x2<316&&y2>400&&y2<473)
  419. {
  420. system("killall -CONT madplay &");
  421. }
  422. //暂停
  423. if(x2>707&&x2<792&&y2>400&&y2<476)
  424. {
  425. system("killall -STOP madplay &");
  426. }
  427. //上一首
  428. else if(x2>23&&x2<78&&y2>402&&y2<469)
  429. {
  430. if((*mp)->to==NULL||(*mp)->to->date=="1")
  431. {
  432. printf("已是第一首\n");
  433. }
  434. else
  435. {
  436. bzero(mh,sizeof(mh));
  437. (*mp)=(*mp)->to;
  438. sprintf(mh,"killall madplay && madplay -z %s &",(*mp)->date);
  439. system(mh);
  440. }
  441. }
  442. //下一首
  443. else if(x2>146&&x2<204&&y2>400&&y2<467)
  444. {
  445. if((*mp)->next==NULL)
  446. {
  447. printf("已是最后一首\n");
  448. }
  449. else
  450. {
  451. system("killall -9 madplay &");
  452. usleep(10000);
  453. bzero(mh,sizeof(mh));
  454. (*mp)=(*mp)->next;
  455. sprintf(mh,"madplay %s &",(*mp)->date);
  456. system(mh);
  457. }
  458. }
  459. //加音量
  460. else if(x2>403&&x2<477&&y2>400&&y2<471)
  461. {
  462. vol+=5;
  463. printf("加音量\n");
  464. volume1(vol);
  465. }
  466. //减音量
  467. else if(x2>557&&x2<634&&y2>396&&y2<471)
  468. {
  469. vol-=5;
  470. printf("减音量\n");
  471. volume1(vol);
  472. }
  473. //退出音乐界面
  474. else if(x2>0&&x2<80&&y2>0&&y2<80)
  475. {
  476. break;
  477. }
  478. //关闭退出
  479. else if(x2>696&&x2<800&&y2>0&&y2<102)
  480. {
  481. boqi=0;
  482. system("killall -9 madplay &");
  483. break;
  484. }
  485. }
  486. }
  487. //自动播放函数
  488. void* zi()
  489. {
  490. printf("开始自动播放\n");
  491. char* j;
  492. int dpan;
  493. zshi=1;
  494. if(p->next==NULL)
  495. {
  496. printf("已是最后一张\n");
  497. return NULL;
  498. }
  499. while(p->next!=NULL)
  500. {
  501. if(nao==1)
  502. {
  503. bmp_s("./fan.bmp",0,0);
  504. zshi=0;
  505. nao=0;
  506. break;
  507. }
  508. sleep(2);
  509. p=p->next;
  510. j=strrchr(p->date,'.');
  511. if(strcmp(j,".bmp")==0)
  512. {
  513. printf("打开bmp\n");
  514. sleep(2);
  515. if(nao==1)
  516. {
  517. zshi=0;
  518. nao=0;
  519. break;
  520. }
  521. bai();
  522. bmp_s(p->date,0,0);
  523. }
  524. else if(strcmp(j,".jpg")==0)
  525. {
  526. sleep(2);
  527. if(nao==1)
  528. {
  529. zshi=0;
  530. nao=0;
  531. break;
  532. }
  533. bai();
  534. jpeg_s(p->date);
  535. }
  536. }
  537. printf("退出自动播放\n");
  538. bmp_s("./fan.bmp",0,0);
  539. zshi=0;
  540. }
  541. //定时器处理函数
  542. void sig()
  543. {
  544. printf("判定\n");
  545. if(nao==0&&zshi==0)
  546. {
  547. zi();
  548. }
  549. else if(nao==1)
  550. {
  551. nao=0;
  552. }
  553. printf("nao=%d\n",nao);
  554. }
  555. //定时器
  556. void* ding_s()
  557. {
  558. printf("定时器生成\n");
  559. //int ret;
  560. //dx=pthread_self();
  561. while(1)
  562. {
  563. signal(SIGALRM,sig);
  564. alarm(5);
  565. sleep(5);
  566. }
  567. }
  568. //图片左右滑动切换
  569. int qie(pnode** p)
  570. {
  571. bai();
  572. pthread_t zd;//自动播放线程
  573. char* jk;
  574. if((*p)->date=="1")
  575. *p=(*p)->next;
  576. jk=strrchr((*p)->date,'.');
  577. if(strcmp(jk,".bmp")==0)
  578. {
  579. bmp_s((*p)->date,0,0);
  580. bmp_s("./fan.bmp",0,0);
  581. }
  582. else
  583. {
  584. jpeg_s((*p)->date);
  585. bmp_s("./fan.bmp",0,0);
  586. }
  587. //注册定时器
  588. pthread_create(&dx,NULL,ding_s,NULL);
  589. while(1)
  590. {
  591. get_xy(&hx1,&hy1,&hx2,&hy2);
  592. nao=1;
  593. printf("hx1=%d hx2=%d hy1=%d hy2=%d\n",hx1,hx2,hy1,hy2);
  594. if(hy1-hy2>=150&&(hx1-hx2>=-30||hx1-hx2<=30))
  595. {
  596. nao=0;
  597. pthread_create(&zd,NULL,zi,NULL);
  598. //zi(p);
  599. }
  600. if(hy1-hy2<=-150)
  601. {
  602. break;
  603. }
  604. if(hx1>0&&hx1<80&&hy1>0&&hy1<80)
  605. {
  606. break;
  607. }
  608. if(hx1<hx2)
  609. {
  610. if((*p)->to==NULL||(*p)->to->date=="1")
  611. {
  612. printf("已是第一张图片\n");
  613. continue;
  614. }
  615. printf("上一张\n");
  616. (*p)=(*p)->to;
  617. jk=strrchr((*p)->date,'.');
  618. if(strcmp(jk,".bmp")==0)
  619. {
  620. bai();
  621. bmp_s((*p)->date,0,0);
  622. bmp_s("./fan.bmp",0,0);
  623. }
  624. else
  625. {
  626. bai();
  627. jpeg_s((*p)->date);
  628. bmp_s("./fan.bmp",0,0);
  629. }
  630. }
  631. else if(hx1>hx2)
  632. {
  633. if((*p)->next==NULL)
  634. {
  635. printf("已是最后一张\n");
  636. continue;
  637. }
  638. printf("下一张\n");
  639. *p=(*p)->next;
  640. jk=strrchr((*p)->date,'.');
  641. if(strcmp(jk,".bmp")==0)
  642. {
  643. bai();
  644. bmp_s((*p)->date,0,0);
  645. bmp_s("./fan.bmp",0,0);
  646. }
  647. else
  648. {
  649. bai();
  650. jpeg_s((*p)->date);
  651. bmp_s("./fan.bmp",0,0);
  652. }
  653. }
  654. }
  655. pthread_cancel(dx);
  656. return 0;
  657. }
  658. int main(int argc,char* argv[])
  659. {
  660. if(argc<4)
  661. {
  662. printf("文件不足\n");
  663. return -1;
  664. }
  665. char* h=argv[1];
  666. char* m=argv[2];
  667. char* b_m=argv[3];
  668. //音乐图片链表
  669. pnode* bmp_m;
  670. //pnode* p;
  671. pnode* mp;
  672. //音乐链表
  673. bmp_m=chu();
  674. mp=chu();
  675. //图片链表
  676. p=chu();
  677. jian_dir(b_m,bmp_m);
  678. jian_dir(h,p);
  679. //音乐文件夹
  680. jian_dir(m,mp);
  681. bian(p);
  682. bian(mp);
  683. bian(bmp_m);
  684. fd=open("/dev/fb0",O_RDWR);
  685. if(fd==-1)
  686. {
  687. printf("打开屏幕失败\n");
  688. return -1;
  689. }
  690. f=open("/dev/event0",O_RDWR);
  691. if(f==-1)
  692. {
  693. printf("打开触摸屏失败\n");
  694. return -1;
  695. }
  696. int zx,zy;
  697. //多功能
  698. while(1)
  699. {
  700. bmp_s("./zhu.bmp",0,0);
  701. get_dian(&zx,&zy);
  702. //相册
  703. if(zx>140&&zx<237&&zy>300&&zy<400)
  704. {
  705. qie(&p);
  706. }
  707. //音乐器
  708. if(zx>557&&zx<653&&zy>314&&zy<402)
  709. {
  710. bo(&mp,m,bmp_m);
  711. }
  712. }
  713. return 0;
  714. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/48094
推荐阅读
相关标签
  

闽ICP备14008679号