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音乐播放器相关推荐

  1. 【毕业设计】基于单片机的MP3音乐播放器设计与实现 - stm32 物联网 c51

    文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 系统设计 3.1 系统架构 3.2 软件部分设计 3.3 实现效果 3.4 部分相关代码 4 最后 1 简介 Hi,大家好,这里是丹成学长,今 ...

  2. 基于JavaSwing开发MP3音乐播放器 课程设计 大作业源码 毕业设计

    基于JavaSwing开发MP3音乐播放器:   (大作业) 开发环境: Windows操作系统 开发工具: MyEclipse+Jdk 运行效果图:  基于JavaSwing开发MP3音乐播放器:  ...

  3. 毕业设计 单片机MP3音乐播放器 - 物联网 嵌入式

    文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 系统设计 3.1 系统架构 3.2 软件部分设计 3.3 实现效果 3.4 部分相关代码 4 最后 1 简介 Hi,大家好,学长今天向大家介绍 ...

  4. 毕业设计 嵌入式 MP3音乐播放器设计与实现

    文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 系统设计 3.1 系统架构 3.2 软件部分设计 3.3 实现效果 3.4 部分相关代码 4 最后 1 简介 Hi,大家好,学长今天向大家介绍 ...

  5. stm32毕业设计 单片机MP3音乐播放器

    文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 系统设计 3.1 系统架构 3.2 软件部分设计 3.3 实现效果 3.4 部分相关代码 1 简介 Hi,大家好,这里是学长今天向大家介绍一个 ...

  6. Linux下基于Libmad库的MP3音乐播放器编写

    linux下基于Libmad库的MP3音乐播放器编写 libmad是一个开源mp3解码库,其对mp3解码算法做了很多优化,性能较好,很多播放器如mplayer.xmms等都是使用这个开源库进行解码的: ...

  7. 基于智能手机Android平台音乐播放器全程开发实战

    基于android开发的智能手机平台的应用越来越多,目前也是一块比较热门的技术,本项目为基于android系统的音乐播放器项目,学习本项目的目的是为了让学员尽快掌握android领域的小应用的开发.项 ...

  8. 基于Amarok的跨平台音乐播放器:Clementine mac版

    Clementine是一个基于Amarok的跨平台音乐播放器,同时它也支持 Win 和 Mac 平台,属于全栖型选手.Clementine可以将歌曲目录加入"库"中以进行搜索,可以 ...

  9. 在HarmonyOS中实现基于JS卡片的音乐播放器

    /   今日科技快讯   / 近日,苹果首席执行官蒂姆·库克接受<时代>杂志专访,谈及他本人对领导力.企业价值和新技术的看法.库克表示,苹果不仅要引领创新,还要努力让世界变得更安全更公平, ...

最新文章

  1. Unity导出apk出现的问题,JDK,Android SDK,NDK,无“安装模块”
  2. 表单向导 css实现 步骤指引器
  3. 解决teamviewer试用期到期的方法
  4. Java 中日期的几种常见操作 —— 取值、转换、加减、比较
  5. NB驱动建立MQTT连接和断开MQTT连接的代码实现
  6. 五四,阿里巴巴新青年了解下?
  7. 基因学:大数据的大希望
  8. java编程思想笔记(一)——面向对象导论
  9. Unity Shader-深度相关知识总结与效果实现(LinearDepth,Reverse Z,世界坐标重建,软粒子,高度雾,运动模糊,扫描线效果)
  10. linux设备驱动原理与本质
  11. access查询top10产品_access数据库 top
  12. 企业微信在线客服机器人系统开发
  13. H2单元测试数据库使用调研
  14. HNOI2015 亚瑟王
  15. esp32 Flash分区与OTA功能简析
  16. c语言有50个学生,要求输出成绩在80分以上的学生的学号和成绩,输入50个同学的学号和成绩,输出其中80分以上的学号和成绩...
  17. 什么是互联网产品的运营?,互联网营销
  18. EIE结构与算法映射
  19. 人工智能和机器学习在医疗领域中的应用
  20. SAP收购Sybase的真实意图或强化BI

热门文章

  1. ERP,中国软件的一代发展史
  2. 获利40多万,工地技术员自学开发外挂被抓
  3. 解决所有人的痛点,禁止Win10强制更新,一键彻底关闭更新,Windows Update Blocker
  4. python模拟报数游戏
  5. CV_DbgAssert(CV_ELEM_SIZE1(traits::Depth<_Tp>::value) == elemSize1())解释
  6. 删除/清除/过滤标点(所有中英文标点)的正则表达式——Desktop Search开发笔记【经验积累】
  7. 972信息检索 | 第四章 国内重要的综合性信息检索系统
  8. 计算机控制器和主控芯片,看完这三点让你完全了解微控制器与微处理器的差别?...
  9. 正则表达式中的圆括号
  10. 【大数据24小时】贵阳用大数据使森林火灾受害率降低到0.0019%