/*
    This file is part of the KDE project
    Copyright (C) 2005-2007 Matthias Kretz <kretz@kde.org>
    Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    Contact: Nokia Corporation (qt-info@nokia.com)

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License version 2 as published by the Free Software Foundation.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public License
    along with this library; see the file COPYING.LIB.  If not, write to
    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.
*/


/*!
    \enum Phonon::DiscType
    Enum to identify the media discs supported by MediaObject.

    \value NoDisc
    No disc was selected. This is only useful as a return value from
    MediaSource::diskType().
    \value Cd Identifies Audio CDs.
    \value Dvd Identifies DVDs (not arbitrary data DVDs, only movie DVDs).
    \value Vcd Identifies Video CDs.

    \sa MediaSource, MediaObject
*/

/*!
    \enum Phonon::MetaData

    Provided as keys for Phonon::MediaObject::metaData(). The enum
    values matches strings defined in the Ogg Vorbis specification

    \value ArtistMetaData
    \value AlbumMetaData
    \value TitleMetaData
    \value DateMetaData
    \value GenreMetaData
    \value TracknumberMetaData
    \value DescriptionMetaData
    \value MusicBrainzDiscIdMetaData
*/

/*!
    \enum Phonon::State
    \since 4.4

    The state enum describes the different states a media object can
    take. Several functions of \l{Phonon::}{MediaObject} are
    asynchronous, so even if a you have requested a state change
    through a function call, e.g., through
    \l{Phonon::MediaObject::}{play()}, you cannot be sure that the
    change has taken place before you receive the
    \l{Phonon::MediaObject::}{stateChanged()} signal.

    A media object can at any time change into any state, regardless
    of the state it previously had. \omit In the
    \l{Phonon::}{MediaObject} class description explains the typical
    state changes in the life of a media object. \endomit

    \value LoadingState
    After construction it might take a while before the media object
    is ready to \l{Phonon::MediaObject::}{play()}. This state is
    commonly used by backends to initialize the \l{Phonon
    Overview}{media graph} and loading the source. When
    the object leaves the loading state, it will enter the
    StoppedState unless an error occurred or another state is
    requested through a function call, e.g.,
    \l{Phonon::}{MediaObject::play()}.

    \value StoppedState
    In the stopped state, the media object is ready to play its
    current media source. The current
    \l{MediaObject::seek()}{position} in the media stream is then 0.

    \value PlayingState
    The media object is playing back its media source.

    \value BufferingState
    The Player is waiting for data to be able to start or continue
    playing. This state is commonly used to wait for media data over a
    network connection.

    \value PausedState
    The media player has currently paused its playback, i.e., it
    stops playing but keeps the current playback position in the
    stream.

    \value ErrorState
    When a media object enters the error state a problem with the
    playback has occurred. The possible errors are grouped into
    two categories by Phonon::ErrorType, and the type can be
    queried through \l{Phonon::MediaObject::}{errorType()}. A
    \l{Phonon::}{FatalError} implies that the playback
    cannot continue, but one can still try with a new media
    source. With a \l{Phonon::}{NormalError} it might
    be possible to continue playback, and a media object may
    therefore change state from the ErrorState.

    \sa MediaObject
*/

/*!
    \enum Phonon::Category

    Sets the category your program should be listed in in the mixer.

    \value NoCategory
    Will make use of the default device.
    \value NotificationCategory
    If the sounds produced are notifications (ping, beep and such) you
    should use this category.
    \value MusicCategory
    If your application is a music player (like a jukebox or media player
    playing an audio file).
    \value VideoCategory
    If the sound is the audio channel of a video.
    \value CommunicationCategory
    If your applications produces sounds from communication with somebody
    else (VoIP, voice chat).
    \value GameCategory
    Sound produced by a computer game should go into this category.
    \value AccessibilityCategory
    Sounds produced for accessibility (e.g., Text-To-Speech)
    \omitvalue LastCategory
    Holds the largest value of categories.
    \omitvalue AccessibilityCategory

    A Jukebox will set this to Music, a VoIP program to Communication, a
    DVD player to video, and so on.

    \note These categories can also become useful for an application that
    controls the volumes automatically, like turning down the music when a call
    comes in, or turning down the notifications when the media player knows
    it's playing classical music.
*/

/*!
    \enum Phonon::ErrorType

    This enum describes the severity when an error has occurred during
    playback.

    After a media object has entered the \l{Phonon::}{ErrorState}, one
    can query the type of error from
    \l{Phonon::}{MediaObject::errorType()}. Note that you should query
    the error when receiving the
    \l{Phonon::}{MediaObject::stateChanged()} signal, because the
    error type will be lost if the media object leaves the error
    state.    

    \value NoError No error. MediaObject::errorType() returns this if
    MediaObject::state() != Phonon::ErrorState.

    \value NormalError An error has occurred with the playback of the current
    source. It might be possible to continue playback, for instance, if only the
    audio stream in a video cannot be played back. The media object will then
    leave the error state again.

    \value FatalError. Something important does not work. Your program cannot continue
    the playback of the current source, but it might be possible to try another.

    \sa MediaObject::errorType()
*/

/*!
    \fn QString Phonon::categoryToString(Category c)

    Returns a (translated) string to show to the user identifying the given
    Category (\a c).
*/

/*!
    \enum Phonon::ObjectDescriptionType
    \relates Phonon::ObjectDescription

    This enum defines the type of information that is contained in a
    \l{Phonon::}{ObjectDescription} object.

    \value AudioOutputDeviceType An audio output device (\l{Phonon::}{AudioOutputDevice}).
    This can be soundcards (with different drivers),
    sound servers, or other virtual outputs like playback on a different
    computer on the network.

    \value EffectType An audio effect (\l{Phonon::}{EffectDescription}).
    \omitvalue SubtitleType
    \omitvalue AudioCaptureDeviceType
    \omitvalue AudioChannelType
*/

/*!
    \typedef Phonon::AudioOutputDevice
    \relates Phonon::ObjectDescription

    This typedef of \l{Phonon::}{ObjectDescription} describes an audio output
    device, such as soundcards (with different drivers), sound servers, or other
    virtual outputs like playback on a different computer on the network.

    \omit
    For Hardware devices the backend should use libkaudiodevicelist
    (AudioDevice and AudioDeviceEnumerator) which will list removable
    devices even when they are unplugged and provide a unique identifier
    that can make backends use the same identifiers.
    \endomit

    A list of available devices is given by the backend with
    Backendcapabilities::availableAudioOutputDevices()

    \snippet doc/src/snippets/phononobjectdescription.cpp 1

*/

/*!
    \fn Phonon::phononVersion()
    \inmodule Phonon
    \since 4.5

    Returns the Phonon version.
*/

/*!
    \class Phonon::ObjectDescription
    \inmodule Phonon
    \inheaderfile Phonon/ObjectDescription
    \since 4.4
    \brief The ObjectDescription class provides information about Phonon objects.

    Phonon currently uses this class to describe audio effects and
    audio output devices - using the typedefs AudioOutputDevice and
    EffectDescription. The type of an ObjectDescription is also
    described through the \l{Phonon::}{ObjectDescriptionType} enum.
    Objects of the same \l{Phonon::ObjectDescriptionType}{type} are
    uniquely identified by an index().

    The class gives a description() and a name() of the object, both
    of which are strings appropriate for end users of a Phonon
    application. You can also check whether the device or effect
    described is \l{isValid()}{valid}. This does not guarantee that
    the device or effect functions as expected, but that the
    ObjectDescription describes an existing device or effect.

    Audio output devices and effect descriptions are used to select
    the audio output device to be used for playback and to create
    effects; we show examples of this in the snippet below. The
    available descriptions can be fetched with
    \l{Phonon::BackendCapabilities::}{availableAudioOutputDevices()}
    and \l{Phonon::BackendCapabilities::}{availableAudioEffects()}
    static functions in the Phonon::BackendCapabilities namespace

    \snippet doc/src/snippets/phononobjectdescription.cpp 0

    Other types of ObjectDescriptions might be possible in the future,
    e.g., descriptions of audio capture devices, such as microphones.

    \omit Not implemented yet.
    Need a new paragraph on that some descriptions 'belong
    together', such as chained audio effects.

    Some parts give the end user choices, e.g. what source to capture
    audio from. These choices are described by the name and
    description methods of this class and identified with the id
    method. Subclasses then define additional information like which
    audio and video choices belong together.  \endomit

    \sa Phonon::AudioOutputDevice, Phonon::EffectDescription, {Capabilities Example}, {Phonon Module}
*/

/*!
    \fn Phonon::ObjectDescription::ObjectDescription()
    \brief constructs a new object description.
    \internal
*/

/*!
    \fn Phonon::ObjectDescription::ObjectDescription (int index, const QHash<QByteArray, QVariant> & properties)
    \internal
*/

/*!
    \fn Phonon::ObjectDescription::ObjectDescription(const QExplicitlySharedDataPointer<ObjectDescriptionData> &dd)
    \internal
*/

/*!
    \fn static inline ObjectDescription<T> Phonon::ObjectDescription::fromIndex(int index)
    \internal

    \omit Currently indices are not unique for all ObjectDescription types, making
    the behavior of this function undefined. \endomit

    Returns a new description object that describes the
    device/effect/codec/...  with the given \a index.
*/

/*!
    \fn inline bool Phonon::ObjectDescription::operator==(const ObjectDescription &otherDescription) const

    Returns \c true if this ObjectDescription describes the same
    object as \a otherDescription; otherwise, returns \c false.
*/

/*!
    \fn inline bool Phonon::ObjectDescription::operator!=(const ObjectDescription &otherDescription) const
    Returns \c false if this ObjectDescription describes the same
    as \a otherDescription; otherwise, returns \c true.
*/

/*!
    \fn inline QString Phonon::ObjectDescription::name() const

    Returns a string appropriate for a user to select between
    object descriptions, e.g., from a QComboBox.

    \sa description()
*/

/*!
    \fn inline QString Phonon::ObjectDescription::description() const

    Returns a more extensive description than the name() function.

    For example, in the case of \l{Phonon::}{AudioOutputDevice}s, this
    text should make clear which sound source is described; this is
    sometimes hard to describe or understand from just the name.

    The text is appropriate to present to an end user in for example
    tool tips of items, with the name()'s as text, in a QComboBox.

*/

/*!
    \fn inline QVariant Phonon::ObjectDescription::property(const char *name) const

    Returns the property named \a name. A property can be used for
    extended information, such as the manufacturer of a sound card. The
    information will usually be given as text.

    If the property is not set an invalid QVariant is returned.

    Qt's backends do not use properties at the time of this writing.

    \sa propertyNames()
*/

/*!
    \fn inline QList<QByteArray> Phonon::ObjectDescription::propertyNames() const

    Properties can be used for extended information about a
    ObjectDescription, e.g., a manufacturer of a sound card. The
    information will usually be given text.

    This function returns all names that return valid data when
    property() is called.

    Currently, Qt backends do not use properties for their object
    descriptions.

    \sa property()
*/

/*!
    \fn inline bool Phonon::ObjectDescription::isValid() const

    Returns true if the device or effect described exists.

    An ObjectDescription that is invalid, will also have an
    index() of -1.

    \sa index()
*/

/*!
    \fn inline int Phonon::ObjectDescription::index() const

    Returns a unique identifier for this ObjectDescription. Used
    internally to distinguish between the descriptions.

    Notice that the identifiers are only unique to the type of
    description, e.g., \l{Phonon::}{AudioOutputDevice} or
    \l{Phonon::}{EffectDescription}.
*/

/*!
    \class Phonon::ObjectDescriptionPrivate
    \inmodule Phonon
    \since 4.4
    \internal

*/

/*!
    \class Phonon::StreamInterface
    \inmodule Phonon
    \since 4.4
    \brief Backend interface to handle media streams (AbstractMediaStream).
    \internal
*/

/*!
    \fn virtual Phonon::StreamInterface::~StreamInterface()
*/

/*!
    \fn virtual void Phonon::StreamInterface::writeData(const QByteArray &data) = 0
    \internal
*/

/*!
    \fn virtual void Phonon::StreamInterface::endOfData() = 0
    \internal
*/

/*!
    \fn virtual void Phonon::StreamInterface::setStreamSize(qint64 newSize) = 0
    \internal
*/

/*!
    \fn virtual void Phonon::StreamInterface::setStreamSeekable(bool s) = 0
    \internal
*/

/*!
    \fn void Phonon::StreamInterface::connectToSource(const MediaSource &mediaSource)
    \internal
*/

/*!
    \fn void Phonon::StreamInterface::needData()
    \internal
*/

/*!
    \fn void Phonon::StreamInterface::enoughData()
    \internal
*/

/*!
    \fn void Phonon::StreamInterface::seekStream(qint64)
    \internal
*/

/*!
    \fn void Phonon::StreamInterface::reset()
    \internal
*/

/*!
    \fn Phonon::StreamInterface::StreamInterface()
    \internal
    \omit
    For subclasses.
    \endomit
*/

/*!
    \class StreamInterfacePrivate
    \inmodule Phonon
    \internal
*/

/*!
    \class Phonon::AbstractVideoOutput
    \inmodule Phonon
    \internal
    \since 4.4
    \brief The AbstractVideoOutput class is the common base class for all video output classes.

    \sa VideoWidget
*/

/*!
    \namespace Phonon::Experimental
    \internal
*/

/*!
    \fn Phonon::AbstractVideoOutput::AbstractVideoOutput(AbstractVideoOutputPrivate &d)
    \internal

    Constructor that is called from derived classes.

    \param parent Standard QObject parent.
*/

/*!
    \class Phonon::AbstractVideoOutputPrivate
    \inmodule Phonon
    \internal
    \since 4.4
*/

/*!
    \class Phonon::VolumeFaderEffect
    \inmodule Phonon
    \internal
    \since 4.4

    This effect differs from gradually changing the output volume in that
    a dedicated effect can change the volume in the smallest possible
    steps while every other volume control will make more or less
    noticeable steps.

    \sa AudioOutput::volume()
*/

/*!
    \property Phonon::VolumeFaderEffect::volume

    This is the current volume of the output as voltage factor.
    Setting this property changes the volume immediately.

    1.0 means 100%, 0.5 means 50% voltage/25% power, 0.0 means 0%

    \sa volumeDecibel
*/

/*!
    \property Phonon::VolumeFaderEffect::volumeDecibel

    This is the current volume of the output in decibel.
    Setting this property changes the volume immediately.

    0 dB means no change in volume, -6dB means an attenuation of the
    voltage to 50% and an attenuation of the power to 25%, -inf dB means
    silence.

    \sa volume
*/

/*!
    \property Phonon::VolumeFaderEffect::fadeCurve

    This property holds the fade curve to be used for the fadeIn(), fadeOut()
    and fadeTo() slots.

    Defaults to Fade3Decibel.

    \sa FadeCurve
*/

/*!
    \enum Phonon::VolumeFaderEffect::FadeCurve
    Determines the curve of the volume change.

    \value Fade3Decibel Crossfade curve/fast fade out.
    This is the default fade curve.
    \value Fade6Decibel Linear fade out.
    \value Fade9Decibel Slow fade out.
    \value Fade12Decibel A more extreme version of the -9dB fade.

    \bold{Notes:}

    \c Fade3Decibel is often the best fade for a crossfade, as after half
    of the time the volume reached -3dB. This means that half the
    possible power (which is proportional to the square of the
    voltage) is reached. Summed, the maximum power of two audio
    signals fading with a -3dB curve will always be equal.

    For fading in or out the -3dB curve is too abrupt in the end.

    With a -6dB fade curve, a volume of -6dB is reached after half of
    the fading time. -6dB is equal to half of the voltage meaning
    that the voltage multiplier changes linearly from the start
    of the fade to the end.

    With the \c Fade9Decibel fade, a volume of -9dB is reached after
    half of the fade time, so the fade is fast in the beginning and
    slow at the end. This is a good fade for ending music.
*/

/*!
    \fn void Phonon::VolumeFaderEffect::fadeIn(int fadeTime)

    Tells the Fader to change the volume from the current volume to 100%
    in \a fadeTime milliseconds.

    Short for \c fadeTo(1.0, fadeTime).

    \param fadeTime the fade duration in milliseconds

    \sa fadeTo(), volume
*/

