Linux——mplayer项目
部分来源:看见代码就想敲
一,功能
二.VT100讲解
[1]简介
VT100是一个古老的终端定义,后面出现的终端几乎都兼容这种终端
VT100控制码是用来在终端扩展显示的代码。比如果终端上任意坐标用不同的颜色显示字符。
规则:
<1>所有的vt100控制字符都是\033开头(即esc的ascii码)。用输出字符语句来输出。
我们可以使用printf来输出我们所有的控制字符。
<2>常用格式:
printf("\033[字体背景颜色;字体颜色m")
printf("需要打印的字符串");
printf("\033[0m"); 关闭所有属性
背景颜色范围:40-47(若是不在该范围则代码原样输出)
40:黑
41:深红
42:绿
43:黄色
44:蓝色
45:紫色
46:深绿
47:白色
前景字符颜色:30-----------37
30:黑
31:红
32:绿
33:黄
34:蓝色
35:紫色
36:深绿
37:白色
【2】系统定义的特殊控制字符格式。(即系统最后一个字符不是m,而是控制字符)
1.常用系统控制字符
\033[y;xH设置光标位置
例如:
//表示在第5行,第3列的位置打印"123"字符串
printf("\033[5;3H");
printf("123");
printf("\033[0m");
\033[2J 清屏
三.函数代码
1.打印菜单函数
2.打印指定目录下歌曲名函数
(1)定义playlist记录所有的歌曲名
(2)定义playlist_size记录歌曲数目
(3)定义索引记录当前播放曲目
【1】首先DIR *dir=open(dir_path)打开指定目录
【2】定义struct dirent遍历目录
【3】定义一个数组存放可播放的文件后缀
const char *filename[] = {".mp3", ".mp4", ".avi", ".rm", ".rmvb", ".flv", ".wma"};
【4】sttchr函数以指针的形式返回符合·条件的后缀
【5】遍历目录且与数组中后缀进行比较,打印出符合条件的文件名,记录文件个数。
【6】关于index函数
index函数使用不当
在printfPlayerList 函数里,index 函数用于查找文件扩展名。不过,要是文件没有扩展名或者index
没找到·字符,P就会是 NULL。后续对 p调用strcmp函数时,就会引引发段错误。
2.管道传递命令函数
【1】fifo_fd 管道文件的描述符
【2】command为const char*的指针,直接传入管道字符串命令
【3】写入命令长度
3.播放函数
【1】用excel函数运行代码外文件
【2】运行playlist中索引为current_index的曲目
【3】exit退出
【4】通过在子进程中使用播放歌曲
4.暂停函数
向管道发送命令进行暂停,再次使用继续播放
5.停止函数
向管道发送退出命令
6.播放上一个函数
【1】首先传入记录正在播放曲目编号的索引
【2】从新定义该索引为上一首歌编号
【3】停止正在播放的歌曲
【4】退出子进程
【5】创建新的子进程播放歌曲
7.播放下一个函数
【1】首先传入记录正在播放曲目编号的索引
【2】从新定义该索引为下一首歌编号
【3】停止正在播放的歌曲
【4】退出子进程
【5】创建新的子进程播放歌曲
遇到的问题:上一个下一个只能使用一次
8.倍速函数
【1】打印倍速菜单
【2】输入选择
【3】将倍速命令写入管道
9.定位函数.
【1】打印定位的秒速
【2】输入后清空缓冲区
【3】sprintf将定位的时间转化为命令字符串
【4】将命令输入管道
10.播放方式函数
输入选择播放模式输入管道
四.主函数代码
1.打开管道:连接子父进程,需要设置为双向模式,不然父子进程创建为同一单向.
2.打印菜单进行循环控制
3.打印菜单并选择歌曲播放
【1】如果输入1时有父进程在运行,说明此时有子进程运行,歌曲在播放,停止子进程并使pid=-1;此时在创建父子进程,父进程等待子进程结束
【2】赋值给current_index索引,用于播放选择歌曲.current_index范围是0-playlist_size-1,所以在输入基础减1
遇到的问题:输入1播放歌后不打印一级菜单
4.功能实现
【1】通过父进程控制子进程
【2】case3需要结束播放,停止子进程结束,并且将pid=-1.这样如果没有播放会跳过功能,命令不会滞留在管道.
【3】如果没有播放音乐时使用停止命令会使命令滞留在管道里,在播放音乐会停止。
5.退出命令
要养成用完就关闭的习惯