mplayer的控制

今天对昨天编译完成的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);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值