/*!
    \fn void Phonon::VolumeFaderEffect::fadeOut(int fadeTime)

    Tells the Fader to change the volume from the current volume to 0%
    in \a fadeTime milliseconds.
    Short for \c fadeTo(0.0, fadeTime).

    \param fadeTime the fade duration in milliseconds

    \sa fadeTo
*/

/*!
    \fn void Phonon::VolumeFaderEffect::fadeTo(float volume, int fadeTime)

    Tells the Fader to change the volume from the current value to
    \a volume in \a fadeTime milliseconds.

    \sa fadeIn(), fadeOut()
*/

/*!
    \class Phonon::VolumeFaderEffectPrivate
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \class Phonon::VolumeFaderInterface
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \fn virtual Phonon::VolumeFaderInterface::~VolumeFaderInterface()
    \internal
*/

/*!
    \fn virtual float Phonon::VolumeFaderInterface::volume() const
    \internal
*/

/*!
    \fn virtual void Phonon::VolumeFaderInterface::setVolume(float)
    \internal
*/

/*!
    \fn virtual Phonon::VolumeFaderEffect::FadeCurve Phonon::VolumeFaderInterface::fadeCurve() const
    \internal
*/

/*!
    \fn virtual void Phonon::VolumeFaderInterface::setFadeCurve(Phonon::VolumeFaderEffect::FadeCurve)
    \internal
*/

/*!
    \fn virtual void Phonon::VolumeFaderInterface::fadeTo(float, int)
    \internal
*/

/*!
    \class Phonon::AbstractMediaStream
    \inmodule Phonon
    \internal
    \since 4.4
    \brief The AbstractMediaStream class is the base class for custom media data streams.
    \inheaderfile Phonon/AbstractMediaStream

    This class is subclassed to provide custom data streams for
    \l{Phonon::}{MediaSource}s.

    The \l{Phonon::}{MediaSource} knows how to handle the most common
    media sources, such as files and CD. If you need to fetch
    multimedia from other sources, you can reimplement this class,
    which can be used by a \l{Phonon::}{MediaSource}.

    When a backend needs more data from the stream, needData() will be
    called. You must then use writeData() to write the data to the
    backend. You can either write one time and wait for a new
    needData() call, or continue to write data until you receive an
    enoughData() call. When the stream is at its end, call endOfData()
    instead of writeData().

    Before the custom stream is passed to a \l{Phonon::}{MediaSource},
    setStreamSize() needs to be called, and also setStreamSeekable()
    (if the stream is seekable). A good place to do this work is in
    the constructor. A seekable stream must also reimplement
    seekStream().

    We show two examples. The first writes data repeatedly until it
    receives the enoughData() call, while the second only writes once
    and waits for a new needData() call.

    Example where data is written repeatedly.

    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 0

    Example where data is written once:

    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 1

    \sa Phonon::MediaSource, Phonon::MediaObject 

*/

/*!
    \fn Phonon::AbstractMediaStream::AbstractMediaStream(QObject *parent = 0)
    \internal

    Constructs an AbstractMediaStream object with the given \a parent.

*/

/*!
    \fn qint64 Phonon::AbstractMediaStream::streamSize() const

    Returns the stream size that was set with setStreamSize().

    A negative value means that the length of the stream cannot be known.

    Defaults to 0.

    \sa setStreamSize()
*/

/*!
    \fn void Phonon::AbstractMediaStream::setStreamSize(qint64 size)

    Sets the \a size of the stream in number of bytes.

    A negative value means that the length of the stream cannot be known.

    Defaults to 0.

    This function has to be called. A backend will not call needData()
    until the stream size is set.

    \sa streamSize()

*/

/*!
    \fn bool Phonon::AbstractMediaStream::streamSeekable() const

    Returns whether your data stream is set as seekable.

    Defaults to \c false.

    \sa setStreamSeekable()

*/

/*!
    \fn void Phonon::AbstractMediaStream::setStreamSeekable(bool s)

    Sets whether your data stream is seekable. \a s should be true if
    the stream is seekable; otherwise false.

    Defaults to \c false.

    If you set this to \c true you have to implement the seekStream()
    function.

    \sa streamSeekable()
*/

/*!
    \fn void Phonon::AbstractMediaStream::writeData(const QByteArray &data)

    Sends the media \a data to the backend for decoding.

    Use this function to send data to the backend after needData() has
    been called.

    If your stream is a push stream, data should be written until the
    enoughData() function is called. For a pull stream, write data
    once before the call to needData() function returns.

    If the data is depleted, call endOfData() instead of writeData().

    \warning Don't call this function before the first needData() is emitted.

    \sa needData(), endOfData()

*/

/*!
    \fn void Phonon::AbstractMediaStream::endOfData()

    Tells the backend that the media data stream is at its end.

    \warning Don't call this function before the first needData() is emitted.

    \sa writeData(), needData()
*/

/*!
    \fn void Phonon::AbstractMediaStream::error(Phonon::ErrorType errorType, const QString &errorString)

    If an I/O error occurs you should call this function to make
    MediaObject go into ErrorState. \c errorType classifies the error,
    while \a errorString is a textual description of the error suitable
    for users of Phonon applications.

    \sa MediaObject::errorType(), MediaObject::errorString()
*/

/*!
    \fn virtual void Phonon::AbstractMediaStream::reset() = 0

    Reimplement this function to reset the stream. Subsequent calls to writeData should start
    from the first position of the data unless a seek is requested.

    The function is necessary for the case where a non-seekable MediaStream is
    played more than once. For a seekable stream the implementation can simply call
    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 2

    \sa writeData(), needData()
*/

/*!
    \fn virtual void Phonon::AbstractMediaStream::needData() = 0

    Reimplement this function to be notified when the backend needs data.

    When this function is called you should write data to the backend
    (See writeData()).

    \sa writeData(), endOfData(), enoughData()
*/

/*!
    \fn virtual void Phonon::AbstractMediaStream::enoughData()

    If your stream is a push stream, reimplement this function to be
    notified when the backend has enough data and your stream object
    may take a break.

    This method is important for pushing data to the backend in order
    to not fill the backend buffer unnecessarily.

    \sa needData()
*/

/*!
    \fn virtual void Phonon::AbstractMediaStream::seekStream(qint64 offset)

    Reimplement this function if your stream is seekable.

    When this function is called the next call to writeData has to be at the
    requested \a offset.

    \warning Do not call the parent implementation.

    \sa setStreamSeekable(), streamSeekable(), needData()
*/

/*!
    \class Phonon::BackendInterface
    \inmodule Phonon
    \since 4.4
    \brief Main Backend class interface
    \internal

    This interface defines the main factory of the backend. The createObject() function creates all the
    objects needed by the frontend.

    The objectDescriptionIndexes and objectDescriptionProperties functions return information about
    available devices, effects and codecs.

    An implementation could look like this:
    \snippet snippets/phonon/samplebackend/main.cpp snippet

*/

/*!
    \fn virtual Phonon::BackendInterface::~BackendInterface()
    \internal

    Silence gcc's warning.
*/

/*!
    \enum Phonon::BackendInterface::Class
    \internal

    Classes that the createObject() function has to handle.

    \value MediaObjectClass Request to return a \c MediaObject object.
    \value VolumeFaderEffectClass Request to return a \c VolumeFaderEffect
    object.
    \value AudioOutputClass Request to return an \c AudioOutput object.
    \value AudioDataOutputClass Request to return an \c AudioDataOutput object.
    \value VisualizationClass Request to return a \c Visualization object.
    \value VideoDataOutputClass Request to return a \c VideoDataOutput object.
    \value EffectClass Request to return a \c Effect object.
    Takes an additional int that specifies the effect ID.
    \value VideoWidgetClass Request to return a \c VideoWidget object.
*/

/*!
    \fn virtual QObject *Phonon::BackendInterface::createObject(Class c, QObject *parent, const QList<QVariant> &args = QList<QVariant>()) = 0
    \internal

    Returns a new instance of the requested class.

    \param c The requested class.
    \param parent The parent object.
    \param args Additional arguments (documented in Class).
*/


/*!
    \fn virtual QList<int> Phonon::BackendInterface::objectDescriptionIndexes(ObjectDescriptionType type) const = 0
    \internal

    Returns the unique identifiers for the devices/effects/codecs of the given \a type.

    \param type see ObjectDescriptionType
*/

/*!
    \fn virtual QHash<QByteArray, QVariant> Phonon::BackendInterface::objectDescriptionProperties(ObjectDescriptionType type, int index) const = 0
    \internal

    Given a unique identifier that was returned from objectDescriptionIndexes this function
    returns a hash mapping property names to values.

    The property "name" must always be present. All other properties are optional.

    \table
    \header \o Property \o Description
    \row \o name \o The name of the device/effect/codec/...
    \row \o description \o A text explaining what this device/effect/codec/... is/can do
    \row \o icon \o An icon name (using the freedesktop naming scheme) or a QIcon for this
    device/effect/codec/...
    \row \o available \o A bool telling whether the device is present or unplugged.
    \endtable

    \param type see ObjectDescriptionType
    \param index The unique identifier that is returned from objectDescriptionIndexes
*/

/*!
    \fn virtual bool Phonon::BackendInterface::startConnectionChange(QSet<QObject *>) = 0;
    \internal

    When this function is called the nodes given in the parameter list should
    not lose any signal data when connections are changed.
*/

/*!
    \fn virtual bool Phonon::BackendInterface::connectNodes(QObject *, QObject *) = 0
    \internal

    Defines a signal connection between the two given nodes.
*/

/*!
    \fn virtual bool Phonon::BackendInterface::disconnectNodes(QObject *, QObject *) = 0
    \internal

    Cuts a signal connection between the two given nodes.
*/

/*!
    \fn virtual bool Phonon::BackendInterface::endConnectionChange(QSet<QObject *>) = 0
    \internal

    When this function is called the nodes given in the parameter list may lose
    signal data when a port is not connected.
*/

/*!
    \fn virtual QStringList Phonon::BackendInterface::availableMimeTypes() const = 0
    \internal

    Returns all available MIME types.
*/

/*!
    \class Phonon::MediaSource
    \inmodule Phonon
    \inheaderfile Phonon/MediaSource
    \since 4.4
    \brief The MediaSource class provides multimedia data for media objects.

    The MediaSource class manages a source of multimedia content, such
    as a music or video file, of which data is given to a
    \l{Phonon::}{MediaObject}.

    The media source knows how fetch its data from several sources,
    e.g., from files, a QIODevice, or a CD. The possible source types
    are described by the \l{MediaSource::}{Type} enum. The type of the
    source is set by the media source itself, and is dependent on the
    constructor used to create it. Note that it is possible to provide
    data from any source by implementing a QIODevice.

    The class has several functions to acquire information about the
    source it manages, e.g., fileName() and url(). The return from
    these functions are dependent on the type() of the media source.

    Normally, a programmer does not need to be concerned with media
    sources. It's constructors are implicit, so one can, for instance,
    send an URL or filename directly to the constructors of the
    \l{Phonon::}{MediaObject}.

    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 3

    A MediaSource object cannot be reused for another multimedia
    source. It is possible to play the same source again, and also
    stop and start a non-seekable media source, such as a radio
    stream, with the same MediaSource object.

    \section1 Qt Backends

    Currently, Qt's backends support files in local and remote
    locations. Support for other sources, such as CD/DVD, are planned
    for the future.

    \sa MediaObject, {Phonon Module}
*/

/*!
    \enum Phonon::MediaSource::Type

    Identifies the type of media described by the MediaSource object.

    \value Invalid The MediaSource object does not describe any valid source.
    \value LocalFile The MediaSource object describes a local file.
    \value Url The MediaSource object describes an URL, which can be either a
    local file or a file on the network.
    \value Disc The MediaSource object describes a disc, e.g., a CD.
    \value Stream The MediaSource object describes a data stream.
                  This is the type used for \l{QIODevice}s. Note
                  that a stream opened with a QUrl, will still be of the Url type.
    \value Empty The media source doesn't have a source.

    \sa MediaSource::type()
*/

/*!
    \fn Phonon::MediaSource::MediaSource()
    \internal

    Creates an invalid MediaSource object.

    \sa Invalid
*/

/*!
    \fn Phonon::MediaSource::MediaSource(const QString &fileName)

    Creates a MediaSource object for the file specified by \a
    fileName.  You can also use this constructor with \l{The Qt
    Resource System}{Qt resources}

    \omit
    \param fileName file name of a local media file or a Qt resource that was compiled in.
    \endomit
*/

/*!
    \fn Phonon::MediaSource::MediaSource(const QUrl &url)

    Creates a MediaSource object for a the URL specified by \a url.
    
    If the multimedia content you would like to play back is on a
    remote network location, you should use this constructor; though,
    it also possible to specify an URL to a local file.

    \sa QUrl
*/


/*!
    \fn Phonon::MediaSource::MediaSource(Phonon::DiscType discType, const QString &deviceName = QString())

    Creates a MediaSource object for the type of disc specified by \a discType in the named
    device referred to by \a deviceName.

    \note \a deviceName is a platform dependent device name. It can be useful to specify this
    if the computer has more than one CD drive. On KDE, it is recommended to use the Solid
    hardware discovery framework to retrieve the device name in a portable way.
*/

/*!
    \fn Phonon::MediaSource::MediaSource(AbstractMediaStream *stream)
    \internal
    Creates a MediaSource object for a data stream.

    Your application can provide the media data by subclassing AbstractMediaStream and
    passing a pointer to that object. Phonon will never delete the \a stream.

    \param stream The AbstractMediaStream subclass to provide the media data.

    \sa setAutoDelete
*/

/*!
    \fn Phonon::MediaSource::MediaSource(QIODevice *ioDevice)

    Creates a MediaSource object for the QIODevice specified by \a ioDevice.

    This constructor can be very handy in the combination of
    QByteArray and QBuffer.

    If you need to fetch multimedia data from a source that is not
    supported by MediaSource, you should subclass QIODevice and use
    this MediaSource constructor. It is important that you reimplement
    QIODevice::isSequential(), as it is used by MediaSource to
    determine if the media source is seekable.

    \a ioDevice is an arbitrary readable QIODevice subclass. If the device is not opened
    MediaSource will open it as QIODevice::ReadOnly.

    \note Sequential devices can also be used, but MediaObject::isSeekable() will
    return false as a result.

    \warning On Windows, we only support \l{QIODevice}s containing the
    \c avi, \c mp3, or \c mpg formats. Use the constructor that takes
    a file name to open files (the Qt backend does not use a QFile
    internally).

    \sa setAutoDelete()
*/

/*!
    \fn Phonon::MediaSource::MediaSource(MediaSourcePrivate &)
    \internal
*/

/*!
    \fn Phonon::MediaSource::~MediaSource()

    Destroys the MediaSource object. You should never delete a
    MediaSource yourself, the MediaObject will handle this.

*/

/*!
    \fn Phonon::MediaSource::MediaSource(const MediaSource &other)

    Constructs a copy of the \a other media source.

    This constructor is fast thanks to explicit sharing.
*/

/*!
    \fn MediaSource &Phonon::MediaSource::operator=(const MediaSource &other)

    Assigns the \a other media source to this media source and returns a
    reference to it.

    This operation is fast thanks to explicit sharing.
*/

/*!
    \fn bool Phonon::MediaSource::operator==(const MediaSource &other) const

    Returns true if this media source is equal to the \a other media source;
    otherwise returns false.
*/

/*!
    \fn void Phonon::MediaSource::setAutoDelete(bool enable)

    If \a enable is true, the media source will take ownership of the
    object passed in the \l{Phonon::}{MediaSource}'s constructor
    object that was passed in the constructor; otherwise, the
    programmer is responsible for deletion of this object.

    This setting is false by default. If you enable it, you should
    only access the stream or device as long as you keep the media
    source object around. As long as you keep the media source
    wrapping the stream or device, the object will not get deleted.

    \sa autoDelete()
*/

/*!
    \fn bool Phonon::MediaSource::autoDelete() const

    Returns the setting of the auto-delete option. The default is
    false.

    \sa setAutoDelete()
*/

/*!
    \fn Type Phonon::MediaSource::type() const

    Returns the type of the MediaSource (depends on the constructor
    that was used).

    \sa Type
*/

