添加线程,播放暂停程序结束控制进程
This commit is contained in:
parent
c5e4bfbfe5
commit
b61fa9d1fd
60
main.cpp
60
main.cpp
|
@ -2,71 +2,11 @@
|
||||||
|
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
|
|
||||||
void *getTimerThreadFunc(void *arg); // 发送获取当前时间的 mplayer 命令
|
|
||||||
void *readPipeMSG(void *arg); // 获取当前时间的线程
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
QApplication a(argc, argv);
|
QApplication a(argc, argv);
|
||||||
MainWindow w;
|
MainWindow w;
|
||||||
w.show();
|
w.show();
|
||||||
// pthread_t t1,t2; //
|
|
||||||
// pthread_create(&t1,NULL,getTimerThreadFunc,(void*)&w);
|
|
||||||
// pthread_create(&t2,NULL,readPipeMSG,(void*)&w);
|
|
||||||
// pthread_join(t1,NULL);
|
|
||||||
// pthread_join(t2,NULL);
|
|
||||||
|
|
||||||
return a.exec();
|
return a.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
void *getTimerThreadFunc(void *arg)
|
|
||||||
{
|
|
||||||
MainWindow *p = (MainWindow *)arg;
|
|
||||||
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
// 发送获取的当前时间的命令
|
|
||||||
// 发送 get_time_pos 命令到管道中
|
|
||||||
write(p->fifo_fd, "get_time_pos\n", strlen("get_time_pos\n"));
|
|
||||||
usleep(500*1000); // 休眠 0.5 秒
|
|
||||||
|
|
||||||
// 发送获取当前歌曲进度的命令
|
|
||||||
write(p->fifo_fd,"get_percent_pos\n",strlen("get_percent_pos\n"));
|
|
||||||
usleep(500*1000); // 休眠 0.5 秒
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void *readPipeMSG(void *arg)
|
|
||||||
{
|
|
||||||
MainWindow *p = (MainWindow *)arg;
|
|
||||||
|
|
||||||
// 不停的获取无名管道的数据
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
char buf[256] = "";
|
|
||||||
int ret = read(p->fd[0], buf, sizeof(buf)); // 从无名管道读取内容到 buf
|
|
||||||
if(ret > 0)
|
|
||||||
{
|
|
||||||
// 判断消息的类型 :
|
|
||||||
// 如果消息是 "当前歌曲播放时间位置"
|
|
||||||
if(strncmp(buf,"ANS_TIME_POSITION",strlen("ANS_TIME_POSITION")) == 0)
|
|
||||||
{
|
|
||||||
int time = 0;
|
|
||||||
sscanf(buf,"ANS_TIME_POSITION=%d",&time); // 从数据流 buf 中读取时间到 time
|
|
||||||
// 给 UI 发送当前时间信号
|
|
||||||
emit p->currentTimeSignal(time);
|
|
||||||
}
|
|
||||||
// 如果消息是 "当前歌曲播放进度"
|
|
||||||
else if(strncmp(buf,"ANS_PERCENT_POSITION", strlen("ANS_PERCENT_POSITION")) == 0)
|
|
||||||
{
|
|
||||||
int currentProgress = 0;
|
|
||||||
sscanf(buf, "ANS_PERCENT_POSITION=%d", ¤tProgress);
|
|
||||||
// 给 UI 发送进度信号
|
|
||||||
emit p->currentProgressSignal(currentProgress);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
102
mainwindow.cpp
102
mainwindow.cpp
|
@ -1,6 +1,12 @@
|
||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
#include "ui_mainwindow.h"
|
#include "ui_mainwindow.h"
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
int mplayer_pid;
|
||||||
|
pthread_t t1,t2; //
|
||||||
|
|
||||||
|
void *getTimerThreadFunc(void *arg); // 发送获取当前时间的 mplayer 命令
|
||||||
|
void *readPipeMSG(void *arg); // 获取当前时间的线程
|
||||||
|
|
||||||
MainWindow::MainWindow(QWidget *parent)
|
MainWindow::MainWindow(QWidget *parent)
|
||||||
: QMainWindow(parent)
|
: QMainWindow(parent)
|
||||||
|
@ -9,6 +15,7 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
initMainWindow(); // 初始化主界面
|
initMainWindow(); // 初始化主界面
|
||||||
mplayerInit(); // 初始化 mplayer
|
mplayerInit(); // 初始化 mplayer
|
||||||
|
kill(mplayer_pid,SIGSTOP);
|
||||||
scanSong(); // 扫描歌曲列表
|
scanSong(); // 扫描歌曲列表
|
||||||
setSongList(); // 将扫描的歌曲显示到歌曲列表中
|
setSongList(); // 将扫描的歌曲显示到歌曲列表中
|
||||||
|
|
||||||
|
@ -20,6 +27,8 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
|
|
||||||
MainWindow::~MainWindow()
|
MainWindow::~MainWindow()
|
||||||
{
|
{
|
||||||
|
if(mplayer_pid != 0)
|
||||||
|
kill(mplayer_pid,SIGKILL);
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,6 +36,7 @@ void MainWindow::initMainWindow()
|
||||||
{
|
{
|
||||||
// 设置主窗体属性
|
// 设置主窗体属性
|
||||||
setWindowTitle("音乐播放器");
|
setWindowTitle("音乐播放器");
|
||||||
|
setWindowIcon(QIcon(":/icon/button"));
|
||||||
|
|
||||||
// 设置子组件背景透明
|
// 设置子组件背景透明
|
||||||
ui->song_list_widget->setAttribute(Qt::WA_TranslucentBackground);
|
ui->song_list_widget->setAttribute(Qt::WA_TranslucentBackground);
|
||||||
|
@ -71,9 +81,6 @@ void MainWindow::mplayerInit()
|
||||||
pid_t pid = fork();
|
pid_t pid = fork();
|
||||||
if(pid == 0) // 子进程
|
if(pid == 0) // 子进程
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 重定向标准输出
|
// 重定向标准输出
|
||||||
dup2(fd[1], 1);
|
dup2(fd[1], 1);
|
||||||
// 使用 exec 启动 mplayer
|
// 使用 exec 启动 mplayer
|
||||||
|
@ -83,6 +90,14 @@ void MainWindow::mplayerInit()
|
||||||
}
|
}
|
||||||
else if(pid>0) // 父进程
|
else if(pid>0) // 父进程
|
||||||
{
|
{
|
||||||
|
mplayer_pid = pid;
|
||||||
|
|
||||||
|
pthread_create(&t1,NULL,getTimerThreadFunc,this);
|
||||||
|
pthread_create(&t2,NULL,readPipeMSG,this);
|
||||||
|
|
||||||
|
// pthread_detach(t1);
|
||||||
|
// pthread_detach(t2);
|
||||||
|
|
||||||
// 打开管道
|
// 打开管道
|
||||||
// 以写的方式打开(阻塞到某进程 以读的方式打开)
|
// 以写的方式打开(阻塞到某进程 以读的方式打开)
|
||||||
fifo_fd = open("fifo_cmd", O_WRONLY);
|
fifo_fd = open("fifo_cmd", O_WRONLY);
|
||||||
|
@ -126,7 +141,6 @@ void MainWindow::scanSong()
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void MainWindow::playNextSong(void)
|
void MainWindow::playNextSong(void)
|
||||||
{
|
{
|
||||||
index++;
|
index++;
|
||||||
|
@ -140,8 +154,6 @@ void MainWindow::playNextSong(void)
|
||||||
write(this->fifo_fd, changeSongBuf, len); // 将获取的下一首歌曲名写入到有名管道中
|
write(this->fifo_fd, changeSongBuf, len); // 将获取的下一首歌曲名写入到有名管道中
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void MainWindow::setCurrentTimeLabel(int time)
|
void MainWindow::setCurrentTimeLabel(int time)
|
||||||
{
|
{
|
||||||
int m = 0, s = 0;
|
int m = 0, s = 0;
|
||||||
|
@ -159,18 +171,52 @@ void MainWindow::setCurrentSlider(int currentProgress)
|
||||||
ui->time_slider->setValue(currentProgress);
|
ui->time_slider->setValue(currentProgress);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_play_btn_clicked()
|
void *getTimerThreadFunc(void *arg)
|
||||||
{
|
{
|
||||||
if(play_btn_flag == 0)
|
MainWindow *p = (MainWindow *)arg;
|
||||||
{
|
|
||||||
ui->play_btn->setIcon(QIcon(":/icon/button"));
|
|
||||||
|
|
||||||
play_btn_flag = 1;
|
while (1)
|
||||||
}
|
|
||||||
else if (play_btn_flag == 1)
|
|
||||||
{
|
{
|
||||||
ui->play_btn->setIcon(QIcon(":/icon/button_play"));
|
// 发送获取的当前时间的命令
|
||||||
play_btn_flag = 0;
|
// 发送 get_time_pos 命令到管道中
|
||||||
|
write(p->fifo_fd, "get_time_pos\n", strlen("get_time_pos\n"));
|
||||||
|
usleep(500*1000); // 休眠 0.5 秒
|
||||||
|
|
||||||
|
// 发送获取当前歌曲进度的命令
|
||||||
|
write(p->fifo_fd,"get_percent_pos\n",strlen("get_percent_pos\n"));
|
||||||
|
usleep(500*1000); // 休眠 0.5 秒
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void *readPipeMSG(void *arg)
|
||||||
|
{
|
||||||
|
MainWindow *p = (MainWindow *)arg;
|
||||||
|
|
||||||
|
// 不停的获取无名管道的数据
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
char buf[256] = "";
|
||||||
|
int ret = read(p->fd[0], buf, sizeof(buf)); // 从无名管道读取内容到 buf
|
||||||
|
if(ret > 0)
|
||||||
|
{
|
||||||
|
// 判断消息的类型 :
|
||||||
|
// 如果消息是 "当前歌曲播放时间位置"
|
||||||
|
if(strncmp(buf,"ANS_TIME_POSITION",strlen("ANS_TIME_POSITION")) == 0)
|
||||||
|
{
|
||||||
|
int time = 0;
|
||||||
|
sscanf(buf,"ANS_TIME_POSITION=%d",&time); // 从数据流 buf 中读取时间到 time
|
||||||
|
// 给 UI 发送当前时间信号
|
||||||
|
emit p->currentTimeSignal(time);
|
||||||
|
}
|
||||||
|
// 如果消息是 "当前歌曲播放进度"
|
||||||
|
else if(strncmp(buf,"ANS_PERCENT_POSITION", strlen("ANS_PERCENT_POSITION")) == 0)
|
||||||
|
{
|
||||||
|
int currentProgress = 0;
|
||||||
|
sscanf(buf, "ANS_PERCENT_POSITION=%d", ¤tProgress);
|
||||||
|
// 给 UI 发送进度信号
|
||||||
|
emit p->currentProgressSignal(currentProgress);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,3 +229,29 @@ void MainWindow::setSongList()
|
||||||
}
|
}
|
||||||
ui->song_list_widget->addItems(strList);
|
ui->song_list_widget->addItems(strList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_play_btn_clicked()
|
||||||
|
{
|
||||||
|
if(play_btn_flag == 0)
|
||||||
|
{
|
||||||
|
ui->play_btn->setIcon(QIcon(":/icon/button_play"));
|
||||||
|
kill(mplayer_pid,SIGCONT);
|
||||||
|
play_btn_flag = 1;
|
||||||
|
}
|
||||||
|
else if (play_btn_flag == 1)
|
||||||
|
{
|
||||||
|
ui->play_btn->setIcon(QIcon(":/icon/button"));
|
||||||
|
kill(mplayer_pid,SIGSTOP);
|
||||||
|
play_btn_flag = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_back_btn_clicked()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_front_btn_clicked()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
@ -26,8 +27,8 @@ class MainWindow : public QMainWindow
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static int fd[2]; // 声明无名管道
|
int fd[2]; // 声明无名管道
|
||||||
static int fifo_fd; // 声明有名管道
|
int fifo_fd; // 声明有名管道
|
||||||
int index = 0; // 歌曲索引
|
int index = 0; // 歌曲索引
|
||||||
vector<string> vectorSong; // 歌曲名动态数组
|
vector<string> vectorSong; // 歌曲名动态数组
|
||||||
|
|
||||||
|
@ -55,6 +56,10 @@ signals:
|
||||||
private slots:
|
private slots:
|
||||||
void on_play_btn_clicked();
|
void on_play_btn_clicked();
|
||||||
|
|
||||||
|
void on_back_btn_clicked();
|
||||||
|
|
||||||
|
void on_front_btn_clicked();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::MainWindow *ui;
|
Ui::MainWindow *ui;
|
||||||
};
|
};
|
||||||
|
|
|
@ -42,21 +42,6 @@
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">color: rgb(255, 255, 0);</string>
|
<string notr="true">color: rgb(255, 255, 0);</string>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>新建项目</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>新建项目</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>新建项目</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QLabel" name="label_artist">
|
<widget class="QLabel" name="label_artist">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
|
@ -187,7 +172,7 @@ color: rgb(255, 255, 0);</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
<iconset resource="res.qrc">
|
<iconset resource="res.qrc">
|
||||||
<normaloff>:/icon/button_play</normaloff>:/icon/button_play</iconset>
|
<normaloff>:/icon/button</normaloff>:/icon/button</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="iconSize">
|
<property name="iconSize">
|
||||||
<size>
|
<size>
|
||||||
|
@ -349,7 +334,7 @@ color: rgb(255, 255, 0);</string>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>1055</width>
|
<width>1055</width>
|
||||||
<height>26</height>
|
<height>25</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
|
|
Loading…
Reference in New Issue