/* This file is part of the KDE project.
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
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 or 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 .
*/
#ifndef Phonon_QT7_MEDIAOBJECT_H
#define Phonon_QT7_MEDIAOBJECT_H
#include
#include
#include
#include
#include "medianode.h"
#if QT_ALLOW_QUICKTIME
#include
#endif
QT_BEGIN_NAMESPACE
namespace Phonon
{
namespace QT7
{
class QuickTimeVideoPlayer;
class QuickTimeAudioPlayer;
class QuickTimeMetaData;
class AudioGraph;
class MediaObjectAudioNode;
class MediaObject : public MediaNode,
public Phonon::MediaObjectInterface
#ifndef QT_NO_PHONON_MEDIACONTROLLER
, public Phonon::AddonInterface
#endif
{
Q_OBJECT
Q_INTERFACES(Phonon::MediaObjectInterface Phonon::AddonInterface)
public:
MediaObject(QObject *parent);
~MediaObject();
QStringList availableAudioStreams() const;
QStringList availableVideoStreams() const;
QStringList availableSubtitleStreams() const;
QString currentAudioStream(const QObject *audioPath) const;
QString currentVideoStream(const QObject *videoPath) const;
QString currentSubtitleStream(const QObject *videoPath) const;
void setCurrentAudioStream(const QString &streamName,const QObject *audioPath);
void setCurrentVideoStream(const QString &streamName,const QObject *videoPath);
void setCurrentSubtitleStream(const QString &streamName,const QObject *videoPath);
void play();
void pause();
void stop();
void seek(qint64 milliseconds);
qint32 tickInterval() const;
void setTickInterval(qint32 interval);
bool hasVideo() const;
bool isSeekable() const;
qint64 currentTime() const;
Phonon::State state() const;
QString errorString() const;
Phonon::ErrorType errorType() const;
qint64 totalTime() const;
MediaSource source() const;
void setSource(const MediaSource &);
void setNextSource(const MediaSource &source);
qint32 prefinishMark() const;
void setPrefinishMark(qint32);
qint32 transitionTime() const;
void setTransitionTime(qint32);
bool hasInterface(Interface interface) const;
QVariant interfaceCall(Interface interface, int command, const QList &arguments = QList());
QuickTimeVideoPlayer* videoPlayer() const;
QuickTimeAudioPlayer* audioPlayer() const;
void setVolumeOnMovie(float volume);
bool setAudioDeviceOnMovie(int id);
int videoOutputCount();
#if QT_ALLOW_QUICKTIME
void displayLinkEvent();
#endif
signals:
void stateChanged(Phonon::State,Phonon::State);
void tick(qint64);
void seekableChanged(bool);
void hasVideoChanged(bool);
void bufferStatus(int);
void finished();
void aboutToFinish();
void prefinishMarkReached(qint32);
void totalTimeChanged(qint64);
void metaDataChanged(QMultiMap);
void currentSourceChanged(const MediaSource &newSource);
// Add-on interface:
void availableSubtitlesChanged();
void availableAudioChannelsChanged();
void titleChanged(int);
void availableTitlesChanged(int);
void chapterChanged(int);
void availableChaptersChanged(int);
void angleChanged(int);
void availableAnglesChanged(int);
protected:
void mediaNodeEvent(const MediaNodeEvent *event);
bool event(QEvent *event);
private:
enum AudioSystem {AS_Unset, AS_Video, AS_Graph, AS_Silent} m_audioSystem;
Phonon::State m_state;
QuickTimeVideoPlayer *m_videoPlayer;
QuickTimeAudioPlayer *m_audioPlayer;
QuickTimeVideoPlayer *m_nextVideoPlayer;
QuickTimeAudioPlayer *m_nextAudioPlayer;
MediaObjectAudioNode *m_mediaObjectAudioNode;
#if QT_ALLOW_QUICKTIME
CVDisplayLinkRef m_displayLink;
QMutex m_displayLinkMutex;
bool m_pendingDisplayLinkEvent;
void startDisplayLink();
void stopDisplayLink();
#endif
qint32 m_tickInterval;
qint32 m_transitionTime;
quint32 m_prefinishMark;
quint32 m_currentTime;
float m_percentageLoaded;
int m_tickTimer;
int m_videoTimer;
int m_audioTimer;
int m_rapidTimer;
bool m_waitNextSwap;
int m_swapTimeLeft;
QTime m_swapTime;
bool m_autoplayTitles;
void synchAudioVideo();
void updateCurrentTime();
void swapCurrentWithNext(qint32 transitionTime);
bool setState(Phonon::State state);
void pause_internal();
void play_internal();
void setupAudioSystem();
void restartAudioVideoTimers();
void updateRapidly();
void updateCrossFade();
void updateAudioBuffers();
void updateLipSynch(int allowedOffset);
void updateVideoFrames();
void updateBufferStatus();
void setMute(bool mute);
void inspectAudioGraphRecursive(AudioConnection *connection, int &effectCount, int &outputCount);
void inspectVideoGraphRecursive(MediaNode *node, int &effectCount, int &outputCount);
void inspectGraph();
bool isCrossFading();
void setCurrentTrack(int track);
QString m_errorString;
Phonon::ErrorType m_errorType;
bool checkForError();
int m_audioEffectCount;
int m_audioOutputCount;
int m_videoEffectCount;
int m_videoOutputCount;
};
}} //namespace Phonon::QT7
QT_END_NAMESPACE
#endif // Phonon_QT7_MEDIAOBJECT_H