1 /*!
2 * @file musicplayer.cpp
3 * Copyright (c) 2018
4 * @brief des
5 * detailed des
6 *
7 * @date 2018
8 * @author lee
9 */
10 #include "musicplayer.h"
11 #include "ui_musicplayer.h"
12 #include "frmmessagebox.h"
13
14 #include <QMutex>
15 #include <QMutexLocker>
16 #include <QDebug>
17 #include <QDateTime>
18 #include <QPropertyAnimation>
19 #include "audiosink.h"
20 #include "audioplayer.h"
21
22 MusicPlayer *MusicPlayer::self = NULL;
23 /**************************************
24 Function:
25 Description:
26 ***************************************/
Instance(QWidget * parent)27 MusicPlayer *MusicPlayer::Instance(QWidget *parent)
28 {
29 if (self == NULL) {
30 QMutex mutex;
31 QMutexLocker locker(&mutex);
32 if (self == NULL) {
33 self = new MusicPlayer(parent);
34 }
35 }
36 return self;
37 }
38
39 /**************************************
40 Function:
41 Description:
42 ***************************************/
MusicPlayer(QWidget * parent)43 MusicPlayer::MusicPlayer(QWidget *parent) :
44 QWidget(parent),
45 ui(new Ui::MusicPlayer),
46 ap(NULL),
47 m_totalDuration(0),
48 m_curDuration(0),
49 m_bPlayState(STOPPED),
50 m_bMusicListOpen(false),
51 m_bSearchDialogOpen(false),
52 m_curMusicFilePath(""),
53 m_curMusicFileCount(-1),
54 m_curPlayOrderState(0),
55 m_pSearchDialog(NULL),
56 m_nextPlayOrderState(1)
57
58 {
59 pStaticMusicPlayer = this;
60
61 ui->setupUi(this);
62 setWindowFlags(this->windowFlags()|Qt::FramelessWindowHint);
63 setAttribute(Qt::WA_DeleteOnClose);//the ~CameraSetting will be call when func close() run
64
65 m_commonFunction = new CommonFunction ;
66
67 ui->posterLabel->setPixmap(QPixmap(":/images/playerIcons/MusicPoster.png"));
68
69 ui->setttingButton->setIcon(QIcon(":/images/playerIcons/headphone.png"));
70 ui->setttingButton->setIconSize(QSize(50,50));
71
72 //m_pPlayList = PlayList::Instance(this);
73 //m_pPlayList->move(1024,50);
74 //connect(this, SIGNAL(hidePlayList()), m_pPlayList, SLOT(hidePlayList()));
75 //connect(this,SIGNAL(showPlayList()),m_pPlayList,SLOT(showPlayList()));
76
77 //connect(m_pPlayList,SIGNAL(notifyMusicPlayerToPlay(QList<QFileInfo>,int,int)),\
78 // this,SLOT(on_notifyMusicPlayerToPlay(QList<QFileInfo>,int,int)));
79 //connect(m_pPlayList,SIGNAL(notifyMusicPlayerListChanged(QList<QFileInfo>,int)),\
80 // this,SLOT(on_notifyMusicPlayerListChanged(QList<QFileInfo>,int)));
81
82 progressSliderTimer = new QTimer(this);
83 connect(progressSliderTimer,SIGNAL(timeout()),this,SLOT(timerUpdate()));
84
85 connect(ui->progressSlider,SIGNAL(sliderMoved(int)),this,SLOT(onProgressSliderMoved(int)));
86 connect(ui->progressSlider,SIGNAL(sliderReleased()),this,SLOT(onProgressSliderReleased()));
87
88 connect(this, SIGNAL(msgSignal(int,void*,void*,int)),
89 this, SLOT(doMsgCmd(int,void*,void*,int)));
90 ui->playListButton->hide();
91 ui->nextMusicButton->hide();
92 ui->preMusicButton->hide();
93 ui->playOrderButton->hide();
94 m_outType = AudioSink::CODEC_OUT;
95 }
96
97
98 /**************************************
99 Function:
100 Description:
101 ***************************************/
~MusicPlayer()102 MusicPlayer::~MusicPlayer()
103 {
104 delete ui;
105 delete m_commonFunction;
106 m_commonFunction = NULL;
107 self = NULL;
108 if(ap != NULL){
109 delete ap;
110 ap = NULL;
111 }
112 }
113
114 /**************************************
115 Function:
116 Description:
117 ***************************************/
initAutPlayer()118 void MusicPlayer::initAutPlayer()
119 {
120 fprintf(stderr, "%s %d\n", __func__,__LINE__);
121 if(m_curMusicFilePath.isEmpty())
122 {
123 qDebug()<<"file path is emtpy";
124 }
125 fprintf(stderr, "%s %d\n", __func__,__LINE__);
126 if(ap != NULL){
127 delete ap;
128 ap = NULL;
129 }
130 fprintf(stderr, "%s %d\n", __func__,__LINE__);
131 ap = new AudioPlayer(m_outType);
132 if(ap == NULL){
133 qDebug()<<"new AutPlayer error";
134 return ;
135 }
136 fprintf(stderr, "%s %d\n", __func__,__LINE__);
137 m_bPlayState = STOPPED;
138
139 int ret = ap->setUrl((char*)m_curMusicFilePath.toLatin1().data());
140 if(ret != 0){
141 qDebug()<<"this video set url errror";
142 return;
143 }
144 fprintf(stderr, "%s %d\n", __func__,__LINE__);
145 //ap->setUserCb(autMusicCb_func, this);
146
147 m_totalDuration = ap->getDuration() / 1000;
148 ui->progressSlider->setRange(0, m_totalDuration);
149 qDebug()<<"m_totalDuration ms:" << m_totalDuration * 1000;
150 m_curDuration=0;
151
152 ui->totalTimeLabel->setText(getTimeStr(m_totalDuration,m_totalDuration));
153 ui->curTimeLabel->setText(getTimeStr(m_curDuration,m_totalDuration));
154 ap->start();
155
156 fprintf(stderr, "%s %d\n", __func__,__LINE__);
157 ui->playButton->setIcon(QIcon(":/images/playerIcons/Pause.png"));
158 ui->playButton->setIconSize(QSize(50,50));
159 m_bPlayState = PLAYING;
160
161 progressSliderTimer->start(1000);
162 }
163
164 /**************************************
165 Function:
166 Description:
167 ***************************************/
timerUpdate()168 void MusicPlayer::timerUpdate()
169 {
170 if (ap == NULL)
171 return ;
172 m_curDuration = ap->getCurrentPosition();
173 ui->progressSlider->setValue(m_curDuration / 1000);
174 updateDurationInfo(m_curDuration / 1000 + 1);
175 }
176
177 /**************************************
178 Function:
179 Description:
180 ***************************************/
updateDurationInfo(qint64 currentInfo)181 void MusicPlayer::updateDurationInfo(qint64 currentInfo)
182 {
183 QString tStr;
184
185 if (ap == NULL)
186 return ;
187
188 if(currentInfo>= m_totalDuration)
189 {
190 currentInfo = 0;
191 ui->progressSlider->setValue(0);
192 m_bPlayState = STOPPED;
193 ui->playButton->setIcon(QIcon(":/images/playerIcons/Play.png"));
194 ui->playButton->setIconSize(QSize(50,50));
195 ap->stop();
196 progressSliderTimer->stop();
197 }
198
199 tStr=getTimeStr(currentInfo,m_totalDuration);
200 ui->curTimeLabel->setText(tStr);
201 }
202
203 /**************************************
204 Function:
205 Description:
206 ***************************************/
onProgressSliderMoved(int value)207 void MusicPlayer::onProgressSliderMoved(int value)
208 {
209 qDebug()<<"slider is moved"<<value;
210 progressSliderTimer->stop();
211 if (!ui->progressSlider->isSliderDown()) {
212 ui->progressSlider->setValue(value);
213 }
214 ui->progressSlider->setValue(value);
215 updateDurationInfo(value);
216 progressSliderTimer->start(1000);
217 }
218
219 /**************************************
220 Function:
221 Description:
222 ***************************************/
onProgressSliderReleased()223 void MusicPlayer::onProgressSliderReleased()
224 {
225 qDebug()<<"slider is released";
226 if(m_bPlayState == PAUSEED)
227 on_playButton_clicked();
228 progressSliderTimer->stop();
229 m_bPlayState = SEEKING;
230 if(ap != NULL){
231 ap->seekto(ui->progressSlider->value() * 1000);
232 }
233 progressSliderTimer->start(1000);
234
235 m_bPlayState = PLAYING;
236
237 }
238
239 /**************************************
240 Function:
241 Description:
242 ***************************************/
startPlay()243 void MusicPlayer::startPlay()
244 {
245 bool isExist = m_commonFunction->fileExistOrNot(m_curMusicFilePath);
246 if(!isExist){
247 qDebug()<<"file exist";
248 frmMessageBox *msg = new frmMessageBox(this);
249 msg->SetMessage(QString("文件不存在!"),0);
250 msg->exec();
251 return;
252 }
253 //if(!m_commonFunction->video_support_or_not(this,m_curMusicFilePath)){
254 // qDebug()<<"format not support";
255 // return ;
256 //}
257 initAutPlayer();
258 getMusicInfo(m_curMusicFilePath);
259 }
260
261 /**************************************
262 Function:
263 Description:
264 ***************************************/
stopPlay()265 void MusicPlayer::stopPlay()
266 {
267 if(ap != NULL){
268 ap->stop();
269 }
270 }
271 /**************************************
272 Function:
273 Description:
274 ***************************************/
on_notifyMusicPlayerToPlay(QList<QFileInfo> playList,int row,int listType)275 void MusicPlayer::on_notifyMusicPlayerToPlay(QList<QFileInfo> playList,int row,int listType)
276 {
277 //hide the playlist
278 emit hidePlayList();
279 m_bMusicListOpen = false;
280
281 if(listType == 0){
282 if(m_playList_udisk != playList){
283 qDebug()<<"on_notifyMusicPlayerToPlay set list wrong";
284 }else{
285 m_playList_udisk = playList;
286 }
287 m_playList = m_playList_udisk;
288 }else if(listType == 1){
289 if(m_playList_favorite != playList){
290 qDebug()<<"on_notifyMusicPlayerToPlay set list wrong";
291 }else{
292 m_playList_favorite = playList;
293 }
294 m_playList = m_playList_favorite;
295 }
296
297 m_playList = playList;
298 if(m_playList.count() < row){
299 qDebug()<<"playlist is wrong";
300 return;
301 }
302 m_curMusicFilePath = m_playList.at(row).absoluteFilePath();
303 m_curMusicFileCount = row;
304
305 startPlay();
306 }
307
308 /**************************************
309 Function:
310 Description:
311 ***************************************/
on_notifyMusicPlayerListChanged(QList<QFileInfo> playList,int listType)312 void MusicPlayer::on_notifyMusicPlayerListChanged(QList<QFileInfo> playList,int listType)
313 {
314
315 if(listType == 0){
316 qDebug()<<"m_playList_udisk has been update";
317 m_playList_udisk = playList;
318 }else if(listType == 1){
319 qDebug()<<"m_playList_favorite has been update";
320 m_playList_favorite = playList;
321 }
322 }
323
324 /**************************************
325 Function:
326 Description:
327 ***************************************/
on_playButton_clicked()328 void MusicPlayer::on_playButton_clicked()
329 {
330 qDebug()<<"MusicPlayer::on_playButton_clicked()";
331 int ret=0;
332 if(ap != NULL){
333 if (m_bPlayState == PAUSEED){
334 ap->start();
335 m_bPlayState = PLAYING;
336 ui->playButton->setIcon(QIcon(":/images/playerIcons/Pause.png"));
337 }
338 else if(m_bPlayState == PLAYING){
339 ap->pause();
340 m_bPlayState = PAUSEED;
341 ui->playButton->setIcon(QIcon(":/images/playerIcons/Play.png"));
342 }
343 else if(m_bPlayState == STOPPED){
344 initAutPlayer();
345 }
346 }
347 }
348
349 /**************************************
350 Function:
351 Description:
352 ***************************************/
on_preMusicButton_clicked()353 void MusicPlayer::on_preMusicButton_clicked()
354 {
355 qDebug()<<"on_preMusicButton_clicked,here";
356 if(m_curMusicFileCount -1 >= 0){
357 m_curMusicFileCount--;
358 m_curMusicFilePath = m_playList.at(m_curMusicFileCount).absoluteFilePath();
359 progressSliderTimer->stop();
360 stopPlay();
361 startPlay();
362 }else{
363 return ;
364 }
365 }
366
367 /**************************************
368 Function:
369 Description:
370 ***************************************/
on_nextMusicButton_clicked()371 void MusicPlayer::on_nextMusicButton_clicked()
372 {
373 qDebug()<<"on_nextMusicButton_clicked,here";
374 if(m_curMusicFileCount + 1 < m_playList.count()){
375 m_curMusicFileCount++;
376 m_curMusicFilePath = m_playList.at(m_curMusicFileCount).absoluteFilePath();\
377 progressSliderTimer->stop();
378 stopPlay();
379 startPlay();
380 }else{
381 return ;
382 }
383 }
384
385 /**************************************
386 Function:
387 Description:
388 ***************************************/
on_searchButton_clicked()389 void MusicPlayer::on_searchButton_clicked()
390 {
391 qDebug()<<"on_searchButton_clicked";
392
393
394 if(m_pSearchDialog == NULL){
395 m_pSearchDialog = new searchFileDialog(0,this);
396
397 connect(m_pSearchDialog,SIGNAL(notifyMusicPlayerAddFile(QString)),\
398 this,SLOT(on_notifyMusicPlayerAddFile(QString)));
399
400 connect(m_pSearchDialog,SIGNAL(notifyMusicCancelSearch()),\
401 this,SLOT(on_notifyMusicCancelSearch()));
402 }
403
404 if(m_bSearchDialogOpen == false){
405 m_bSearchDialogOpen = true;
406 m_pSearchDialog->showD();
407 } else {
408 m_bSearchDialogOpen = false;
409 m_pSearchDialog->hide();
410 }
411 }
412
413 /**************************************
414 Function:
415 Description:
416 ***************************************/
417 /*
418 void MusicPlayer::on_playListButton_clicked()
419 {
420 qDebug()<<"on_playListButton_clicked";
421
422 if(m_pPlayList == NULL){
423 qDebug()<<"new";
424 m_pPlayList = PlayList::Instance(this);
425 m_pPlayList->move(1024,50);
426 }
427 qDebug()<<"already exisit";
428 if(!m_bMusicListOpen){
429 qDebug()<<"show!!!!";
430 emit showPlayList();
431 m_bMusicListOpen = true;
432 } else {
433 qDebug()<<"hide!!!";
434 emit hidePlayList();
435 m_bMusicListOpen = false;
436 }
437 }
438 */
439
440 /**************************************
441 Function:
442 Description:
443 //some operation when MusicPlayer get focus
444 //通过焦点实现的方法还需要进一步测试,存在bug
445 ***************************************/
446
focusInEvent(QFocusEvent *)447 void MusicPlayer::focusInEvent(QFocusEvent*)
448 {
449 qDebug()<<"Musicplayer get focus";
450 if(m_bMusicListOpen == true){
451 emit hidePlayList();
452 m_bMusicListOpen = false;
453 }
454 }
455
456
457 /**************************************
458 Function:
459 Description:
460 ***************************************/
on_playOrderButton_clicked()461 void MusicPlayer::on_playOrderButton_clicked()
462 {
463 switch(m_nextPlayOrderState){
464 case 0:
465 qDebug()<<"now is random play";
466 ui->playOrderButton->setIcon(QIcon(":/images/playerIcons/randomPlay.png"));
467 m_curPlayOrderState = 0;
468 m_nextPlayOrderState = 1;
469 break;
470 case 1:
471 qDebug()<<"now is sequence play";
472 ui->playOrderButton->setIcon(QIcon(":/images/playerIcons/playlist2.png"));
473 m_curPlayOrderState = 1;
474 m_nextPlayOrderState = 2;
475 break;
476 case 2:
477 qDebug()<<"now is circle play";
478 ui->playOrderButton->setIcon(QIcon(":/images/playerIcons/playlistRepeat.png"));
479 m_curPlayOrderState = 2;
480 m_nextPlayOrderState = 0;
481 break;
482 }
483 }
484
485 /**************************************
486 Function:
487 Description:
488 ***************************************/
on_setttingButton_clicked()489 void MusicPlayer::on_setttingButton_clicked()
490 {
491 if (m_outType == AudioSink::HDMI_OUT){
492 m_outType = AudioSink::CODEC_OUT;
493
494 ui->setttingButton->setIcon(QIcon(":/images/playerIcons/headphone.png"));
495 ui->setttingButton->setIconSize(QSize(50,50));
496 } else if (m_outType == AudioSink::CODEC_OUT){
497 m_outType = AudioSink::WM8960_OUT;
498
499 ui->setttingButton->setIcon(QIcon(":/images/playerIcons/wm8960.png"));
500 ui->setttingButton->setIconSize(QSize(50,50));
501 } else if (m_outType == AudioSink::WM8960_OUT) {
502 m_outType = AudioSink::HDMI_OUT;
503
504 ui->setttingButton->setIcon(QIcon(":/images/playerIcons/hdmi.png"));
505 ui->setttingButton->setIconSize(QSize(50,50));
506 }
507 if (ap)
508 ap->setOutType(m_outType);
509 }
510
511 /**************************************
512 Function:
513 Description:
514 ***************************************/
on_pushButton_clicked()515 void MusicPlayer::on_pushButton_clicked()
516 {
517 if(ap!=NULL){
518 ap->stop();
519 }
520 this->close();
521 system("fbinit");
522 }
523
524 /**************************************
525 Function:
526 Description:
527 ***************************************/
getMusicInfo(QString path)528 void MusicPlayer::getMusicInfo(QString path)
529 {
530 MusicInfoThread* thread = new MusicInfoThread(path, this);
531 connect(thread,SIGNAL(complete(QString,QString,QString,QPixmap)),\
532 this,SLOT(setMusicInfo(QString ,QString ,QString ,QPixmap )));
533 thread->start();
534 }
535
536 /**************************************
537 Function:
538 Description:
539 ***************************************/
setMusicInfo(QString albumName,QString musicName,QString singerName,QPixmap poster)540 void MusicPlayer::setMusicInfo(QString albumName,QString musicName,QString singerName,QPixmap poster)
541 {
542 m_albumName = albumName;
543 m_musicName = musicName;
544 m_singerName = singerName;
545 m_poster = poster;
546 if(!m_albumName.isEmpty()){
547 ui->albumTextLabel->setText(m_albumName);
548 }else{
549 ui->albumTextLabel->setText("未知专辑");
550 }
551 if(!m_musicName.isEmpty()){
552 ui->MusicTextLabel->setText(m_musicName);
553 }else{
554 ui->MusicTextLabel->setText("未知音乐名");
555 }
556 if(!m_singerName.isEmpty()){
557 ui->artistTextLabel->setText(m_singerName);
558 }else{
559 ui->artistTextLabel->setText("未知艺术家");
560 }
561 if(!m_poster.isNull()){
562 ui->posterLabel->clear();
563 ui->posterLabel->setPixmap(m_poster);
564 }else{
565 ui->posterLabel->clear();
566 ui->posterLabel->setPixmap(QPixmap(":/images/playerIcons/MusicPoster.png"));
567 }
568 }
569
570 /**************************************
571 Function:
572 Description:
573 ***************************************/
on_notifyMusicPlayerAddFile(QString strpath)574 void MusicPlayer::on_notifyMusicPlayerAddFile(QString strpath)
575 {
576 qDebug()<<"on_notifyMusicPlayerAddFile ";
577 m_curMusicFilePath = strpath;
578 if(m_bSearchDialogOpen == true){
579 m_bSearchDialogOpen = false;
580 m_pSearchDialog->hide();
581 }
582
583 if (m_bPlayState != STOPPED){
584 ap->stop();
585 progressSliderTimer->stop();
586 ui->progressSlider->setValue(0);
587 m_bPlayState = STOPPED;
588 ui->playButton->setIcon(QIcon(":/images/playerIcons/Play.png"));
589 ui->playButton->setIconSize(QSize(50,50));
590 }
591 startPlay();
592 }
593
594
595 /**************************************
596 Function:
597 Description:
598 ***************************************/
on_notifyMusicCancelSearch()599 void MusicPlayer::on_notifyMusicCancelSearch()
600 {
601 qDebug()<<"on_notifyMusicCancelSearch ";
602
603 if(m_bSearchDialogOpen == true){
604 m_bSearchDialogOpen = false;
605 m_pSearchDialog->hide();
606 }
607
608 }
609
610
611 /**************************************
612 Function:
613 Description:
614 ***************************************/
doMsgCmd(int msgType,void * user,void * data,int len)615 void MusicPlayer::doMsgCmd(int msgType, void* user,void* data,int len)
616 {
617
618 switch(msgType)
619 {
620 case 128:
621 break;
622 case SUBCTRL_SUBTITLE_AVAILABLE:
623 break;
624 case SUBCTRL_SUBTITLE_EXPIRED:
625 break;
626 case AWPLAYER_MEDIA_PREPARED:
627 break;
628 case AWPLAYER_MEDIA_PLAYBACK_COMPLETE:
629 on_nextMusicButton_clicked();
630 break;
631 case AWPLAYER_MEDIA_SEEK_COMPLETE:
632
633 break;
634 case AWPLAYER_MEDIA_STARTED:
635 break;
636 case AWPLAYER_MEDIA_LOG_RECORDER:
637 break;
638 case AWPLAYER_MEDIA_BUFFERING_UPDATE:
639 break;
640 case AWPLAYER_MEDIA_ERROR:
641 break;
642 case AWPLAYER_MEDIA_INFO:
643 break;
644 case AWPLAYER_MEDIA_SET_VIDEO_SIZE:
645 break;
646 default:
647 break;
648 }
649 }
650
651 /**************************************
652 Function:
653 Description:
654 ***************************************/
autMusicCb_func(int msgType,void * user,void * data,int len)655 int MusicPlayer::autMusicCb_func(int msgType, void* user,void* data,int len)
656 {
657 emit pStaticMusicPlayer->msgSignal(msgType,user,data,len);
658 }
659
660
661 /**************************************
662 Function:
663 Description:
664 ***************************************/
MusicInfoThread(QString path,QObject * parent)665 MusicInfoThread::MusicInfoThread(QString path,QObject *parent)
666 : m_filepath(path),
667 QThread(parent)
668 {
669 qDebug() << "MusicInfoThread Thread : " << QThread::currentThreadId();
670 commonfunc = new CommonFunction;
671 m_albumName = QString("");
672 m_musicName = QString("");
673 m_singerName = QString("");
674 m_poster = QPixmap();
675 }
676
677 /**************************************
678 Function:
679 Description:
680 ***************************************/
~MusicInfoThread()681 MusicInfoThread::~MusicInfoThread()
682 {
683 qDebug()<<"~MusicInfoThread";
684 }
685
686 /**************************************
687 Function:
688 Description:
689 ***************************************/
run()690 void MusicInfoThread::run()
691 {
692 qDebug() << "MusicInfoThread run in Thread : " << QThread::currentThreadId();
693 qDebug()<<"the file's absoluteFilePath is"<<m_filepath;
694
695 XRetriever *demoRetriver = XRetrieverCreate();
696 if(NULL == demoRetriver){
697 printf("XRetrieverCreate failed\n");
698 }
699 int ret = XRetrieverSetDataSource(demoRetriver, (char*)m_filepath.toLatin1().data(), NULL);
700 if(ret < 0){
701 printf("set datasource failed\n");
702 }
703 printf("XRetrieverSetDataSource end\n");
704 CdxMediaInfoT mi;
705 XRetrieverGetMetaData(demoRetriver, METADATA_MEDIAINFO, &mi);
706 printf("the video information:titile[64]=[%.02x %.02x %.02x %.02x %.02x]\n",mi.title[0],mi.title[1],mi.title[2],mi.title[3],mi.title[4]);
707 printf("the video information:album[64]=[%s] ,albumsz=%d,genre[64]=%s,genresz=%d,title[64]=%s,titlesz=%d,year[64]=%s,yearsz=%d,composer[64]=%s,date[64]=%s\n",
708 mi.album,mi.albumsz,mi.genre,mi.genresz,mi.title,mi.titlesz,mi.year,mi.yearsz,mi.composer,mi.date);
709
710 if(mi.albumsz!=0){
711 m_albumName = commonfunc->print_info(mi.album,mi.albumsz);
712 qDebug()<<"album is"<<m_albumName;
713 }
714 if(mi.titlesz!=0){
715 m_musicName = commonfunc->print_info(mi.title,mi.titlesz);
716 qDebug()<<"title is"<<m_musicName;
717 }
718 if(mi.authorsz!=0){
719 m_singerName = commonfunc->print_info(mi.author,mi.authorsz);
720 qDebug()<<"author is"<< m_singerName;
721 }
722 else if(mi.artistsz!=0){
723 m_singerName = commonfunc->print_info(mi.artist,mi.artistsz);
724 qDebug()<<"artist is"<< m_singerName;
725 }
726 if(mi.nAlbumArtBufSize != 0){
727 qDebug()<<"this music has poster";
728 QImage img = QImage::fromData((const uchar*)mi.pAlbumArtBuf,mi.nAlbumArtBufSize);
729 QImage imgScaled = img.scaled(320,260,Qt::KeepAspectRatio);
730 m_poster.convertFromImage(imgScaled);
731 }
732
733 emit complete(m_albumName,m_musicName,m_singerName,m_poster);
734
735 XRetrieverDestory(demoRetriver);
736 demoRetriver = NULL;
737 return ;
738 }
739