/*!
    \fn QString Phonon::MediaSource::fileName() const

    Returns the file name of the MediaSource if type() ==
    LocalFile; otherwise, returns QString().

    \sa type()
*/

/*!
    \fn QUrl Phonon::MediaSource::url() const
    Returns the URL of the MediaSource if type() == URL or type() == LocalFile;
    otherwise returns QUrl().

    \sa type()
*/

/*!
    \fn Phonon::DiscType Phonon::MediaSource::discType() const
    Returns the disc type of the MediaSource if type() == Disc; otherwise
    returns NoDisc.

    \sa type()
*/

/*!
    \fn QString Phonon::MediaSource::deviceName() const

    Returns the device name of the MediaSource if type() == Disc; otherwise
    returns QString().

    \sa type()
*/

/*!
    \fn AbstractMediaStream *Phonon::MediaSource::stream() const
    \internal
    Returns the media stream of the MediaSource if type() == Stream; otherwise
    returns 0.
    QIODevices are handled as streams, too.
*/

/*!
    \class Phonon::MediaSourcePrivate
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \class Phonon::SeekSlider
    \inmodule Phonon
    \inheaderfile Phonon/SeekSlider
    \since 4.4
    \brief The SeekSlider class provides a slider for seeking to positions in media streams.

    The SeekSlider connects to a \l{Phonon::}{MediaObject}, and
    controls the seek position in the object's media stream.

    The slider will connect to the necessary signals to keep track of
    the sliders maximum, minimum, and current values. It will also
    disable itself for non-seekable streams, and update the media
    object when the current value of the slider changes.

    Here follows a typical example of SeekSlider usage:

    \snippet doc/src/snippets/seekslider.cpp 0

    \sa Phonon::VolumeSlider, Phonon::VideoWidget, {Music Player Example}, {Phonon Module}

*/

/*!
    \property Phonon::SeekSlider::iconVisible
    \brief whether the icon next to the slider is visible

    By default the icon is visible if the platform provides an icon; else
    it's hidden.

*/

/*!
    \property Phonon::SeekSlider::tracking
    \brief whether slider tracking is enabled

    If tracking is enabled (the default), the media seeks
    while the slider is being dragged. If tracking is
    disabled, the media seeks only when the user
    releases the slider.
*/

/*!
    \property Phonon::SeekSlider::pageStep
    \brief the page step interval

    The larger of two natural steps that a slider provides and
    typically corresponds to the user pressing PageUp or PageDown.

    Defaults to 5 seconds.
*/

/*!
    \property Phonon::SeekSlider::singleStep
    \brief the single step interval

    The smaller of two natural steps that a slider provides and
    typically corresponds to the user pressing an arrow key.

    Defaults to 0.5 seconds.
*/

/*!
    \property Phonon::SeekSlider::orientation
    \brief the orientation of the slider

    The orientation must be Qt::Vertical or Qt::Horizontal (the default).
*/

/*!
    \property Phonon::SeekSlider::iconSize
    \brief the icon size used for the mute button/icon.

    The default size is defined by the GUI style.
*/

/*!
    \fn explicit Phonon::SeekSlider::SeekSlider(QWidget *parent = 0)

    Constructs a seek slider widget with the given \a parent.
*/

/*!
    \fn explicit Phonon::SeekSlider::SeekSlider(MediaObject *media, QWidget *parent = 0)

    Constructs a seek slider widget for the specified \a media with the
    given \a parent.
*/

/*!
    \fn Phonon::SeekSlider::~SeekSlider()
    Destroys the seek slider.
*/

/*!
    \fn Phonon::MediaObject *Phonon::SeekSlider::mediaObject() const

    Return the media object this SeekSlider controls.
*/

/*!
    \class Phonon::SeekSliderPrivate
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \fn void Phonon::SeekSlider::setMediaObject(MediaObject *media)

    Sets the media object to be controlled by this slider to the \a media specified.
*/

/*!
    \class Phonon::VideoPlayer
    \inmodule Phonon
    \inheaderfile Phonon/VideoPlayer
    \since 4.4
    \brief The VideoPlayer widget is used to perform playback of video.

    With VideoPlayer you can get results quickly and easily. You can
    do the standard playback tasks like play(), pause(), and stop(),
    but also set a playback volume and seek - if the media and backend
    supports seeking.

    VideoPlayer is provided for convenience and removes the need to
    create a media graph with a \l{Phonon::}{MediaObject},
    \l{Phonon::}{AudioOutput}, and \l{Phonon::}{VideoWidget}. If
    you need functionality not supported by the player, you can build
    this \l{Building Graphs}{graph} yourself.

    Keep in mind that when the VideoPlayer instance is deleted the
    playback will stop.

    Note also that most of the functions in this class are
    asynchronous. For instance, a media source may not play
    immediately after you call the play() function.

    A play and forget code example:
    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 4

    \sa {Phonon Module}, MediaObject
*/

/*!
    \fn Phonon::VideoPlayer::VideoPlayer(QWidget *parent = 0)
    
    Constructs a new video widget with a \a parent using
    Phonon::VideoCategory as its category.

    \param parent The QObject parent.
*/

/*!
    \fn Phonon::VideoPlayer::VideoPlayer(Phonon::Category category, QWidget *parent = 0)

    Constructs a new VideoPlayer instance with the specified \a
    parent.

    \a category is the category used for the audio output device.
*/

/*!
    \fn Phonon::VideoPlayer::~VideoPlayer()

    On destruction the playback is stopped, also the audio output is
    removed so that the desktop mixer will not show the application
    anymore. If you need a persistent audio output don't use
    VideoPlayer but MediaObject, VideoPath and VideoOutput.
*/

/*!
    \fn qint64 Phonon::VideoPlayer::totalTime() const

    Get the total time (in milliseconds) of the file currently being played.
*/

/*!
    \fn qint64 Phonon::VideoPlayer::currentTime() const

    Get the current time (in milliseconds) of the file currently being played.
*/

/*!
    \fn float Phonon::VideoPlayer::volume() const

    This is the current volume of the output as voltage factor.

    1.0 means 100%, 0.5 means 50% voltage/25% power, 0.0 means 0%
*/

/*!
    \fn bool Phonon::VideoPlayer::isPlaying() const

    Returns true if it is currently playing; otherwise returns false if it
    is currently stopped or paused
*/

/*!
    \fn bool Phonon::VideoPlayer::isPaused() const

    Returns true if it is currently paused; otherwise returns false if it
    is currently playing or stopped.
*/

/*!
    \fn void Phonon::VideoPlayer::load(const Phonon::MediaSource &source)

    Starts pre-loading the media data from the specified \a source and
    filling audio buffers in the backend.

    When there's already a media playing (or paused) it will be stopped
    (the finished signal will not be emitted).

    \sa MediaObject::setCurrentSource()
*/

/*!
    \fn void Phonon::VideoPlayer::play(const Phonon::MediaSource &source)

    Plays the media from the given \a source. Starts playback as fast as
    possible.
    This can take a considerable time depending on the URL and the
    backend.

    If you need low latency between calling play() and the sound actually
    starting to play on your output device you need to use MediaObject
    and be able to set the URL before calling play(). Note that
    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 5
    doesn't make a difference: the application should be idle between the
    load and play calls so that the backend can start preloading the
    media and fill audio buffers.
*/

/*!
    \fn void Phonon::VideoPlayer::play()

    Continues playback of paused media. Restarts playback of a stopped
    (or newly loaded) media.

    \sa MediaObject::play(), play()
*/

/*!
    \fn void Phonon::VideoPlayer::pause()

    Pauses the playback.

    \sa MediaObject::pause()
*/

/*!
    \fn void Phonon::VideoPlayer::stop()

    Stops the playback.

    \sa MediaObject::stop()
*/

/*!
    \fn void Phonon::VideoPlayer::seek(qint64 ms)

    Seeks to the requested time. Note that the backend is free to
    ignore the seek request if the media source isn't seekable; you
    can check this by asking the media object of the VideoPlayer.

    \snippet doc/src/snippets/videomedia.cpp 0

    The \a ms parameter is the time in milliseconds from the start of
    the media.

    The call is asynchronous, so currentTime() can still be the old
    value right after this method was called. If all you need is a
    slider that shows the current position and allows the user to
    seek, use the class SeekSlider.

    \sa MediaObject::seek(), MediaObject::isSeekable(), mediaObject()
*/

/*!
    \fn void Phonon::VideoPlayer::setVolume(float volume)

    Sets the \a volume of the output as voltage factor.

    1.0 means 100%, 0.5 means 50% voltage/25% power, 0.0 means 0%
*/

/*!
    \fn MediaObject *Phonon::VideoPlayer::mediaObject() const

    Returns the media object being used by the player.

    The media object can be accessed directly instead of using the
    \l{VideoPlayer}s convenience functions, e.g., play() and stop().
    It is also possible to give the object to other Phonon widgets,
    e.g., a \l{Phonon::}{SeekSlider} or a \l{Phonon::}{VolumeSlider}.

    \sa Phonon::SeekSlider, Phonon::MediaObject
*/

/*!
    \fn AudioOutput *Phonon::VideoPlayer::audioOutput() const

    Returns the audio output object being used by the player.

*/

/*!
    \fn VideoWidget *Phonon::VideoPlayer::videoWidget() const

    Returns the video widget being used by the player.
*/

/*!
    \fn void Phonon::VideoPlayer::finished()

    This signal is emitted when the playback finished.

*/

/*!
    \class Phonon::VideoWidgetPrivate
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \class Phonon::MediaObject
    \inmodule Phonon
    \inheaderfile Phonon/MediaObject
    \since 4.4
    \brief The MediaObject class provides an interface for media playback.


    The media object manages a \l{Phonon::}{MediaSource}, which
    supplies the media object with multimedia content, e.g., from a
    file. A playback in Phonon is always started by calling the
    \l{Phonon::MediaObject::}{play()} function.

    The state of play (play, pause, stop, seek) is controlled by the
    media object, and you can also query the current
    \l{Phonon::MediaObject::}{state()}. It keeps track of the playback
    position in the media stream, and emits the
    \l{Phonon::MediaObject::}{tick()} signal when the current position
    in the stream changes.

    Notice that most functions of this class are asynchronous, so you
    cannot rely on that a state is entered after a function call
    before you receive the \l{Phonon::MediaObject::}{stateChanged()}
    signal. The description of the \l{Phonon::}{State} enum gives a
    description of the different states.

    Before play() is called, the media object should be connected to
    \l{Sinks}{output nodes}, which outputs the media to the
    underlying hardware. The output nodes required are dependent on
    the contents of the multimedia file that is played back. Phonon
    has currently two output nodes: the \l{Phonon::}{AudioOutput} for
    audio content and \l{Phonon::}{VideoWidget} for video content.  If
    a \l{Phonon::}{MediaSource} contains both audio and video, both
    nodes need to be connected to the media object.

    \snippet snippets/phonon.cpp 4
    \snippet snippets/phonon.cpp 5 

    The media object can queue sources for playback. When it has
    finished to play one source, it will start playing the next in the
    queue; the new source is then removed from the queue. The
    queue can be altered at any time. 

    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 7

    You can also make use of the
    \l{Phonon::MediaObject::}{aboutToFinish()} signal, which is
    guaranteed to be emitted in time for altering the queue.

    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 8

    When playback is finishing, i.e., when a media source has been
    played to the end and the queue is empty, several signals are
    emitted. First, the media object will emit aboutToFinish() -
    shortly before the playback has finished - and then finished().
    The stateChanged() signal will also be emitted with
    \l{Phonon::}{PausedState}, which is the state the media object
    takes when the playback is finished. If you wish to enter another
    state, you can connect a slot to finished() and set a new state
    there.

    The media object resolves the meta information, such as title,
    artist, and album. The meta data is not resolved immediately after
    a new source is provided, but will be resolved before the object
    leaves the \l{Phonon::}{LoadingState}. The data is queried by
    string keys - which should follow the Ogg Vorbis specification
    \l http://xiph.org/vorbis/doc/v-comment.html - or by using the
    \l{Phonon::}{MetaData} enum. The data available will depend on the
    type and content of the individual media files.  metaDataChanged()
    will be emitted when the media object has resolved new meta data.

    Errors encountered during playback and loading of media sources
    are reported by emitting a state changed signal with
    \l{Phonon::}{ErrorState}. The severity of the error can be queried
    by the \l{Phonon::}{ErrorType}. With a \l{Phonon::}{NormalError},
    it might be possible to continue the playback, for instance, if
    only audio playback fails for a media source which also has video.
    A \l{Phonon::}{FatalError} indicates that Phonon cannot continue
    playback of the current source, but it is possible to try with a
    different one. A user readable error message is given by
    errorString().

    \sa Phonon::MediaSource, Phonon::AudioOutput, VideoWidget,
    {Music Player Example}, {Phonon Overview}, Phonon::VideoPlayer,
    Phonon::createPlayer(), {Phonon Module}

*/

/*!
    \property Phonon::MediaObject::transitionTime
    \brief Defines the time between playback of two media sources
    in the media queue.

    A positive transition time defines a gap of silence between queued
    media sources.

    A transition time of 0 ms requests gapless playback (i.e., the
    next source in the media queue starts immediately after the
    playback of the current source finishes).

    A negative transition time defines a crossfade between the queued
    media sources.

    Defaults to 0 (gapless playback).

    \warning This feature might not work reliably with every
             backend.
*/

/*!
    \property Phonon::MediaObject::prefinishMark
    \brief the time when the prefinishMarkReached signal is emitted before playback ends.

    This property specifies the time in milliseconds the
    prefinishMarkReached() signal is emitted before the playback
    finishes. A value of \c 0 disables the signal. The signal is only
    emitted for the last source in the \l{queue()}{media queue}.

    Defaults to \c 0 (disabled).

    \warning For some media data the total time cannot be determined
    accurately, therefore the accuracy of the prefinishMarkReached signal
    can be bad sometimes. Still, it is better to use this method than to
    look at totalTime() and currentTime() to emulate the behavior
    because the backend might have more information available than your
    application does through totalTime() and currentTime().

    \sa prefinishMarkReached()
*/

/*!
    \property Phonon::MediaObject::tickInterval
    \brief The time interval in milliseconds between two ticks.

    The tick() signal is emitted continuously during playback.
    The tick interval is the time that elapses between the emission of two tick signals.
    If you set the interval to \c 0 the tick signal gets disabled.

    The tick() signal can, for instance, be used to update widgets
    that show the current position in the playback of a media source.

    Defaults to \c 0 (disabled).

    \warning The back-end is free to choose a different tick interval close
    to what you asked for. This means that the following code \c may fail:
    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 9
    On the other hand the following is guaranteed:
    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 10

    \sa tick()
*/

/*!
    \fn Phonon::MediaObject::~MediaObject()

    Destroys the MediaObject.
*/

/*!
    \fn State Phonon::MediaObject::state() const

    Returns the current Phonon::State of the object.

    \sa Phonon::State, stateChanged()
*/

/*!
    \fn bool Phonon::MediaObject::hasVideo() const

    Check whether the current media source includes a video stream.

    \warning This information is not resolved immediately after a
    media object gets a new source. Listen to the hasVideoChanged()
    signal instead.

    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 11

    Returns \c true if the media contains video data; otherwise,
    returns  \c false.

    \sa hasVideoChanged()
*/

/*!
    \fn bool Phonon::MediaObject::isSeekable() const

    Check whether it is possible to seek, i.e., change the
    playback position in the media stream.

    \warning This information is not solved immediately after the
    media object gets a new media source. The hasVideoChanged() signal
    is emitted after this information is available.

    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 12

    Returns \c true if the current media may be seeked; otherwise,
    returns \c false.

    \sa seekableChanged()
*/

/*!
    \fn QStringList Phonon::MediaObject::metaData(const QString &key) const

    Returns the strings associated with the given \a key.

    Backends should use the keys specified in the Ogg Vorbis
    documentation: \l http://xiph.org/vorbis/doc/v-comment.html

    Therefore the following should work with every backend:

    Note that meta data is not resolved before the \c
    metaDataChanged() signal is emitted.

    A typical usage looks like this:

    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 13
*/

/*!
    \fn QStringList Phonon::MediaObject::metaData(Phonon::MetaData key) const

    Returns the strings associated with the given \a key.

    Same as above except that the keys are defined in the
    Phonon::MetaData enum.

    \sa metaDataChanged()
*/

