Hey, I have built a small Phonon based media player as part of a college project. I need to add mpris2 support to it for remote control using kde connect. When trying to run the application I get the following error:
QWidget: Must construct a QApplication before a QPaintDevice I already have a QApplication constructed in main.cpp but I still get the error. Attached is the Mpris2 implementation (basically modified from the Dragon Player source code) Can anyone please tell me where I am going wrong? I am not really familiar with D-Bus and the Mpris specification. PS: the full repository is at https://www.github.com/Zakhrov/WebPhonon
#include "appwrapper.h" #include "mainwindow.h" #include <KDE/KCmdLineArgs> AppWrapper::AppWrapper():KUniqueApplication(true,true),w(0) { } AppWrapper::~AppWrapper() { if(w) { w=0; } delete w; } int AppWrapper::newInstance() { if(!w) { w=new MainWindow; } w->showMaximized(); return KUniqueApplication::newInstance(); }
#ifndef APPWRAPPER_H #define APPWRAPPER_H #include <KDE/KUniqueApplication> class MainWindow; class AppWrapper : public KUniqueApplication { Q_OBJECT public: AppWrapper(); ~AppWrapper(); virtual int newInstance(); private: MainWindow *w; }; #endif // APPWRAPPER_H
#ifndef CODEINE_H #define CODEINE_H class QWidget; QWidget *mwindow(); int main(int,char**); #define APP_NAME "WebPhonon" #endif // CODEINE_H
#include <QtGui/QApplication> //#include "mainwindow.h" #include "codeine.h" #include "appwrapper.h" #include <QCoreApplication> #include <QPixmap> #include <QSplashScreen> #include <QTextStream> //#include <kcmdlineargs.h> //#include <kurl.h> //#include <kaboutdata.h> #include <KDE/KCmdLineArgs> #include <KDE/KUrl> #include <KDE/KAboutData> #include <KDE/KUniqueApplication> int main(int argc, char *argv[]) { KAboutData aboutData( "WebPhonon", "WebPhonon", ki18n("WebPhonon"), "1.5", ki18n("Media Player"), KAboutData::License_GPL, ki18n("Copyright (c) 2013 Zakhrov") ); KCmdLineArgs::init( argc, argv, &aboutData ); KCmdLineOptions options; //new options.add("+[file]", ki18n("Document to open")); //new KCmdLineArgs::addCmdLineOptions(options); //new KUniqueApplication::addCmdLineOptions(); QApplication a(argc, argv); QCoreApplication::setApplicationName("WebPhonon"); AppWrapper app; QPixmap img; img.load(":/splash/WebPhonon-Master-text2.png"); QSplashScreen spl; spl.setPixmap(img); spl.show(); // QStringList cmd=a.arguments(); // QTextStream cout(stdout); // cout<<argv[0]<<endl; // cout<<argv[1]<<endl; // if(!cmd.isEmpty()) // { // w.cmdopen(cmd.last()); // } /*KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); //new if(args->count()) //new { app(args->url(0).url()); //new }*/ //w.showMaximized(); return app.exec(); }
/* this is the main player window for WebPhonon. Here, a phonon graph is built that handles the audio and video from the various locations such as local files, http streams and from a database table The current databases supported are MySQL for Linux/Windows and Microsoft SQL Server as a windows only option. MS SQL support is not fully tested. TODO Add media from disks such as CD, DVD and Blu-Ray this means that fututre dependencies may include libdvdcss2 and libbluray Add proper media scanner and tagger for pulling metadata for a video file (like XBMC) */ #include "dialog.h" #include "dbmainwindow.h" #include "backenddialog.h" #include "mainwindow.h" #include "ui_mainwindow.h" #include "helpdialog.h" #include "dropwidget.h" #include "mpris2.h" #include <Phonon/AudioOutput> #include <Phonon/MediaObject> #include <QFileDialog> #include <Phonon/BackendCapabilities> #include <QDesktopServices> #include <QSqlDatabase> #include <QTableWidgetItem> #include <QSqlQuery> #include <QMessageBox> #include <Phonon/VideoWidget> #include <KDE/KCmdLineArgs> #include <KDE/KUrl> //#include <stdlib.h> //#include <boost/filesystem/ MainWindow * MainWindow::s_instance=0; QWidget* mwindow() { return MainWindow::s_instance; } DropWidget *MainWindow::dwidget=new DropWidget(); Phonon::MediaObject *MainWindow::med=new Phonon::MediaObject(); MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { //setting window icon and initializing objects this->setWindowIcon(QIcon(":/icons/WebPhononIcon.png")); ui->setupUi(this); d=new Dialog(this); dm2=new DBMainWindow(this); bkdiag=new BackendDialog(this); hdiag=new HelpDialog(this); sndout=new Phonon::AudioOutput(Phonon::VideoCategory,this); //MainWindow::med=new Phonon::MediaObject(this); //MainWindow::dwidget=new DropWidget(this); med->setTransitionTime(2000); Phonon::createPath(med,dwidget); Phonon::createPath(med,sndout); QStringList collabel; collabel.append("URL"); collabel.append("Name"); ui->seekSlider->setMediaObject(med); ui->volumeSlider->setAudioOutput(sndout); ui->volumeSlider->setTracking(true); ui->lineEdit->hide(); urls.clear(); ui->tableWidget->hide(); ui->tableWidget->setColumnCount(2); ui->tableWidget->setHorizontalHeaderLabels(collabel); ui->pushButton->hide(); //connecting signals and slots for going to next file and for drag n drop connect(med,SIGNAL(aboutToFinish()),this,SLOT(next())); connect(dwidget,SIGNAL(geturls(const QMimeData*)),this,SLOT(dropdata(const QMimeData*))); connect(dwidget,SIGNAL(capturespace(QKeyEvent*)),this,SLOT(widgetpause(QKeyEvent*))); connect(med,SIGNAL(tick(qint64)),this,SLOT(timechanged(qint64))); connect(med,SIGNAL(totalTimeChanged(qint64)),this,SLOT(totalTimeChanged(qint64))); //adding custom video widget with drag n drop enabled ui->gridLayout->addWidget(dwidget); ui->seekSlider->setIconVisible(false); volume=sndout->volumeDecibel(); ui->label->setText(QString::number(volume)); s_instance=this; Mpris2(this); } void MainWindow::cmdopen(QString cmdfile) { int i; int index=sources.size(); sources.append(Phonon::MediaSource(QUrl(cmdfile))); QTableWidgetItem *fitem=new QTableWidgetItem(cmdfile,1); i=ui->tableWidget->rowCount(); ui->tableWidget->insertRow(i); ui->tableWidget->setItem(i,0,fitem); if(med->state()!=Phonon::PlayingState) { if(!sources.isEmpty()) med->setCurrentSource(sources.at(index)); med->play(); ui->tableWidget->selectRow(index); } ui->tableWidget->resizeColumnsToContents(); } MainWindow::~MainWindow() { MyDB.close(); delete ui; } void MainWindow::on_actionLocal_File_triggered() { //this function/slot triggers a dialog box for selecting files and adds files to the tablewidget (playlist) int i; int index=sources.size(); QStringList fnames=QFileDialog::getOpenFileNames(this,tr("Choose Files"),QDesktopServices::storageLocation(QDesktopServices::MoviesLocation)); foreach (QString fname, fnames) { sources.append(Phonon::MediaSource(QUrl::fromLocalFile(fname))); QTableWidgetItem *fitem=new QTableWidgetItem(fname,1); i=ui->tableWidget->rowCount(); ui->tableWidget->insertRow(i); ui->tableWidget->setItem(i,0,fitem); } ui->tableWidget->resizeColumnsToContents(); if(med->state()!=Phonon::PlayingState) { if(!sources.isEmpty()) med->setCurrentSource(sources.at(index)); med->play(); ui->tableWidget->selectRow(index); } } void MainWindow::on_actionHttp_Stream_triggered() { //shows th url bar for adding http streams ui->lineEdit->show(); ui->pushButton->show(); } void MainWindow::on_actionPlay_triggered() { med->play(); ui->lineEdit->hide(); ui->pushButton->hide(); ui->tableWidget->selectRow(sources.indexOf(med->currentSource())); } void MainWindow::on_actionPause_triggered() { if(med->state()==Phonon::PlayingState) med->pause(); else med->play(); } void MainWindow::on_actionStop_triggered() { med->stop(); } void MainWindow::on_actionFull_Screen_triggered() { if(dwidget->isFullScreen()==false) { dwidget->setFullScreen(true); dwidget->setFocus(); } else { dwidget->setFullScreen(false); } } void MainWindow::on_actionExit_triggered() { this->close(); } void MainWindow::on_actionSet_Database_triggered() { //opens the set database dialog d->show(); } void MainWindow::on_actionFrom_Database_triggered() { //queries the database for media information and urls QString tabindex,titleindex,studio,language,artist,album,year; int i; int index=sources.size(); HostName=d->host; DBName=d->dbname; UName=d->uname; Passwd=d->passwd; TabName=d->tabname; DBType=d->dbtype; QPixmap img1,img2; img1.load(":/Icons/WebPhononIcon.png"); img2=img1.scaled(32,32); QMessageBox msg; msg.setIconPixmap(img2); msg.setWindowTitle("Database Module"); MyDB=QSqlDatabase::addDatabase(DBType); MyDB.setConnectOptions(); if(MyDB.isDriverAvailable(DBType)==true) { if(DBType=="QODBC") { QString dsn= QString("DRIVER={SQL Server};SERVER=%1;DATABASE=%2;Trusted_Connection=Yes;").arg(HostName).arg(DBName); MyDB.setDatabaseName(dsn); MyDB.open(); } else { if(HostName=="localhost") { MyDB.setHostName(HostName); MyDB.setDatabaseName(DBName); } else { MyDB.setHostName(HostName); MyDB.setPort(3306); MyDB.setDatabaseName(DBName); } MyDB.open(UName,Passwd); } if(MyDB.isOpen()==true) { msg.setText(MyDB.driverName()+" Database "+DBName+" Open"); msg.exec(); } if(!MyDB.tables().contains(TabName)) { msg.setText(TabName+" does not exist"); msg.exec(); } else if(TabName=="Movies") { ui->tableWidget->setColumnCount(5); QStringList Moviecollabel; QString rating; Moviecollabel.append("URL"); Moviecollabel.append("Title"); Moviecollabel.append("Studio"); Moviecollabel.append("Language"); Moviecollabel.append("Rating"); ui->tableWidget->setHorizontalHeaderLabels(Moviecollabel); QSqlQuery request("SELECT url, Title, Studio, Language, rating FROM "+TabName); while(request.next()) { tabindex=request.value(0).toString(); titleindex=request.value(1).toString(); studio=request.value(2).toString(); language=request.value(3).toString(); rating=request.value(4).toString(); sources.append(Phonon::MediaSource(QUrl(request.value(0).toString()))); QTableWidgetItem *item1=new QTableWidgetItem(tabindex,1); QTableWidgetItem *item2=new QTableWidgetItem(titleindex,1); QTableWidgetItem *item3=new QTableWidgetItem(studio,1); QTableWidgetItem *item4=new QTableWidgetItem(language,1); QTableWidgetItem *item5=new QTableWidgetItem(rating,1); i=ui->tableWidget->rowCount(); ui->tableWidget->insertRow(i); ui->tableWidget->setItem(i,0,item1); ui->tableWidget->setItem(i,1,item2); ui->tableWidget->setItem(i,2,item3); ui->tableWidget->setItem(i,3,item4); ui->tableWidget->setItem(i,4,item5); } } else if(TabName=="Music") { ui->tableWidget->setColumnCount(6); QStringList Musiccollabel; Musiccollabel.append("URL"); Musiccollabel.append("Title"); Musiccollabel.append("Artist"); Musiccollabel.append("Album"); Musiccollabel.append("Year"); Musiccollabel.append("Language"); ui->tableWidget->setHorizontalHeaderLabels(Musiccollabel); QSqlQuery request("SELECT url, Title, artist, album, year, language FROM "+TabName); while(request.next()) { tabindex=request.value(0).toString(); titleindex=request.value(1).toString(); artist=request.value(2).toString(); album=request.value(3).toString(); year=request.value(4).toString(); language=request.value(5).toString(); sources.append(Phonon::MediaSource(QUrl(request.value(0).toString()))); QTableWidgetItem *item1=new QTableWidgetItem(tabindex,1); QTableWidgetItem *item2=new QTableWidgetItem(titleindex,1); QTableWidgetItem *item3=new QTableWidgetItem(artist,1); QTableWidgetItem *item4=new QTableWidgetItem(album,1); QTableWidgetItem *item5=new QTableWidgetItem(year,1); QTableWidgetItem *item6=new QTableWidgetItem(language,1); i=ui->tableWidget->rowCount(); ui->tableWidget->insertRow(i); ui->tableWidget->setItem(i,0,item1); ui->tableWidget->setItem(i,1,item2); ui->tableWidget->setItem(i,2,item3); ui->tableWidget->setItem(i,3,item4); ui->tableWidget->setItem(i,4,item5); ui->tableWidget->setItem(i,5,item6); } } else if(TabName=="Music_Videos") { QString ishd; int hd; ui->tableWidget->setColumnCount(5); QStringList MVidcollabel; MVidcollabel.append("URL"); MVidcollabel.append("Title"); MVidcollabel.append("Artist"); MVidcollabel.append("Language"); MVidcollabel.append("HD"); ui->tableWidget->setHorizontalHeaderLabels(MVidcollabel); QSqlQuery request("SELECT url, Title, artist, language, HD FROM "+TabName); while(request.next()) { tabindex=request.value(0).toString(); titleindex=request.value(1).toString(); artist=request.value(2).toString(); language=request.value(3).toString(); hd=request.value(4).toInt(); if(hd==1) ishd="yes"; else ishd="no"; sources.append(Phonon::MediaSource(QUrl(request.value(0).toString()))); QTableWidgetItem *item1=new QTableWidgetItem(tabindex,1); QTableWidgetItem *item2=new QTableWidgetItem(titleindex,1); QTableWidgetItem *item3=new QTableWidgetItem(artist,1); QTableWidgetItem *item4=new QTableWidgetItem(language,1); QTableWidgetItem *item5=new QTableWidgetItem(ishd,1); i=ui->tableWidget->rowCount(); ui->tableWidget->insertRow(i); ui->tableWidget->setItem(i,0,item1); ui->tableWidget->setItem(i,1,item2); ui->tableWidget->setItem(i,2,item3); ui->tableWidget->setItem(i,3,item4); ui->tableWidget->setItem(i,4,item5); } } else if(TabName=="TV_Shows") { int season,episode; QString eptitle; ui->tableWidget->setColumnCount(5); QStringList TVcollabel; TVcollabel.append("URL"); TVcollabel.append("Title"); TVcollabel.append("Season"); TVcollabel.append("Episode"); TVcollabel.append("Episode Title"); ui->tableWidget->setHorizontalHeaderLabels(TVcollabel); QSqlQuery request("SELECT url, Title, Season, Episode, Ep_Title FROM "+TabName); while(request.next()) { tabindex=request.value(0).toString(); titleindex=request.value(1).toString(); season=request.value(2).toInt(); episode=request.value(3).toInt(); eptitle=request.value(4).toString(); sources.append(Phonon::MediaSource(QUrl(request.value(0).toString()))); QTableWidgetItem *item1=new QTableWidgetItem(tabindex,1); QTableWidgetItem *item2=new QTableWidgetItem(titleindex,1); QTableWidgetItem *item3=new QTableWidgetItem(QString::number(season),1); QTableWidgetItem *item4=new QTableWidgetItem(QString::number(episode),1); QTableWidgetItem *item5=new QTableWidgetItem(eptitle,1); i=ui->tableWidget->rowCount(); ui->tableWidget->insertRow(i); ui->tableWidget->setItem(i,0,item1); ui->tableWidget->setItem(i,1,item2); ui->tableWidget->setItem(i,2,item3); ui->tableWidget->setItem(i,3,item4); ui->tableWidget->setItem(i,4,item5); } } else { QSqlQuery request("SELECT url, Title FROM "+TabName); while(request.next()) { tabindex=request.value(0).toString(); titleindex=request.value(1).toString(); sources.append(Phonon::MediaSource(QUrl(request.value(0).toString()))); QTableWidgetItem *item1=new QTableWidgetItem(tabindex,1); QTableWidgetItem *item2=new QTableWidgetItem(titleindex,1); i=ui->tableWidget->rowCount(); ui->tableWidget->insertRow(i); ui->tableWidget->setItem(i,0,item1); ui->tableWidget->setItem(i,1,item2); } } ui->tableWidget->resizeColumnsToContents(); ui->tableWidget->show(); if(med->state()!=Phonon::PlayingState) { if(!sources.isEmpty()) med->setCurrentSource(sources.at(index)); ui->tableWidget->selectRow(index); med->play(); } MyDB.close(); } else { msg.setText("Database Driver not Loaded"); msg.exec(); } } void MainWindow::on_actionManage_Databases_triggered() { //shows database manager window dm2->showMaximized(); } void MainWindow::on_tableWidget_cellClicked(int row, int column) { if(column==0) { med->stop(); med->clearQueue(); if(row>=sources.size()) return; med->setCurrentSource(sources[row]); med->play(); } } void MainWindow::on_actionHide_Table_triggered() { if(ui->tableWidget->isHidden()==true) ui->tableWidget->show(); else ui->tableWidget->hide(); ui->lineEdit->hide(); ui->pushButton->hide(); } void MainWindow::on_pushButton_clicked() { //adds url typed in url bar to playlist int i; QString uname; uname.insert(0,ui->lineEdit->text()); int index=sources.size(); sources.append(Phonon::MediaSource(QUrl(uname))); QTableWidgetItem *uitem=new QTableWidgetItem(uname,1); i=ui->tableWidget->currentRow(); ui->tableWidget->insertRow(i+1); ui->tableWidget->setItem(i+1,0,uitem); ui->tableWidget->resizeColumnsToContents(); ui->lineEdit->hide(); ui->pushButton->hide(); if(med->state()!=Phonon::PlayingState) { if(!sources.isEmpty()) med->setCurrentSource(sources.at(index)); ui->tableWidget->selectRow(index); med->play(); } } void MainWindow::on_actionAvailable_Formats_triggered() { bkdiag->show(); } void MainWindow::next() { this->on_actionFoward_triggered(); } void MainWindow::on_actionUser_Manual_triggered() { //opens user manual hdiag->showMaximized(); } void MainWindow::dropdata(const QMimeData *mimeData) { //activates drag n drop int i; int index=sources.size(); if (mimeData->hasUrls()) { foreach (QUrl url, mimeData->urls()) { sources.append(Phonon::MediaSource(url)); QTableWidgetItem *uitem=new QTableWidgetItem(url.toString(),1); i=ui->tableWidget->rowCount(); ui->tableWidget->insertRow(i); ui->tableWidget->setItem(i,0,uitem); } ui->tableWidget->resizeColumnsToContents(); if(med->state()!=Phonon::PlayingState) { if(!sources.isEmpty()) med->setCurrentSource(sources.at(index)); ui->tableWidget->selectRow(index); med->play(); } } } void MainWindow::parseArgs() { KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); if(args->count()>0) cmdopen(args->url(0).url()); } void MainWindow::on_actionBack_triggered() { // if(sources.size()>0) //{ int index=sources.indexOf(med->currentSource()); // QString size=QString::number(index); // QMessageBox *sizedisp=new QMessageBox(this); // sizedisp->setText(size); // sizedisp->show(); if(index!=0) { med->setCurrentSource(sources.at(index-1)); ui->tableWidget->selectRow(index-1); med->play(); } else { med->setCurrentSource(sources.at(index)); ui->tableWidget->selectRow(index); med->play(); } } void MainWindow::on_actionFoward_triggered() { int index=sources.indexOf(med->currentSource())+1; if(sources.size()>index) { med->setCurrentSource(sources.at(index)); ui->tableWidget->selectRow(index); med->play(); } } void MainWindow::widgetpause(QKeyEvent *event) { switch(event->key()) { case Qt::Key_Space: if(med->state()==Phonon::PlayingState) med->pause(); else med->play(); break; case Qt::Key_MediaPrevious:this->on_actionBack_triggered(); break; case Qt::Key_MediaNext:this->on_actionFoward_triggered(); break; case Qt::Key_MediaStop: med->stop();; break; case Qt::Key_F: if(dwidget->isFullScreen()) dwidget->setFullScreen(false); else dwidget->setFullScreen(true); break; case Qt::Key_Right:this->on_actionSkip_Foward_triggered(); break; case Qt::Key_Left: this->on_actionSkip_Backward_triggered(); break; case Qt::Key_Up: this->on_actionVolume_Up_triggered(); break; case Qt::Key_Down: this->on_actionVolume_Down_triggered(); break; default: med->play(); } } void MainWindow::on_actionVolume_Up_triggered() { if(volume<=50) { volume=volume+0.5; ui->label->setText(QString::number(volume)); ui->volumeSlider->audioOutput()->setVolumeDecibel(volume); } } void MainWindow::on_actionVolume_Down_triggered() { if(volume>=-50) { volume=volume-0.5; ui->label->setText(QString::number(volume)); ui->volumeSlider->audioOutput()->setVolumeDecibel(volume); } } void MainWindow::on_actionSkip_Foward_triggered() { currenttime=med->currentTime(); if(currenttime < med->totalTime()-10000) ui->seekSlider->mediaObject()->seek(currenttime+10000); } void MainWindow::on_actionSkip_Backward_triggered() { currenttime=med->currentTime(); if(currenttime > 10000) ui->seekSlider->mediaObject()->seek(currenttime-10000); } void MainWindow::timechanged(qint64 time) { qint64 hour,min,sec,dispsec,dmin; hour=min=dmin=0; time=med->currentTime(); sec=time/1000; dispsec=sec; if(sec>59) { min=sec/60; dispsec=sec%60; dmin=min; } if(min>59) { hour=min/60; dmin=min%60; } ui->hourlabel1->setText(QString::number(hour)); ui->minlabel1->setText(QString::number(dmin)); ui->slabel1->setText(QString::number(dispsec)); } void MainWindow::totalTimeChanged(qint64 newtottime) { qint64 hour,min,sec,dispsec,dmin; hour=min=sec=dispsec=dmin=0; newtottime=med->totalTime(); sec=newtottime/1000; dispsec=sec; if(sec>59) { min=sec/60; dispsec=sec%60; dmin=min; } if(min>59) { hour=min/60; dmin=min%60; } ui->hourlabel2->setText(QString::number(hour)); ui->minlabel2->setText(QString::number(dmin)); ui->slabel2->setText(QString::number(dispsec)); } void MainWindow::on_actionClear_Playlist_triggered() { sources.clear(); int i, rcnt; rcnt=ui->tableWidget->rowCount(); ui->tableWidget->clearContents(); for(i=0;i<=rcnt;i++) { ui->tableWidget->removeRow(i); } }
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> //#include <phonon/phonon> #include <Phonon/MediaObject> #include <Phonon/AudioOutput> #include <QPlainTextEdit> #include "dialog.h" #include "dbmainwindow.h" #include "backenddialog.h" #include "helpdialog.h" #include "dropwidget.h" #include "codeine.h" #include <QSqlDatabase> #include <QWebView> #include <QTableWidgetItem> #include <Phonon/VideoWidget> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); void cmdopen(QString cmdfile); static Phonon::MediaObject *med; static DropWidget *dwidget; friend QWidget *mwindow(); static MainWindow *s_instance; friend class AppWrapper; ~MainWindow(); public slots: void dropdata(const QMimeData *mimeData); void parseArgs(); private slots: void on_actionLocal_File_triggered(); void on_actionHttp_Stream_triggered(); void on_actionPlay_triggered(); void on_actionPause_triggered(); void on_actionStop_triggered(); void on_actionFull_Screen_triggered(); void on_actionExit_triggered(); void on_actionSet_Database_triggered(); void on_actionFrom_Database_triggered(); void on_actionManage_Databases_triggered(); void on_tableWidget_cellClicked(int row, int column); void on_actionHide_Table_triggered(); void on_pushButton_clicked(); void on_actionAvailable_Formats_triggered(); void next(); void on_actionUser_Manual_triggered(); void on_actionBack_triggered(); void on_actionFoward_triggered(); void widgetpause(QKeyEvent *event); void on_actionVolume_Up_triggered(); void on_actionVolume_Down_triggered(); void on_actionSkip_Foward_triggered(); void on_actionSkip_Backward_triggered(); void timechanged(qint64 time); void totalTimeChanged(qint64 newtottime); void on_actionClear_Playlist_triggered(); private: Ui::MainWindow *ui; Phonon::AudioOutput *sndout; Dialog *d; QSqlDatabase MyDB; QString HostName,DBName,UName,Passwd,TabName,DBType; QList<QUrl> urls; QList <Phonon::MediaSource> sources; DBMainWindow *dm2; QTableWidgetItem *item; BackendDialog *bkdiag; HelpDialog *hdiag; qreal volume; qint64 currenttime; }; //Phonon::MediaObject MainWindow::med; //DropWidget MainWindow::dwidget; #endif // MAINWINDOW_H
#include "mediaplayer2.h" #include "dropwidget.h" #include "mainwindow.h" #include "mpris2.h" #include "codeine.h" #include <QtDBus/QDBusAbstractAdaptor> #include <QApplication> MediaPlayer2::MediaPlayer2(QObject * parent) : QDBusAbstractAdaptor(parent) { connect(MainWindow::med,SIGNAL(hasVideoChanged(bool)),this,SLOT(emitFullscreenChange(bool))); } bool MediaPlayer2::CanQuit() const { return true; } bool MediaPlayer2::Fullscreen() const { return MainWindow::dwidget->isFullScreen(); } void MediaPlayer2::setFullscreen(bool fullscreen) const { MainWindow::dwidget->setFullScreen(fullscreen); } bool MediaPlayer2::CanSetFullscreen() const { return MainWindow::med->hasVideo(); } void MediaPlayer2::quit() { } void MediaPlayer2::emitFullscreenChange(bool fullscreen) const { QVariantMap properties; properties["Fullscreen"] = fullscreen; properties["CanSetFullscreen"] = CanSetFullscreen(); Mpris2::signalPropertiesChange(this,properties); }
#ifndef MEDIAPLAYER2_H #define MEDIAPLAYER2_H #include "codeine.h" #include<QtDBus/QDBusAbstractAdaptor> class MediaPlayer2 :QDBusAbstractAdaptor { Q_OBJECT Q_PROPERTY(bool CanQuit READ CanQuit) Q_PROPERTY(bool Fullscreen READ Fullscreen WRITE setFullscreen) Q_PROPERTY(bool CanSetFullscreen READ CanSetFullscreen) public: MediaPlayer2(QObject* parent); bool CanQuit() const; bool Fullscreen() const; void setFullscreen(bool fullscreen) const; bool CanSetFullscreen() const; public slots: void quit(); private slots: void emitFullscreenChange(bool fullscreen) const; }; #endif // MEDIAPLAYER2_H
#include "mediaplayer2player.h" #include "mainwindow.h" #include "mpris2.h" #include "dropwidget.h" #include "codeine.h" #include <QtDBus/QDBusAbstractAdaptor> #include <QCryptographicHash> static QByteArray makeTrackId(const QString& source) { return QByteArray("/org/kde/") + APP_NAME + "/tid_" + QCryptographicHash::hash(source.toLocal8Bit(), QCryptographicHash::Sha1).toHex(); } MediaPlayer2Player::MediaPlayer2Player(QObject *parent): QDBusAbstractAdaptor(parent) { connect(MainWindow::med,SIGNAL(currentSourceChanged(Phonon::MediaSource)),this,SLOT(currentSourceChanged())); } bool MediaPlayer2Player::CanGoNext() const { return false; } bool MediaPlayer2Player::CanGoPrevious() const { return false; } bool MediaPlayer2Player::CanPlay() const { return true; } bool MediaPlayer2Player::CanPause() const { return MainWindow::med->state()!= Phonon::ErrorState; } QVariantMap MediaPlayer2Player::Metadata() const { QVariantMap metadata; switch(MainWindow::med->currentSource().type()) { case Phonon::MediaSource::Invalid: case Phonon::MediaSource::Empty: break; default: metadata["mpris:length"]=MainWindow::med->totalTime(); } return metadata; } void MediaPlayer2Player::Next() const { //MainWindow::on_actionFoward_triggered(); } void MediaPlayer2Player::Previous() const { //MainWindow::on_actionBack_triggered(); } void MediaPlayer2Player::Pause() const { MainWindow::med->pause(); } void MediaPlayer2Player::Stop() const { MainWindow::med->stop(); } void MediaPlayer2Player::Play() const { MainWindow::med->play(); } void MediaPlayer2Player::currentSourceChanged() const { QVariantMap properties; properties["Metadata"] = Metadata(); Mpris2::signalPropertiesChange(this, properties); }
#ifndef MEDIAPLAYER2PLAYER_H #define MEDIAPLAYER2PLAYER_H #include "codeine.h" #include<QtDBus/QDBusAbstractAdaptor> #include <Phonon/MediaSource> #include<QtDBus/QDBusObjectPath> #include <QVariantMap> class MediaPlayer2Player: public QDBusAbstractAdaptor { Q_OBJECT Q_PROPERTY(bool CanGoNext READ CanGoNext) Q_PROPERTY(bool CanGoPrevious READ CanGoPrevious) Q_PROPERTY(bool CanPlay READ CanPlay) Q_PROPERTY(bool CanPause READ CanPause) public: MediaPlayer2Player(QObject * parent); bool CanGoNext() const; bool CanGoPrevious() const; bool CanPlay() const; bool CanPause() const; QVariantMap Metadata() const; public slots: void Next() const; void Previous() const; void Pause() const; void Stop() const; void Play() const; private slots: void currentSourceChanged() const; }; #endif // MEDIAPLAYER2PLAYER_H
#include "mpris2.h" #include "mediaplayer2.h" #include "mediaplayer2player.h" #include "codeine.h" #include <QtDBus/QDBusConnection> #include <QtDBus/QDBusMessage> #include <QMetaClassInfo> #include <QStringList> #include <unistd.h> Mpris2::Mpris2(QObject *parent) : QObject(parent) { QString mpris2Name("org.mpris.MediaPlayer2.WebPhonon"); bool success = QDBusConnection::sessionBus().registerService(mpris2Name); if (!success) success = QDBusConnection::sessionBus().registerService(mpris2Name + ".instance" + QString::number(getpid())); if (success) { new MediaPlayer2(this); new MediaPlayer2Player(this); QDBusConnection::sessionBus().registerObject("/org/mpris/MediaPlayer2", this, QDBusConnection::ExportAdaptors); } } void Mpris2::signalPropertiesChange(const QObject *adaptor, const QVariantMap &properties) { QDBusMessage msg=QDBusMessage::createSignal("/org/mpris/MediaPlayer2","org.freedesktop.DBus.Properties","PropertiesChanged"); QVariantList args; args<<adaptor->metaObject()->classInfo(0).value(); args<<properties; args<<QStringList(); msg.setArguments(args); QDBusConnection::sessionBus().send(msg); }
#ifndef MPRIS2_H #define MPRIS2_H #include "codeine.h" #include <QObject> #include <QVariantMap> class Mpris2 : public QObject { Q_OBJECT public: explicit Mpris2(QObject *parent = 0); static void signalPropertiesChange(const QObject* adaptor, const QVariantMap& properties); signals: public slots: }; #endif // MPRIS2_H
>> Visit http://mail.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<