Development/Tutorials/Phonon/Simple Media Player

From KDE TechBase
Revision as of 16:12, 10 May 2013 by Maidis (talk | contribs) (add simple media player example from kde git, remove not be used parts from original tutorial, new ones need to be written)

Abstract

One of the primary target audiences of Phonon is simple multimedia players. After following this tutorial, you will be able to create a minimal multimedia player application using C++, Phonon, Qt, and CMake.

The Code

This simple player application will consist of two .cpp files, one .h, and a CMakeLists.txt:

main.cpp

Like all executable binaries, a main() function is needed. We implement a simple one in main.cpp:

#include <KAboutData>
#include <KApplication>
#include <KCmdLineArgs>

#include "mainwindow.h"

int main(int argc, char *argv[])
{
  KAboutData aboutData("basicaudioplayer", 0,
                       ki18n("Basic Audio Player"), "1.0",
                       ki18n("A basic audio player using Phonon."),
                       KAboutData::License_BSD,
                       ki18n("Copyright (c) 2011-2013 Jon Ander Peñalba <[email protected]>"));
  KCmdLineArgs::init(argc, argv, &aboutData);
  KApplication app;

  MainWindow *window = new MainWindow();
  window->show();

  return app.exec();
}

mainwindow.h

Now that we have a working build environment, real work can begin. The first step is to build a simple GUI. In this simple player, the GUI will be nothing more than a simple QWidget with a few children. No fancy designer .ui files, no complicated file browser, no exciting features.

Copy the following code into your mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <KMainWindow>

class KLineEdit;
class KPushButton;

namespace Phonon {
class MediaObject;
}

class MainWindow : public KMainWindow
{
    Q_OBJECT

  public:
    MainWindow(QWidget *parent=0);

  private slots:
    void openFile();

  private:
    Phonon::MediaObject *media;

    KLineEdit *file_name;
    KPushButton *file_button;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"

#include <QtGui/QHBoxLayout>

#include <KApplication>
#include <KFileDialog>
#include <KLineEdit>
#include <KPushButton>

#include <Phonon/AudioOutput>
#include <Phonon/MediaObject>
#include <Phonon/SeekSlider>
#include <Phonon/VolumeSlider>

MainWindow::MainWindow(QWidget *parent)
    : KMainWindow(parent)
{
  // Create the widgets

  // File selector
  file_name = new KLineEdit("Open an audio file", this);
  file_button = new KPushButton("Open", this);
  file_name->setEnabled(false);
  connect(file_button, SIGNAL(clicked()), this, SLOT(openFile()));

  // Audio control
  Phonon::SeekSlider *seek = new Phonon::SeekSlider(this);
  KPushButton *play_button = new KPushButton("Play", this);
  KPushButton *pause_button = new KPushButton("Pause", this);
  KPushButton *stop_button = new KPushButton("Stop", this);
  Phonon::VolumeSlider *volume = new Phonon::VolumeSlider(this);
  volume->setOrientation(Qt::Vertical);

  // Define the layout
  // File stuff
  QHBoxLayout *file_layout = new QHBoxLayout(this);
  file_layout->addWidget(file_name);
  file_layout->addWidget(file_button);

  // Buttons
  QHBoxLayout *button_layout = new QHBoxLayout(this);
  button_layout->addWidget(play_button);
  button_layout->addWidget(pause_button);
  button_layout->addWidget(stop_button);

  // Seek slider
  QVBoxLayout *left_layout = new QVBoxLayout(this);
  left_layout->addWidget(seek);
  left_layout->addLayout(button_layout);

  // Volume slider
  QHBoxLayout *audio_layout = new QHBoxLayout(this);
  audio_layout->addLayout(left_layout);
  audio_layout->addWidget(volume);

  // Let's bring it all together
  QWidget *central_widget = new QWidget(this);
  QVBoxLayout *central_layout = new QVBoxLayout(this);
  central_layout->addLayout(file_layout);
  central_layout->addLayout(audio_layout);
  central_widget->setLayout(central_layout);
  setCentralWidget(central_widget);

  // Create the media and define the output
  media = new Phonon::MediaObject(this);
  Phonon::AudioOutput *output = new Phonon::AudioOutput(Phonon::MusicCategory, this);
  Phonon::createPath(media, output);

  // Connect the widgets to the audio
  seek->setMediaObject(media);
  volume->setAudioOutput(output);
  connect(play_button, SIGNAL(clicked()), media, SLOT(play()));
  connect(pause_button, SIGNAL(clicked()), media, SLOT(pause()));
  connect(stop_button, SIGNAL(clicked()), media, SLOT(stop()));
}

void MainWindow::openFile()
{
  QString file = KFileDialog::getOpenFileName();
  file_name->setText(file);
  media->setCurrentSource(file);
  media->play();
}

Build

CMakeLists.txt

We first begin by writing a CMakeLists.txt file which is used by CMake to generate a proper Makefile for building:

project (phonon_tutorial2)
find_package(KDE4 REQUIRED)
include (KDE4Defaults)
include_directories(${KDE4_INCLUDES})
set(phonon_tutorial2_SRCS main.cpp mainwindow.cpp)
kde4_add_executable(phonon_tutorial2 ${phonon_tutorial2_SRCS})
target_link_libraries(phonon_tutorial2 ${KDE4_KDEUI_LIBS} ${PHONON_LIBS} ${KDE4_KIO_LIBS})
install(TARGETS phonon_tutorial2  ${INSTALL_TARGETS_DEFAULT_ARGS})

Here we link our example against phonon.

Make And Run

cmake . && make && ./phonon_tutorial2