最近要弄一款音乐播放器。虽然在网上能够找到类似的代码。但是不怎么方便调用。所以我自己写了两个文件,方便其他时候调用,是采用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.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;
}
// 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;
}