基于Madplay的MP3音乐播放器
1 简介
根据本学期(大三)末课程设计的要求,本人独立制作该播放器。该播放器使用madplay,并在linux运行。
测试环境:Red Hat Enterprise 5
获取完整源码:我的GitHub
2 文件说明
源文件 | 头文件 | 函数名 | 功能描述 |
---|---|---|---|
main.c | main() | 主函数 | |
getCommand() | 获取命令 | ||
execCommand() | 执行命令 | ||
sCommand() | 播放音乐 | ||
uCommand() | 暂停播放 | ||
cCommand() | 继续播放 | ||
nCommand() | 下一首 | ||
pCommand() | 上一首 | ||
qCommand() | 退出 | ||
getMusicFileDir() | 获取音乐目录路径 | ||
getMusicDir() | 获取音乐文件路径 | ||
displayHelp() | 显示帮助 | ||
readFileList.c | readFileList.h | readFileList() | 读取目录,获取MP3文件信息并存入列表 |
music_list.c | music_list.h | createMusicList() | 初始化双向列表 |
musicListInsert() | 插入链表 | ||
bSearch() | 二分法查询与排序 | ||
musicListDisplay() | 打印链表 | ||
musicFind() | 查询链表 | ||
locateMusic() | 指针在链表中移动 | ||
madplay.c | madplay.h | play() | 播放音乐 |
suspend() | 暂停播放 | ||
continuePlay() | 继续播放 | ||
end() | 结束播放 |
其他文件:
文件名 | 功能描述 |
---|---|
.music_config | 存放音乐目录的路径 |
3 部分代码讲解
3.1 getCommand()
/* 读取指令和参数 */
char getCommand(char *arg)
{char res = '0'; // 指令char input[256];printf("Input command: ");fgets(input, 256, stdin);input[strlen(input) - 1] = '\0';/* Trim */int i = 0;while(' ' == input[i]) // 去除前空格++i;if('\0' != input[i])res = input[i]; // 获得第一各有效字符 if('s' == res || 'S' == res){strcpy(arg, "\0");if(' ' != input[++i] || '\0' == input[i]) // 非空格或无参数return 'E';++i;strcat(arg, &input[i]);}else // 无参数指令,检测指令是否有错{while('\0' != input[++i]){if(' ' != input[i]){res = 'E';break;}}}return res;
}
getCommand()完成对用户输入的字符串处理并获取指令和参数。用户输入的字符串放在input[]中;res为处理获得的指令,为’E’时,表明input字符串无效;arg为当指令为s或S时的参数,即音乐名。
该函数会去除字符串前的空格,并认为空格之后的第一个有效字符即为指令。若指令为s或S,则读取一个空格之后的非空格字符串作为参数,而不检验文件名后缀是否为MP3,若无有效字符串则无效。其他指令之后非空格或非结束标记则无效。
3.2 createMusicList()
music_list * createMusicList()
{music_list *mList;mList = (music_list *)malloc(sizeof(music_list));if(NULL == mList){perror("mList malloc fail\n");exit(1);}mList->length = 0;mList->mHead = NULL;return mList;
}
初始化双向链表,链表结构体声明在music_list.h文件中。mList为头指针,始终指向链表头。
双向链表可以容易地实现前后移动指针来实现上一首和下一首音乐。
3.3 bSearch()
int bSearch(int funcFlag, music_list *mList, char *value, int low, int high)
{ // funcFlag = 0: musicListInsert// funcFlag = 1: musicFind or musicListDeleteint mid = (low + high) / 2;music *tmp; // tmp指向mid节点tmp = locateMusic(mList, mid);// printf("low: %d, high: %d, mid: %d\n", low, high, mid);if(0 == funcFlag){if(high - low <= 1) // a[low]为比value小的最大值,a[high]为比value大的最小值return high;}if(1 == funcFlag) // musicFind{//printf("value:%s, tmp->name: %s",value, tmp->name);if(strcmp(value, tmp->name) == 0)return mid; // 文件存在,返回所在链表位置if((high - low) <= 0)return -1; // 文件不存}int r = strcmp(value, tmp->name);if(r < 0) return bSearch(funcFlag, mList, value, low, mid);if(r > 0)return bSearch(funcFlag, mList, value, mid, high);
}
使用二分法查找和排序,funcFlag作功能选择标记位,为1时是排序,为0时是查找。
3.4 play()
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; }
}
通过fork创建子进程,让子进程调用exec执行madplay播放命令。父进程返回子进程pid以实现后续控制。
基于Madplay的MP3音乐播放器相关推荐
- 【毕业设计】基于单片机的MP3音乐播放器设计与实现 - stm32 物联网 c51
文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 系统设计 3.1 系统架构 3.2 软件部分设计 3.3 实现效果 3.4 部分相关代码 4 最后 1 简介 Hi,大家好,这里是丹成学长,今 ...
- 基于JavaSwing开发MP3音乐播放器 课程设计 大作业源码 毕业设计
基于JavaSwing开发MP3音乐播放器: (大作业) 开发环境: Windows操作系统 开发工具: MyEclipse+Jdk 运行效果图: 基于JavaSwing开发MP3音乐播放器: ...
- 毕业设计 单片机MP3音乐播放器 - 物联网 嵌入式
文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 系统设计 3.1 系统架构 3.2 软件部分设计 3.3 实现效果 3.4 部分相关代码 4 最后 1 简介 Hi,大家好,学长今天向大家介绍 ...
- 毕业设计 嵌入式 MP3音乐播放器设计与实现
文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 系统设计 3.1 系统架构 3.2 软件部分设计 3.3 实现效果 3.4 部分相关代码 4 最后 1 简介 Hi,大家好,学长今天向大家介绍 ...
- stm32毕业设计 单片机MP3音乐播放器
文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 系统设计 3.1 系统架构 3.2 软件部分设计 3.3 实现效果 3.4 部分相关代码 1 简介 Hi,大家好,这里是学长今天向大家介绍一个 ...
- Linux下基于Libmad库的MP3音乐播放器编写
linux下基于Libmad库的MP3音乐播放器编写 libmad是一个开源mp3解码库,其对mp3解码算法做了很多优化,性能较好,很多播放器如mplayer.xmms等都是使用这个开源库进行解码的: ...
- 基于智能手机Android平台音乐播放器全程开发实战
基于android开发的智能手机平台的应用越来越多,目前也是一块比较热门的技术,本项目为基于android系统的音乐播放器项目,学习本项目的目的是为了让学员尽快掌握android领域的小应用的开发.项 ...
- 基于Amarok的跨平台音乐播放器:Clementine mac版
Clementine是一个基于Amarok的跨平台音乐播放器,同时它也支持 Win 和 Mac 平台,属于全栖型选手.Clementine可以将歌曲目录加入"库"中以进行搜索,可以 ...
- 在HarmonyOS中实现基于JS卡片的音乐播放器
/ 今日科技快讯 / 近日,苹果首席执行官蒂姆·库克接受<时代>杂志专访,谈及他本人对领导力.企业价值和新技术的看法.库克表示,苹果不仅要引领创新,还要努力让世界变得更安全更公平, ...
最新文章
- Unity导出apk出现的问题,JDK,Android SDK,NDK,无“安装模块”
- 表单向导 css实现 步骤指引器
- 解决teamviewer试用期到期的方法
- Java 中日期的几种常见操作 —— 取值、转换、加减、比较
- NB驱动建立MQTT连接和断开MQTT连接的代码实现
- 五四,阿里巴巴新青年了解下?
- 基因学:大数据的大希望
- java编程思想笔记(一)——面向对象导论
- Unity Shader-深度相关知识总结与效果实现(LinearDepth,Reverse Z,世界坐标重建,软粒子,高度雾,运动模糊,扫描线效果)
- linux设备驱动原理与本质
- access查询top10产品_access数据库 top
- 企业微信在线客服机器人系统开发
- H2单元测试数据库使用调研
- HNOI2015 亚瑟王
- esp32 Flash分区与OTA功能简析
- c语言有50个学生,要求输出成绩在80分以上的学生的学号和成绩,输入50个同学的学号和成绩,输出其中80分以上的学号和成绩...
- 什么是互联网产品的运营?,互联网营销
- EIE结构与算法映射
- 人工智能和机器学习在医疗领域中的应用
- SAP收购Sybase的真实意图或强化BI
热门文章
- ERP,中国软件的一代发展史
- 获利40多万,工地技术员自学开发外挂被抓
- 解决所有人的痛点,禁止Win10强制更新,一键彻底关闭更新,Windows Update Blocker
- python模拟报数游戏
- CV_DbgAssert(CV_ELEM_SIZE1(traits::Depth<_Tp>::value) == elemSize1())解释
- 删除/清除/过滤标点(所有中英文标点)的正则表达式——Desktop Search开发笔记【经验积累】
- 972信息检索 | 第四章 国内重要的综合性信息检索系统
- 计算机控制器和主控芯片,看完这三点让你完全了解微控制器与微处理器的差别?...
- 正则表达式中的圆括号
- 【大数据24小时】贵阳用大数据使森林火灾受害率降低到0.0019%