《智能家居》培训第四天------2019-01-08
目录:
一)linux系统中的音乐播放器
二)实现音乐界面的功能
三)main.c代码
四)音乐界面实现总结
五)下午宣讲内容
六)所想
七)总结
一)linux系统中的音乐播放器
1)平时听音乐,我们打开的是网易云音乐、酷狗音乐、QQ音乐等软件;在linux系统下,所有的第三方工具最终都是一个可执行文件,这里所用到的音乐播放器就是一个可执行文件:mplayer
2)培训中我们把老师给的mplayer文件拷贝到了开发板根目录下的bin目录文件里
3)播放音乐指令:mplayer 1.mp3 -----播放1这首音乐
二)实现音乐界面的功能
1)接口函数system
①定义:这个函数的功能就是执行一条shell上的命令(终端上的命令)
1 #include <stdlib.h>
2 int system(const char *command); //执行一条command命令
②音乐界面各种功能的指令
1 system("killall -STOP mplayer &"); //暂停音乐
2 system("killall -CONT mplayer &"); //继续播放
3 system("killall -9 mplayer &"); //停止音乐,就是把当前音乐终止掉
4 system("mplayer /hg/music/1.mp3 &"); //播放音乐,播放开发板根目录下的hg目录里的music目录里的1.MP3这首歌
"&"的意思是:不是很记得,大概是允许在开发板后台播放,就是当退出音乐界面后,依然可以播放音乐。
2)用二维数组保存音乐信息
如果只有一首歌,那么使用上面的播放指令就可以了,但是如果有很多首歌,就不能这样写指令了,这里我们使用二维数组来保存歌曲信息,第一维表示有n首歌,第二维表示每首歌的执行指令,如下:
1 char music_name[6][20]={
2 "mplayer /1.mp3 &",
3 "mplayer /2.mp3 &",
4 "mplayer /3.mp3 &",
5 "mplayer /4.mp3 &",
6 "mplayer /5.mp3 &",
7 "mplayer /6.mp3 &",
8 };
9 /*
10 当需要播放第n首歌时就执行相应命令:system(music_name[n-1]);
11 */
3)各部分功能的代码实现(封装成单个music_function.c文件)
1 void music_play() 2 { 3 system(music_name[0]); 4 i=0; //i是用来表示第几首歌的,每次点击播放都把i置0,即从第一首开始播放 5 } 6 void music_pause() 7 { 8 system("killall -STOP mplayer &"); 9 } 10 void music_continue() 11 { 12 system("killall -CONT mplayer &"); 13 } 14 void music_stop() 15 { 16 system("killall -9 mplayer &"); 17 } 18 void music_next() 19 { 20 if(i>5) 21 { 22 system("killall -9 mplayer &"); 23 printf("No more! Press the previous button."); 24 } 25 if(i<=5) 26 { 27 system("killall -9 mplayer &"); //先停止,再播放下一首歌 28 system(music_name[i++]); 29 } 30 } 31 void music_previous() 32 { 33 34 if(i<0) 35 { 36 system("killall -9 mplayer &"); 37 printf("No more! Press play or the next button."); 38 } 39 if(i>=0) 40 { 41 system("killall -9 mplayer &"); //先停止,再播放上一首歌 42 system(music_name[i--]); 43 } 44 } 45 void music_back() //当退出音乐界面时把音乐终止并且i置0 46 { 47 system("killall -9 mplayer &"); 48 i=0; 49 }
4)上述代码未解决的问题
①我希望这6首歌的顺序是围成一个圈的,即第一首的前一首是最后一首,最后一首的后一首是前一首,智商捉急,这个逻辑我不知道怎么用代码来表示,莫名觉得学了数据结构的话应该就可以解决,这个问题希望寒假过后可以得到解决。
三)main.c代码
1 #include <stdio.h> 2 int main() 3 { 4 int x,y; 5 int pause_flag=1; //用于判断是暂停歌曲还是继续歌曲 6 //打开触摸屏 7 my_tsopen(); 8 while(1) 9 { 10 //一级界面----主界面 11 show_screen("./my_screen.bmp"); 12 //等待用户点击,获取点击的x,y的坐标 13 get_x_y(&x,&y); 14 //若点击“音乐”则进入二级界面----音乐 15 if((x>=240&&x<=340)&&(y>=200&&y<=260)) 16 { 17 //显示音乐界面 18 show_screen("./music_screen2.bmp"); 19 while(1) 20 { 21 //等待用户点击,获取x,y的坐标 22 get_x_y(&x,&y); 23 if((x>=25&&x<=125)&&(y>=400&&y<=450))//点击播放 24 { 25 music_play(); 26 }else if((x>=160&&x<=260)&&(y>=400&&y<=450)){ //点击暂停 27 switch(pause_flag) 28 { 29 case 1:music_pause();pause_flag++;break; //第一次点击暂停为暂停音乐 30 case 2:music_continue();pause_flag--;break; //第二次点击暂停为继续音乐 31 } 32 }else if((x>=300&&x<=400)&&(y>=400&&y<=450)){ //点击停止 33 music_stop(); 34 }else if((x>=440&&x<=560)&&(y>=400&&y<=450)){ //点击上一首 35 music_previous(); 36 }else if((x>=620&&x<=740)&&(y>=400&&y<=450)){ //点击下一首 37 music_next(); 38 }else if((x>=690&&x<=780)&&(y>=50&&y<=100)){ //点击返回 39 music_back(); 40 break; 41 } 42 } 43 } 44 } 45 }
四)音乐界面实现总结
代码拆分为4个源文件:
① main.c------main函数所在的源文件
② show_screen.c------界面显示→int show_screen(char* pathname)
③ music_function.c------音乐界面各种功能
④ts.c------检测触摸,获取触摸点x,y坐标
五)下午宣讲内容
下午本来是讲视频功能的,结果被宣讲占用了时间,宣讲的最终目的就是吸引我们报名培训,我个人觉得挺不错的,晚上也去听了一些细节,听完才发现这是面向大三学生的,他们说大二先把基础打好。
六)所想
1)上午码了音乐界面的全部代码,理论上是可以执行的,但开发板不行,后来心情迫切想知道自己写的东西到底行不行,就借了别人一个可以触摸的板子,连上一看,可以!没有问题!!!触摸音乐进入音乐界面触摸播放播放音乐等都没问题!!!唯一有问题的是暂停和继续那一块,我一开始是用if语句来判断执行暂停还是继续,下午才发现这一段代码逻辑上有问题,想了一下,觉得switch语句更加方便,于是就改用了switch选择暂停或者继续,成功!心里乐开了花。
2)下午老师又带我们写了一遍UI,这次老师没有使用之前的触摸接口函数get_x_y(),而是真正写了一遍获取触摸点坐标的实现,这篇笔记之所以不写触摸实现是因为对于这一块目前为止我还有不少疑问,现在记笔记有点说不清楚,以后有机会会补上。(机会来了,触摸屏的详细介绍放在第五天,点击此链接跳转-------修改日期2019.1.11)
3)其实我们一直学的都是很小一部分的内容,比如system函数的使用,mplayer播放器的使用,学海无涯,我觉得如果是没有目的地学的话,学到的东西会更广,更宽泛,同时也意味着更迷茫更无目的性,我觉得学习过程两种都要兼顾,前者是打地基让你视野更加宽阔了解得更多,后者是实战建房子让你针对问题解决问题更加实际也更加有成就感更学得下去,加油加油努力努力干巴爹干巴爹嗯嗯嗯。
七)总结
1)到今天为止,实现了音乐这块功能
2)两个未解决问题
①歌曲播放顺序问题
②触摸屏检测触摸获取触摸点坐标的实现问题