#include "widget.h"
#include "ui_widget.h"
#include <pthread.h>
#include <unistd.h>
#include <QFile>
#include <QTextStream>
#include <QDebug>
int f_s;
int song_length=0;
bool song_pause=false;
int sound=-1;
bool song_time_compare(Widget::Song_lrc v1,Widget::Song_lrc v2)
{
return v1.time<v2.time;
}
void* get_song_time(void* arg)
{
while(1)
{
int act_fd;
if((act_fd = open("myfifo", O_WRONLY)) == -1)
{
perror("fail to open");
}
sleep(1);
if(song_pause==true && song_length<1)
{
if(write(act_fd,"get_time_length\n",strlen("get_time_length\n")) == -1)
{
perror("write");
}
}
sleep(1);
if(sound==-1)
{
if(write(act_fd,"get_property volume\n",strlen("get_property volume\n")) == -1)
{
perror("write");
}
}
sleep(3);
if(song_pause==true)
{
if(write(act_fd,"get_time_pos\n",strlen("get_time_pos\n")) == -1)
{
perror("write");
}
}
::close(act_fd);
}
}
void* get_recv_time(void* arg)
{
float stime = 0.0f;
float time = 0.0f;
int sounds = 0;
while(1)
{
sleep(1);
if(song_pause==true)
{
char buf[1024];
read(f_s, buf, sizeof(buf)); // 从管道读取数据
if(song_length<1)
{
if(strncmp(buf,"ANS_LENGTH", strlen("ANS_LENGTH")) == 0)
{
stime = 0.0f;
sscanf(buf,"ANS_LENGTH=%f", &stime);
song_length=stime*10;
cout << "1:" << song_length << endl;
}
}
if(sound==-1)
{
if(strncmp(buf,"ANS_volume", strlen("ANS_volume")) == 0)
{
sounds = 0;
sscanf(buf,"ANS_volume=%d", &sounds);
sound=sounds;
//cout << "sounds:" << buf << endl;
}
}
if(strncmp(buf,"ANS_TIME_POSITION", strlen("ANS_TIME_POSITION")) == 0)
{
time = 0.0f;
sscanf(buf,"ANS_TIME_POSITION=%f", &time);
cout << "2:" << time << endl;
}
}
}
}
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
Widget::Widget(int fd0,QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
f_s = fd0;
this->setWindowTitle("音乐播放器");
this->setFixedSize(800,550);
init();
}
void Widget::init()
{
pthread_t tid1;
pthread_create(&tid1,NULL, get_song_time, NULL);
pthread_detach(tid1);
//
pthread_t tid2;
pthread_create(&tid2,NULL, get_recv_time, NULL);
pthread_detach(tid2);
//
QStringList results_mp3,results_lrc;
results_lrc=get_file.getfile("lrc");
results_mp3=get_file.getfile("mp3");
current_song=results_lrc[0];
foreach (QString s_lrc, results_lrc) {
ui->file_song_comboBox->addItem(s_lrc);
}
ui->file_song_comboBox->setCurrentIndex(0);
ui->textEdit_time->setText("00:00:0");
t = new QTimer(this);//加入对象树
//connect(t, &QTimer::timeout, [=]{ flush_game();});
connect(t,SIGNAL(timeout()),this,SLOT(song_update()));
//t->start(1000);
}
void Widget::song_update()
{
if(song_length>1)
{
ui->horizontalSlider->setRange(0,song_length);
ui->textEdit_sound->setText(QString::number(sound));
QString m = QString::number(t_m%10);
QString s = QString::number(t_m/10/10%6)+QString::number(t_m/10%10);
QString f = QString::number(t_m/10/60/10)+QString::number(t_m/10/60%10);
ui->textEdit_time->setText(f+":"+s+":"+m);
ui->horizontalSlider->setValue(t_m);
// cout << "tm:" << t_m <<" t:"<< (song_lrc[t_s].time/100) << endl;
if(t_m++==(song_lrc[t_s].time/100))
{
qDebug()<<123;
//ui->listWidget->setCurrentRow(t_s++);
}
if(t_m>song_length)
{
t->stop();
}
}
}
void Widget::send_comm(char *comm)
{
int act_fd;
if((act_fd = open("myfifo", O_WRONLY)) == -1)
{
perror("fail to open");
}
if(write(act_fd,comm,strlen(comm)) == -1) //歌曲暂停
{
perror("write");
}
::close(act_fd);
}
void Widget::on_file_song_comboBox_highlighted(const QString &arg1)
{
current_song = arg1;
}
void Widget::on_pushButton_select_song_clicked()
{
deal_file.song_line=0;
ui->listWidget->clear();
song_lrc.clear();
deal_file.song_lrc.clear();
t_s=0;
t_m=0;
song_length=0;
t->stop();
QString ss =QDir::currentPath()+"/res/"+current_song;
QFile file(ss);
if (file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QString line;
QTextStream in(&file); //用文件构造流
line = in.readLine();//读取一行放到字符串里
while(!line.isNull())//字符串有内容
{
line=in.readLine();//循环读取下行
string str_song=line.toStdString();
//deal_file(str_song);
deal_file.deal_file(str_song);
}
}
file.close();
for(int i=0;i<deal_file.song_lrc.size();i++)
{
s_lrc.song=deal_file.song_lrc[i].song;
s_lrc.time=deal_file.song_lrc[i].time;
s_lrc.line=deal_file.song_lrc[i].line;
song_lrc.push_back(s_lrc);
}
sort(song_lrc.begin(),song_lrc.end(),song_time_compare);
for(int i=0;i<song_lrc.size();i++)
{
// ui->listWidget->addItem(QString::number(song_lrc[i].line));
ui->listWidget->addItem(QString::fromStdString(song_lrc[i].song));
}
//
}
void Widget::mousePressEvent(QMouseEvent *ev)
{
// 获取当前点击位置,得到的这个鼠标坐标是相对于当前QSlider的坐标
int currentX = ev->pos().x();
// 获取当前点击的位置占整个Slider的百分比
double per = currentX * 1.0 / ui->horizontalSlider->width()-0.1;
qDebug()<<per;
if(per>0.009 && per<1.0)
{
ui->horizontalSlider->setValue(per*song_length);
}
char buff[60];
//qDebug()<< int(per*song_length)/10;
sprintf(buff,"seek %d 2\n",int(per*song_length)/10);
cout << buff << endl;
send_comm(buff);
// 利用算得的百分比得到具体数字
// int value = per * (this->maximum() - this->minimum()) + this->minimum();
// 设定滑动条位置
// this->setValue(value);
// 滑动条移动事件等事件也用到了mousePressEvent,加这句话是为了不对其产生影响,是的Slider能正常相应其他鼠标事件
// QSlider::mousePressEvent(ev);
}
void Widget::on_pushButton_play_clicked()
{
t->start(100);
song_pause=true;
QStringList list = current_song.split(".");
QString ss ="loadfile ../QT_music_mplayer/res/"+list[0]+".mp3"+"\n";
std::string stdstr=ss.toStdString();
const char *ch = stdstr.c_str();
char *chh = const_cast<char*>(ch);//
this->send_comm(chh);
}
void Widget::on_pushButton_pause_clicked()
{
this->send_comm("pause\n");
if(song_pause==true)
{
song_pause=false;
t->stop();
}
else
{
song_pause=true;
t->start(100);
}
}
void Widget::on_horizontalSlider_valueChanged(int value)
{
QString m = QString::number(value%10);
QString s = QString::number(value/10/10%6)+QString::number(value/10%10);
QString f = QString::number(value/10/60/10)+QString::number(value/10/60%10);
QString time = f+":"+s+":"+m;
// ui->horizontalSlider->setR
没有合适的资源?快使用搜索试试~ 我知道了~
C++基于linux+qt+mplayer实现的音乐播放器项目源码
共39个文件
lrc:12个
mp3:12个
cpp:4个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 10 浏览量
2023-12-07
17:47:47
上传
评论
收藏 53.2MB ZIP 举报
温馨提示
C++基于linux+qt+mplayer实现的音乐播放器项目源码
资源推荐
资源详情
资源评论
收起资源包目录
mplayer_music-master.zip (39个子文件)
mplayer_music-master
get_songfile.cpp 727B
widget.ui 3KB
deal_songfile.cpp 1KB
widget.cpp.autosave 9KB
widget.cpp 9KB
QT_music_mplayer.pro.user 18KB
res
亲爱的你怎么不在身边-江美琪.lrc 1KB
童话(2014演唱会版)-光良.mp3 3.74MB
董小姐.lrc 2KB
爱转角.lrc 2KB
亲爱的你怎么不在身边-江美琪.mp3 3.94MB
永远飞行模式-Dear Jane.mp3 9.16MB
小鲤鱼历险记-动漫原声.mp3 1.37MB
小鲤鱼历险记-动漫原声.lrc 860B
player 9KB
安和桥.lrc 1KB
StopLove.mp3 3.33MB
童话(2014演唱会版)-光良.lrc 1KB
后来的我们.mp3 5.36MB
永远飞行模式-Dear Jane.lrc 2KB
安和桥.mp3 3.91MB
简单爱.lrc 1KB
董小姐.mp3 4.86MB
后来的我们.lrc 2KB
爱上你很快乐.mp3 5.15MB
爱上你很快乐.lrc 1KB
Diamonds.lrc 3KB
简单爱.mp3 5.17MB
Diamonds.mp3 3.44MB
StopLove.lrc 3KB
爱上你很快乐 0B
(null) 0B
爱转角.mp3 4.6MB
QT_music_mplayer.pro 447B
main.cpp 3KB
deal_songfile.h 414B
get_songfile.h 205B
.gitignore 350B
widget.h 2KB
共 39 条
- 1
资源评论
- zafu_cyc2024-04-21资源有很好的参考价值,总算找到了自己需要的资源啦。
云哲-吉吉2021
- 粉丝: 3214
- 资源: 1130
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功