/*!
    \fn QMultiMap<QString, QString> Phonon::MediaObject::metaData() const

    Returns all meta data in a multi map. 

    \sa metaDataChanged()
*/

/*!
    \fn QString Phonon::MediaObject::errorString() const

    Returns a human-readable description of the last error that occurred.
    The strings given may vary between backends.

    The error description can be used to give a message to the user -
    and the developer - when the stateChanged() signal is emitted with
    \l{Phonon::}{ErrorState}.

    \section1 Qt Backends

    On Windows, Qt fetches its error messages from the DirectShow
    backend.  This usually includes an error number, which can be
    looked up in the DirectShow documentation:
    \l{http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/dx81_c/directx_cpp/htm/errorandsuccesscodes.asp}.

    On Linux and Mac, the error strings are not fetched directly from
    the backend, but are created in the backend.

    \sa Phonon::ErrorState, stateChanged()
*/

/*!
    \fn ErrorType Phonon::MediaObject::errorType() const

    Tells your program what to do about the last error that occurred.
    Use this function after receiving a stateChanged() signal with
    \l{Phonon::}{ErrorState}.

    \sa Phonon::ErrorType, Phonon::ErrorState, stateChanged()
*/

/*!
    \fn MediaSource Phonon::MediaObject::currentSource() const

    Returns the current media source, i.e., the media source that is
    being played back. The current source is either set with
    setCurrentSource() or taken from the media queue() when a media
    source has finished playing.

    \sa setCurrentSource()
*/

/*!
    \fn void Phonon::MediaObject::setCurrentSource(const MediaSource &source)

    Set the media source the MediaObject should use.

    After the media object receives a new source, it will enter the
    \l{Phonon::}{LoadingState}. When it is ready to play, it
    enters the \l{Phonon::}{StoppedState} unless another state
    has been requested, e.g., by calling play().

    \a source is the MediaSource object to the media data. You can
    just as well use a QUrl or QString (for a local file) here.

    We show an example:

    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 14

    \sa currentSource(), MediaSource
*/

/*!
    \fn QList<MediaSource> Phonon::MediaObject::queue() const

    Returns the queued media sources.

    This does list does not include the current source,
    returned by currentSource().

    \sa enqueue()
*/

/*!
    \fn void Phonon::MediaObject::setQueue(const QList<MediaSource> &sources)

    Set the \a sources to play when the current source has finished.

    This function will overwrite the current queue.

    \sa clearQueue(), enqueue()
*/

/*!
    \fn void Phonon::MediaObject::setQueue(const QList<QUrl> &urls)

    Set the \a urls to play when the current media has finished.

    This function overwrites the current queue.

    \sa clearQueue(), enqueue()
*/

/*!
    \fn void Phonon::MediaObject::enqueue(const MediaSource &source)

    Appends \a source to the queue.

    You can use this function to provide the next source after the
    aboutToFinish() signal has been emitted.

    \sa aboutToFinish(), setQueue(), clearQueue()
*/

/*!
    \fn void Phonon::MediaObject::enqueue(const QList<MediaSource> &sources)

    Appends multiple \a sources to the queue.

    \sa setQueue(), clearQueue()
*/

/*!
    \fn void Phonon::MediaObject::enqueue(const QList<QUrl> &urls)

    Appends the URLs in \a urls to the media source queue. 

    The function will create \l{MediaSource}s from the \l{QUrl}s, and
    append these to the queue.

    \sa setQueue(), clearQueue()
*/

/*!
    \fn void Phonon::MediaObject::clearQueue()

    Clears the queue of media sources.

    \sa queue(), enqueue()
*/

/*!
    \fn qint64 Phonon::MediaObject::currentTime() const

    Returns the current time (in milliseconds), i.e., position in the
    media stream, of the file currently being played.

    \sa tick(), totalTime(), remainingTime()
*/

/*!
    \fn qint64 Phonon::MediaObject::totalTime() const

    Get the total time (in milliseconds) of the file currently being played.

    Returns the total time in milliseconds.

    \warning The total time is not defined before the media object
             enters the \l{Phonon::}{LoadingState}.

    \sa totalTimeChanged()
*/

/*!
    \fn qint64 Phonon::MediaObject::remainingTime() const

    Get the remaining time (in milliseconds) of the file currently being played.

    Returns the remaining time in milliseconds.

    \sa totalTime(), currentTime(), totalTimeChanged()
*/

/*!
    \fn void Phonon::MediaObject::play()

    Requests playback of the media data to start.

    Playback starts when the stateChanged() signal is emitted with
    \l{Phonon::}{PlayingState}.

    If the media object is already in a
    \l{Phonon::}{PlayingState}, nothing happens.

    \sa stop(), pause(), stateChanged()
*/

/*!
    \fn void Phonon::MediaObject::pause()

    Requests playback to pause, and the media object to enter the
    \l{Phonon::}{PausedState}. If it was paused already, nothing
    changes.

    This function is asynchronous and the media might not be paused
    immediately.

    \sa play(), stop(), stateChanged()
*/

/*!
    \fn void Phonon::MediaObject::stop()

    Requests playback to stop, and the media object to enter the
    \l{Phonon::}{StoppedState}. If it was stopped before
    nothing changes.

    This function is asynchronous and the media might not be
    stopped immediately.

    \sa play(), pause(), stateChanged()
*/

/*!
    \fn void Phonon::MediaObject::seek(qint64 time)

    Requests a seek to the \a time indicated, specified in milliseconds.

    You can only seek if state() is PlayingState, BufferingState or PausedState.

    The call is asynchronous, so currentTime can still be the old
    value right after this method was called. If all you need is a
    slider that shows the current position and allows the user to
    seek, use the class SeekSlider.

    If the current source of the media object is not seekable, calls
    to this functions do nothing.

    \sa SeekSlider, tick()
*/

/*!
    \fn void Phonon::MediaObject::clear()

    Stops and removes all playing and enqueued media sources.

    \sa setCurrentSource()
*/


/*!
    \fn void Phonon::MediaObject::stateChanged(Phonon::State newstate, Phonon::State oldstate)

    This signal is emitted when the state of the MediaObject has changed.
    The \a oldstate and \a newstate parameters indicate the previous
    state and current state of the media object.

    If you are only interested in the new state of the media object, you can
    connect this signal to a slot that accepts only one State argument.
*/

/*!
    \fn void Phonon::MediaObject::tick(qint64 time)

    This signal is emitted in intervals defined by the
    \l{tickInterval} property. The current position of the media
    object in the stream is given by the \a time parameter. The \a
    time is specified in milliseconds.

    \sa tickInterval
*/

/*!
    \fn void Phonon::MediaObject::metaDataChanged()

    This signal is emitted when the media object has resolved new meta
    data. This will happen before the media object leaves the
    \l{Phonon::}{LoadingState} after a new source has been set.

    This signal is not emitted when the media object removes the
    current data, i.e., when a new source is set or an error has
    occurred. If you need to know this, you can listen for the
    \l{Phonon::}{ErrorState}, and connect to the
    \l{Phonon::MediaObject::}{currentSourceChanged()} signal.

    You can get the new meta data with the metaData methods.
    
    \sa metaData(), currentSourceChanged(), stateChanged(), Phonon::State
*/

/*!
    \fn void Phonon::MediaObject::seekableChanged(bool isSeekable)

    This signal is emitted when the media object's ability to seek in
    the media stream changes. \a isSeekable is true if it is possible
    to seek(); otherwise, it is false.

    Change in the ability to seek in the stream usually happens when
    the current source changes or when an error occurs.

    \omit Emitted whenever the return value of isSeekable()
    changes. \endomit

    Normally you'll check isSeekable() after setting a new media
    source, and then let this signal tell you when seeking is
    possible. That way you don't have to poll isSeekable().
*/

/*!
    \fn void Phonon::MediaObject::hasVideoChanged(bool hasVideo)

    Emitted whenever the return value of hasVideo() changes, i.e.,
    the media source being played back contains video.

    Normally you'll check hasVideo() first and then let this signal
    tell you whether video is available now or not. That way you
    don't have to poll hasVideo().

    \a hasVideo is true  when the stream contains video and adding a
    VideoWidget will show a video, and false if there is no video data
    in the stream and adding a VideoWidget will show an empty (black)
    VideoWidget.
*/

/*!
    \fn void Phonon::MediaObject::bufferStatus(int percentFilled)

    Provides information about the status of the buffer.

    When a MediaObject is in the \l{Phonon::}{BufferingState}, it will
    send this signal regularly. \a percentFilled is a number between 0
    and 100 telling you how much the buffer is filled.

    You can use this signal to show a progress bar to the user when
    in BufferingState:

    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 15

    Note that the \l{Phonon::}{BufferingState} is commonly used when
    waiting for data over a network connection, but this might not be
    true for all backends.
*/

/*!
    \fn void Phonon::MediaObject::finished()

    Emitted when the object has finished playback.  It is not emitted
    if you call stop(), pause() or load(). It is emitted only when the
    current media source has finished playing and the media queue() is
    empty, or when a \l{Phonon::FatalError}{fatal error} occurs.

    \warning This signal is not emitted when the current source has
    finished and there's another source in the queue. It is only
    emitted when the queue is empty.

    \sa currentSourceChanged(), aboutToFinish(), prefinishMarkReached()
*/

/*!
    \fn void Phonon::MediaObject::currentSourceChanged(const Phonon::MediaSource &newSource)

    Emitted when the MediaObject fetches a new MediaSource from the
    queue() and before it enters the \l{Phonon::}{LoadingState} for
    the new source. The media object will take a new source from the
    queue() when it has finished the playback of the
    \l{currentSource()}{current source}.

    \a newSource is the source that starts to play at the time the
    signal is emitted.
*/

/*!
    \fn void Phonon::MediaObject::aboutToFinish()

    Emitted before the playback of the whole queue ends. When this
    signal is emitted you still have time to enqueue() a new
    MediaSource, so that playback continues.

    If you need a signal to be emitted at a specific time before
    playback is finished, you should use the prefinishMarkReached()
    signal instead.

    \sa enqueue(), prefinishMark, prefinishMarkReached()
*/

/*!
    \fn void Phonon::MediaObject::prefinishMarkReached(qint32 msecToEnd)

    Emitted when there are only \a msecToEnd milliseconds left
    of playback.

    \warning This signal is not emitted when there is another source
    in the queue.  It is only emitted when the queue is empty.

    \sa setPrefinishMark(), prefinishMark(), aboutToFinish(), finished()
*/

/*!
    \fn void Phonon::MediaObject::totalTimeChanged(qint64 newTotalTime)

    This signal is emitted as soon as the total time of the media file is
    known or has changed. For most non-local media data the total
    time of the media can only be known after some time. At that time the
    totalTime function can not return useful information. You have
    to wait for this signal to know the real total time.

    \a newTotalTime is the length of the media file in milliseconds.

    \sa totalTime()
*/

/*!
    \fn MediaObject *Phonon::createPlayer(Phonon::Category category, const MediaSource &source = MediaSource())

    Convenience function to create a MediaObject and AudioOutput
    connected by a path. The \l{Phonon::}{MediaObject} return will
    have \a source set as its current source and the specified \a
    category.

*/

/*!
    \class Phonon::MediaObjectPrivate
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \namespace Phonon::BackendCapabilities
    \inmodule Phonon
    \since 4.4
    \brief The BackendCapabilities namespace contains functions to describe the capabilities of the multimedia backend.

*/

/*!
    \class Phonon::BackendCapabilitiesPrivate
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \class Phonon::BackendCapabilities::Notifier
    \since 4.4
    \inmodule Phonon
    \inheaderfile Phonon/BackendCapabilities

    Notifications about backend capabilities.
*/

/*!
    \fn void Phonon::BackendCapabilities::Notifier::capabilitiesChanged()

    This signal is emitted if the capabilities have changed. This can
    happen if the user has requested a backend change.
*/

/*!
    \fn void Phonon::BackendCapabilities::Notifier::availableAudioOutputDevicesChanged()

    This signal is emitted when audio output devices were plugged or
    unplugged.

    Check BackendCapabilities::availableAudioOutputDevices to get the
    current list of available devices.
*/

/*!
    \fn Notifier *Phonon::BackendCapabilities::notifier()

    Use this function to get a QObject pointer to connect to the capabilitiesChanged signal.

    \return a pointer to a QObject.

    The capabilitiesChanged signal is emitted if the capabilities have changed. This can
    happen if the user has requested a backend change.

    To connect to this signal do the following:
    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 16

    \sa Notifier::capabilitiesChanged()
*/

/*!
    \fn QStringList Phonon::BackendCapabilities::availableMimeTypes()

    Returns a list of mime types that the Backend can decode.

    \sa isMimeTypeAvailable()
*/

/*!
    \fn bool Phonon::BackendCapabilities::isMimeTypeAvailable(const QString &mimeType)

    Often all you want to know is whether one given MIME type can be
    decoded by the backend. Use this method in favor of
    availableMimeTypes() as it can give you a negative answer without
    having a backend loaded.

    Returns true if the given \a mimeType is supported by the backend;
    otherwise, returns false.

    \sa availableMimeTypes()
*/

/*!
    \fn QList<AudioOutputDevice> Phonon::BackendCapabilities::availableAudioOutputDevices()

    Returns the audio output devices the backend supports.

    \return A list of AudioOutputDevice objects that give a name and
            description for every supported audio output device.
*/

/*!
    \fn QList<EffectDescription> Phonon::BackendCapabilities::availableAudioEffects()

    Returns descriptions for the audio effects the backend supports.

    \return A list of AudioEffectDescription objects that give a name and
    description for every supported audio effect.
*/

/*!
    \internal
    \class ObjectDescriptionModelData
    \internal
    \inmodule Phonon
    \brief Data class for models for ObjectDescription objects.
*/

/*!
    \typedef Phonon::EffectDescription
    \relates Phonon::ObjectDescription

    EffectDescription gives a description of an \l{Processors}{audio
    effect}. It is a typedef of the \l{Phonon::}{ObjectDescription}
    class. Please see its class description for details.

    EffectDescription is used to create audio \l{Phonon::}{Effect}s,
    which can be inserted into a media graph, altering an audio
    stream.

    \sa Phonon::ObjectDescription, {Capabilities Example}, {Media
    Player}

*/

/*!
    \class Phonon::ObjectDescriptionModel
    \inmodule Phonon
    \internal
    \since 4.4
    \brief The ObjectDescriptionModel class provides a model from
    a list of ObjectDescription objects.

    ObjectDescriptionModel is a read only model that supplies a list
    using ObjectDescription::name() for the text and
    ObjectDescription::description() for the tooltip. If set the properties
    "icon" and "available" are used to set the decoration and disable the
    item (disabled only visually, you can still select and drag it).

    It also provides the methods moveUp() and moveDown() to order the list.
    Additionally drag and drop is possible so that
    QAbstractItemView::InternalMove can be used.
    The resulting order of the ObjectDescription::index() values can then be
    retrieved using tupleIndexOrder().

    An example use case would be to give the user a QComboBox to select
    the output device:
    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 17

    And to retrieve the selected AudioOutputDevice:
    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 18

*/

/*!
    \fn inline int Phonon::ObjectDescriptionModel::rowCount(const QModelIndex &parent = QModelIndex()) const

    Returns the number of rows in the model. This value corresponds
    to the size of the list passed through setModelData.

    \param parent The optional \a parent argument is used in most models to specify
    the parent of the rows to be counted. Because this is a list if a
    valid parent is specified the result will always be 0.

    Reimplemented from QAbstractItemModel.

    \sa QAbstractItemModel::rowCount()
*/

/*!
    \fn inline QVariant Phonon::ObjectDescriptionModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const

    Returns data from the item with the given \a index for the specified
    \a role.
    If the view requests an invalid index, an invalid variant is
    returned.

    Reimplemented from QAbstractItemModel.

    \sa QAbstractItemModel::data(), Qt::ItemDataRole
*/

/*!
    \fn inline Qt::ItemFlags Phonon::ObjectDescriptionModel::flags(const QModelIndex &index) const
    \internal

    Reimplemented to show unavailable devices as disabled (but still
    selectable). The \a index of the model index for which to return
    flags.

*/

