目的
制作一个可以在Linux环境下运行的MP3播放器。要求实现的MP3主要功能包括:播放、暂停、继续、停止、循环播放、上一曲、下一曲、退出、歌曲显示等功能。
本设计是基于madplay库实现的,程序运行时会显示一个字符界面,在该字符界面下输入相应的提示字符即可实现音乐的播放、暂停、继续、停止、上一曲、下一曲、歌词的显示等功能,也可以加入额外的一些功能。编写一个MakeFile文件,make命令来实现程序的编译。
环境搭建
Madplay是一个开源mp3解码库,对mp3解码算法做了很多优化。常用的安装环境步骤如下
创建依赖库->解压工具软件包->move可执行文件->设置环境变量
Ubuntu环境下直接执行sudo apt-get install madplay可以直接在线安装
抽象数据类型定义
1 音乐文件的存储采用双向链表的结构体music表示,列表单由music_list表示。
2 音乐文件的本机读取通过readFileList函数实现,定义char类型数组musicFilePath存放文件路径。
3 通过musicFind()函数返回音乐所在位置,在主函数的getMusicDir()有所应用,定义控制指针*pos实现上下首的播放切换。
4 使用madplay命令基础操作,定义进程pid控制。
5 定义arg[]数组存放指令的参数,定义command字符变量(char类型)来存放控制指令。
详细设计
封装madplay功能
int play(char *name)
{
pid_t pid;
int status;
if((pid = fork()) < 0)
{
perror("Fork error\n");
return 0;
}
else if(0 == pid)
{
waitpid(getppid(), &status, 0); // 等待父进程结束
execlp("madplay", "madplay","-q", name, (char*)0);
return 0;
}
else
{
return pid;
}
}
int suspend(pid_t pid)
{
kill(pid, SIGSTOP);
return 0;
}
int continuePlay(pid_t pid)
{
kill(pid, SIGCONT);
return 0;
}
int end(pid_t pid)
{
kill(pid, SIGINT);
return 0;
}
歌曲列表
music_list * createMusicList()
{
music_list *mList;
mList = (music_list *)malloc(sizeof(music_list));
if(NULL == mList)
{
perror("fail\n");
exit(1);
}
mList->length = 0;
mList->mHead = NULL;