媒体播放模块文档
本播放模块利用程序对mplayer 进行控制从而实现媒体播放所需的基本功能,实现的主要功能为开始播放,暂停播放,继续播放,停止播放和音量控制等几部分。
实现的主要原理为,首先将mplayer的播放模式设为slave模式,之后将子进程的标准输入绑定到管道的子进程端,最后父进程通过管道向子进程发送相关的控制命令。
相关函数主要有五个,分别为:
void mPlay(TChar* musicname);//播放函数
void mStop();//停止函数
void mPause();//暂停函数
void mContinue();//继续播放函数
void mChangevolume(float voice);//调节音量函数
对于播放函数mPlay(TChar* musicname),音乐名可以为绝对路径也可以为相对路径,如可以为/home/work/mplayer/anxiang.mp3,也可以为anxiang.mp3
对于暂停函数mPause()和继续播放函数mContinue()来说,由于mplayer的slave模式下暂停命令和继续播放命令都为pause,所以要对播放器状态进行判断,判断播放器是处于播放状态还是处于暂停状态。
对于调节音量函数mChangevolume(float voice)需要注意的是,voice的取值范围为[0,100]
注意要点:
(1) 歌曲状态设置mplayer -slave -quiet -mixer -ao alsa 参数中,-slave是将mplayer播放状态设置为slave模式,这样播放器将从管道中接收控制命令,-quiet是设置在播放的时候不显示播放的状态信息,-mixer -ao alsa设置在播放过程中可以改变音量大小,否则的话音量改变函数将不起作用。
(2) 函数播放时候的system调用需要创建新进程,否则的话将必须等到歌曲播放完毕才可以继续。
(3) g_sock_pair[0]和
g_sock_pair[1]分别为管道的两端,本程序中将g_sock_pair[0]设为父进程端,将g_sock_pair[1]设为子进程端。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <unistd.h>
#include <fcntl.h>
#include "basetype.h"
#include <string>
namespace nsPF
{
using std::string;
class TmPlay
{
public:
TmPlay();
~TmPlay();
void mPlay(TChar* musicname);//播放
void mStop();//停止
void mPause();//暂停
void mContinue();//继续
void mChangevolume(float voice);//调节音量,voice的区间为[0,100]
private:
void Send_cmd(TChar *);//向mplayer的slave模式发送命令函数
public:
bool IfPlay;//是否播放标志
bool IfStop;//是否停止标志
bool IfPause;//是否暂停标志
bool IfQuit;//是否退出标志
bool music_over;//是否播放完毕标志
private:
int g_sock_pair[2]; //全双工管道标识符
pid_t g_pid ;
};
TmPlay::TmPlay()
{
int sockID;
sockID=socketpair(AF_UNIX, SOCK_STREAM, 0, g_sock_pair);//建立全双工管道
if(sockID)
{
printf("the pipe is not contructed/n");
exit(0);
}
else
{
IfPlay=false;//设置标识符初始状态
IfStop=true;
IfPause=false;
IfQuit=true;
music_over=true;
}
}
TmPlay::~TmPlay()
{
close(g_sock_pair[0]);//关闭管道
close(g_sock_pair[1]);
wait(NULL);//收集子进程信息
}
void TmPlay::Send_cmd(TChar *cmd)
{
write(g_sock_pair[0], cmd, strlen(cmd));//父进程向mplayer子进程发送命令
}
void TmPlay::mPlay(TChar *musicname)
{
TChar sPlay[100]="mplayer -slave -quiet -mixer -ao alsa ";//设定播放模式
strcat(sPlay,musicname);
if((g_pid = fork()) == 0) //创建子进程用于播放音乐
{
dup2(g_sock_pair[1], STDIN_FILENO); // 绑定标准输入,使管道的输出为子进程的输入
music_over=false;
system(sPlay);//播放音乐
music_over=true;
exit(0);//播放完毕后子进程退出
}
}
void TmPlay::mPause()
{
if(IfPause==true)
{
printf("Already Pause/n");
}
else
{
Send_cmd("pause/n"); //暂停播放
IfPause=true;
}
}
void TmPlay::mContinue()
{
if(IfPause==false)
{
printf("Not in Pause/n");
}
else
{
Send_cmd("pause/n");//继续播放
IfPause==false;
}
}
void TmPlay::mStop()
{
if(IfPlay==true)
{
printf("Not in Run/n");
}
else
{
Send_cmd("quit/n");//停止播放,退出mplayer
IfPlay==false;
music_over=true;
}
}
void TmPlay::mChangevolume(float voice)
{
TChar sVoi[100];
sprintf(sVoi,"volume %f 1/n",voice);
Send_cmd(sVoi);
}
}