mplayer播放器

#一.mplayer播放器
https://gitee.com/qianzhen1997/linux_learning/tree/master/mymplayer
##码云链接
##在Linux下,通过mplayer播放器,C语言编写。
#二.整体思路设计流程

#三.各模块设计理念
##1 在主菜单下,按1为进行歌单列表操作,按2为歌曲播放控制,按0退出。

##2歌单列表操作,按1之后进入歌单列表操作子菜单,再按1则增加歌曲,在输入歌曲ID和歌曲的路径,就添加完成。,思路是新建一个文本文档以只写方式打开,将输入的信息写入文件中,并且加了判断如果输入的路径不存在,则提示路径不存在,并需要再次输入。按4则显示歌曲列表,,思路是把文件中的信息以链表的形式组成,遍历链表,将其中的信息打印出来。按3则删除歌曲,按3之后再输入相应的歌曲ID,则可以删除歌曲,,删除的思路是,遍历链表,通过输入的信息找到相应的链表节点,删除它,上一节点的next指向删除节点的下一节点。按2添加指定文件夹下的所有歌曲,,mode是文件或者目录的属性,属于调试信息,,再次按4查看则发现全部添加,添加文件夹下的所有歌曲思路是首先打开这个目录,然后读取目录中的内容,判断是不是文件,如果是再判断是不是以。mp3为结尾,如果也是,则说明这是应该要添加的歌曲,则添加,如果要添加子目录中的歌曲,则要用递归的思想。
##3歌曲播放控制,首先按6播放歌曲,思路是创建父子进程,在父进程中getchar()阻塞一下,在子进程通过execl函数,参数输入相应的路径和命令,就可以播放歌曲。,控制歌曲的总体思路是,通过分别有名管道发送和接收命令,通过无名管道进行父子进程通讯,按5为暂停或者再次播放,思路是输入pause\n,则可以暂停或者再次播放,按7为控制播放音量,命令为volume x 1,x为播放的具体音量,需要输入修改,将其发送后则可以改变音量,按1和按2分别为快进和快退,命令分别改为seek 10和seek -10则可以快进或者快退10秒,将这个命令发送即可。,按4为播放下一首,思路是通过read_song()这个函数读取文件中的信息,并形成链表,返回头结点,遍历链表找到和正在播放的歌曲名相同时,跳出循环,指针指向下一节点,命令为loadfile 歌曲名\n,歌曲名需要绝对路径,因此通过strcat函数都将文件中的文件名前加入了路径。。当一首歌播放完时,自动跳到下一首歌,思路是通过无名管道进行父子进程通讯,一直发送get_percent_pos\n命令,获得播放歌曲的进度,当判断为100时则调用nextsong()函数,播放下一曲。采用多线程的方式,去执行这个fun()函数,自动跳转下一曲。
##4播放时显示歌词,父子进程中通过无名管道,子进程写父进程读,思路是再创建一个线程调用fun1()函数,命令是get_time_pos\n,一方面发送后接收ANS_TIME_POSITION=秒数,通过字符串数组操作获得相应的秒数,另一方面通过读取存放歌词的.lrc文件,用fgets()函数,一行一行的读取,再通过字符串操作,获得时间的字符串,再用atof函数将其转化为浮点型,再将2者时间进行比较,因为为浮点型所以不能直接判断等于,要相减两者误差小于1e-7则相等,若相等,则输出相应的时间和歌词。因为开启了2个线程,因此用信号量加了P()和V()原子操作,这样就不会使得只能有一个线程有效。 #5心得体会 ##这个项目,使我加深了对创建父子进程,无名管道通讯,有名管道通讯,多线程多进程操作,信号量的PV操作,加深了对Linux系统编程的了解,加深了对通讯的了解,综合性较强。