xref: /OK3568_Linux_fs/app/forlinx/flapp/src/plugins/allwinner/music/musicplayer.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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