/*!
    \fn inline QList<int> Phonon::ObjectDescriptionModel::tupleIndexOrder() const

    Returns a list of indexes in the same order as they are in the
    model. The indexes come from the ObjectDescription::index
    method.

    This is useful to let the user define a list of preference.
*/

/*!
    \fn inline int Phonon::ObjectDescriptionModel::tupleIndexAtPositionIndex(int positionIndex) const

    Returns the ObjectDescription::index for the tuple
    at the given position \a positionIndex. For example a
    QComboBox will give you the currentIndex as the
    position in the list. But to select the according
    AudioOutputDevice using AudioOutputDevice::fromIndex
    you can use this method.

    \param positionIndex The position in the list.
*/

/*!
    \class Phonon::ObjectDescriptionModelDataPrivate
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \fn inline QMimeData *Phonon::ObjectDescriptionModel::mimeData(const QModelIndexList &indexes) const
    \internal
    
    Returns the MIME data that dropMimeData() can use to create new
    items.
*/

/*!
    \fn inline void Phonon::ObjectDescriptionModel::moveUp(const QModelIndex &index)

    Moves the item at the given \a index up. In the resulting list
    the items at index.row() and index.row() - 1 are swapped.

    Connected views are updated automatically.
*/

/*!
    \fn inline void Phonon::ObjectDescriptionModel::moveDown(const QModelIndex &index)

    Moves the item at the given \a index down. In the resulting list
    the items at index.row() and index.row() + 1 are swapped.

    Connected views are updated automatically.
*/

/*!
    \fn explicit inline Phonon::ObjectDescriptionModel::ObjectDescriptionModel(QObject *parent = 0)

    Constructs a ObjectDescription model with the
    given \a parent.
*/

/*!
    \fn explicit inline Phonon::ObjectDescriptionModel::ObjectDescriptionModel(const QList<ObjectDescription<type> > &data, QObject *parent = 0)

    Constructs a ObjectDescription model with the
    given \a parent and the given \a data.
*/

/*!
    \fn inline void Phonon::ObjectDescriptionModel::setModelData(const QList<ObjectDescription<type> > &data)

    Sets the model data using the list provided by \a data.

    All previous model data is cleared.
*/

/*!
    \fn inline QList<ObjectDescription<type> > Phonon::ObjectDescriptionModel::modelData() const

    Returns the model data.

    As the order of the list might have changed this can be different
    to what was set using setModelData().
*/

/*!
    \fn inline ObjectDescription<type> Phonon::ObjectDescriptionModel::modelData(const QModelIndex &index) const

    Returns one ObjectDescription of the model data for the given \a index.
*/

/*!
    \fn inline Qt::DropActions Phonon::ObjectDescriptionModel::supportedDropActions() const

    This model supports drag and drop to copy or move
    items.
*/

/*!
    \fn inline bool Phonon::ObjectDescriptionModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)

    Accept drops from other models of the same ObjectDescriptionType.

    The \a data is dropped at the given \a row and \a column; you
    also receive the \a parent model index.

    If a valid \a parent is given the dropped items will be inserted
    above that item.
*/

/*!
    \fn inline bool Phonon::ObjectDescriptionModel::removeRows(int row, int count, const QModelIndex &parent = QModelIndex())

    Removes count rows starting with the given row.

    If a valid \a parent is given no rows are removed since this is a
    list model.

    Returns true if the rows were successfully removed; otherwise returns false.
*/

/*!
    \fn inline QStringList Phonon::ObjectDescriptionModel::mimeTypes() const

    Returns a list of supported drag and drop MIME types. Currently
    it only supports one type used internally.
*/

/*!
    \class Phonon::EffectInterface
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \class Phonon::Effect
    \inmodule Phonon
    \inheaderfile Phonon/Effect
    \since 4.4
    \brief The Effect class is used to transform audio streams.

    An effect is a media node which is inserted into a path between a
    \l{Phonon::}{MediaObject} and an audio output node, for instance,
    an \l{Phonon::}{AudioOutput}. The Effect transforms the media
    stream on that path.

    Examples may include simple modifiers, such as fading or pitch
    shifting, and more complex mathematical transformations. You can
    query the backend for available effects with
    BackendCapabilities::availableAudioEffects(). Note that the
    effects available is dependent on the underlying system
    (DirectDraw, GStreamer, or QuickTime).

    In order to use an effect, insert it into the path as follows:

    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 19

    The effect will immediately begin applying it's transformations on
    the path. To stop it, remove the Effect from the path.

    To create an effect, you use the \l{Phonon::}{EffectDescription}
    class, which you get from
    \l{BackendCapabilities::}{availableAudioEffects()}. We give a code
    example below.

    \snippet doc/src/snippets/audioeffects.cpp 0

    An effect can have one or more parameters, which let you alter how
    the effect works, for instance, by specifying the depth of a
    reverb effect. See the EffectParameter class description for
    details.

    Phonon also provides EffectWidget, which lets the user modify the
    parameters of an effect an the fly; e.g., with combo boxes.

    \sa {Phonon Module}, EffectWidget
*/

/*!
    \fn explicit Phonon::Effect::Effect(const EffectDescription &description, QObject *parent = 0)

    Constructs a new effect object with the given \a description and \a parent object.

    The EffectDescription object determines the type of the effect.

    \sa {Phonon::BackendCapabilities::availableAudioEffects()}
*/

/*!
    \fn Phonon::Effect::Effect(EffectPrivate &dd, QObject *parent)
    \internal
*/

/*!
    \fn Phonon::Effect::~Effect()
    \internal
*/

/*!
    \fn QVariant Phonon::Effect::parameterValue(const EffectParameter &parameter) const

    Returns the value of the given effect \a parameter. You can fetch
    the available parameters for an effect with parameters().

    \sa setParameterValue(), EffectParameter
*/

/*!
    \fn void Phonon::Effect::setParameterValue(const EffectParameter &parameter, const QVariant &value)

    Sets the given effect \a parameter to the specified \a value.

    Parameters for an effect are returned by parameters(). You can
    check which QVariant::Type an EffectParameter takes with the
    EffectParameter::type() function.

    \sa parameterValue(), EffectParameter
*/

/*!
    \fn EffectDescription Phonon::Effect::description() const;

    Returns the description of this effect. This is the same
    description that was passed to the constructor. 
*/

/*!
    \fn QList<EffectParameter> Phonon::Effect::parameters() const;

    Returns a list of parameters that this effect provides to control
    its behavior.

    \sa EffectParameter, EffectWidget
*/

/*!
    \class Phonon::EffectPrivate
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \class Phonon::AudioOutput
    \inmodule Phonon
    \inheaderfile Phonon/AudioOutput
    \since 4.4
    \brief The AudioOutput class is used to send data to audio output devices.

    The AudioOutput class plays sound over a sound device. The audio
    output needs to be connected to a \l{Phonon::}{MediaObject} using
    \l{Phonon::}{createPath()}. To start playback, you call
    \l{Phonon::MediaObject::}{play()} on the media object.

    \snippet snippets/phonon.cpp 2

    The class supports changing the volume(). It is also possible to
    mute the sound. 

    To find out what \l{Phonon::}{AudioOutputDevice}s are available
    for AudioOutput, you can call
    BackendCapabilities::availableAudioOutputDevices(). A default device is
    selected by the backend, but it is possible to set the device to
    be used with setOutputDevice(). The outputDeviceChanged() signal
    will be emitted if the device changes.

    If an error occurs with the playback, for instance, if no valid
    output device is found, the media object will receive a
    stateChanged() signal with the \l{Phonon::}{ErrorState}.

    Note that the default values of properties are dependent on the
    backend.

    \sa Phonon::VolumeSlider, {Music Player Example}, BackendCapabilities, {Phonon Module}
*/

/*!
    \property Phonon::AudioOutput::name

    This is the name that appears in Mixer applications that control
    the volume of this output.

*/

/*!
    \property Phonon::AudioOutput::volume

    This is the current loudness of the output.  \omit The volume is a
    real value between 0.0 (minimum) and 1.0 (maximum). The volume
    follows the sound device used, with 1.0 being the maximum volume
    the device can produce. \endomit

    (it is using Stevens' law
    to calculate the change in voltage internally).

    \sa volumeDecibel
*/

/*!
    \property Phonon::AudioOutput::volumeDecibel

    This is the current volume of the output in decibel.

    0 dB means no change in volume, -6dB means an attenuation of the
    voltage to 50% and an attenuation of the power to 25%, -inf dB means
    silence.

    \sa volume
*/

/*!
    \property Phonon::AudioOutput::outputDevice
    This property holds the (hardware) destination for the output.

    The default device is determined by the \l{Phonon::}{Category} and the global
    configuration for that category. Normally you don't need
    to override this setting - letting the user change the global
    configuration is the right choice. You can still override the
    device though, if you have good reasons to do so.

    \sa outputDeviceChanged()
*/

/*!
    \property Phonon::AudioOutput::muted
    This property tells whether the output is muted.

    Muting the output has the same effect as calling setVolume(0.0).
*/

/*!
    \fn explicit Phonon::AudioOutput::AudioOutput(Phonon::Category category, QObject *parent = 0)

    Creates a new AudioOutput with the given \a parent that defines
    output to a physical device.

    The \a category can be used by mixer applications to group volume
    controls of applications into categories. That makes it easier for
    the user to identify the programs.
    The category is also used for the default output device that is
    configured centrally. As an example: often users want to have the
    audio signal of a VoIP application go to their USB headset while
    all other sounds should go to the internal soundcard.

    \sa Phonon::categoryToString(), outputDevice
*/

/*!
    \fn explicit Phonon::AudioOutput::AudioOutput(QObject *parent = 0)

    Creates a new AudioOutput that defines output to the system
    default device with the \{Phonon::Category::}{NoCategory} category

    \sa Phonon::categoryToString(), outputDevice
*/

/*!
    \fn Phonon::Category Phonon::AudioOutput::category() const

    Returns the category of this output.

    \sa Phonon::AudioOutput::AudioOutput()
*/

/*!
    \fn void Phonon::AudioOutput::volumeChanged(qreal newVolume)

    This signal is emitted whenever the volume has changed. As the
    volume can change without a call to setVolume (calls over dbus)
    this is important to keep a widget showing the current volume up
    to date.

    \a newVolume is the new volume level.

    \sa setVolume(), volume()
*/

/*!
    \fn void Phonon::AudioOutput::mutedChanged(bool muted)

    This signal is emitted when the muted property has changed. The \a muted
    value passed by the signal indicates the state of the muted property.
    As this property can change by IPC (DBus) calls a UI element showing
    the muted property should listen to this signal.
*/

/*!
    \fn void Phonon::AudioOutput::outputDeviceChanged(const Phonon::AudioOutputDevice &newAudioOutputDevice)

    This signal is emitted when the (hardware) device for the output
    has changed. \a newAudioOutputDevice is the new device.

    The change can happen either through setOutputDevice or if the
    global configuration for the used category has changed.

    \sa outputDevice
*/

/*!
    \class Phonon::AudioOutputPrivate
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \class Phonon::EffectParameter
    \inmodule Phonon
    \inheaderfile Phonon/EffectParameter
    \since 4.4
    \brief The EffectParameter class describes one parameter of an effect.

    You fetch the parameters of an \l{Phonon::}{Effect} with
    \l{Phonon::}{Effect::parameters()}.

    \snippet doc/src/snippets/phononeffectparameter.cpp 0

    To describe itself, an effect parameter gives a name() and
    possibly description() (depending on the backend used). These are
    suited to present the effect parameter to the user of a Phonon
    application.

    Note that effects are created by the backend, and that
    their name and descriptions may vary.

    The value of an effect parameter is stored in a \l{QVariant},
    of which type() is usually \c int or \c double. 

    The value is retrieved with \l{Phonon::}{Effect::parameterValue()}
    and set with \l{Phonon::Effect::}{setParameterValue()} - both of
    which takes the EffectParameter as argument. Note that not all
    effect parameters support setting of their value. 

    You get the values a parameter can take with possibleValues(); an
    empty list is returned if the values are continuous.

    A parameter may also specify default(), minimum(), and maximum()
    values. Values are returned as \l{QVariant}s. If the parameter
    does not have the requested value, an \l{QVariant::Invalid}
    invalid QVariant is returned from these functions.

    The \l{Phonon::}{EffectWidget} provides a widget with which one
    can control the parameters of an \l{Phonon::}{Effect}.

    \snippet doc/src/snippets/phononeffectparameter.cpp 1

    \sa Effect, EffectWidget, {Capabilities Example}, {Phonon Module}
*/

/*!
    \fn Phonon::EffectParameter::EffectParameter()
    \internal

    Creates an invalid effect parameter.
*/

/*!
    \fn Phonon::EffectParameter::~EffectParameter()

    Destroys the effect parameter.
*/

/*!
    \fn Phonon::EffectParameter::EffectParameter(const EffectParameter &other)

    Constructs a copy of the \a other effect parameter.
*/

/*!
    \fn const QString &Phonon::EffectParameter::name() const

    The name of the parameter. Can be used as the label.

    \return A label for the parameter.
*/

/*!
    \fn const QString &Phonon::EffectParameter::description() const

    The parameter may come with a description (LADSPA doesn't have a
    field for this, so don't expect many effects to provide a
    description).

    The description can be used for a tooltip or WhatsThis help.

    \return A text describing the parameter.
*/

/*!
    \fn QVariant::Type Phonon::EffectParameter::type() const

    Returns the parameter type.

    Common types are QVariant::Int, QVariant::Double, QVariant::Bool and QVariant::String. When
    QVariant::String is returned you get the possible values from possibleValues.
*/

/*!
    \fn bool Phonon::EffectParameter::isLogarithmicControl() const

    Returns whether the parameter should be
    displayed using a logarithmic scale. This is particularly useful for
    frequencies and gains.
*/

/*!
    \fn QVariant Phonon::EffectParameter::minimumValue() const

    The minimum value to be used for the control to edit the parameter.

    If the returned QVariant is invalid the value is not bounded from
    below.
*/

/*!
    \fn QVariant Phonon::EffectParameter::maximumValue() const

    The maximum value to be used for the control to edit the parameter.

    If the returned QVariant is invalid the value is not bounded from
    above.
*/

/*!
    \fn QVariant Phonon::EffectParameter::defaultValue() const

    The default value.
*/

/*!
    \fn QVariantList Phonon::EffectParameter::possibleValues() const

    The possible values to be used for the control to edit the parameter.

    if the value of this parameter is to be picked from predefined values
    this returns the list (otherwise it returns an empty QVariantList).
*/

/*!
    \fn bool Phonon::EffectParameter::operator<(const EffectParameter &rhs) const

    \internal
    compares the ids of the parameters
*/

/*!
    \fn bool Phonon::EffectParameter::operator>(const EffectParameter &rhs) const

    \internal
    compares the ids of the parameters
*/

/*!
    \fn bool Phonon::EffectParameter::operator==(const EffectParameter &rhs) const

    \internal
    compares the ids of the parameters
*/

/*!
    \fn Phonon::EffectParameter &Phonon::EffectParameter::operator=(const EffectParameter &other)

    Assigns the \a other effect parameter to this parameter and returns
    a reference to this parameter.
*/

/*!
    \enum Phonon::EffectParameter::Hint

    Only for backend developers:

    Flags to set the return values of isToggleControl(),
    isLogarithmicControl(), isIntegerControl(), isBoundedBelow() and
    isBoundedAbove(). The values of the flags correspond to the values
    used for LADSPA effects.

    \value ToggledHint
    If this hint is set it means that
    the control has only two states: zero and non-zero
    (see isToggleControl()).

    \value LogarithmicHint
    LADSPA's SAMPLE_RATE hint needs to be translated by the backend
    to normal bounds, as the backend knows the sample rate - and the
    frontend doesn't (see isLogarithmicControl()).

    \value IntegerHint See isIntegerControl().
*/

/*!
    \fn Phonon::EffectParameter::EffectParameter(int parameterId,
        const QString &name, EffectParameter::Hints hints,
        const QVariant &defaultValue, const QVariant &min = QVariant(),
        const QVariant &max = QVariant(), const QVariantList &values = QVariantList(),
        const QString &description = QString())

    Only to be used by backend implementations:

    Creates a new effect parameter.

    \a parameterId This is a number to uniquely identify the
    parameter. The id is used for value() and setValue().

    \a name is the name/label for this parameter.

    \a hints sets the hints for the type of parameter.

    \a defaultValue The value that should be used as a default.

    \a min is the minimum value allowed for this parameter. You only
    need to set this if the BoundedBelowHint is set.

    \a max is the maximum value allowed for this parameter. You only
    need to set this if the BoundedAboveHint is set.

    The \a values parameter is the values that the effect parameter
    can take (only applies if non-continuous) 

    \a description is a descriptive text for the parameter
    (explaining what it controls) to be used as a tooltip or
    WhatsThis help.
*/

/*!
    \fn int Phonon::EffectParameter::id() const

    \internal

    Returns the parameter's identifier.
*/

/*!
   \typedef Phonon::AudioOutputInterface
   \inmodule Phonon
   \internal
*/

/*!
    \class Phonon::AudioOutputInterface40
    \inmodule Phonon
    \since 4.4
    \internal
    \brief Interface for AudioOutput objects

*/

/*!
    \fn virtual Phonon::AudioOutputInterface40::~AudioOutputInterface40()
    \internal
*/

/*!
    \fn virtual qreal Phonon::AudioOutputInterface40::volume() const = 0
    \internal
*/

/*!
    \fn virtual void Phonon::AudioOutputInterface40::setVolume(qreal) = 0
    \internal
*/

/*!
    \fn virtual int Phonon::AudioOutputInterface40::outputDevice() const = 0
    \internal
*/

/*!
    \fn virtual bool Phonon::AudioOutputInterface40::setOutputDevice(int) = 0
    \internal
*/

/*!
    \class Phonon::Path
    \inmodule Phonon
    \inheaderfile Phonon/Path
    \since 4.4
    \brief The Path class describes connections between media nodes.

    In a \l{Building Graphs}{media graph}, \l{Phonon::}{MediaNode}s
    are connected by Paths. The multimedia travels in streams over
    these paths.

    You create a path between two media nodes using the static
    Phonon::createPath() function, which takes two nodes as arguments.
    The first argument will send the media stream to the second.
    Please refer to the class description of the individual media
    nodes and the Phonon \l{Phonon Overview}{overview} to see which
    nodes can be connected to each other.

    Paths are also used to insert audio \l{Phonon::}{Effect}s between
    two media nodes. The effect will then alter the stream on the
    path. Notice that \l{Phonon::}{Effect}s also are media nodes, but
    that insertEffect() - instead of Phonon::createPath() - is used to
    insert them into the media graph.

    The following code example shows how to create a path between two
    media nodes and insert an effect on that path.

    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 20

    \sa Phonon::MediaNode, Phonon::MediaObject, Phonon::AudioOutput,
        Phonon::VideoWidget, {Phonon Module}
*/

/*!
    \fn Phonon::Path::~Path();

    Destroys this reference to the Path. If the path was valid the connection is not broken
    as both the source and the sink MediaNodes still keep a reference to the Path.

    \sa disconnect()
*/

/*!
    \fn Phonon::Path::Path();

    Creates an invalid path.

    You can still make it a valid path by calling reconnect. It is
    recommended to use the Phonon::createPath() function to create
    paths.

    \sa Phonon::createPath(), isValid()
*/

/*!
    \fn Phonon::Path::Path(const Path &path);

    Constructs a copy of the other \a path specified.

    This constructor is fast thanks to explicit sharing.
*/

/*!
    \fn bool Phonon::Path::isValid() const;

    A path is considered valid if it is connected to two media nodes,
    in which case this function returns true. If it is connected to
    one or no media nodes, it is consider invalid, and this function
    will then return false.
*/

/*!
    \fn Effect *Phonon::Path::insertEffect(const EffectDescription &desc, Effect *insertBefore = 0);

    Creates and inserts an effect into the path.

    You may insert effects of the same class as often as you like,
    but if you insert the same object, the call will fail.

    \a desc is the EffectDescription object for the effect to be inserted.

    If you already inserted an effect you can
    tell with \a insertBefore in which order the data gets
    processed. If this is \c 0 the effect is appended at the end of
    the processing list. If the effect has not been inserted before
    the method will do nothing and return \c false.

    Returns a pointer to the effect object if it could be inserted
    at the specified position. If \c 0 is returned, the effect was not
    inserted.

    Below is a code example for inserting an effect into a path:

    \snippet doc/src/snippets/audioeffects.cpp 0

    \sa removeEffect(), effects()
*/

/*!
    \fn bool Phonon::Path::insertEffect(Effect *effect, Effect *insertBefore = 0);

    Inserts the given \a effect into the path before the effect specified by \a insertBefore
    and returns true if successful; otherwise returns false.

    If \a insertBefore is zero, the effect is appended to the processing list.

    You may insert effects of the same class as often as you like, but if you insert
    the same object, the call will fail.

    \a effect will be inserted right before \a insertBefore. If
    \a insertBefore is \c 0, the effect is appended at the end of the
    processing list. If the effect has not been inserted before the
    method will do nothing and return \c false.

    Returns whether the effect could be inserted at the specified
    position. If \c false is returned the effect was not inserted.

    \sa removeEffect(), effects()
*/

/*!
    \fn bool Phonon::Path::removeEffect(Effect *effect);

    Removes the given \a effect from the path and returns true; otherwise returns false.

    Removes an \a effect from the path.

    If the effect is deleted while it is still connected, the effect will be removed
    automatically.

    \omit
    \param effect The effect to be removed.

    \return Returns whether the call was successful. If it returns
    \c false the effect could not be found in the path, meaning it
    has not been inserted before.
    \endomit

    \sa insertEffect(), effects()
*/

/*!
    \fn QList<Effect *> Phonon::Path::effects() const;

    Returns a list of Effect objects that are currently
    used as effects. The order in the list determines the order the
    signal is sent through the effects.

    \return A list with all current effects.

    \sa insertEffect(), removeEffect()
*/

/*!
    \fn bool Phonon::Path::reconnect(MediaNode *source, MediaNode *sink);

    Changes the media nodes the path is connected to by connecting the path
    to the \a source and \a sink nodes specified. Returns true if successful;
    otherwise returns false.

    If unsuccessful, the path remains connected to the same nodes as before.

    \sa Phonon::createPath(), {Phonon Overview}
*/

/*!
    \fn bool Phonon::Path::disconnect();

    Tries to disconnect the path from the MediaNodes it is connected to, returning
    true if successful or false if unsuccessful.

    If successful, the path is invalidated: isValid() will returns false.
*/

/*!
    \fn Path &Phonon::Path::operator=(const Path &p);

    Assigns \a p to this Path and returns a reference to this Path.

    This operation is fast thanks to explicit sharing.
*/

/*!
    \fn bool Phonon::Path::operator==(const Path &p) const;

    Returns true if this Path is equal to \a p; otherwise returns false;
*/

/*!
    \fn bool Phonon::Path::operator!=(const Path &p) const;

    Returns true if this Path is not equal to \a p; otherwise returns false.
*/

/*!
    \fn MediaNode *Phonon::Path::source() const;

    Returns the source MediaNode used by the path.
*/

/*!
    \fn MediaNode *Phonon::Path::sink() const;

    Returns the sink MediaNode used by the path.
*/

/*!
    \fn Path Phonon::createPath(MediaNode *source, MediaNode *sink);

    \relates Phonon::Path
    Creates a new Path connecting the two MediaNodes \a source and \a sink.

    The implementation will automatically select the right format and media type. E.g. connecting a
    MediaObject and AudioOutput will create a Path object connecting the audio. This might be
    represented as PCM or perhaps even AC3 depending on the AudioOutput object.

    \param source The MediaNode to connect an output from
    \param sink The MediaNode to connect to.
*/

/*!
    \class Phonon::PathPrivate
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \class Phonon::MediaObjectInterface
    \inmodule Phonon
    \since 4.4
    \internal
    \brief Backend interface for media sources.

    The backend implementation has to provide two signals, that are not defined
    in this interface:
    \list
    \o \target phonon_MediaObjectInterface_stateChanged
    void stateChanged(Phonon::State newstate, Phonon::State oldstate)

    Emitted when the state of the MediaObject has changed.
    In case you're not interested in the old state you can also
    connect to a slot that only has one State argument.

    \param newstate The state the Player is in now.
    \param oldstate The state the Player was in before.

    \o \target phonon_MediaObjectInterface_tick
    void tick(qint64 time)

    This signal gets emitted every tickInterval milliseconds.

    \param time The position of the media file in milliseconds.

    \sa setTickInterval()
    \sa tickInterval()
    \endlist

    \sa MediaObject
*/

/*!
    \fn virtual Phonon::MediaObjectInterface::~MediaObjectInterface()
    \internal
*/

/*!
    \fn virtual qint64 Phonon::MediaObjectInterface::remainingTime() const
    \internal
*/

/*!
    \fn virtual qint32 Phonon::MediaObjectInterface::prefinishMark() const = 0
    \internal
*/

/*!
    \fn virtual void Phonon::MediaObjectInterface::setPrefinishMark(qint32) = 0
    \internal
*/

/*!
    \fn virtual qint32 Phonon::MediaObjectInterface::transitionTime() const = 0
    \internal
*/

/*!
    \fn virtual void Phonon::MediaObjectInterface::setTransitionTime(qint32) = 0
    \internal
*/

/*!
    \fn virtual void Phonon::MediaObjectInterface::play() = 0
    \internal

    Requests the playback to start.

    This method is only called if the state transition to PlayingState is possible.

    The backend should react immediately
    by either going into PlayingState or BufferingState if the
    former is not possible.
*/

/*!
    \fn virtual void Phonon::MediaObjectInterface::pause() = 0
    \internal

    Requests the playback to pause.

    This method is only called if the state transition to PausedState is possible.

    The backend should react as fast as possible. Go to PausedState
    as soon as playback is paused.
*/

/*!
    \fn virtual void Phonon::MediaObjectInterface::stop() = 0
    \internal

    Requests the playback to be stopped.

    This method is only called if the state transition to StoppedState is possible.

    The backend should react as fast as possible. Go to StoppedState
    as soon as playback is stopped.

    A subsequent call to play() will start playback at the beginning of
    the media.
*/

/*!
    \fn virtual void Phonon::MediaObjectInterface::seek(qint64 milliseconds) = 0
    \internal

    Requests the playback to be seeked to the given time.

    The backend does not have to finish seeking while in this function
    (i.e. the backend does not need to block the thread until the seek is
    finished; even worse it might lead to deadlocks when using a
    ByteStream which gets its data from the thread this function would
    block).

    As soon as the seek is done the currentTime() function and
    the tick() signal will report it.

    \param milliseconds The time where playback should seek to in
    milliseconds.
*/

/*!
    \fn virtual qint32 Phonon::MediaObjectInterface::tickInterval() const = 0
    \internal

    Return the time interval in milliseconds between two ticks.

    Returns the tick interval that it was set to (might not
    be the same as you asked for).
*/

/*!
    \fn virtual void Phonon::MediaObjectInterface::setTickInterval(qint32 interval) = 0
    \internal

    Change the interval the tick signal is emitted. Set \a interval to 0 to
    disable the signal.

    \a interval tick interval in milliseconds

    Returns the tick interval that it was set to (might not be the same as you
    asked for).

*/

/*!
    \fn virtual bool Phonon::MediaObjectInterface::hasVideo() const = 0
    \internal

    Check whether the media data includes a video stream.

    Returns true if the media contains video data.
*/

/*!
    \fn virtual bool Phonon::MediaObjectInterface::isSeekable() const = 0
    \internal

    If the current media may be seeked this function returns true;
    otherwise, false.

    Returns whether the current media may be seeked.
*/

/*!
    \fn virtual qint64 Phonon::MediaObjectInterface::currentTime() const = 0
    \internal

    Get the current time (in milliseconds) of the file currently being played.
*/

/*!
    \fn virtual Phonon::State Phonon::MediaObjectInterface::state() const = 0
    \internal

    Get the current state.
*/

/*!
    \fn virtual QString Phonon::MediaObjectInterface::errorString() const = 0
    \internal

    A translated string describing the error.
*/

/*!
    \fn virtual Phonon::ErrorType Phonon::MediaObjectInterface::errorType() const = 0
    \internal

    Tells your program what to do about the error.

    \sa Phonon::ErrorType
*/

/*!
    \fn virtual qint64 Phonon::MediaObjectInterface::totalTime() const = 0
    \internal

    Returns the total time of the media in milliseconds.

    If the total time is not know return -1. Do not block until it is
    known, instead emit the totalTimeChanged signal as soon as the total
    time is known or changes.
*/

/*!
    \fn virtual MediaSource Phonon::MediaObjectInterface::source() const = 0
    \internal

    Returns the current source.
*/

/*!
    \fn virtual void Phonon::MediaObjectInterface::setSource(const MediaSource &) = 0
    \internal

    Sets the current source. When this function is called the MediaObject is
    expected to stop all current activity and start loading the new
    source (i.e. go into LoadingState).

    It is expected that the
    backend now starts preloading the media data, filling the audio
    and video buffers and making all media meta data available. It
    will also trigger the totalTimeChanged signal.

    If the backend does not know how to handle the source it needs to
    change state to Phonon::ErrorState. Don't bother about handling KIO
    URLs. It is enough to handle AbstractMediaStream sources correctly.

    \warning Keep the MediaSource object around as long as the backend
    uses the AbstractMediaStream returned by the MediaSource. In case
    that no other reference to the MediaSource exists and it is set to
    MediaSource::autoDelete, the AbstractMediaStream is deleted when the
    last MediaSource ref is deleted.
*/

/*!
    \fn virtual void Phonon::MediaObjectInterface::setNextSource(const MediaSource &source) = 0
    \internal

    Sets the next source to be used for transitions. When a next source
    is set playback should continue with the new source. In that case
    finished and prefinishMarkReached are not emitted.

    \param source The source to transition to (crossfade/gapless/gap). If
    \a source is an invalid MediaSource object then the queue is empty
    and the playback should stop normally.

    \warning Keep the MediaSource object around as long as the backend
    uses the AbstractMediaStream returned by the MediaSource. In case
    that no other reference to the MediaSource exists and it is set to
    MediaSource::autoDelete, the AbstractMediaStream is deleted when the
    last MediaSource ref is deleted.
*/

/*!
    \class Phonon::EffectWidget effectwidget.h Phonon/EffectWidget
    \inmodule Phonon
    \inheaderfile Phonon/EffectWidget
    \since 4.4
    \brief The EffectWidget class provides a widget to control the parameters of an Effect.

    The EffectWidget class provides a widget, with which an effects
    parameters can be controlled. The widget does not have an API,
    and is constructed with the \l{Phonon::}{Effect}, of which
    parameters should be controlled.

    \snippet doc/src/snippets/audioeffects.cpp 1

    The following image shows an example of an effect widget.

    \image effectwidget.png

    Note that some audio effects do not have parameters, and the
    widget will then not \l{QWidget::}{show()} at all.

    \sa Effect, BackendCapabilities, EffectDescription, {Phonon Module}
*/

/*!
    \class Phonon::AbstractAudioOutput
    \inmodule Phonon
    \internal
    \brief Provides a common base class for all audio outputs.

    \sa AudioOutput
*/

/*!
    \fn Phonon::AbstractAudioOutput::~AbstractAudioOutput()
    \internal
*/

/*!
    \class Phonon::AbstractAudioOutputPrivate
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \class AudioOutputAdaptor
    \inmodule Phonon
    \brief Provides an adaptor class for interface org.kde.Phonon.AudioOutput
    \internal
*/

/*!
    \class Phonon::VolumeSlider
    \inmodule Phonon
    \inheaderfile Phonon/VolumeSlider
    \since 4.4
    \brief The VolumeSlider widget provides a slider that is used to control the volume of an audio output device.

    The slider also displays an icon indicating if the volume of the
    \l{Phonon::}{AudioOutput} it is connected to is muted. The icon
    can be removed with setMuteVisible().

    It is possible to set the \l{maximumVolume}{maximum} value of the
    slider. By default, the minimum and maximum values of the slider
    are 0.0 (no sound) to 1.0 (the maximum volume the audio output can
    produce).

    Here follows a code example:

    \snippet doc/src/snippets/volumeslider.cpp 0

    \omit mention how to change the style of the slider. \endomit

    \sa {Phonon Module}
*/

/*!
    \property Phonon::VolumeSlider::maximumVolume

    This property holds the maximum volume that can be set with this slider.

    By default the maximum value is 1.0 (100%).
*/

/*!
    \property Phonon::VolumeSlider::orientation
    This property holds the orientation of the slider.

    The orientation must be Qt::Vertical (the default) or Qt::Horizontal.
*/

/*!
    \property Phonon::VolumeSlider::tracking
    This property holds whether slider tracking is enabled.

    If tracking is enabled (the default), the volume changes
    while the slider is being dragged. If tracking is
    disabled, the volume changes only when the user
    releases the slider.
*/

/*!
    \property Phonon::VolumeSlider::pageStep
    This property holds the page step.

    The larger of two natural steps that a slider provides and
    typically corresponds to the user pressing PageUp or PageDown.

    Defaults to 5 (5% of the voltage).
*/

/*!
    \property Phonon::VolumeSlider::singleStep
    This property holds the single step.

    The smaller of two natural steps that a slider provides and
    typically corresponds to the user pressing an arrow key.

    Defaults to 1 (1% of the voltage).
*/

/*!
    \property Phonon::VolumeSlider::muteVisible
    This property holds whether the mute button/icon next to the slider is visible.

    By default the mute button/icon is visible.
*/

/*!
    \property Phonon::VolumeSlider::iconSize
    \brief the icon size used for the mute button/icon.

    The default size is defined by the GUI style.
*/

/*!
    \fn explicit Phonon::VolumeSlider::VolumeSlider(QWidget *parent = 0)
    Constructs a new volume slider with the given \a parent.
*/

/*!
    \fn explicit Phonon::VolumeSlider::VolumeSlider(AudioOutput *output, QWidget *parent = 0)
    Constructs a new volume slider with the given \a output object and \a parent.
*/

/*!
    \fn Phonon::VolumeSlider::~VolumeSlider()
*/

/*!
    \fn AudioOutput *Phonon::VolumeSlider::audioOutput() const
*/

/*!
    \fn void Phonon::VolumeSlider::setAudioOutput(Phonon::AudioOutput *output)

    Sets the audio output object to be controlled by this slider to the specified
    \a output object.
*/

/*!
    \class Phonon::VolumeSliderPrivate
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \class Phonon::MediaController
    \inmodule Phonon
    \inheaderfile Phonon/MediaController
    \since 4.4
    \brief The MediaController class controls optional features of a media file/device.

    Some media sources have content that the \l{Phonon::}{MediaObject}
    does not provide control over, for instance, chapters in a DVD
    file. The functionality the media controller offers is
    dependent on the type of media source that is played back.
    Commonly, the media controller allows you to:

    \list
        \o Navigate between \bold chapters.
        \o Navigate between \bold titles.
        \o Select between \bold angles.
    \endlist 

    The \l{Phonon::MediaController::}{Feature} enum explains these
    terms in more detail, and their context in playback of CD and DVD. 

    The media controller keeps a \l{Phonon::}{MediaObject}, of which
    \l{Phonon::MediaObject::currentSource()}{media source} is played
    back. You can still call the media object's functions, e.g.,
    \l{Phonon::MediaObject::}{stop()}; this is all handled correctly
    by the media controller. You have the option of letting the media
    controller play all titles of a source in sequence by setting the
    \l{autoplayTitles()}{autoplay titles} option.

    To start a playback using a media object, you call
    \l{Phonon::MediaObject::}{play()} on the media object. To play a
    specific title, use setCurrentTitle() and then call
    \l{Phonon::MediaObject::}{play()}.

    \warning The Phonon::MediaController class is not yet supported by
    Qt backends.

    \sa {Phonon Module}
*/

/*!
    \fn int Phonon::MediaController::availableAudioChannels() const
    \internal
*/

/*!
    \fn void Phonon::MediaController::availableAudioChannelsChanged()
    \internal
*/

/*!
    \fn QList<SubtitleDescription> Phonon::MediaController::availableSubtitles() const
    \internal
*/

/*!
    \fn void Phonon::MediaController::availableSubtitlesChanged()
    \internal
*/

/*!
    \fn AudioChannelDescription Phonon::MediaController::currentAudioChannel() const
    \internal
*/

/*!
    \fn SubtitleDescription Phonon::MediaController::currentSubtitle() const
    \internal
*/

/*!
    \fn void Phonon::MediaController::setCurrentAudioChannel(const Phonon::AudioChannelDescription &stream)
    \internal
*/

/*!
    \fn void Phonon::MediaController::setCurrentSubtitle(const Phonon::SubtitleDescription &stream)
    \internal
*/

/*!
    \fn Phonon::BackendCapabilities::availableAudioCaptureDevices()
    \internal
*/

/*!
    \fn Phonon::BackendCapabilities::Notifier::availableAudioCaptureDevicesChanged()
    \internal
*/

/*!
    \enum Phonon::MediaController::Feature

    The values of this enum are interpreted differently depending on
    the type of media source, e.g., DVD or CD. We give examples for
    these sources.

    \value Angles In the VOB (DVD) format, it is possible to to give
    several video streams of the same scene, each of which displays
    the scene from a different angle. The DVD viewer can then change
    between these angles.

    \value Chapters In the VOB format, chapters are points in a
    single video stream that can be played and seeked to
    separately. 

    \value Titles On a CD, a title is a separate sound track. On DVD,
    a title is a separate VOB file.

*/

/*!
    \fn Phonon::MediaController::MediaController(MediaObject *parent)

    Constructs a new MediaController with the media object (\a parent)
    to be used by the media controller.

    \sa MediaObject, Feature
*/

/*!
    \fn Phonon::MediaController::~MediaController()
*/

/*!
    \fn Features Phonon::MediaController::supportedFeatures() const
*/

/*!
    \fn int Phonon::MediaController::availableAngles() const

    Returns the available angles that is available for the current
    media source.

    \sa Feature
*/

/*!
    \fn int Phonon::MediaController::currentAngle() const

    Returns the angle that is currently used.

    \sa Feature
*/

/*!
    \fn int Phonon::MediaController::availableChapters() const

    Returns the number of chapters the current media source
    contains.

    \sa Feature
*/

/*!
    \fn int Phonon::MediaController::currentChapter() const

    Returns the chapter that is currently being played back.

    \sa Feature
*/

/*!
    \fn int Phonon::MediaController::availableTitles() const

    Returns the number of titles that the current media source
    contains.

    \sa Feature
*/

/*!
    \fn int Phonon::MediaController::currentTitle() const

    Returns the title that is currently played back.

    The current title is 0 (the first) by default.

    \sa Feature
*/

/*!
    \fn bool Phonon::MediaController::autoplayTitles() const

    Returns true if titles will automatically be played when the media
    is played; otherwise returns false.

    The media controller will play the titles of the media source in
    sequence when the media object's \l{Phonon::MediaObject::}{play()}
    function is called. If the autoplay option is disabled, the media
    object will play the
    \l{Phonon::}{MediaController::currentTitle()}{current title} and then
    finish the playback.

    \sa setAutoplayTitles(), currentTitle()
*/

/*!
    \fn void Phonon::MediaController::setAutoplayTitles(bool enable)

    Sets the titles to play automatically when the media is played if
    \a enable is true; otherwise disables this option.

    The media controller will play the titles of the media source in
    sequence when the media object's \l{Phonon::MediaObject::}{play()}
    function is called. If the autoplay option is disabled, the media
    object will play the
    \l{Phonon::}{MediaController::currentTitle()}{current title} and then
    finish the playback.

    \sa autoplayTitles(), currentTitle()
*/

/*!
    \fn void Phonon::MediaController::setCurrentAngle(int angleNumber)

    Sets the current angle to the given \a angleNumber if the media
    file or device supports navigation by angle number.

    \sa Feature
*/

/*!
    \fn void Phonon::MediaController::setCurrentChapter(int chapterNumber)

    Sets the current chapter to the given \a chapterNumber if the media
    file or device supports navigation by chapter number.

    \sa Feature
*/

/*!
    \fn void Phonon::MediaController::setCurrentTitle(int titleNumber)

    Skips to the given title \a titleNumber.

    If it was playing before the title change it will start playback on the new title if
    autoplayTitles is enabled.

    \sa Feature
*/

/*!
    \fn void Phonon::MediaController::nextTitle()

    Skips to the next title.

    If it was playing before the title change it will start playback on the next title if
    autoplayTitles is enabled.

    \sa Feature
*/

/*!
    \fn void Phonon::MediaController::previousTitle()

    Skips to the previous title.

    If it was playing before the title change it will start playback on the previous title if
    autoplayTitles is enabled.

    \sa Feature
*/

/*!
    \fn void Phonon::MediaController::availableAnglesChanged(int availableAngles)

    This signal is emitted whenever the number of available angles changes.
    The new number of available angles is given by \a availableAngles.

    \sa Feature
*/

/*!
    \fn void Phonon::MediaController::angleChanged(int angleNumber)

    This signal is emitted whenever the current angle changes.
    The new angle number is given by \a angleNumber.

    \sa Feature
*/

/*!
    \fn void Phonon::MediaController::availableChaptersChanged(int availableChapters)

    This signal is emitted whenever the number of available chapters changes.
    The new number of available chapters is given by \a availableChapters.

    \sa Feature
*/

/*!
    \fn void Phonon::MediaController::chapterChanged(int chapterNumber)

    This signal is emitted whenever the current chapter changes.
    The new chapter number is given by \a chapterNumber.

    \sa Feature
*/

/*!
    \fn void Phonon::MediaController::availableTitlesChanged(int availableTitles)

    This signal is emitted whenever the number of available titles changes.
    The new number of available titles is given by \a availableTitles.

    \sa Feature
*/

/*!
    \fn void Phonon::MediaController::titleChanged(int titleNumber)

    This signal is emitted whenever the current title changes.
    The new title number is given by \a titleNumber.

    \sa Feature
*/

/*!
    \class Phonon::VideoWidget
    \inmodule Phonon
    \inheaderfile Phonon/VideoWidget
    \since 4.4
    \ingroup advanced
    \ingroup multimedia
    \brief The VideoWidget class provides a widget that is used to display video.

    The VideoWidget class renders the video of a media stream on a
    QWidget. It is connected to the \l{Phonon::}{MediaObject}, of
    which video stream it should render. You connect the two objects
    using the Phonon::createPath() function.

    The widget has some possibilities to manipulate the video
    stream. You can change the brightness(), hue(), saturation(),
    and contrast().

    Resizing of the video is handled automatically, but you can affect
    the way the video is resized with the aspectRatio and scaleMode
    properties. By default, the widget will use the aspect ratio of
    the video stream itself.

    The video widget takes the size of the video when it receives a new video
    stream (i.e., when a new MediaSource is set on the MediaObject to which it is
    connected). If you need to know the size of the video, you can call
    \l{QWidget::}{sizeHint()} after the video has been loaded (i.e., after the
    MediaObject leaves the \l{Phonon::}{LoadingState}).

    It is also possible to go to \l{fullScreen}{full screen} mode.

    A typical example of usage follows below:

    \snippet doc/src/snippets/code/doc_src_phonon-api.qdoc 21

    \sa {Phonon Module}
*/

/*!
    \fn Phonon::VideoWidget::VideoWidget(QWidget *parent = 0)

     Constructs a new video widget with the specified \a parent.
*/

/*!
    \fn Phonon::VideoWidget::VideoWidget(VideoWidgetPrivate &d, QWidget *parent)
    \internal

     Constructs a new video widget with the specified \a parent.
*/

/*!
    \fn bool Phonon::VideoWidget::event(QEvent *)
    \reimp
*/

/*!
    \fn void Phonon::VideoWidget::mouseMoveEvent(QMouseEvent *)
    \reimp
*/

/*!
    \enum Phonon::VideoWidget::ScaleMode

    The ScaleMode enum describes how to treat aspect ratio during
    resizing of video.

    \value FitInView    The video will be fitted to fill the view
                        keeping aspect ratio.
    \value ScaleAndCrop The video is scaled
*/

/*!
    \property Phonon::VideoWidget::fullScreen
    This property holds whether the video is shown using the complete
    screen.

    The property differs from QWidget::fullScreen in that it is
    writeable.

    By default the widget is not shown in fullScreen.

    \warning When switching to full screen mode using setFullScreen(),
    the widget onto which the video is rendered is shown as a
    top-level window. Key event forwarding is handled by VideoWidget,
    but if you need to handle other events, e.g., mouse events, you
    should handle fullscreen mode yourself.
*/

/*!
    \property Phonon::VideoWidget::aspectRatio
    Defaults to AspectRatioAuto.

    \sa AspectRatio
*/

/*!
    \property Phonon::VideoWidget::scaleMode

    If the size of the widget and the size of the video are not equal.
    The video will be zoomed to fit the widget. The smaller zoom
    (AddBarsScaleMode) adds black bars at the left/right or top/bottom to
    make all of the image visible (default). The bigger zoom (ExpandMode)
    fills the widget completely, keeping all information in one direction
    and leaving parts of the image outside of the widget in the other
    direction.
*/

/*!
    \property Phonon::VideoWidget::brightness

    This property holds brightness of the video.

    Default is 0. Acceptable values are in range of -1, 1.
*/

/*!
    \property Phonon::VideoWidget::contrast

    This property holds the contrast of the video.

    Default is 0. Acceptable values are in range of -1, 1.
*/

/*!
    \property Phonon::VideoWidget::hue

    This property holds the hue of the video.

    Default is 0. Acceptable values are in range of -1, 1.
*/

/*!
    \property Phonon::VideoWidget::saturation

    This property holds saturation of the video.

    Default is 0. Acceptable values are in range of -1, 1.
*/

/*!
    \enum Phonon::VideoWidget::AspectRatio

    Defines the width:height to be used for the video.

    \value AspectRatioAuto
    Let the decoder find the aspect ratio automatically from the
    media file (this is the default).

    \value AspectRatioWidget
    Fits the video into the widget making the aspect ratio depend
    solely on the size of the widget. This way the aspect ratio
    is freely resizeable by the user.

    \value AspectRatio4_3
    Make width/height == 4/3, which is the old TV size and
    monitor size (1024/768 == 4/3). (4:3)

    \value AspectRatio16_9
    Make width/height == 16/9, which is the size of most current
    media. (16:9)
*/

/*!
    \fn void Phonon::VideoWidget::exitFullScreen()

    Convenience slot, calling setFullScreen(false)
*/


/*!
    \fn void Phonon::VideoWidget::enterFullScreen()

    Convenience slot, calling setFullScreen(true)
*/

/*!
    \class Phonon::VideoWidgetInterface
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \fn virtual Phonon::VideoWidgetInterface::~VideoWidgetInterface()
*/

/*!
    \fn virtual Phonon::VideoWidget::AspectRatio Phonon::VideoWidgetInterface::aspectRatio() const = 0
    \internal
*/

/*!
    \fn virtual void Phonon::VideoWidgetInterface::setAspectRatio(Phonon::VideoWidget::AspectRatio ratio) = 0
    \internal
*/

/*!
    \fn virtual qreal Phonon::VideoWidgetInterface::brightness() const = 0
    \internal
*/

/*!
    \fn virtual void Phonon::VideoWidgetInterface::setBrightness(qreal) = 0
    \internal
*/

/*!
    \fn virtual Phonon::VideoWidget::ScaleMode Phonon::VideoWidgetInterface::scaleMode() const = 0
    \internal
*/

/*!
    \fn virtual void Phonon::VideoWidgetInterface::setScaleMode(Phonon::VideoWidget::ScaleMode mode) = 0
    \internal
*/

/*!
    \fn virtual qreal Phonon::VideoWidgetInterface::contrast() const = 0
    \internal
*/

/*!
    \fn virtual void Phonon::VideoWidgetInterface::setContrast(qreal) = 0
    \internal
*/

/*!
    \fn virtual qreal Phonon::VideoWidgetInterface::hue() const = 0
    \internal
*/

/*!
    \fn virtual void Phonon::VideoWidgetInterface::setHue(qreal) = 0
    \internal
*/

/*!
    \fn virtual qreal Phonon::VideoWidgetInterface::saturation() const = 0
    \internal
*/

