mplayer 音乐播放器封装类

来源:互联网 发布:linux的cat命令 编辑:程序博客网 时间:2024/04/28 13:15
 最近要弄一款音乐播放器。虽然在网上能够找到类似的代码。但是不怎么方便调用。所以我自己写了两个文件,方便其他时候调用,是采用mplayer的命令行方式播放的。
因为我要的功能不多,所以只写了几个函数,架构搭好了,需要的朋友可以添加

XHMusicPlay.cpp文件
//
//  XHMusicPlay.h
//  
//
//  Created by gifter on 16/6/10.
//
//


#ifndef XHMusicPlay_h
#define XHMusicPlay_h


int OpenMusicFile(char *filename);


int PauseMusic();
int StopMusic();
int SetVolume(int volume);
int SetMute(int mute);


#endif /* XHMusicPlay_h */













XHMusicPlay.cpp文件



//
//  XHMusicPlay.cpp
//  
//
//  Created by gifter on 16/6/10.
//
//


#include "XHMusicPlay.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <pthread.h>


enum STATE{PLAY,PAUSE,STOP,VOLUME,MUTE};
typedef struct Params_t
{
    int playState;
    int params;
    pthread_mutex_t mutex;
    pthread_cond_t qready;
}params_t;


static params_t p;




static int fd_fifo;
static int fd_pipe[2];


static void xh_pause()
{
    char *buf = "pause\n";


    if(write(fd_fifo,buf,strlen(buf)) != strlen(buf))
        perror("write");
    return;
}


static void xh_setvolume(int volume)
{
    char buf[20]= {0};
    sprintf(buf,"volume %d\n",volume);
    if(write(fd_fifo,buf,strlen(buf)) != strlen(buf))
        perror("write");
    return;
    
}
static void xh_setmute(int mute)
{
  
    char buf[20] = {0};
    sprintf(buf,"mute %d\n",mute);
    if(write(fd_fifo,buf,strlen(buf)) != strlen(buf))
        perror("write");
    return;


}
static void xh_stop()
{
   
    char *buf = "stop\n";
    if(write(fd_fifo,buf,strlen(buf)) != strlen(buf))
        perror("write");
    return;
}
void *SendtoMplayer_Pthread(void *arg)
{
    char buf[100];
    while(1)
    {
       
        pthread_cond_wait(&p.qready,&p.mutex);
        switch (p.playState) {
            case PAUSE:
                xh_pause();
                break;
            case PLAY:
                xh_pause();
                break;


            case VOLUME:
                xh_setvolume(p.params);
                break;
            case MUTE:
                xh_setmute(p.params);
            case STOP:
                xh_stop();
                return 0;
                
            default:
                break;
        }
        
    }
    


}


void *RecvFromMplayer_Pthread(void *arg)
{
    char buf[100];
    close(fd_pipe[1]);
    int size = 0;
    while(1)
    {
        size = read(fd_pipe[0],buf,sizeof(buf));
        if (size == 0) {
            break;
        }
        else
        {
            buf[size] = 0;
            printf("th msg read form pipe is %s\n",buf);


        }
    }
    return 0;
}






int OpenMusicFile(char *filename)
{
    int fd;
    char buf[100];
    pid_t pid;
    p.playState = PLAY;
    p.params = 0;
    pthread_mutex_init(&p.mutex,0);
    pthread_cond_init(&p.qready,0);
    unlink("/tmp/my_fifo");
    if( mkfifo("/tmp/my_fifo",O_CREAT|0666) < 0)
    {
        perror("mkfifo");
    }
    
    if(pipe(fd_pipe) < 0)
    {
        perror("pipe");
        exit(-1);
    }
       //新建播放的进程
    pid = fork();
    if(pid < 0)
    {
        perror("fork");
        exit(-1);
    }
    //播放进程
    if(pid == 0)  //son of process
    {
        close(fd_pipe[0]);
        dup2(fd_pipe[1],1);
        if((fd_fifo = open("/tmp/my_fifo",O_RDWR)) < 0)
        {
            perror("son fd_fifo");
        }
        execlp("mplayer","mplayer","-slave","-quiet","-input",\
               "file=/tmp/my_fifo",filename,"-loop","0",NULL);
    }
    //主进程
    else
    {
        pthread_t tid1;
        pthread_t tid2;
        fd_fifo=open("/tmp/my_fifo",O_RDWR);
        if(fd_fifo<0)
        {
            perror("open my_fifo");
        }
        pthread_create(&tid1,NULL,SendtoMplayer_Pthread,NULL);
        pthread_create(&tid2,NULL,RecvFromMplayer_Pthread,NULL);
        
    }
    return 1;
}


int PauseMusic()
{
 
    pthread_mutex_lock(&p.mutex);
    p.playState = PAUSE;
    pthread_mutex_unlock(&p.mutex);
    pthread_cond_signal(&p.qready);
    return 1;
}
int StopMusic()
{
    pthread_mutex_lock(&p.mutex);
    p.playState = STOP;
    pthread_mutex_unlock(&p.mutex);
    pthread_cond_signal(&p.qready);
    return 1;
    
}
int SetVolume(int volume)
{
    pthread_mutex_lock(&p.mutex);
    p.playState = VOLUME;
    p.params = volume;
    pthread_mutex_unlock(&p.mutex);
    pthread_cond_signal(&p.qready);
    return 1;


    
}
int SetMute(int mute)
{
    pthread_mutex_lock(&p.mutex);
   
    p.playState = MUTE;
    p.params = mute;
    pthread_mutex_unlock(&p.mutex);
    pthread_cond_signal(&p.qready);
    return 1;
    
}
int main(int argc,char *argv[])
{
    
OpenMusicFile("G.mp3");
    sleep(5);
    PauseMusic();
    sleep(5);
    PauseMusic();
    sleep(1);
    SetMute(1);
    sleep(2);
    SetVolume(30);
    char ch;
    ch = getchar();
return 1;
}










 
0 0
原创粉丝点击