C语⾔实现⾳乐播放器(Linuxmadplay)
(⼀)需求分析
1.扫描指定路径下的⾳乐,并显⽰出来
2.实现⾳乐的播放、暂停、上⼀⾸和下⼀⾸的功能
3.程序退出释放内存资源
(⼆)思路
1.扫描出指定路径下的⾳乐⽂件(便利指定⽂件夹,出⾳频⽂件放在数组⾥⾯)
2.创建链表存放⾳乐的信息(⾳乐名、歌曲路径、歌曲总数等信息)
3.创建新的进程,⽤来播放⾳乐
4.调⽤kill函数实现⾳乐的切换和暂停播放功能
注意: 如果出现设备繁忙,可以使⽤ps -aux命令查看是否正在使⽤madplay,如果有madplay进程kill掉再运⾏程序就可以了(三)接⼝函数
函数原型功能介绍头⽂件备注
DIR *opendir(const char *name);打开⼀个⽬录#include <sys/types.h> #include <dirent.h>
struct dirent *readdir(DIR *dirp);读取⽬录的信息放在返回值中#include <dirent.h> char *getcwd(char *buf, size_t size)获取当前所在路径#include <unistd.h>
pid_t fork(void)创建⼀个新的进程#include <unistd.h>⽗进程和⼦进程返回值不同
int kill(pid_t pid, int sig);发送⼀个信号到进程#include <signal.h> int execlp(const char *file, const char *arg, …0)调⽤系统程序#include <unistd.h>注意和system区别(四)功能演⽰
在使⽤前先安装madplay⾳频解码器,在Ubuntu下安装如下:apt install madplay
安装完成后,编译⼯程(make) 之后运⾏程序传递参数就可以播放⾳乐了
输⼊1测试:
剩下的我就不⼀⼀测试了,感兴趣的可以⾃⼰下载⼯程测试下
(五)代码实现
这⾥贴出主要代码,因为我把功能开写的代码有些多:music.c
/*********************************************************************
*                                                                    *
File        : music.c                                                *
Purpose    : play music                                            *
author      : @Mrming                                                *
Time        : 2020/2                                            *
***************************END-OF-HEADER******************************
*/
#include "link.h"
#include "file.h"
#include <unistd.h>
#include <string.h>
#include <signal.h>
char CtrFlag=0;//0从头播放 1播放 2暂停
pid_t pid;//播放⾳乐进程句柄
extern struct song song_info;//歌曲信息结构体
link_t song_list = { NULL,0,"song_list" };//创建链表,存放歌曲的信息(链表头部,节点个数,链表名字) node *cur_song= NULL;//当前歌曲节点
/**
* @brief 实现⾳乐的控制播放、暂停
*
* @param  None
*
*/
void play()
{
char *str=NULL;
switch(CtrFlag)
{
case 0:
{
pid = fork();
if(pid==0)
{
str = strcat(cur_song->path,cur_song->name);
//printf("\n%s\n",str);
close(0);//
execlp("madplay","madplay",str,"-r","-q",NULL);//execlp会开辟⼀个新的线程覆盖掉⼦线程
}
CtrFlag = 2;
}
break;
case 1:
kill(pid,18);//对于主进程控制继续播放
CtrFlag = 2;
break;
case 2:
{
CtrFlag = 1;
if(pid>0)
{
kill(pid,19);//主进程中暂停⼦进程
}
}
break;
default:
printf("play:");
}
}
/**
* @brief  获取下⼀⾸歌曲并播放
*
* @param  None
*
void next()
{
cur_song = next_node(cur_song);
if(cur_song == NULL)
{
cur_song = song_list.phead;
}
kill(pid,9);//杀死当前⾳乐的进程
CtrFlag = 0;//恢复默认值
play();//播放当前选中的⾳乐
}
/
**
* @brief 获取上⼀⾸歌曲并播放
*
* @param  None
*
*/
void prev()
{
cur_song = prev_node(cur_song);
if(cur_song->prev == NULL)
{
cur_song = song_list.phead->next;
printf("this song is the first! \n");
}
kill(pid,9);//杀死当前⾳乐的进程
CtrFlag = 0;//恢复默认值
play();//播放当前选中的⾳乐
}
/**
* @brief  显⽰⾳乐列表
*
* @param  None
*
*/
void show_music_list(void)
{
printf("歌曲总数:%d⾸\n",song_info.song_num);//打印歌曲总数  out_list(&song_list);
}
/**
* @brief 关闭⾳乐释放链表资源
*
* @param  None
*
*/
void source_recovery(void)
{
system("killall madplay");//关闭madplay进程
destory_link(&song_list);//退出程序前释放资源
}
//打印当前歌曲的上⼀⾸和下⼀⾸
void near_curMusic(node *cur_song)
{
printf("\n当前歌曲 : %s\n",cur_song->name);
if(CtrFlag == 2)printf("播放状态:播放\n");
if(CtrFlag == 1)printf("播放状态:暂停\n");
}
* @brief 查⾳乐⽂件放在song_list中
*
* @param  argv:路径
*
*/
void search_all_music(char *argv)
{
int i = 0;
link_init(&song_list);//初始化链表1
search_file(argv,".mp3");//指定路径下查指定⽂件名,结果放在song_info结构体中
for(i=0;i<song_info.song_num;i++)//歌曲信息插⼊链表
{
link_insert_tail(&song_list,song_info.song_name[i],song_info.song_path[i]);//尾插数据
c语言listinsert函数//printf("%s\t%s\n",song_info.song_name[i],song_info.song_path[i]);
}
cur_song = song_list.phead->next;
}
/**
* @brief 功能列表
*
* @param  None
*
*/
int menu()
{
int i;
printf("+-------------------------------------------------------------+\n");
printf("|                                                            | \n");
printf("|                Welcome to MP3 PLAYER                      | \n");
printf("|                                                            | \n");
printf("|                      1.Play\\stop                          | \n");
printf("|                      2.prev song                            | \n");
printf("|                      3.next song                            | \n");
printf("|                      4.music list                          | \n");
printf("|                      5.quit                                | \n");
printf("|_____________________________________________________________| \n");  printf("choose->");
scanf("%d",&i);
return i;
}
/**
* @brief 功能选择
*
* @param  None
*
*/
void start_music()
{
show_music_list();
while(1)
{
near_curMusic(cur_song);
switch(menu())
{
case 1:
play();
break;
case 2:
prev();
break;
case 3:
next();

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。