今天对昨天编译完成的mplayer提供了接口控制,碰到的问题主要有:(1)应用程序找不到mplayer。主要是将mplayer和应用程序放到了同一个目录,解决方法是将mplayer放到bin目录下,问题解决。(2)程序执行的时候不接受音频控制。解决方法是加上-mixer -ao oss ,但是加上此选项后,执行是mplayer自动调用mp3lib,而不调用昨天编译进去的第三方定点解码库libmad,解决方法是将-ac mad 放在参数表的最前面,让mplayer首先调用这个解码库,具体形式为mplayer -ac mad -mixer -ao oss -slave
源代码如下:
#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>
using std::string;
class TmPlay
{
public:
TmPlay();
~TmPlay();
void mPlay(char* musicname);//播放
void mStop();//停止
void mPause();//暂停
void mContinue();//继续
void mChangevolume(float voice);//调节音量,voice的区间为[0,100]
private:
void Send_cmd(char *);//向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(char *cmd)
{
write(g_sock_pair[0], cmd, strlen(cmd));//父进程向mplayer子进程发送命令
}
void TmPlay::mPlay(char *musicname)
{
char sPlay[100]="mplayer -ac mad -mixer -ao oss -slave ";//设定播放模式
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)
{
char sVoi[100];
sprintf(sVoi,"volume %f 1/n",voice);
Send_cmd(sVoi);
}
int main()
{
TmPlay tmplay;
tmplay.mPlay("anxiang.mp3");
sleep(5);
tmplay.mChangevolume(50);
tmplay.mPause();
sleep(2);
tmplay.mContinue();
tmplay.mChangevolume(1);
}