写在前面:大家好,我是草莓橙须圆。毕业之前在CSDN和微信公众号活跃
欢迎关注我的公众号:【草莓橙须圆】
微信公众号主要就是更新大学生或者考研党的日常
CSDN主要就是学习Java过程中总结的笔记,以及编程分享
这篇文章主要是给大家分享字符界面 MP3播放器
本次基于 Ubuntu18.04,64位环境下的字符界面 MP3播放器,对于字符界面 MP3播放器:主要包括,执行播放指令,开创子进程允许各类模式播放,通过文件进行沟通,通过主界面的提示,以及输入的字符判断要执行的操作。拥有下一曲,上一曲,暂停,播放,显示目录点歌,对应每个选项又有相应的功能操作,通过杀死之前的子进程,打开另一个子进程,进行切歌,模式其切换等功能
首先先安装madplay:
因为网络问题无法安装madplay
解决办法:
无法下载 http://archive.ubuntu.com/ubuntu/·····暂时不能解析域名,解决办法
已经madplay配置完成
代码:
1.头文件:madplay.h
说明:实现madplay的控制,包括播放play、暂停suspend、开始start、下一首next、上一首previous
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "madplay.h"
#ifdef MADPLAY_DEBUG
int main()
{
pid_t pid;
char *name = "./music/happy.mp3";
pid = play(name);
printf("child pid: %d\n", pid);
char con;
printf("suspend?");
scanf("%c", &con);
getchar();
printf("\n");
if('y' == con)
suspend(pid);
printf("continue?");
scanf("%c", &con);
getchar();
if('y' == con)
continuePlay(pid);
printf("end?");
scanf("%c", &con);
printf("\n");
end(pid);
return 0;
}
#endif
/* 成功则返回进程pid,失败则返回0 */
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;
}
2.文件名:madplay.h
#ifndef MADPLAY_H
#define MADPLAY_H
包含四个功能函数的声明。
int play(char *name); //播放
int suspend(pid_t pid); //暂停
int continuePlay(pid_t pid); //继续播放
int end(pid_t pid);
3.文件名:music_list.c
头文件:music_list.h
说明:music结构体双向循环链表的具体实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "music_list.h"
int bSearch(int funcFlag, music_list *mList, char *value, int low, int high);
/*
int main()
{
music_list *mList;
mList = createMusicList();
char *name = "abcd";
musicListInsert(mList, name);
musicListDisplay(mList);
return 0;
}
*/
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;
}
int musicListInsert(music_list *mList, char *name)
{
music *mNew;
mNew = (music *)malloc(sizeof(music));
if(NULL == mNew)
{
perror("mNew malloc fail\n");
exit(1);
}
mNew->name = name;
if(NULL == mList->mHead) // 初始节点
{
mNew->next = mNew;
mNew->prev = mNew;
mList->mHead = mNew;
#ifdef MUSIC_LIST_DEBUG
printf("init next: %s\n", mList->mHead->next->name);
printf("init prev: %s\n", mList->mHead->prev->name)</