From b61fa9d1fdce4ad2ae0a4f21a7429eb9c2c6798e Mon Sep 17 00:00:00 2001 From: flykhan Date: Thu, 31 Aug 2023 11:18:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BA=BF=E7=A8=8B=EF=BC=8C?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E6=9A=82=E5=81=9C=E7=A8=8B=E5=BA=8F=E7=BB=93?= =?UTF-8?q?=E6=9D=9F=E6=8E=A7=E5=88=B6=E8=BF=9B=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cpp | 60 ---------------------------- mainwindow.cpp | 104 +++++++++++++++++++++++++++++++++++++++++-------- mainwindow.h | 9 ++++- mainwindow.ui | 19 +-------- 4 files changed, 97 insertions(+), 95 deletions(-) diff --git a/main.cpp b/main.cpp index 3750dee..7396ee9 100644 --- a/main.cpp +++ b/main.cpp @@ -2,71 +2,11 @@ #include -#include - - -void *getTimerThreadFunc(void *arg); // 发送获取当前时间的 mplayer 命令 -void *readPipeMSG(void *arg); // 获取当前时间的线程 - int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; 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(); } -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); - } - } - } -} diff --git a/mainwindow.cpp b/mainwindow.cpp index c28772e..5711425 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,6 +1,12 @@ #include "mainwindow.h" #include "ui_mainwindow.h" +#include +int mplayer_pid; +pthread_t t1,t2; // + +void *getTimerThreadFunc(void *arg); // 发送获取当前时间的 mplayer 命令 +void *readPipeMSG(void *arg); // 获取当前时间的线程 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) @@ -9,6 +15,7 @@ MainWindow::MainWindow(QWidget *parent) ui->setupUi(this); initMainWindow(); // 初始化主界面 mplayerInit(); // 初始化 mplayer + kill(mplayer_pid,SIGSTOP); scanSong(); // 扫描歌曲列表 setSongList(); // 将扫描的歌曲显示到歌曲列表中 @@ -20,6 +27,8 @@ MainWindow::MainWindow(QWidget *parent) MainWindow::~MainWindow() { + if(mplayer_pid != 0) + kill(mplayer_pid,SIGKILL); delete ui; } @@ -27,6 +36,7 @@ void MainWindow::initMainWindow() { // 设置主窗体属性 setWindowTitle("音乐播放器"); + setWindowIcon(QIcon(":/icon/button")); // 设置子组件背景透明 ui->song_list_widget->setAttribute(Qt::WA_TranslucentBackground); @@ -71,9 +81,6 @@ void MainWindow::mplayerInit() pid_t pid = fork(); if(pid == 0) // 子进程 { - - - // 重定向标准输出 dup2(fd[1], 1); // 使用 exec 启动 mplayer @@ -83,6 +90,14 @@ void MainWindow::mplayerInit() } 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); @@ -126,7 +141,6 @@ void MainWindow::scanSong() closedir(dir); } - void MainWindow::playNextSong(void) { index++; @@ -136,12 +150,10 @@ void MainWindow::playNextSong(void) // 将 loadfile 'song_name_path' 写入字符数组 int len = sprintf(changeSongBuf, "loadfile ./song/%s\n", vectorSong[index].c_str()); qDebug() << changeSongBuf << endl; // 控制台打印下一首歌的名字 -// write(this->fifo_fd, changeSongBuf.toUtf8().toStdString().c_str(),changeSongBuf.toUtf8().toStdString().size()); + // write(this->fifo_fd, changeSongBuf.toUtf8().toStdString().c_str(),changeSongBuf.toUtf8().toStdString().size()); write(this->fifo_fd, changeSongBuf, len); // 将获取的下一首歌曲名写入到有名管道中 } - - void MainWindow::setCurrentTimeLabel(int time) { int m = 0, s = 0; @@ -159,18 +171,52 @@ void MainWindow::setCurrentSlider(int currentProgress) ui->time_slider->setValue(currentProgress); } -void MainWindow::on_play_btn_clicked() +void *getTimerThreadFunc(void *arg) { - if(play_btn_flag == 0) - { - ui->play_btn->setIcon(QIcon(":/icon/button")); + MainWindow *p = (MainWindow *)arg; - play_btn_flag = 1; - } - else if (play_btn_flag == 1) + while (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); } + +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() +{ + +} diff --git a/mainwindow.h b/mainwindow.h index 5db74b1..122fb19 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -14,6 +14,7 @@ #include #include #include +#include using namespace std; @@ -26,8 +27,8 @@ class MainWindow : public QMainWindow Q_OBJECT public: - static int fd[2]; // 声明无名管道 - static int fifo_fd; // 声明有名管道 + int fd[2]; // 声明无名管道 + int fifo_fd; // 声明有名管道 int index = 0; // 歌曲索引 vector vectorSong; // 歌曲名动态数组 @@ -55,6 +56,10 @@ signals: private slots: void on_play_btn_clicked(); + void on_back_btn_clicked(); + + void on_front_btn_clicked(); + private: Ui::MainWindow *ui; }; diff --git a/mainwindow.ui b/mainwindow.ui index 5dbf900..9ca7ecb 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -42,21 +42,6 @@ color: rgb(255, 255, 0); - - - 新建项目 - - - - - 新建项目 - - - - - 新建项目 - - @@ -187,7 +172,7 @@ color: rgb(255, 255, 0); - :/icon/button_play:/icon/button_play + :/icon/button:/icon/button @@ -349,7 +334,7 @@ color: rgb(255, 255, 0); 0 0 1055 - 26 + 25