/* 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_MEDIAGRAPH_H
#define PHONON_MEDIAGRAPH_H
#include "backendnode.h"
#include
#include
//#define GRAPH_DEBUG
QT_BEGIN_NAMESPACE
namespace Phonon
{
namespace DS9
{
class MediaObject;
//in the end we should probably have no more inheritance here: everything should be in the interface of the class
//could be nice to then remove all the "*this" in the code of this class
class MediaGraph : public QObject
{
public:
MediaGraph(MediaObject *mo, short index);
~MediaGraph();
bool isSeekable() const;
qint64 absoluteTotalTime() const;
qint64 absoluteCurrentTime() const;
void play();
void stop();
void pause();
void absoluteSeek(qint64);
QMultiMap metadata() const;
static QList getAllFilters(Graph graph);
QList getAllFilters() const;
HRESULT loadSource(const Phonon::MediaSource &);
bool hasVideo() const { return m_hasVideo; }
void grabNode(BackendNode *node);
void grabFilter(Filter filter);
//connections of the nodes
bool connectNodes(BackendNode *source, BackendNode *sink);
bool disconnectNodes(BackendNode *source, BackendNode *sink);
Phonon::MediaSource mediaSource() const;
//before loading a source, and after its playback this will be called
HRESULT cleanup();
void ensureStopped();
short index() const;
Filter realSource() const;
#ifndef QT_NO_PHONON_MEDIACONTROLLER
QList titles() const;
void setStopPosition(qint64 time);
qint64 stopPosition() const;
#endif //QT_NO_PHONON_MEDIACONTROLLER
void switchFilters(Filter oldFilter, Filter newFilter);
OAFilterState syncGetRealState() const;
bool isLoading() const;
bool isStopping() const;
HRESULT renderResult() const;
Graph graph() const;
void finishLoading(quint16 workId, HRESULT hr, Graph);
void finishSeeking(quint16 workId, qint64 time);
private:
bool isSourceFilter(const Filter &filter) const;
bool isDemuxerFilter(const Filter &filter) const;
bool isDecoderFilter(const Filter &filter);
static QList getFilterChain(const Filter &source, const Filter &sink);
HRESULT reallyFinishLoading(HRESULT, const Graph &graph);
//utility functions
void ensureSourceConnectedTo(bool force = false);
void ensureSourceDisconnected();
bool tryConnect(const OutputPin &, const InputPin &);
bool tryDisconnect(const OutputPin &, const InputPin &);
HRESULT removeFilter(const Filter& filter);
//after loading, removes the decoders that are not linked to a sink
HRESULT removeUselessDecoders();
//COM objects
Graph m_graph;
ComPointer m_mediaControl;
ComPointer m_mediaSeeking;
Filter m_fakeSource, m_realSource;
Filter m_demux;
QList m_decoderPins;
QList m_decoders;
bool m_hasVideo;
bool m_hasAudio;
bool m_connectionsDirty;
bool m_isStopping;
mutable bool m_isSeekable;
HRESULT m_result;
quint16 m_index;
quint16 m_renderId;
quint16 m_seekId;
//while seeking we need to store the current time
qint64 m_currentTime;
qint64 m_totalTime;
MediaObject *m_mediaObject;
Phonon::MediaSource m_mediaSource;
QList m_sinkConnections; //connections to the source
Q_DISABLE_COPY(MediaGraph);
};
}
}
QT_END_NAMESPACE
#endif // PHONON_MEDIAGRAPH_H