diff options
Diffstat (limited to 'src/3rdparty/phonon/phonon/mediaobject.h')
-rw-r--r-- | src/3rdparty/phonon/phonon/mediaobject.h | 625 |
1 files changed, 625 insertions, 0 deletions
diff --git a/src/3rdparty/phonon/phonon/mediaobject.h b/src/3rdparty/phonon/phonon/mediaobject.h new file mode 100644 index 0000000000..5cbddbbefd --- /dev/null +++ b/src/3rdparty/phonon/phonon/mediaobject.h @@ -0,0 +1,625 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Matthias Kretz <kretz@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) version 3, or any + later version accepted by the membership of KDE e.V. (or its + successor approved by the membership of KDE e.V.), Trolltech ASA + (or its successors, if any) and the KDE Free Qt Foundation, which shall + act as a proxy defined in Section 6 of version 3 of the license. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see <http://www.gnu.org/licenses/>. + +*/ +#ifndef Phonon_MEDIAOBJECT_H +#define Phonon_MEDIAOBJECT_H + +#include "medianode.h" +#include "mediasource.h" +#include "phonon_export.h" +#include "phonondefs.h" +#include "phononnamespace.h" + +QT_BEGIN_HEADER +QT_BEGIN_NAMESPACE + +namespace Phonon +{ + class MediaObjectPrivate; + + /** \class MediaObject mediaobject.h Phonon/MediaObject + * \short Interface for media playback of a given URL. + * + * This class is the most important class in %Phonon. Use it to open a media + * file at an arbitrary location, a CD or DVD or to stream media data from + * the application to the backend. + * + * This class controls the state (play, pause, stop, seek) + * and you can use it to get a lot of information about the media data. + * + * Notice that most functions of this class are asynchronous. + * That means if you call play() the object only starts playing when the + * stateChanged() signal tells you that the object changed into PlayingState. + * The states you can expect are documented for those methods. + * + * A common usage example is the following: + * \code + * media = new MediaObject(this); + * connect(media, SIGNAL(finished()), SLOT(slotFinished()); + * media->setCurrentSource("/home/username/music/filename.ogg"); + * media->play(); + * \endcode + * + * If you want to play more that one media file (one after another) you can + * either tell MediaObject about all those files + * \code + * media->setCurrentSource(":/sounds/startsound.ogg"); + * media->enqueue("/home/username/music/song.mp3"); + * media->enqueue(":/sounds/endsound.ogg"); + * \endcode + * or provide the next file just in time: + * \code + * media->setCurrentSource(":/sounds/startsound.ogg"); + * connect(media, SIGNAL(aboutToFinish()), SLOT(enqueueNextSource())); + * } + * + * void enqueueNextSource() + * { + * media->enqueue("/home/username/music/song.mp3"); + * } + * \endcode + * + * \ingroup Playback + * \ingroup Recording + * \author Matthias Kretz <kretz@kde.org> + */ + class PHONON_EXPORT MediaObject : public QObject, public MediaNode + { + friend class FrontendInterfacePrivate; + Q_OBJECT + K_DECLARE_PRIVATE(MediaObject) + PHONON_OBJECT(MediaObject) + /** + * \brief Defines the time between media sources. + * + * A positive transition time defines a gap of silence between queued + * media sources. + * + * A transition time of 0 ms requests gapless playback (sample precise + * queueing of the next source). + * + * A negative transition time defines a crossfade between the queued + * media sources. + * + * Defaults to 0 (gapless playback). + * + * \warning This feature might not work reliably on every platform. + */ + Q_PROPERTY(qint32 transitionTime READ transitionTime WRITE setTransitionTime) + + /** + * \brief Get a signal before playback finishes. + * + * This property specifies the time in milliseconds the + * prefinishMarkReached signal is + * emitted before the playback finishes. A value of \c 0 disables the + * signal. + * + * 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 behaviour + * because the backend might have more information available than your + * application does through totalTime and currentTime. + * + * \see prefinishMarkReached + */ + Q_PROPERTY(qint32 prefinishMark READ prefinishMark WRITE setPrefinishMark) + + /** + * \brief The time interval in milliseconds between two ticks. + * + * 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. + * + * 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 \em may \em fail: + * \code + * int x = 200; + * media->setTickInterval(x); + * Q_ASSERT(x == producer->tickInterval()); + * \endcode + * On the other hand the following is guaranteed: + * \code + * int x = 200; + * media->setTickInterval(x); + * Q_ASSERT(x >= producer->tickInterval() && + * x <= 2 * producer->tickInterval()); + * \endcode + * + * \see tick + */ + Q_PROPERTY(qint32 tickInterval READ tickInterval WRITE setTickInterval) + public: + /** + * Destroys the MediaObject. + */ + ~MediaObject(); + + /** + * Get the current state. + * + * @return The state of the object. + * + * @see State + * \see stateChanged + */ + State state() const; + + /** + * Check whether the media data includes a video stream. + * + * \warning This information cannot be known immediately. It is best + * to also listen to the hasVideoChanged signal. + * + * \code + * connect(media, SIGNAL(hasVideoChanged(bool)), hasVideoChanged(bool)); + * media->setCurrentSource("somevideo.avi"); + * media->hasVideo(); // returns false; + * } + * + * void hasVideoChanged(bool b) + * { + * // b == true + * media->hasVideo(); // returns true; + * } + * \endcode + * + * \return \c true if the media contains video data. \c false + * otherwise. + * + * \see hasVideoChanged + */ + bool hasVideo() const; + + /** + * Check whether the current media may be seeked. + * + * \warning This information cannot be known immediately. It is best + * to also listen to the hasVideoChanged signal. + * + * \code + * connect(media, SIGNAL(hasVideoChanged(bool)), hasVideoChanged(bool)); + * media->setCurrentSource("somevideo.avi"); + * media->hasVideo(); // returns false; + * } + * + * void hasVideoChanged(bool b) + * { + * // b == true + * media->hasVideo(); // returns true; + * } + * \endcode + * + * \return \c true when the current media may be seeked. \c false + * otherwise. + * + * \see seekableChanged() + */ + bool isSeekable() const; + + qint32 tickInterval() const; + + /** + * Returns the strings associated with the given \p key. + * + * Backends should use the keys specified in the Ogg Vorbis + * documentation: http://xiph.org/vorbis/doc/v-comment.html + * + * Therefore the following should work with every backend: + * + * A typical usage looks like this: + * \code + * setMetaArtist (media->metaData("ARTIST" )); + * setMetaAlbum (media->metaData("ALBUM" )); + * setMetaTitle (media->metaData("TITLE" )); + * setMetaDate (media->metaData("DATE" )); + * setMetaGenre (media->metaData("GENRE" )); + * setMetaTrack (media->metaData("TRACKNUMBER")); + * setMetaComment(media->metaData("DESCRIPTION")); + * \endcode + * + * For Audio CDs you can query + * \code + * metaData("MUSICBRAINZ_DISCID"); + * \endcode + * to get a DiscID hash that you can use with the MusicBrainz + * service: + * http://musicbrainz.org/doc/ClientHOWTO + */ + QStringList metaData(const QString &key) const; + + /** + * Returns the strings associated with the given \p key. + * + * Same as above except that the keys are defined in the + * Phonon::MetaData enum. + */ + QStringList metaData(Phonon::MetaData key) const; + + /** + * Returns all meta data. + */ + QMultiMap<QString, QString> metaData() const; + + /** + * Returns a human-readable description of the last error that occurred. + */ + QString errorString() const; + + /** + * Tells your program what to do about the error. + * + * \see Phonon::ErrorType + */ + ErrorType errorType() const; + + /** + * Returns the current media source. + * + * \see setCurrentSource + */ + MediaSource currentSource() const; + + /** + * Set the media source the MediaObject should use. + * + * \param source The MediaSource object to the media data. You can + * just as well use a QUrl or QString (for a local file) here. + * Setting an empty (invalid) source, will stop and remove the + * current source. + * + * \code + * QUrl url("http://www.example.com/music.ogg"); + * media->setCurrentSource(url); + * \endcode + * + * \see currentSource + */ + void setCurrentSource(const MediaSource &source); + + /** + * Returns the queued media sources. This does list does not include + * the current source (returned by currentSource). + */ + QList<MediaSource> queue() const; + + /** + * Set the MediaSources to play when the current media has finished. + * + * This function will overwrite the current queue. + * + * \see clearQueue + * \see enqueue + */ + void setQueue(const QList<MediaSource> &sources); + + /** + * Set the MediaSources to play when the current media has finished. + * + * This function overwrites the current queue. + * + * \see clearQueue + * \see enqueue + */ + void setQueue(const QList<QUrl> &urls); + + /** + * Appends one source to the queue. Use this function to provide + * the next source just in time after the aboutToFinish signal was + * emitted. + * + * \see aboutToFinish + * \see setQueue + * \see clearQueue + */ + void enqueue(const MediaSource &source); + + /** + * Appends multiple sources to the queue. + * + * \see setQueue + * \see clearQueue + */ + void enqueue(const QList<MediaSource> &sources); + + /** + * Appends multiple sources to the queue. + * + * \see setQueue + * \see clearQueue + */ + void enqueue(const QList<QUrl> &urls); + + /** + * Clears the queue of sources. + */ + void clearQueue(); + + /** + * Get the current time (in milliseconds) of the file currently being played. + * + * \return The current time in milliseconds. + * + * \see tick + */ + qint64 currentTime() const; + + /** + * Get the total time (in milliseconds) of the file currently being played. + * + * \return The total time in milliseconds. + * + * \see totalTimeChanged + */ + qint64 totalTime() const; + + /** + * Get the remaining time (in milliseconds) of the file currently being played. + * + * \return The remaining time in milliseconds. + */ + qint64 remainingTime() const; + + qint32 prefinishMark() const; + void setPrefinishMark(qint32 msecToEnd); + + qint32 transitionTime() const; + void setTransitionTime(qint32 msec); + + public Q_SLOTS: + + void setTickInterval(qint32 newTickInterval); + + /** + * Requests playback of the media data to start. Playback only + * starts when stateChanged() signals that it goes into PlayingState, + * though. + * + * \par Possible states right after this call: + * \li BufferingState + * \li PlayingState + * \li ErrorState + */ + void play(); + + /** + * Requests playback to pause. If it was paused before nothing changes. + * + * \par Possible states right after this call: + * \li PlayingState + * \li PausedState + * \li ErrorState + */ + void pause(); + + /** + * Requests playback to stop. If it was stopped before nothing changes. + * + * \par Possible states right after this call: + * \li the state it was in before (e.g. PlayingState) + * \li StoppedState + * \li ErrorState + */ + void stop(); + + /** + * Requests a seek to the time indicated. + * + * You can only seek if state() == 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. + * + * @param time The time in milliseconds where to continue playing. + * + * \par Possible states right after this call: + * \li BufferingState + * \li PlayingState + * \li ErrorState + * + * \see SeekSlider + */ + void seek(qint64 time); + + /** + * Stops and removes all playing and enqueued media sources. + * + * \see setCurrentSource + */ + void clear(); + + Q_SIGNALS: + /** + * 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. + */ + void stateChanged(Phonon::State newstate, Phonon::State oldstate); + + /** + * This signal gets emitted every tickInterval milliseconds. + * + * @param time The position of the media file in milliseconds. + * + * @see setTickInterval, tickInterval + */ + void tick(qint64 time); + + /** + * This signal is emitted whenever the audio/video data that is + * being played is associated with new meta data. E.g. for radio + * streams this happens when the next song is played. + * + * You can get the new meta data with the metaData methods. + */ + void metaDataChanged(); + + /** + * Emitted whenever the return value of isSeekable() changes. + * + * Normally you'll check isSeekable() first and then let this signal + * tell you whether seeking is possible now or not. That way you + * don't have to poll isSeekable(). + * + * \param isSeekable \p true if the stream is seekable (i.e. calling + * seek() works) + * \p false if the stream is not seekable (i.e. + * all calls to seek() will be ignored) + */ + void seekableChanged(bool isSeekable); + + /** + * Emitted whenever the return value of hasVideo() changes. + * + * 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(). + * + * \param hasVideo \p true The stream contains video and adding a + * VideoWidget will show a video. + * \p false There is no video data in the stream and + * adding a VideoWidget will show an empty (black) + * VideoWidget. + */ +#ifndef QT_NO_PHONON_VIDEO + void hasVideoChanged(bool hasVideo); +#endif //QT_NO_PHONON_VIDEO + + /** + * Tells about the status of the buffer. + * + * You can use this signal to show a progress bar to the user when + * in BufferingState: + * + * \code + * progressBar->setRange(0, 100); // this is the default + * connect(media, SIGNAL(bufferStatus(int)), progressBar, SLOT(setValue(int))); + * \endcode + * + * \param percentFilled A number between 0 and 100 telling you how + * much the buffer is filled. + */ // other names: bufferingProgress + void bufferStatus(int percentFilled); + + /** + * Emitted when the object has finished playback. + * It is not emitted if you call stop(), pause() or + * load(), but only on end-of-queue or a critical error. + * + * \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. + * + * \see currentSourceChanged + * \see aboutToFinish + * \see prefinishMarkReached + */ + void finished(); + + /** + * Emitted when the MediaObject makes a transition to the next + * MediaSource in the queue(). + * + * In other words, it is emitted when an individual MediaSource is + * finished. + * + * \param newSource The source that starts to play at the time the + * signal is emitted. + */ + void currentSourceChanged(const Phonon::MediaSource &newSource); + + /** + * Emitted before the playback of the whole queue stops. When this + * signal is emitted you still have time to provide the next + * MediaSource (using enqueue()) so that playback continues. + * + * This signal can be used to provide the next MediaSource just in + * time for the transition still to work. + * + * \see enqueue + */ + void aboutToFinish(); + + /** + * Emitted when there are only \p msecToEnd milliseconds left + * for playback. + * + * \param msecToEnd The remaining time until the playback queue finishes. + * + * \warning This signal is not emitted when there is another source in the queue. + * It is only emitted when the queue is empty. + * + * \see setPrefinishMark + * \see prefinishMark + * \see aboutToFinish + * \see finished + */ + void prefinishMarkReached(qint32 msecToEnd); + + /** + * 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. + * + * \param newTotalTime The length of the media file in milliseconds. + * + * \see totalTime + */ + void totalTimeChanged(qint64 newTotalTime); + + protected: + //MediaObject(Phonon::MediaObjectPrivate &dd, QObject *parent); + + private: + Q_PRIVATE_SLOT(k_func(), void _k_resumePlay()) + Q_PRIVATE_SLOT(k_func(), void _k_resumePause()) + Q_PRIVATE_SLOT(k_func(), void _k_metaDataChanged(const QMultiMap<QString, QString> &)) +#ifndef QT_NO_PHONON_ABSTRACTMEDIASTREAM + Q_PRIVATE_SLOT(k_func(), void _k_stateChanged(Phonon::State, Phonon::State)) +#endif //QT_NO_PHONON_ABSTRACTMEDIASTREAM + Q_PRIVATE_SLOT(k_func(), void _k_aboutToFinish()) + Q_PRIVATE_SLOT(k_func(), void _k_currentSourceChanged(const MediaSource &)) + }; + + /** + * Convenience function to create a MediaObject and AudioOutput connected by + * a path. + */ + PHONON_EXPORT MediaObject *createPlayer(Phonon::Category category, const MediaSource &source = MediaSource()); +} //namespace Phonon + +QT_END_NAMESPACE +QT_END_HEADER + +// vim: sw=4 ts=4 tw=80 +#endif // Phonon_MEDIAOBJECT_H |