doc/src/frameworks-technologies/phonon.qdoc
changeset 7 f7bc934e204c
equal deleted inserted replaced
3:41300fa6a67c 7:f7bc934e204c
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the documentation of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 /*!
       
    43     \page phonon-overview.html
       
    44     \title Phonon Overview
       
    45     \ingroup frameworks-technologies
       
    46 
       
    47     \tableofcontents
       
    48 
       
    49     \section1 Introduction
       
    50 
       
    51     Qt uses the Phonon multimedia framework to provide functionality
       
    52     for playback of the most common multimedia formats. The media can
       
    53     be read from files or streamed over a network, using a QURL to a
       
    54     file.
       
    55 
       
    56     In this overview, we take a look at the main concepts of Phonon.
       
    57     We also explain the architecture, examine the
       
    58     core API classes, and show examples on how to use the classes
       
    59     provided.
       
    60 
       
    61     \section1 Architecture
       
    62 
       
    63     Phonon has three basic concepts: media objects, sinks, and paths.
       
    64     A media object manages a media source, for instance, a music file;
       
    65     it provides simple playback control, such as starting, stopping,
       
    66     and pausing the playback. A sink outputs the media from Phonon,
       
    67     e.g., by rendering video on a widget, or by sending audio to a
       
    68     sound card. Paths are used to connect Phonon objects, i.e., a
       
    69     media object and a sink, in a graph - called a media graph in
       
    70     Phonon.
       
    71 
       
    72     As an example, we show a media graph for an audio stream:
       
    73 
       
    74     \image conceptaudio.png
       
    75 
       
    76     The playback is started and managed by the media object, which
       
    77     send the media stream to any sinks connected to it by a path. The
       
    78     sink then plays the stream back, usually though a sound card.
       
    79 
       
    80     \omit Not sure if this goes here, or anywhere...
       
    81     All nodes in the graph are synchronized by the framework,
       
    82     meaning that if more than one sink is connected to the same
       
    83     media object, the framework will handle the synchronization
       
    84     between the sinks; this happens for instance when a media
       
    85     source containing video with sound is played back. More on
       
    86     this later.
       
    87     \endomit
       
    88 
       
    89     \section2 Media Objects
       
    90 
       
    91     The media object, an instance of the \l{Phonon::}{MediaObject}
       
    92     class, lets you start, pause, and stop the playback of a media
       
    93     stream, i.e., it provided basic control over the playback. You may
       
    94     think of the object as a simple media player.
       
    95 
       
    96     The media data is provided by a media source, which is
       
    97     kept by the media object. The media source is a separate
       
    98     object - an instance of \l{Phonon::}{MediaSource} - in Phonon, and
       
    99     not part of the graph itself. The source will supply the media
       
   100     object with raw data. The data can be read from files and streamed
       
   101     over a network. The contents of the source will be interpreted by
       
   102     the media object.
       
   103 
       
   104     A media object is always instantiated with the default constructor
       
   105     and then supplied with a media source. Concrete code examples are
       
   106     given later in this overview.
       
   107 
       
   108     As a complement to the media object, Phonon also provides
       
   109     \l{Phonon::}{MediaController}, which provides control over
       
   110     features that are optional for a given media. For instance, for
       
   111     chapters, menus, and titles of a VOB (DVD) file will be features
       
   112     managed by a \l{Phonon::}{MediaController}.
       
   113 
       
   114     \section2 Sinks
       
   115 
       
   116     A sink is a node that can output media from the graph, i.e., it
       
   117     does not send its output to other nodes. A sink is usually a
       
   118     rendering device.
       
   119 
       
   120     The input of sinks in a Phonon media graph comes from a
       
   121     \l{Phonon::}{MediaObject}, though it might have been processed
       
   122     through other nodes on the way.
       
   123 
       
   124     While the \l{Phonon::}{MediaObject} controls the playback, the
       
   125     sink has basic controls for manipulation of the media. With an
       
   126     audio sink, for instance, you can control the volume and mute the
       
   127     sound, i.e., it represents a virtual audio device. Another example
       
   128     is the \l{Phonon::}{VideoWidget}, which can render video on a
       
   129     QWidget and alter the brightness, hue, and scaling of the video.
       
   130 
       
   131     As an example we give an image of a graph used for playing back a
       
   132     video file with sound.
       
   133 
       
   134     \image conceptvideo.png
       
   135 
       
   136     \section2 Processors
       
   137 
       
   138     Phonon does not allow manipulation of media streams directly,
       
   139     i.e., one cannot alter a media stream's bytes programmatically
       
   140     after they have been given to a media object. We have other nodes
       
   141     to help with this: processors, which are placed in the graph on
       
   142     the path somewhere between the media object and its sinks. In
       
   143     Phonon, processors are of the \l{Phonon::}{Effect} class.
       
   144 
       
   145     When inserted into the rendering process, the  processor will
       
   146     alter the media stream, and will be active as long as it is part
       
   147     of the graph. To stop, it needs to be removed.
       
   148 
       
   149     \omit \image conceptprocessor.png \endomit
       
   150 
       
   151     The \c {Effect}s may also have controls that affect how the media
       
   152     stream is manipulated. A processor applying a depth effect to
       
   153     audio, for instance, can have a value controlling the amount of
       
   154     depth. An \c Effect can be configured at any point in time.
       
   155 
       
   156     \section1 Playback
       
   157 
       
   158     In some common cases, it is not necessary to build a graph
       
   159     yourself.
       
   160 
       
   161     Phonon has convenience functions for building common graphs. For
       
   162     playing an audio file, you can use the
       
   163     \l{Phonon::}{createPlayer()} function. This will set up the
       
   164     necessary graph and return the media object node; the sound can
       
   165     then be started by calling its \l{Phonon::MediaObject::}{play()}
       
   166     function.
       
   167 
       
   168     \snippet snippets/phonon.cpp 0
       
   169 
       
   170     We have a similar solution for playing video files, the
       
   171     \l{Phonon::}{VideoPlayer}.
       
   172 
       
   173     \snippet snippets/phonon.cpp 1
       
   174 
       
   175     The VideoPlayer is a widget onto which the video will be drawn. 
       
   176 
       
   177     The \c .pro file for a project needs the following line to be added:
       
   178 
       
   179     \snippet doc/src/snippets/code/doc_src_phonon.qdoc 0
       
   180 
       
   181     Phonon comes with several widgets that provide functionality
       
   182     commonly associated with multimedia players - notably SeekSlider
       
   183     for controlling the position of the stream, VolumeSlider for
       
   184     controlling sound volume, and EffectWidget for controlling the
       
   185     parameters of an effect. You can learn about them in the API
       
   186     documentation.
       
   187 
       
   188     \section1 Building Graphs
       
   189 
       
   190     If you need more freedom than the convenience functions described
       
   191     in the previous section offers you, you can build the graphs
       
   192     yourself. We will now take a look at how some common graphs are
       
   193     built. Starting a graph up is a matter of calling the
       
   194     \l{Phonon::MediaObject::}{play()} function of the media object.
       
   195 
       
   196     If the media source contains several types of media, for instance, a
       
   197     stream with both video and audio, the graph will contain two
       
   198     output nodes: one for the video and one for the audio. 
       
   199 
       
   200     We will now look at the code required to build the graphs discussed
       
   201     previously in the \l{Architecture} section. 
       
   202 
       
   203     \section2 Audio
       
   204 
       
   205     When playing back audio, you create the media object and connect
       
   206     it to an audio output node - a node that inherits from
       
   207     AbstractAudioOutput. Currently, AudioOutput, which outputs audio
       
   208     to the sound card, is provided.
       
   209 
       
   210     The code to create the graph is straight forward:
       
   211 
       
   212     \snippet snippets/phonon.cpp 2
       
   213 
       
   214     Notice that the type of media an input source has is resolved by
       
   215     Phonon, so you need not be concerned with this. If a source
       
   216     contains multiple media formats, this is also handled
       
   217     automatically.
       
   218 
       
   219     The media object is always created using the default constructor
       
   220     since it handles all multimedia formats.
       
   221 
       
   222     The setting of a Category, Phonon::MusicCategory in this case,
       
   223     does not affect the actual playback; the category can be used by
       
   224     KDE to control the playback through, for instance, the control
       
   225     panel.
       
   226 
       
   227     \omit Not sure about this
       
   228     Users of KDE can often also choose to send sound with the
       
   229     CommunicationCategory, e.g., given to VoIP, to their headset,
       
   230     while sound with MusicCategory is sent to the sound card.
       
   231     \endomit
       
   232 
       
   233     The AudioOutput class outputs the audio media to a sound card,
       
   234     that is, one of the audio devices of the operating system. An
       
   235     audio device can be a sound card or a intermediate technology,
       
   236     such as \c DirectShow on windows. A default device will be chosen
       
   237     if one is not set with \l{Phonon::AudioOutput::}{setOutputDevice()}.
       
   238 
       
   239     The AudioOutput node will work with all audio formats supported by
       
   240     the back end, so you don't need to know what format a specific
       
   241     media source has.
       
   242 
       
   243     For a an extensive example of audio playback, see the \l{Music
       
   244     Player Example}{Phonon Music Player}.
       
   245 
       
   246     \section3 Audio Effects
       
   247 
       
   248     Since a media stream cannot be manipulated directly, the backend
       
   249     can produce nodes that can process the media streams. These nodes
       
   250     are inserted into the graph between a media object and an output
       
   251     node.
       
   252 
       
   253     Nodes that process media streams inherit from the Effect class.
       
   254     The effects available depends on the underlying system. Most of
       
   255     these effects will be supported by Phonon. See the \l{Querying
       
   256     Backends for Support} section for information on how to resolve
       
   257     the available effects on a particular system.
       
   258 
       
   259     We will now continue the example from above using the Path
       
   260     variable \c path to add an effect. The code is again trivial:
       
   261 
       
   262     \snippet snippets/phonon.cpp 3
       
   263 
       
   264     Here we simply take the first available effect on the system.
       
   265 
       
   266     The effect will start immediately after being inserted into the
       
   267     graph if the media object is playing. To stop it, you have to
       
   268     detach it again using \l{Phonon::Path::}{removeEffect()} of the Path.
       
   269 
       
   270     \section2 Video
       
   271 
       
   272     For playing video, VideoWidget is provided. This class functions
       
   273     both as a node in the graph and as a widget upon which it draws
       
   274     the video stream. The widget will automatically choose an available
       
   275     device for playing the video, which is usually a technology
       
   276     between the Qt application and the graphics card, such as \c
       
   277     DirectShow on Windows.
       
   278 
       
   279     The video widget does not play the audio (if any) in the media
       
   280     stream. If you want to play the audio as well, you will need
       
   281     an AudioOutput node. You create and connect it to the graph as
       
   282     shown in the previous section.
       
   283 
       
   284     The code for creating this graph is given below, after which
       
   285     one can play the video with \l{Phonon::MediaObject::}{play()}.
       
   286 
       
   287     \snippet snippets/phonon.cpp 4
       
   288 
       
   289     The VideoWidget does not need to be set to a Category, it is
       
   290     automatically classified to \l{Phonon::}{VideoCategory}, we only
       
   291     need to assure that the audio is also classified in the same
       
   292     category.
       
   293 
       
   294     The media object will split files with different media content
       
   295     into separate streams before sending them off to other nodes in
       
   296     the graph. It is the media object that determines the type of
       
   297     content appropriate for nodes that connect to it.
       
   298 
       
   299     \omit This section is from the future
       
   300 
       
   301     \section2 Multiple Audio Sources and Graph Outputs
       
   302 
       
   303     In this section, we take a look at a graph that contains multiple
       
   304     audio sources in addition to video. We have a video camera with
       
   305     some embarrassing home footage from last weekend's party, a
       
   306     microphone with which we intend to add commentary, and an audio
       
   307     music file to set the correct mood. It would be an advantage to
       
   308     write the graph output to a file for later viewing, but since this
       
   309     is not yet supported by Qt backends, we will play it back
       
   310     directly.
       
   311 
       
   312     <image of party graph>
       
   313 
       
   314     <code>
       
   315 
       
   316     <code walkthrough>
       
   317 
       
   318     \endomit
       
   319 
       
   320     \section1 Backends
       
   321 
       
   322     The multimedia functionality is not implemented by Phonon itself,
       
   323     but by a back end - often also referred to as an engine. This
       
   324     includes connecting to, managing, and driving the underlying
       
   325     hardware or intermediate technology. For the programmer, this
       
   326     implies that the media nodes, e.g., media objects, processors, and
       
   327     sinks, are produced by the back end. Also, it is responsible for
       
   328     building the graph, i.e., connecting the nodes.
       
   329 
       
   330     The backends of Qt use the media systems DirectShow (which
       
   331     requires DirectX) on Windows, QuickTime on Mac, and GStreamer on
       
   332     Linux. The functionality provided on the different platforms are
       
   333     dependent on these underlying systems and may vary somewhat, e.g.,
       
   334     in the media formats supported.
       
   335 
       
   336     Backends expose information about the underlying system. It can
       
   337     tell which media formats are supported, e.g., \c AVI, \c mp3, or
       
   338     \c OGG.
       
   339 
       
   340     A user can often add support for new formats and filters to the
       
   341     underlying system, by, for instance, installing the DivX codex. We
       
   342     can therefore not give an exact overview of which formats are
       
   343     available with the Qt backends.
       
   344 
       
   345     \omit Not sure I want a separate section for this
       
   346     \section2 Communication with the Backends
       
   347 
       
   348     We cooperate with backends through static functions in the
       
   349     Phonon namespace. We have already seen some of these functions
       
   350     in code examples. Their two main responsibilities are creating
       
   351     graph nodes and supplying information about the capabilities
       
   352     of the various nodes. The nodes uses the backend internally
       
   353     when created, so it is only connecting them in the graph that
       
   354     you need to use the backend directly.
       
   355 
       
   356     The main functions for graph building are:
       
   357 
       
   358     \list
       
   359         \o createPath(): This function creates a path between to
       
   360                          nodes, which it takes as arguments.
       
   361         \o 
       
   362     \endlist
       
   363 
       
   364     For more detailed information, please consult the API
       
   365     documentation.
       
   366 
       
   367     \endomit
       
   368 
       
   369     \section2 Querying Backends for Support
       
   370 
       
   371     As mentioned, Phonon depends on the backend to provide its
       
   372     functionality. Depending on the individual backend, full support
       
   373     of the API may not be in place. Applications therefore need to
       
   374     check with the backend if functionality they require is
       
   375     implemented. In this section, we take look at how this is done.
       
   376 
       
   377     The backend provides the
       
   378     \l{Phonon::BackendCapabilities::}{availableMimeTypes()} and
       
   379     \l{Phonon::BackendCapabilities::}{isMimeTypeAvailable()} functions
       
   380     to query which MIME types the backend can produce nodes for. The
       
   381     types are listed as strings, which for any type is equal for any
       
   382     backend or platform.
       
   383 
       
   384     The backend will emit a signal -
       
   385     \l{Phonon::BackendCapabilities::}{Notifier::capabilitiesChanged()}
       
   386     - if its abilities have changed. If the available audio devices
       
   387     have changed, the
       
   388     \l{Phonon::BackendCapabilities::}{Notifier::availableAudioOutputDevicesChanged()}
       
   389     signal is emitted instead.
       
   390 
       
   391     To query the actual audio devices possible, we have the
       
   392     \l{Phonon::BackendCapabilities::}{availableAudioOutputDevices()} as
       
   393     mentioned in the \l{#Sinks}{Sinks} section. To query information
       
   394     about the individual devices, you can examine its \c name(); this
       
   395     string is dependent on the operating system, and the Qt backends
       
   396     does not analyze the devices further.
       
   397 
       
   398     The sink for playback of video does not have a selection of
       
   399     devices. For convenience, the \l{Phonon::}{VideoWidget} is both a
       
   400     node in the graph and a widget on which the video output is
       
   401     rendered. To query the various video formats available, use
       
   402     \l{Phonon::BackendCapabilities::}{isMimeTypeAvailable()}.  To add
       
   403     it to a path, you can use the Phonon::createPath() as usual. After
       
   404     creating a media object, it is also possible to call its
       
   405     \l{Phonon::MediaObject::}{hasVideo()} function.
       
   406 
       
   407     See also the \l{Capabilities Example}.
       
   408 
       
   409     \section1 Installing Phonon
       
   410 
       
   411     When running the Qt configure script, you will be notified whether
       
   412     Phonon support is available on your system. As mentioned
       
   413     previously, to use develop and run Phonon applications, you also
       
   414     need to link to a backend, which provides the multimedia
       
   415     functionality.
       
   416 
       
   417     Note that Phonon applications will compile and run without a
       
   418     working backend, but will, of course, not work as expected.
       
   419 
       
   420     The following sections explains requirements for each backend.
       
   421 
       
   422     \section2 Windows
       
   423 
       
   424     On Windows, building Phonon requires DirectX and DirectShow
       
   425     version 9 or higher. You'll need additional SDKs you can download
       
   426     from Microsoft.
       
   427 
       
   428     \section3 Windows XP and later Windows versions
       
   429 
       
   430     If you develop for Windows XP and up, you should download the Windows SDK
       
   431     \l{http://www.microsoft.com/downloads/details.aspx?FamilyID=e6e1c3df-a74f-4207-8586-711ebe331cdc&amp;DisplayLang=en}{here}.
       
   432     Before building Qt, just call the script: \c {C:\Program Files\Microsoft SDKs\Windows\v6.1\Bin\setenv.cmd}
       
   433 
       
   434     \note Visual C++ 2008 already contains the Windows SDK and doesn't
       
   435     need that package and has already the environment set up for a
       
   436     smooth compilation of phonon.
       
   437 
       
   438     \section3 Earlier Windows versions than Windows XP
       
   439 
       
   440     If you want to support previous Windows versions, you should download and install the Platform SDK. You find it
       
   441     \l{http://www.microsoft.com/downloads/details.aspx?FamilyId=0BAF2B35-C656-4969-ACE8-E4C0C0716ADB&amp;displaylang=en}{here}.
       
   442 
       
   443     \note The platform SDK provided with Visual C++ is not
       
   444     complete and
       
   445     you'll need this one to have DirectShow 9.0 support. You can download the DirectX SDK
       
   446     \l{http://www.microsoft.com/downloads/details.aspx?familyid=09F7578C-24AA-4E0A-BF91-5FEC24C8C7BF&amp;displaylang=en}{here}.
       
   447 
       
   448     \section3 Setting up the environment
       
   449 
       
   450     Once the SDKs are installed, please make sure to set your
       
   451     environment variables LIB and INCLUDE correctly. The paths to the
       
   452     include and lib directory of the SDKs should appear first.
       
   453     Typically, to setup your environment, you would execute the
       
   454     following script:
       
   455 
       
   456     \code
       
   457         Set DXSDK_DIR=C:\Program Files\Microsoft DirectX SDK (February 2007)
       
   458         %DXSDK_DIR%\utilities\bin\dx_setenv.cmd
       
   459         C:\program files\Microsoft Platform SDK\setenv.cmd
       
   460     \endcode
       
   461 
       
   462     If your environment is setup correctly, executing configure.exe on
       
   463     your Qt installation should automatically activate Phonon.
       
   464 
       
   465     \warning The MinGW version of Qt does not support building the
       
   466              Qt backend.
       
   467 
       
   468     \section2 Linux
       
   469 
       
   470     The Qt backend on Linux uses GStreamer (minimum version is 0.10),
       
   471     which must be installed on the system. At a minimum, you need the
       
   472     GStreamer library and base plugins, which provides support for \c
       
   473     .ogg files. The package names may vary between Linux
       
   474     distributions; on Mandriva, they have the following names:
       
   475 
       
   476     \table
       
   477         \header
       
   478             \o Package
       
   479             \o Description
       
   480         \row
       
   481             \o libgstreamer0.10_0.10
       
   482             \o The GStreamer base library.
       
   483         \row
       
   484             \o libgstreamer0.10_0.10-devel
       
   485             \o Contains files for developing applications with
       
   486                GStreamer.
       
   487         \row
       
   488             \o libgstreamer-plugins-base0.10
       
   489             \o Contains the basic plugins for audio and video
       
   490                playback, and will enable support for \c ogg files.
       
   491         \row
       
   492             \o libgstreamer-plugins-base0.10-devel
       
   493             \o Makes it possible to develop applications using the
       
   494                base plugins.
       
   495     \endtable
       
   496 
       
   497     \omit Should go in troubleshooting (in for example README)
       
   498     alsasink backend for GStreamer
       
   499     \table
       
   500         \header
       
   501             \o Variable
       
   502             \o Description
       
   503         \row
       
   504             \o PHONON_GST_AUDIOSINK
       
   505             \o Sets the audio sink to be used. Possible values are
       
   506                ... alsasink.
       
   507         \row
       
   508             \o PHONON_GSTREAMER_DRIVER
       
   509             \o Sets the driver for GStreamer. This driver will
       
   510                usually be configured automatically when
       
   511                installing.
       
   512         \row
       
   513             \o PHONON_GST_VIDEOWIDGET
       
   514             \o This variable can be set to the name of a widget to
       
   515                use as the video widget??
       
   516         \row
       
   517             \o PHONON_GST_DEBUG
       
   518             \o Phonon will give debug information while running if
       
   519                this variable is set to a number between 1 and 3.
       
   520         \row
       
   521             \o PHONON_TESTURL
       
   522             \o ...
       
   523     \endtable
       
   524     \endomit
       
   525 
       
   526     \section2 Mac OS X
       
   527 
       
   528     On Mac OS X, Qt uses QuickTime for its backend. The minimum
       
   529     supported version is 7.0.
       
   530 
       
   531     \section1 Deploying Phonon Applications on Windows and Mac OS X
       
   532 
       
   533     On Windows and Mac OS X, the Qt backend makes use of the
       
   534     \l{QtOpenGL Module}{QtOpenGL} module. You therefore need to deploy
       
   535     the QtOpenGL shared library. If this is not what you want, it is
       
   536     possible to configure Qt without OpenGL support. In that case, you
       
   537     need to run \c configure with the \c -no-opengl option.
       
   538 
       
   539     \section1 Work in Progress
       
   540 
       
   541     Phonon and its Qt backends, though fully functional for
       
   542     multimedia playback, are still under development. Functionality to
       
   543     come is the possibility to capture media and more processors for
       
   544     both music and video files.
       
   545 
       
   546     Another important consideration is to implement support for
       
   547     storing media to files; i.e., not playing back media directly.
       
   548 
       
   549     We also hope in the future to be able to support direct
       
   550     manipulation of media streams. This will give the programmer more
       
   551     freedom to manipulate streams than just through processors.
       
   552 
       
   553     Currently, the multimedia framework supports one input source. It will be
       
   554     possible to include several sources. This is useful in, for example, audio
       
   555     mixer applications where several audio sources can be sent, processed and
       
   556     output as a single audio stream.
       
   557 */
       
   558