1

 
媒体播放模块文档
     本播放模块利用程序对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);
 
}
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值