Difference between revisions of "Development/Tutorials/Phonon/Simple Media Player"
Neverendingo (talk | contribs) m (Text replace - "</code>" to "</syntaxhighlight>") |
(add simple media player example from kde git, remove not be used parts from original tutorial, new ones need to be written) |
||
Line 1: | Line 1: | ||
<!-- TODO: Link classes to apidox --> | <!-- TODO: Link classes to apidox --> | ||
+ | ==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. | 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. | ||
+ | [[image:Phonon-tutorial2.png|frame|center]] | ||
− | = | + | ==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 <tt>main()</tt> function is needed. We implement a simple one in main.cpp: | ||
+ | <syntaxhighlight lang="cpp-qt"> | ||
+ | #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].com>")); | ||
+ | KCmdLineArgs::init(argc, argv, &aboutData); | ||
+ | KApplication app; | ||
+ | |||
+ | MainWindow *window = new MainWindow(); | ||
+ | window->show(); | ||
+ | |||
+ | return app.exec(); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===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: | |
− | + | <syntaxhighlight lang="cpp-qt"> | |
− | + | #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 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | ===mainwindow.cpp=== | |
+ | <syntaxhighlight lang="cpp-qt"> | ||
+ | #include "mainwindow.h" | ||
+ | |||
+ | #include <QtGui/QHBoxLayout> | ||
+ | |||
+ | #include <KApplication> | ||
+ | #include <KFileDialog> | ||
+ | #include <KLineEdit> | ||
+ | #include <KPushButton> | ||
− | + | #include <Phonon/AudioOutput> | |
− | < | + | #include <Phonon/MediaObject> |
− | #include < | + | #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(); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
− | + | ==Build== | |
+ | ===CMakeLists.txt=== | ||
+ | We first begin by writing a CMakeLists.txt file which is used by CMake to generate a proper Makefile for building: | ||
− | + | <syntaxhighlight lang="cmake"> | |
+ | 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}) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Here we link our example against phonon. | |
− | <syntaxhighlight lang=" | + | ===Make And Run=== |
− | + | <syntaxhighlight lang="bash"> | |
+ | cmake . && make && ./phonon_tutorial2 | ||
</syntaxhighlight> | </syntaxhighlight> |
Revision as of 16:12, 10 May 2013
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