/*!
    \fn virtual void Phonon::VideoWidgetInterface::setSaturation(qreal) = 0
    \internal
*/

/*!
    \fn virtual QWidget *Phonon::VideoWidgetInterface::widget() = 0
    \internal
*/

/*!
    \class Phonon::PlatformPlugin
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \fn virtual AbstractMediaStream *Phonon::PlatformPlugin::createMediaStream(const QUrl &url, QObject *parent) = 0

    Creates a AbstractMediaStream object with the given \a parent that provides the data
    for the given URL specified by \a url.
    \omit
    On KDE this uses KIO.
    \endomit
*/

/*!
    \fn virtual QIcon Phonon::PlatformPlugin::icon(const QString &name) const = 0

    Returns the icon for the given icon name.
*/

/*!
    \fn virtual void Phonon::PlatformPlugin::notification(const char *notificationName, const QString &text,
        const QStringList &actions, QObject *receiver, const char *actionSlot) const = 0

    Shows a notification pop-up with the given \a notificationName and \a text.
    Each action in the associated list of \a actions is connected to the \a actionSlot
    of the specified \a receiver object, which is expected to act on the actions as
    they are triggered by the user.
*/

/*!
    \fn virtual QString Phonon::PlatformPlugin::applicationName() const = 0

    Returns the name of the application. For most Qt application this is
    QCoreApplication::applicationName(), but for KDE this is overridden by KAboutData.
*/


/*!
    \fn virtual QObject *Phonon::PlatformPlugin::createBackend() = 0

    Creates a backend object. This way the platform can decide the backend preference.
*/

/*!
    \fn virtual QObject *Phonon::PlatformPlugin::createBackend(const QString &library, const QString &version) = 0

    Using the library loader of the platform, loads a given backend provided the
    specified \a library and \a version.
*/

/*!
    \fn virtual bool Phonon::PlatformPlugin::isMimeTypeAvailable(const QString &mimeType) const = 0

    Tries to check whether the default backend supports the MIME type specified by \a mimeType
    without loading the actual backend library.
    \omit
    On KDE this reads the MIME type list from the .desktop file of
    the backend.
    \endomit
*/

/*!
    \fn virtual void Phonon::PlatformPlugin::saveVolume(const QString &outputName, qreal volume) = 0

    Saves the volume for the given output.
*/

/*!
    \fn virtual qreal Phonon::PlatformPlugin::loadVolume(const QString &outputName) const = 0

    Loads the volume for the given output.
*/

/*!
    \class Phonon::MediaNode
    \inmodule Phonon
    \inheaderfile Phonon/MediaNode
    \since 4.4
    \brief The MediaNode class is the base class for all nodes in a media graph.

    In all phonon applications, one builds a media graph consisting of
    MediaNodes. The graph will take multimedia content, e.g., from a
    file, as input. After its nodes have processed the multimedia, the
    graph will output the media again, e.g., to a sound card.

    The multimedia content is streamed over \l{Phonon::}{Path}s
    between the nodes in the graph. You can query the paths that are
    connected to a media node with inputPaths() and outputPaths().

    You can check whether the node is implemented by the current
    backend by calling isValid(). This does not guarantee that an
    instance of the class works as expected, but that the backend has
    implemented functionality for the class.

    Currently, Phonon has four media nodes: \l{Phonon::}{MediaObject},
    \l{Phonon::}{AudioOutput}, \l{Phonon::}{VideoWidget}, and \l{Phonon::}{Effect}.
    Please refer to their class descriptions for details about their usage, and to
    find out which nodes can be connected to each other. See also \l{Building
    Graphs} in Phonon's \l{Phonon Overview}{overview} document. 

    Two nodes are connected to each other using the
    Phonon::createPath() or \l{Phonon::}{Path::insertEffect()}
    functions (only \l{Phonon::Effect}s use
    \l{Phonon::Path::}{insertEffect()}). We show a code example below,
    in which we build a media graph for video playback and then query
    its media nodes for their \l{Phonon::}{Path}s:

    \snippet doc/src/snippets/medianodesnippet.cpp 0 

    When you create a Phonon application, you will likely build the
    graph yourself. This makes isValid() the most useful function of
    this class. The other two functions help navigate the graph, which
    you do not need to do as you created the nodes yourself.

    \sa {Phonon Overview}, Phonon::MediaObject,
        Phonon::AudioOutput, Phonon::VideoWidget, {Phonon Module}
*/

/*!
    \fn virtual Phonon::MediaNode::~MediaNode()

    Destroys the media node and any paths connecting it to other
    nodes. Any \l{Phonon::}{Effect}s connected to these paths will
    also be deleted.
*/

/*!
    \fn bool Phonon::MediaNode::isValid() const

    Returns true if the backend provides an implementation of this
    class; otherwise returns false.

    This does not guarantee that instances of the class works as
    expected, but that the backend has implemented the functionality
    for this class. For instance, Qt's GStreamer backend will return
    true for instances of the \l{Phonon::}{AudioOutput} class, even if
    there is a problem with GStreamer and it could not play sound. 

*/

/*!
    \fn QList<Path> Phonon::MediaNode::inputPaths() const

    Returns the paths that inputs multimedia to this media node.
    
    \sa outputPaths()
*/

/*!
    \fn QList<Path> Phonon::MediaNode::outputPaths() const

    Returns the paths to which this media node outputs media.

    \sa inputPaths()
*/

/*!
    \fn Phonon::MediaNode::MediaNode(MediaNodePrivate &dd)
    \internal
*/

/*!
    \class Phonon::GlobalConfig
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \fn Phonon::GlobalConfig::GlobalConfig()
    \internal
*/

/*!
    \fn Phonon::GlobalConfig::~GlobalConfig()
    \internal
*/

/*!
    \fn QList<int> Phonon::GlobalConfig::audioOutputDeviceListFor(Phonon::Category category, int override = AdvancedDevicesFromSettings) const
    \internal
*/

/*!
    \fn int Phonon::GlobalConfig::audioOutputDeviceFor(Phonon::Category category, int override = AdvancedDevicesFromSettings) const
    \internal
*/

/*!
    \class Phonon::ObjectDescriptionData
    \inmodule Phonon
    \since 4.4
    \internal
    \brief Data class for objects describing devices or features of the backend.

    \sa Phonon::BackendCapabilities
*/

/*!
    \fn bool Phonon::ObjectDescriptionData::operator==(const ObjectDescriptionData &otherDescription) const

    Returns \c true if this ObjectDescription describes the same
    as \a otherDescription; otherwise returns \c false.
*/

/*!
    \fn QString Phonon::ObjectDescriptionData::name() const

    Returns the name of the capture source.

    \return A string that should be presented to the user to
    choose the capture source.
*/

/*!
    \fn QString Phonon::ObjectDescriptionData::description() const

    Returns a description of the capture source. This text should
    make clear what sound source this is, which is sometimes hard
    to describe or understand from just the name.

    \return A string describing the capture source.
*/

/*!
    \fn QVariant Phonon::ObjectDescriptionData::property(const char *name) const

    Returns a named property.

    If the property is not set an invalid value is returned.

    \sa propertyNames()
*/

/*!
    \fn QList<QByteArray> Phonon::ObjectDescriptionData::propertyNames() const

    Returns all names that return valid data when property() is called.

    \sa property()
*/

/*!
    \fn bool Phonon::ObjectDescriptionData::isValid() const

    Returns true if the Tuple is valid (index != -1); otherwise returns
    false.
*/

/*!
    \fn int Phonon::ObjectDescriptionData::index() const

    A unique identifier for this device/. Used internally
    to distinguish between the devices/.

    \return An integer that uniquely identifies every device.
*/

/*!
    \fn static ObjectDescriptionData *Phonon::ObjectDescriptionData::fromIndex(ObjectDescriptionType type, int index)
    \internal
*/

/*!
    \fn Phonon::ObjectDescriptionData::~ObjectDescriptionData()
    \internal
*/

/*!
    \fn Phonon::ObjectDescriptionData::ObjectDescriptionData(ObjectDescriptionPrivate * = 0)
    \internal
*/

/*!
    \class Phonon::AddonInterface
    \inmodule Phonon
    \since 4.4
    \internal
    \brief Interface for Menu, Chapter, Angle and Title/Track control.
*/

/*!
    \fn virtual Phonon::AddonInterface::~AddonInterface()
    \internal
*/

/*!
    \enum Phonon::AddonInterface::Interface

    This enum describes the type of interface represented by an AddonInterface object.

    \value NavigationInterface
    \value ChapterInterface
    \value AngleInterface
    \value TitleInterface
*/

/*!
    \enum Phonon::AddonInterface::NavigationCommand
    \internal
    \value Menu1Button
*/

/*!
    \enum Phonon::AddonInterface::ChapterCommand
    \internal
    \value availableChapters
    \value chapter
    \value setChapter
*/

/*!
    \enum Phonon::AddonInterface::AngleCommand
    \internal
    \value availableAngles
    \value angle
    \value setAngle
*/

/*!
    \enum Phonon::AddonInterface::TitleCommand
    \internal
    \value availableTitles
    \value title
    \value setTitle
    \value autoplayTitles
    \value setAutoplayTitles
*/

/*!
    \fn virtual bool Phonon::AddonInterface::hasInterface(Interface iface) const = 0
    \internal
*/

/*!
    \fn virtual QVariant Phonon::AddonInterface::interfaceCall(Interface iface, int command,
            const QList<QVariant> &arguments) = 0
    \internal
*/

/*!
    \class Phonon::MediaNodePrivate
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \namespace Phonon::Factory
    \inmodule Phonon
    \internal
*/

/*!
    \fn Sender *Phonon::Factory::sender()

    Returns a pointer to the object emitting the signals.

    \sa Sender::backendChanged()
*/

/*!
    \fn QObject *Phonon::Factory::createMediaObject(QObject *parent = 0)

    Create a new backend object for a MediaObject.

    \return a pointer to the MediaObject the backend provides.
*/

/*!
    \fn QObject *Phonon::Factory::createEffect(int effectId, QObject *parent = 0)

    Create a new backend object for a Effect.

    \return a pointer to the Effect the backend provides.
*/

/*!
    \fn QObject *Phonon::Factory::createVolumeFaderEffect(QObject *parent = 0)

    Create a new backend object for a VolumeFaderEffect.

    \return a pointer to the VolumeFaderEffect the backend provides.
*/

/*!
    \fn QObject *Phonon::Factory::createAudioOutput(QObject *parent = 0)

    Create a new backend object for a AudioOutput.

    \return a pointer to the AudioOutput the backend provides.
*/

/*!
    \fn QObject *Phonon::Factory::createVideoWidget(QObject *parent = 0)

    Create a new backend object for a VideoWidget.

    \return a pointer to the VideoWidget the backend provides.
*/

/*!
    \fn QObject *Phonon::Factory::backend(bool createWhenNull = true)

    \return a pointer to the backend interface.
*/

/*!
    \fn QString Phonon::Factory::identifier()

    Unique identifier for the Backend. Can be used in configuration files
    for example.
*/


/*!
    \fn QString Phonon::Factory::backendName()

    Get the name of the Backend.
    \omit
    It's the name from the .desktop file.
    \endomit
*/

/*!
    \fn QString Phonon::Factory::backendComment()

    Get the comment of the Backend.
    \omit
    It's the comment from the .desktop file.
    \endomit
*/

/*!
    \fn QString Phonon::Factory::backendVersion()

    Get the version of the Backend.
    \omit
    It's the version from the .desktop file.
    \endomit

    The version is especially interesting if there are several versions
    available for binary incompatible versions of the backend's media
    framework.
*/

/*!
    \fn QString Phonon::Factory::backendIcon()

    Get the icon (name) of the Backend.
    \omit
    It's the icon from the .desktop file.
    \endomit
*/

/*!
    \fn QString Phonon::Factory::backendWebsite()

    Get the website of the Backend.
    \omit
    It's the website from the .desktop file.
    \endomit
*/

/*!
    \fn QObject *Phonon::Factory::registerQObject(QObject *object)

    Registers the given backend \a object with the factory.
*/

/*!
    \fn bool Phonon::Factory::isMimeTypeAvailable(const QString &mimeType)
*/

/*!
    \fn void Phonon::Factory::registerFrontendObject(MediaNodePrivate *)
    \internal
*/

/*!
    \fn void Phonon::Factory::deregisterFrontendObject(MediaNodePrivate *)
    \internal
*/

/*!
    \fn void Phonon::Factory::setBackend(QObject *)
*/

/*!
    \fn PlatformPlugin *Phonon::Factory::platformPlugin()
*/

/*!
/*!
    \class Phonon::AbstractMediaStreamPrivate
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \class Phonon::FrontendInterfacePrivate
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \class Phonon::EffectWidgetPrivate
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \class Phonon::IODeviceStream
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \fn explicit Phonon::IODeviceStream::IODeviceStream(QIODevice *ioDevice, QObject *parent = 0)
    \internal

    Creates a new IODeviceStream with the given \a ioDevice and \a
    parent.

*/

/*!
    \fn Phonon::IODeviceStream::~IODeviceStream()
    \internal
*/

/*!
    \fn void Phonon::IODeviceStream::reset()
    \internal
*/

/*!
    \fn void Phonon::IODeviceStream::needData()
    \internal
*/

/*!
    \fn void Phonon::IODeviceStream::seekStream(qint64)
    \internal
*/

/*!
    \namespace Phonon::Platform
    \inmodule Phonon
    \internal
*/

/*!
    \typedef Phonon::EffectDescriptionModel
    \inmodule Phonon
    \brief provides a item view model containing available audio effects.

*/

/*!
    \typedef Phonon::SubtitleDescription
    \inmodule Phonon
    \internal
*/

/*!
    \typedef Phonon::SubtitleDescriptionModel
    \inmodule Phonon
    \internal
*/

/*!
    \typedef Phonon::AudioChannelDescription
    \inmodule Phonon
    \internal
*/

/*!
    \typedef Phonon::AudioChannelDescriptionModel
    \inmodule Phonon
    \internal
*/

/*!
    \typedef Phonon::AudioCaptureDevice
    \inmodule Phonon
    \internal
*/

/*!
    \typedef Phonon::AudioCaptureDeviceModel
    \inmodule Phonon
    \internal
*/

/*!
    \typedef Phonon::CleanUpFunction
    \inmodule Phonon
    \internal
*/

/*!
    \typedef Phonon::QObjectPair
    \inmodule Phonon
    \since 4.4
    \internal

*/

/*!
    \typedef Phonon::AudioOutputDeviceModel
    \inmodule Phonon
    \brief provides an item view model containing available audio output devices.

*/

/*!
    \fn uint Phonon::qHash(const Phonon::EffectParameter &param)
    \internal

*/

/*!
    \fn Phonon::CleanUpGlobalStatic::~CleanUpGlobalStatic()
    \internal
*/

/*!
    \class Phonon::ConstIface
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \class Phonon::CleanUpGlobalStatic
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \class Phonon::EffectParameterPrivate
    \inmodule Phonon
    \since 4.4
    \internal

*/

/*!
    \class Phonon::QSettingsGroup
    \inmodule Phonon
    \since 4.4
    \internal

*/

/*!
    \class Phonon::MediaNodeDestructionHandler
    \inmodule Phonon
    \since 4.4
    \internal

*/

/*!
    \fn Phonon::MediaNodeDestructionHandler::~MediaNodeDestructionHandler()
    \internal
    Called from Base::~Base if this object was registered
    using BasePrivate::addDestructionHandler().
*/

/*!
    \fn Phonon::MediaNodeDestructionHandler::phononObjectDestroyed(MediaNodePrivate *)
    \internal
*/

/*!
    \fn explicit Phonon::EffectWidget::EffectWidget(Effect *effect, QWidget *parent = 0)
    \internal

    Constructs a new EffectWidget for the specified \a effect and with
    the specified \a parent.
*/

/*!
    \fn Phonon::EffectWidget::~EffectWidget()
    \internal
*/

/*!
    \fn QDebug Phonon::operator<<(QDebug s, const ObjectDescription<T> &o)
    \internal
*/

/*!
    \class Phonon::ListModelHelper
    \inmodule Phonon
    \since 4.4
    \internal
*/

/*!
    \class AudioOutputInterface42
    \inmodule Phonon
    \since 4.4
    \internal
*/

