主要功能及实现:
1,播放,暂停及继续,上一曲下一曲和退出
2,实现顺序循环播放等功能
3,可根据不同格式(.mp3)导入歌曲
完整代码:
#include <stdio.h>
#include <glob.h>
#include <unistd.h>
#include <sys/wait.h>
#include <termios.h>
#include <signal.h>
#include <termios.h>
#include <libgen.h>
#include <stdlib.h>
int main()
{
int ret = 0,i=0;
//记录歌曲
int num = 0;
char ch = 0;
glob_t pglob;
//接收返回值,判断子进程是否结束
ret = glob("/home/roots/6-8/music/*.mp3", 0, NULL, &pglob);
if (ret < 0)
{
perror("glob");
return -1;
}
//打印歌曲名称
for (i = 0; i < pglob.gl_pathc; i++)
{
printf("%s\n", basename(pglob.gl_pathv[i]));
}
// 等待用户按下空格键
printf("按下空格键+回车开始播放\n");
while (1)
{
ch = getchar();
if (ch == ' ')
{
break;
}
}
//创建子进程
pid_t pid = fork();
while(1)
{
if (pid == 0)
{
system("clear");
for (int j = 0; j < pglob.gl_pathc; j++)
{
printf("%s\n", basename(pglob.gl_pathv[j]));
}
printf("w--暂停播放\n");
printf("a--播放上一首\n");
printf("s--继续播放\n");
printf("d--播放下一首\n");
printf("q--退出播放\n");
printf("***************正在播放******************\n");
printf("%s\n", basename(pglob.gl_pathv[num]));
execl("/usr/bin/mpg123", "mpg123","-q", pglob.gl_pathv[num], NULL);
}
else
{
// 读取用户输入
ch = getchar();
if (ch != EOF)
{
if (ch == 'w') // 暂停
{
kill(pid, 19); // 发送暂停信号
}
else if (ch == 's') // 继续播放
{
kill(pid, 18); // 发送继续播放信号
}
else if (ch == 'a') // 上一首
{
kill(pid, 9); // 杀死当前进程
if (num == 0)
{
num = pglob.gl_pathc - 1;
}
else
{
num--;
}
pid = fork();
}
else if (ch == 'd') // 下一首
{
kill(pid, 9); // 杀死当前进程
if (num == (pglob.gl_pathc - 1))
{
num = 0;
}
else
{
num++;
}
pid = fork();
}
else if (ch == 'q') // 退出
{
printf("欢迎下次使用\n");
kill(pid, 9); // 杀死当前进程
system("stty echo");
break;
}
}
}
}
return 0;
}