954,496 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Qt Media Player

I'm creating a media player with Qt & the phonon module:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <fstream>
#include <string.h>
#include <stdlib.h>
#include <QtGui>

void MainWindow::slotFinished(){
    int index = sources.indexOf(mediaObject->currentSource()) + 1;
    mediaObject->enqueue(sources.at(index));
    setLabelNowPlaying();
}

std::string ExtractFilename( const std::string& path )
{
  return path.substr( path.find_last_of( '/' ) +1 );
}


void MainWindow::setLabel(const QString &s){
    ui->label->setText(s);
    //qDebug() << "s = " << s;

}

void MainWindow::setLabelNowPlaying(){
    std::string stds;
    stds = "Now playing: ";
    std::string filename;
    filename = mediaObject->currentSource().fileName().toStdString();

    std::string file;

    file = ExtractFilename(filename);

    stds += file;
    setLabel( QString::fromStdString( stds ) );
}

void MainWindow::loadfromfile(std::string filename){
    try{
         std::ifstream file(filename.c_str());
         if (file.is_open()){
             char str[2000];
             bool firsttime = true;
             int index;
             while(!file.eof()){
                file.getline(str,2000);
                if (firsttime){
                    index = atoi(str);
                    if (index == -1){
                        std::cout << "ahh\n";
                        return;
                    }
                    firsttime = false;
                }else{
                    Phonon::MediaSource source(str);
                    sources.append(source);
                    std::cout << str << "\n";
                }
             }
             if (!firsttime){
                mediaObject->setCurrentSource(sources.at(index));
            }
        }
     }catch (int a){}
}

void MainWindow::saveToFile(std::string filename){
    std::ofstream file(filename.c_str());
    file << sources.indexOf(mediaObject->currentSource()) << "\n";
    foreach(Phonon::MediaSource s, sources){
        file << s.fileName().toStdString() << "\n";
    }
}

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
     audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this);
     mediaObject = new Phonon::MediaObject(this);
     metaInformationResolver = new Phonon::MediaObject(this);
     Phonon::createPath(mediaObject, audioOutput);
     connect(mediaObject, SIGNAL(aboutToFinish()), SLOT(slotFinished()));

     std::string home = getenv("HOME");
     home += "/.mped/default.session";
     std::cout << home << "\n";

     try{
        loadfromfile(home);
     }catch (int a){
     }

     ui->setupUi(this);
     statusBar()->showMessage("Imported default.session",7000);

}

void MainWindow::playPause()
{
    switch (mediaObject->state()){
        case Phonon::PlayingState:
            mediaObject->pause();
            ui->pushButtonPlay->setChecked(false);
            setLabel("Paused");
            break;
        case Phonon::PausedState:
            mediaObject->play();
            setLabelNowPlaying();
            break;
        case Phonon::StoppedState:
            mediaObject->play();
            setLabelNowPlaying();
            break;
        case Phonon::LoadingState:
            ui->pushButtonPlay->setChecked(false);
            setLabel("Paused");
            break;
    }
}

void MainWindow::addFiles()
{
    QStringList files = QFileDialog::getOpenFileNames(this, tr("Select Music Files"),
        QDesktopServices::storageLocation(QDesktopServices::MusicLocation));

    ui->pushButtonPlay->setChecked(false);
    if (files.isEmpty())
        return;
    int index = sources.size();
    foreach (QString string, files) {
            Phonon::MediaSource source(string);
            sources.append(source);
    }
    if (!sources.isEmpty()){
        metaInformationResolver->setCurrentSource(sources.at(0));
        mediaObject->setCurrentSource(metaInformationResolver->currentSource());

    }
}


void MainWindow::nextFile()
{

    int index = sources.indexOf(mediaObject->currentSource()) + 1;

    if (sources.size() > index) {
         mediaObject->stop();
         mediaObject->setCurrentSource(sources.at(index));
         mediaObject->play();
         setLabelNowPlaying();
     }
}

void MainWindow::lastFile(){
    int index = sources.indexOf(mediaObject->currentSource()) - 1;

    mediaObject->stop();
    try{
    mediaObject->setCurrentSource(sources.at(index));
    }catch(int e){}
    mediaObject->play();
    setLabelNowPlaying();
}

void MainWindow::shuffle(){
    mediaObject->stop();
    std::random_shuffle(sources.begin(), sources.end());
    mediaObject->setCurrentSource(sources.at(0));
    setLabel("Paused");
 }

void MainWindow::clear(){
    mediaObject->stop();
    sources.clear();
    setLabel("Paused");
}

void MainWindow::first(){
    mediaObject->stop();
    mediaObject->setCurrentSource(sources.at(0));
    mediaObject->play();
    setLabelNowPlaying();
}

void MainWindow::open(){
    QString filename = QFileDialog::getOpenFileName(this, tr("Select session file"),
        QDesktopServices::storageLocation(QDesktopServices::MusicLocation));
    if (filename == "" || filename == NULL){
        return;
    }
     loadfromfile(filename.toStdString());
     mediaObject->setCurrentSource(sources.at(0));
}

void MainWindow::save(){
    QString filename = QFileDialog::getOpenFileName(this, tr("Select session file"),
        QDesktopServices::storageLocation(QDesktopServices::MusicLocation));
    if (filename == "" || filename == NULL){
        return;
    }
    saveToFile(filename.toStdString());
}

void MainWindow::about(){
    QMessageBox::about(this,"About MPED",
                "MPED 0.1\n\n"
                "MPED was written by Matthew Hall <pymatio@googlemail.com>\n\n"
                "MPED is release under the GPL.\n");

}

void MainWindow::aboutToFinish()
{

    int index = sources.indexOf(mediaObject->currentSource()) + 1;

     if (sources.size() > index) {
         mediaObject->enqueue(sources.at(index));
     } else {
         ui->pushButtonPlay->setChecked(false);
     }

}

void MainWindow::finished()
{

         ui->pushButtonPlay->setChecked(false);
         setLabel("Paused");

}



MainWindow::~MainWindow()
{
    std::string home = getenv("HOME");
    home += "/.mped/default.session";
    std::ofstream file(home.c_str());
    file << sources.indexOf(mediaObject->currentSource()) << "\n";
    foreach(Phonon::MediaSource s, sources){
        file << s.fileName().toStdString() << "\n";
    }
    delete ui;
}

when run if you press the next button twice it stays on the same track, also it sometimes jumps to tracks along, why?

pymatio
Light Poster
48 posts since Jun 2009
Reputation Points: 10
Solved Threads: 0
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You
View similar articles that have also been tagged: