技术标签: Ubuntu mp3 播放器 幼稚的小东西 madplay linux
目的
制作一个可以在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;
文章浏览阅读2w次,点赞18次,收藏203次。1、什么是同步逻辑和异步逻辑?同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。同步时序逻辑的特点:各触发器的时钟端全部连接在一起,并接在系统的时钟端,只有当时钟脉冲到来时,电路的状态才能改变。改变后的状态将一直保持到下一个时钟脉冲的到来,此时无论外部输入x有无变化,状态表中的每个状态都是稳定的。异步时序逻辑电路的特点:电路中除可以使用带时钟的触发器外,还可以使用不带时钟的触发器和延迟元件作为存储元件,电路中没有统一的时钟,电路状态的改变由外部输入的变化直接引起。2、同步电
文章浏览阅读5.6k次,点赞11次,收藏25次。list.sort(key=lambda x: (-len(x), x), reverse=True)将list首先根据长度排列,再按照abc字典顺序排列,最后按照降序排列。解释:reverse=True按照降序排列,reverse()为将整个列表反过来;lambda x是指具有排序规则:按照字母从小到大排序,或者按照字符串长度排序;(-len(x), x)是指首先用x的长度排序,如果长度相同则用出现的先后排序;两个排序原则,按照-len(x)排序,len(x)表明将长度从小到大排序,那么-le_a.sort(key=lambda x: sum(x[1:]), reverse=true)
文章浏览阅读395次。现在是互联网时代,信息的获取非常重要。一个人的搜索能力就是你的信息获取能力,当你拥有搜索能力可以让你做到事半功倍。今天分享一下虚拟资源怎么的几个途径:1.可以从各大相关的贴吧、论坛、网站上搜索例如PS教程就去PS吧、PS教程论坛等,小吃教程就去小吃教程吧、或者到网盘搜索,虫部落可以去找一下,很多资源都能找到,这样的方式成本比较低,但是需要你花费很多时间和精力一个个去搜索、下载、然后再整理。2.微信搜一搜这是一条比较容易被忽略的途径,一定要习惯性的用这里搜索功能,很强大,越来越多人会把优质的资源_搜索或输入网址火家都在搜热榜视叛应用购物附近漫画搜索历史清空历史在他暴戾
文章浏览阅读635次。1381. a*bConstraintsTime Limit: 1 secs, Memory Limit: 32 MB DescriptionGive two positive integers a and b, please help us calculate a*b.InputThe first line of the input is a positive i_sicily a * b 问题
文章浏览阅读4.9w次,点赞3次,收藏7次。可能自己在C++编程中没有处理好内存管理,导致电脑偶尔出现KERNEL_DATA_INPAGE_ERROR错误并蓝屏 重启。0×0000007A:KERNEL_DATA_INPAGE_ERROR 错误分析:这个错误往往是内存中的内核数据无法读如内存造成的。有可能是虚拟内存页面文件中存在坏簇、病毒、磁盘控制其错误、内存有问题。从页面文件读/加载存储在硬盘驱动器的信息存在一些问题。_kernel_data_inpage_error
文章浏览阅读1.8w次,点赞6次,收藏13次。Android代码中设置字体大小,字体颜色,显示两种颜色在xml文件中字体大小用的像素<TextView android:id="@+id/uppaid_time" android:layout_width="wrap_content" android:layout_height="wrap_content" ..._android:id调用的字怎么修改大小
文章浏览阅读1.1k次,点赞21次,收藏13次。本系列文章致力于用最简单的语言讲解Transformer架构,帮助朋友们理解它的强大,本文是第六篇:Transformer自注意力机制图文详解。_transformer 自注意力机制
文章浏览阅读2.2k次,点赞21次,收藏20次。【代码】安卓逆向学习之ADB的配置和使用及刷机root。_adb root
文章浏览阅读788次。若有代数式3ae/bc,则不正确的C语言表达式是( )更多相关问题Python字典支持双向索引。正则表达式模块re的_______方法用来在字符串开始处进行指定模式的匹配。Python字典中的“键”可以是元组。Python字典中的“键”不允许重复。表达式sorted([111, 2, 33], key=lambda x: len(str(x))) 的值为________________。已知 x ..._代数式3ae/bc,如何计算
文章浏览阅读10w+次,点赞117次,收藏915次。VScode安装好之后,我们还要知道,VScode毕竟是一个高级的编辑器,只能用来写C/C++代码,不能直接编译代码。同时,它还支持插件扩展,通过丰富的插件,用户能获得更多高效的功能。如果你的代码还是单独的一个.c文件,在当前打开文件夹中就可以编写,那就直接在当前打开的文件夹中新建.c源文件,编写代码,对当前的代码,直接执行【终端】->【运行生成任务】前面讲解的都是如何去编码代码,当我们生成一个可支持程序的时候,如果遇到了bug,我们就要想办法调试代码,那VScode如何调试代码呢?_vscode
文章浏览阅读252次。题目链接:https://codeforces.com/contest/1516A.Tit for Tat题意:给定一个数组,然后再给定n和k。你可以执行操作如下:给任意两个不同的元素(下标不同)一个加上1,一个减掉1。最多执行k次这样的操作,请你给出一个字典序最小的数组。..._xooo3
文章浏览阅读1.7k次。目录 一、RDMA抓包 1.ibdump 2.tcpdump (docker,Linux内核从4.9以上) 3.Offloaded Traffic Sniffer(tcpdump,ConnectX-4以上的版本,libpcap库v1.9或更高版本) ibdump 用法说明 数据收发测试工具: 二、抓包结果分析 RDMA抓包 目录 ..._ibdump