1 软件功能需求
能识别本地的MP3歌曲文件,能根据路径添加入播放器中。 能识别本地的播放列表信息。
具有播放列表功能,能根据用户的需求随意创建、删除播放列表。
用户能往指定的播放列表中添加、删除。添加时,歌曲必须是已经存在的。 用户能查看当前播放器中的所有歌曲。 用户能查看播放器中现有的播放列表信息。 用户能查看指定播放列表下的歌曲信息。
能对播放歌曲进行播放、暂停、停止三种操作。
具有默认、全部循环、单曲循环、随机播放等4中播放模式。
具有显示播放器当前状态功能,能实时显示播放器当前的播放状态和播放列表的一些基本信息。
具有同步功能,在用户退出时, 能保存当前的状态,在下次播放器打开时,能回到退出
去前的状态。
模块分类
播放文件模块、播放列表模块、控制模块、播放模块。 2 文件模块
在指定的目录下搜索MP3歌曲文件,具有打印所有文件和获取歌曲文件信息等功能。
2.1 相关的系统函数
1) 目录相关:opendir closedir readdir chdir mkdir
2) 文件相关:fopen fclose fseek ftell fgets 3) 字符相关:strcmp strlen strcpy sprint
2.2 定义的结构体
#define MUSIC_NAME_LEN #define MUSIC_ARTISH_LEN ··#define MUSIC_PATH
MP3信息头结构体 typedef struct _mp3_head{
int maxmusic;
30 // 文件名的长度 30 // 作者名长度 50 // 歌曲路径长度
// 歌曲链表中歌曲的数量 // 指向歌曲链表的头结点 // 指向歌曲链表的尾节点
struct _mp3_file *head; struct _mp3_file *tail;
}MP3_HEAD_S;
MP3文件链表节点信息 typedef struct _mp3_file{
char musicname[MUSIC_NAME_LEN+1]; // 歌曲名 char artish[MUSIC_ARTISH_LEN+1]; char path[MUSIC_PATH+1] struct _mp3_file *next;
// 作者名
// 歌曲路径=目录+歌曲文件名 // 指向下一歌曲节点
}MP3_FILE_S;
2.3 函数接口
// 更新本地所有歌曲
// 成功返回0, 失败返回-1
int mpp_file_update(const char *dirpath); // 更新歌曲路径
// 判断文件是否为MP3文件 // 成功返回0 ,失败返回-1
int mpp_file_ismp3(const char *filename); // 歌曲文件名
// 读取文件信息,并填充到参数中 // 成功返回0, 失败返回-1
int mpp_file_fillinfo(const char *filename, // 歌曲文件名
const char *path, // 歌曲路径
MP3_FILE_S * mp3); // 歌曲节点指针
// 将新的节点添加到链表中 // 返回返回0, 失败返回-1
int mpp_file_addList(MP3_FILE_S *pst);
// 遍历本地所有歌曲
// 成功返回0, 失败返回-1 int mpp_file_travser();
// 测试MP3歌曲是否在MP3链表中 // 成功返回0, 失败返回-1
int mpp_file_testmp3(const char *musicname);
// 根据歌曲名获取歌曲的名字,作者和路径信息 // 成功返回0, 失败返回-1
int mpp_file_getinfo(const char *musicname, // 要查找的那首歌的歌曲名 char ** name, // 保存查找到的歌曲名 char ** artish, // 保存查找到的作者名 char ** path); // 保存查找到的歌曲路径
// 通过索引号获取MP3歌曲的名字,作者和路径信息 // 成功返回0, 失败返回-1
int mpp_file_getinfobyidx(int musicidx, // 歌曲在链表中的位置 char ** name, // 保存查找到的歌曲名 char ** artish, // 保存查找到的作者名 char ** path); // 保存查找到的歌曲路径
// 获取歌曲数量 成功返回当前MP3列表中的歌曲数量 int mpp_file_getnum();
// 指向新的节点结构体的指针
// MP3歌曲名
3 播放列表模块开发
创建播放列表,添加歌曲至播放播放列表,删除播放列表,和播放列表相关的功能。
3.1 播放列表结构体
#define PL_NAME_LEN 30 // 播放列表名长度 #define DEFAULT_PL_DIR \"./playlist\" // 播放列表存放的路径 播放列表头结点信息 typedef struct pl_head{
int qlnum; char *curpl;
// 当前播放器拥有播放列表的个数 // 当前选择播放的播放列表名 // 当前选择播放的歌曲名 // 指向播放列表的头结点 // 指向播放列表的尾结点
char *curmusic;
struct pl_info *hpl; struct pl_info *tpl;
}PL_HEAD_S;
播放列表节点的信息 typedef struct pl_info{
char plname[PL_NAME_LEN+1]; // 播放列表名 int musicnum;
// 列表下拥有的歌曲数量 // 指向歌曲列表的前一个结点 // 指向歌曲列表的尾结点 // 指向播放列表的前一节点 // 指向播放列表的后一结点
struct pl_music *hmu; struct pl_music *tmu; struct pl_info *prev; struct pl_info *next;
}PL_INFO_S; 歌曲节点的信息 typedef struct pl_music{
char *musicname; // 指向MP3文件链表结点中歌曲名的指针 char *artish;
// 指向MP3文件链表结点中作者指针 // 指向MP3歌曲链表结点中歌曲路径的指针
// 指向前一歌曲结点 // 指向下一歌曲结点
char *musicpath;
struct pl_music *prev; struct pl_music *next; }PL_MUSIC_S;
3.2 函数接口
// 搜索播放列表是否存在
// 存在返回该列表地址, 不存在返回NULL
PL_INFO_S * mpp_pl_search(const char *plname); // 播放列表名
// 在指定播放列表中搜索歌曲
// 成功返回该歌曲的地址,失败返回NULL
PL_MUSIC_S * mpp_pl_searchmusic(PL_INFO_S *ppl, // 播放列表结点
const char *music); // 歌曲名
// 获取播放列表头结点中的当前播放列表和当前播放歌曲
int mpp_pl_getcurinfo(char **plname, // 存放当前播放列表名
char ** musinc); // 存放当前播放歌曲名
// 设置播放列表头结点中的当前播放列表和当前播放歌曲
int mpp_pl_setcurinfo(char *plname, // 要设置的当前播放列表名
char *music); // 要设置的当前播放歌曲名
// 播放列表路径
// 更新播放播放列表
// 成功返回0 ,失败返回-1
int mpp_pl_update(const char *pldirpath);
// 创建播放列表
// 成功返回0,失败返回-1
int mpp_pl_create(const char *plname);
// 销毁播放列表
// 成功返回0,失败返回-1
int mpp_pl_destroy(const char *plname);
// 播放列表名
// 播放列表名
// 播放列表添加歌曲
// 成功返回0,失败返回-1
int mpp_pl_addmu(const char *plname, // 播放列表名
const char *music); // 歌曲名
// 播放列表删除歌曲
// 成功返回0,失败返回-1
int mpp_pl_delmu(const char *plname, const char *music);
// 将链表同步到文件当中 flag 0: 写入文件操作, 1: 删除文件操作 // 成功返回0,失败返回-1
int mpp_pl_syncfile(const char *plname, char flag);
// 根据播放列表名,遍历
int mpp_pl_travserbyname(const char *plname); // 播放列表名
// 遍历播放列表 int mpp_pl_travser();
// 遍历当前播放列表下的歌曲列表 int mpp_pl_travsertocontrol();
// 获取播放列表总个数 int mpp_pl_getplnum();
// 获取当前播放的播放列表名
// 成功返回指向当前的播放列表名的指针,失败返回NULL char * mpp_pl_getcurpl();
// 获取当前播放的歌曲名
// 成功返回指向当前播放歌曲名的指针, 失败返回NULL char * mpp_plgetcurmusic();
4 控制模块
显示一些系统的相关信息,提供命令输入的接口,和命令显示相关的功能。
4.1 控制台编写流程
4.1.1 循环打印命令提示符,并接收命令 4.1.2 判断是否为空命令,去掉结尾的回车符 4.1.3 进行命令匹配,判断命令是否匹配到 4.1.4 根据不同命令指行不同指令
4.2 相关函数
fgets strcmp strlen strtok
4.3 控制结构体
#define CMD_LEN 6 // 命令的长度 #define DES_LEN 50 // 命令解析的长度 #define PROMPT \"my-mpp #\" typedef struct cmd_info { char cmdn[CMD_LEN + 1]; // 控制命令 void (*pFun)(void *); // 控制函数 char des[DES_LEN + 1]; // 命令解析 }CMD_INFO_S;
4.4 函数接口
// 命令台初台化 int Control_initialize();
// 显示当前播放状态界面 void RefreshScreen();
5 播放模块
播放歌曲,暂停播放,停止播放,播放模式, 和播放相关的功能
5.1 相关函数
signal fork
信号 :SIGINT
SIGSTOP SIGCONT
中止一个进程 暂时执行进程 继续执行进程
向一个进程发送信号
wait execl getpid getppid
kill
int kill(pid_t pid, int sig);
sighandler_t signal(int signum, sighandler_t handler);
pid_t fork(void)
创建一个新的进程
注册信号
fork的返回值有三种 -1 0 > 0
o : 表示当前执行程序为子进程
>0 : 表示当前执行的程序为父进程,父进程返回子进程的PID号
pid_t waitpid(int pid, int *status, int option); 等等回收子进程资源
int execl(const char *path, const char *arg, ...);
进程的替换
5.2 播放模块结构体
播放模式枚举类型 typedef enum{ PLAY_MODE_DEFAULT = 0x1, PLAY_MODE_LOOP,
PLAY_MODE_LOOPONE, PLAY_MODE_RANDOM,
PLAY_MODE_RESEVR,
}PLAY_MODE_S;
播放状态枚举类型 typedef enum{
PLAY_STATUS_PLAY = 0x1, PLAY_STATUS_PAUSE, PLAY_STATUS_STOP,
PLAY_STATUS_RESERV,
}PLAY_STATUS_S;
播放相关信息 */ typedef struct play_info{
PLAY_MODE_S playmode;
PLAY_STATUS_S playstatus; pid_t playpid;
char *curplaymusic; char *curartish;
char *curmusicpath;
}PLAY_INFO_S;
5.3 函数接口
// 默认播放 // 全部循环播放 // 单曲循环播放 // 随机播放
// 预留
// 播放 // 暂停 // 停止 // 预留
// 播放模式 // 播放状态 // 播放子进程ID号 // 指向当前播放的歌曲名 // 指向当前播放歌曲的作者名// 指向当前播放的歌曲的路径
// 播放下一首歌曲 int mpp_play_next();
// 播放上一首歌曲 int mpp_play_prev();
// 播放歌曲
int mpp_play_playmusic(const char *musicname, // 播放歌曲名 const char *artish, // 播放歌曲的作者名 const char *path); // 播放歌曲的路径
// 暂停歌曲
int mpp_play_pausemusic();
// 停止播放歌曲
int mpp_play_stopmusic();
// 设置播放的模式
int mpp_play_setmode(PLAY_MODE_S emode); // 播放模式
// 获取当前播放的模式
// 返回当前的播放模式字符串 \"LOOP\" \"LOOP ONE\" \"DEFAULT\" \"RANDOM\" \"unKnown\" char *mpp_getmodestring();
// 获取当前的播放状态
// 返回当前的播放模式字符串 \"Play\" \"Pause\" \"Stop\" \"unKnown\" char *mpp_getstatusstring();
// 随机播放模式
int mpp_play_random();
// 等待播放子进程状态改变的处理函数 void mpp_play_wait(int argc);
因篇幅问题不能全部显示,请点此查看更多更全内容