[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    =?utf-8?q?=5Bkaffeine=5D_/=3A_move_state_handling_code_into_Abst?=
From:       Christoph Pfister <christophpfister () gmail ! com>
Date:       2011-05-24 12:44:58
Message-ID: 20110524124458.116FDA60A4 () git ! kde ! org
[Download RAW message or body]

Git commit 7dd66e9734b64270eb8a95cfde5b19af0c38e0d3 by Christoph Pfister.
Committed on 24/05/2011 at 14:44.
Pushed by pfister into branch 'master'.

move state handling code into AbstractMediaWidget

M  +0    -1    README     
M  +150  -117  src/abstractmediawidget.cpp     
M  +65   -49   src/abstractmediawidget.h     
M  +17   -125  src/backend-mplayer/mplayermediawidget.cpp     
M  +1    -24   src/backend-mplayer/mplayermediawidget.h     
M  +53   -69   src/mediawidget.cpp     
M  +11   -19   src/mediawidget.h     

http://commits.kde.org/kaffeine/7dd66e9734b64270eb8a95cfde5b19af0c38e0d3

diff --git a/README b/README
index 3952f8a..86bdf66 100644
--- a/README
+++ b/README
@@ -5,7 +5,6 @@ Installing Kaffeine
 The following development headers are needed (recommended versions):
 * Qt >= 4.6
 * KDE >= 4.4
-* libvlc >= 1.1.1
 * libX11
 * libXss
 
diff --git a/src/abstractmediawidget.cpp b/src/abstractmediawidget.cpp
index f0aa7c7..9cd49b7 100644
--- a/src/abstractmediawidget.cpp
+++ b/src/abstractmediawidget.cpp
@@ -22,189 +22,220 @@
 
 #include <QCoreApplication>
 
-void AbstractMediaWidget::setMediaWidget(MediaWidget *mediaWidget_)
+AbstractMediaWidget::AbstractMediaWidget(QWidget *parent) : QWidget(parent), mediaWidget(NULL)
 {
-	mediaWidget = mediaWidget_;
+	resetState();
 }
 
-void AbstractMediaWidget::invalidateState()
+AbstractMediaWidget::~AbstractMediaWidget()
 {
-	if (dirtyFlags.fetchAndStoreRelaxed(InvalidateState) == 0) {
-		QCoreApplication::postEvent(this, new QEvent(QEvent::User));
-	}
 }
 
-void AbstractMediaWidget::addDirtyFlags(DirtyFlags additionalDirtyFlags)
+void AbstractMediaWidget::setMediaWidget(MediaWidget *mediaWidget_)
 {
-	while (true) {
-		uint oldDirtyFlags = dirtyFlags;
-		uint newDirtyFlags = (oldDirtyFlags | additionalDirtyFlags);
+	mediaWidget = mediaWidget_;
+}
 
-		if (oldDirtyFlags == newDirtyFlags) {
-			break;
-		}
+void AbstractMediaWidget::resetState()
+{
+	if (pendingUpdates == 0) {
+		QCoreApplication::postEvent(this, new QEvent(QEvent::User));
+	}
 
-		if (!dirtyFlags.testAndSetRelaxed(oldDirtyFlags, newDirtyFlags)) {
-			continue;
-		}
+	pendingUpdates = ResetState;
+	playbackStatus = MediaWidget::Idle;
+	totalTime = 0;
+	currentTime = 0;
+	seekable = false;
+	metadata.clear();
+	audioChannels.clear();
+	currentAudioChannel = -1;
+	subtitles.clear();
+	currentSubtitle = -1;
+	titleCount = 0;
+	currentTitle = -1;
+	chapterCount = 0;
+	currentChapter = -1;
+	angleCount = 0;
+	currentAngle = -1;
+	dvdMenu = false;
+	videoSize = QSize();
+}
+
+void AbstractMediaWidget::addPendingUpdate(PendingUpdate pendingUpdate)
+{
+	if (pendingUpdates == 0) {
+		QCoreApplication::postEvent(this, new QEvent(QEvent::User));
+	}
 
-		if (oldDirtyFlags == 0) {
-			QCoreApplication::postEvent(this, new QEvent(QEvent::User));
-		}
+	pendingUpdates |= pendingUpdate;
+}
 
-		break;
-	}
+void AbstractMediaWidget::updatePlaybackStatus(MediaWidget::PlaybackStatus playbackStatus_)
+{
+	playbackStatus = playbackStatus_;
+	addPendingUpdate(UpdatePlaybackStatus);
 }
 
-void AbstractMediaWidget::customEvent(QEvent *event)
+void AbstractMediaWidget::updateTotalTime(int totalTime_)
 {
-	Q_UNUSED(event)
+	totalTime = totalTime_;
 
-	while (true) {
-		uint oldDirtyFlags = dirtyFlags;
-		uint lowestDirtyFlag = (oldDirtyFlags & (~(oldDirtyFlags - 1)));
-		uint newDirtyFlags = (oldDirtyFlags & (~lowestDirtyFlag));
+	if (totalTime < 0) {
+		totalTime = 0;
+	}
 
-		if (oldDirtyFlags == newDirtyFlags) {
-			break;
-		}
+	addPendingUpdate(UpdateTotalTime);
+}
 
-		if (!dirtyFlags.testAndSetRelaxed(oldDirtyFlags, newDirtyFlags)) {
-			continue;
-		}
+void AbstractMediaWidget::updateCurrentTime(int currentTime_)
+{
+	currentTime = currentTime_;
 
-		switch (static_cast<DirtyFlag>(lowestDirtyFlag)) {
-		case PlaybackFinished:
-			mediaWidget->playbackFinished();
-			break;
-		case UpdatePlaybackStatus:
-			mediaWidget->updatePlaybackStatus(getPlaybackStatus());
-			break;
-		case UpdateTotalTime:
-			mediaWidget->updateTotalTime(getTotalTime());
-			break;
-		case UpdateCurrentTime:
-			mediaWidget->updateCurrentTime(getCurrentTime());
-			break;
-		case UpdateSeekable:
-			mediaWidget->updateSeekable(isSeekable());
-			break;
-		case UpdateMetadata:
-			mediaWidget->updateMetadata(getMetadata());
-			break;
-		case UpdateAudioChannels:
-			mediaWidget->updateAudioChannels(getAudioChannels(),
-				getCurrentAudioChannel());
-			break;
-		case UpdateSubtitles:
-			mediaWidget->updateSubtitles(getSubtitles(), getCurrentSubtitle());
-			break;
-		case UpdateTitles:
-			mediaWidget->updateTitles(getTitleCount(), getCurrentTitle());
-			break;
-		case UpdateChapters:
-			mediaWidget->updateChapters(getChapterCount(), getCurrentChapter());
-			break;
-		case UpdateAngles:
-			mediaWidget->updateAngles(getAngleCount(), getCurrentAngle());
-			break;
-		case UpdateDvdPlayback:
-			mediaWidget->updateDvdPlayback(hasMenu());
-			break;
-		case UpdateVideoSize:
-			// FIXME
-			mediaWidget->updateVideoSize();
-			break;
-		case InvalidateState:
-			// this is a combination of flags
-			break;
-		}
+	if (currentTime < 0) {
+		currentTime = 0;
 	}
-}
 
-MediaWidget::PlaybackStatus DummyMediaWidget::getPlaybackStatus()
-{
-	return MediaWidget::Idle;
+	addPendingUpdate(UpdateCurrentTime);
 }
 
-int DummyMediaWidget::getCurrentTime()
+void AbstractMediaWidget::updateSeekable(bool seekable_)
 {
-	return 0;
+	seekable = seekable_;
+	addPendingUpdate(UpdateSeekable);
 }
 
-int DummyMediaWidget::getTotalTime()
+void AbstractMediaWidget::updateMetadata(const QMap<MediaWidget::MetadataType, QString> &metadata_)
 {
-	return 0;
+	metadata = metadata_;
+	addPendingUpdate(UpdateMetadata);
 }
 
-bool DummyMediaWidget::isSeekable()
+void AbstractMediaWidget::updateAudioChannels(const QStringList &audioChannels_)
 {
-	return false;
+	audioChannels = audioChannels_;
+	addPendingUpdate(UpdateAudioChannels);
 }
 
-QMap<MediaWidget::MetadataType, QString> DummyMediaWidget::getMetadata()
+void AbstractMediaWidget::updateCurrentAudioChannel(int currentAudioChannel_)
 {
-	return QMap<MediaWidget::MetadataType, QString>();
+	currentAudioChannel = currentAudioChannel_;
+	addPendingUpdate(UpdateAudioChannels);
 }
 
-QStringList DummyMediaWidget::getAudioChannels()
+void AbstractMediaWidget::updateSubtitles(const QStringList &subtitles_)
 {
-	return QStringList();
+	subtitles = subtitles_;
+	addPendingUpdate(UpdateSubtitles);
 }
 
-int DummyMediaWidget::getCurrentAudioChannel()
+void AbstractMediaWidget::updateCurrentSubtitle(int currentSubtitle_)
 {
-	return -1;
+	currentSubtitle = currentSubtitle_;
+	addPendingUpdate(UpdateSubtitles);
 }
 
-QStringList DummyMediaWidget::getSubtitles()
+void AbstractMediaWidget::updateTitleCount(int titleCount_)
 {
-	return QStringList();
+	titleCount = titleCount_;
+	addPendingUpdate(UpdateTitles);
 }
 
-int DummyMediaWidget::getCurrentSubtitle()
+void AbstractMediaWidget::updateCurrentTitle(int currentTitle_)
 {
-	return -1;
+	currentTitle = currentTitle_;
+	addPendingUpdate(UpdateTitles);
 }
 
-int DummyMediaWidget::getTitleCount()
+void AbstractMediaWidget::updateChapterCount(int chapterCount_)
 {
-	return 0;
+	chapterCount = chapterCount_;
+	addPendingUpdate(UpdateChapters);
 }
 
-int DummyMediaWidget::getCurrentTitle()
+void AbstractMediaWidget::updateCurrentChapter(int currentChapter_)
 {
-	return -1;
+	currentChapter = currentChapter_;
+	addPendingUpdate(UpdateChapters);
 }
 
-int DummyMediaWidget::getChapterCount()
+void AbstractMediaWidget::updateAngleCount(int angleCount_)
 {
-	return 0;
+	angleCount = angleCount_;
+	addPendingUpdate(UpdateAngles);
 }
 
-int DummyMediaWidget::getCurrentChapter()
+void AbstractMediaWidget::updateCurrentAngle(int currentAngle_)
 {
-	return -1;
+	currentAngle = currentAngle_;
+	addPendingUpdate(UpdateAngles);
 }
 
-int DummyMediaWidget::getAngleCount()
+void AbstractMediaWidget::updateDvdMenu(bool dvdMenu_)
 {
-	return 0;
+	dvdMenu = dvdMenu_;
+	addPendingUpdate(UpdateDvdMenu);
 }
 
-int DummyMediaWidget::getCurrentAngle()
+void AbstractMediaWidget::updateVideoSize(const QSize &videoSize_)
 {
-	return -1;
+	videoSize = videoSize_;
+	addPendingUpdate(UpdateVideoSize);
 }
 
-bool DummyMediaWidget::hasMenu()
+void AbstractMediaWidget::customEvent(QEvent *event)
 {
-	return false;
-}
+	Q_UNUSED(event)
 
-QSize DummyMediaWidget::getVideoSize()
-{
-	return QSize();
+	while (pendingUpdates != 0) {
+		uint lowestPendingUpdate = (pendingUpdates & (~(pendingUpdates - 1)));
+		pendingUpdates &= ~lowestPendingUpdate;
+
+		switch (static_cast<PendingUpdates>(lowestPendingUpdate)) {
+		case PlaybackFinished:
+			mediaWidget->playbackFinished();
+			break;
+		case UpdatePlaybackStatus:
+			mediaWidget->updatePlaybackStatus();
+			break;
+		case UpdateTotalTime:
+			mediaWidget->updateTotalTime();
+			break;
+		case UpdateCurrentTime:
+			mediaWidget->updateCurrentTime();
+			break;
+		case UpdateSeekable:
+			mediaWidget->updateSeekable();
+			break;
+		case UpdateMetadata:
+			mediaWidget->updateMetadata();
+			break;
+		case UpdateAudioChannels:
+			mediaWidget->updateAudioChannels();
+			break;
+		case UpdateSubtitles:
+			mediaWidget->updateSubtitles();
+			break;
+		case UpdateTitles:
+			mediaWidget->updateTitles();
+			break;
+		case UpdateChapters:
+			mediaWidget->updateChapters();
+			break;
+		case UpdateAngles:
+			mediaWidget->updateAngles();
+			break;
+		case UpdateDvdMenu:
+			mediaWidget->updateDvdMenu();
+			break;
+		case UpdateVideoSize:
+			mediaWidget->updateVideoSize();
+			break;
+		case ResetState:
+			// this is a combination of flags
+			break;
+		}
+	}
 }
 
 void DummyMediaWidget::setMuted(bool muted)
@@ -230,10 +261,12 @@ void DummyMediaWidget::setDeinterlacing(bool deinterlacing)
 void DummyMediaWidget::play(const MediaSource &source)
 {
 	Q_UNUSED(source)
+	resetState();
 }
 
 void DummyMediaWidget::stop()
 {
+	resetState();
 }
 
 void DummyMediaWidget::setPaused(bool paused)
diff --git a/src/abstractmediawidget.h b/src/abstractmediawidget.h
index f46c801..1510065 100644
--- a/src/abstractmediawidget.h
+++ b/src/abstractmediawidget.h
@@ -26,31 +26,31 @@
 class AbstractMediaWidget : public QWidget
 {
 public:
-	explicit AbstractMediaWidget(QWidget *parent) : QWidget(parent), mediaWidget(NULL) { }
-	virtual ~AbstractMediaWidget() { }
+	explicit AbstractMediaWidget(QWidget *parent);
+	virtual ~AbstractMediaWidget();
 
 	void setMediaWidget(MediaWidget *mediaWidget_);
-	void invalidateState(); // re-emit signals
 
 	// zero-based numbering is used everywhere (e.g. first audio channel = 0)
 
-	virtual MediaWidget::PlaybackStatus getPlaybackStatus() = 0;
-	virtual int getTotalTime() = 0; // milliseconds
-	virtual int getCurrentTime() = 0; // milliseconds
-	virtual bool isSeekable() = 0;
-	virtual QMap<MediaWidget::MetadataType, QString> getMetadata() = 0;
-	virtual QStringList getAudioChannels() = 0;
-	virtual int getCurrentAudioChannel() = 0;
-	virtual QStringList getSubtitles() = 0;
-	virtual int getCurrentSubtitle() = 0;
-	virtual int getTitleCount() = 0;
-	virtual int getCurrentTitle() = 0;
-	virtual int getChapterCount() = 0;
-	virtual int getCurrentChapter() = 0;
-	virtual int getAngleCount() = 0;
-	virtual int getCurrentAngle() = 0;
-	virtual bool hasMenu() = 0;
-	virtual QSize getVideoSize() = 0;
+	MediaWidget::PlaybackStatus getPlaybackStatus() const { return playbackStatus; }
+	int getTotalTime() const { return totalTime; } // milliseconds
+	int getCurrentTime() const { return currentTime; } // milliseconds
+	bool isSeekable() const { return seekable; }
+	QMap<MediaWidget::MetadataType, QString> getMetadata() const { return metadata; }
+	QStringList getAudioChannels() const { return audioChannels; }
+	int getCurrentAudioChannel() const { return currentAudioChannel; }
+	QStringList getSubtitles() const { return subtitles; }
+	int getCurrentSubtitle() const { return currentSubtitle; }
+	int getTitleCount() const { return titleCount; }
+	int getCurrentTitle() const { return currentTitle; }
+	int getChapterCount() const { return chapterCount; }
+	int getCurrentChapter() const { return currentChapter; }
+	int getAngleCount() const { return angleCount; }
+	int getCurrentAngle() const { return currentAngle; }
+	bool hasDvdMenu() const { return dvdMenu; }
+	QSize getVideoSize() const { return videoSize; }
+
 	virtual void setMuted(bool muted) = 0;
 	virtual void setVolume(int volume) = 0; // [0 - 200]
 	virtual void setAspectRatio(MediaWidget::AspectRatio aspectRatio) = 0;
@@ -69,7 +69,28 @@ public:
 	virtual bool jumpToNextChapter() = 0;
 	virtual void toggleMenu() = 0;
 
-	enum DirtyFlag
+protected:
+	void resetState();
+	void updatePlaybackStatus(MediaWidget::PlaybackStatus playbackStatus_);
+	void updateTotalTime(int totalTime_);
+	void updateCurrentTime(int currentTime_);
+	void updateSeekable(bool seekable_);
+	void updateMetadata(const QMap<MediaWidget::MetadataType, QString> &metadata_);
+	void updateAudioChannels(const QStringList &audioChannels_);
+	void updateCurrentAudioChannel(int currentAudioChannel_);
+	void updateSubtitles(const QStringList &subtitles_);
+	void updateCurrentSubtitle(int currentSubtitle_);
+	void updateTitleCount(int titleCount_);
+	void updateCurrentTitle(int currentTitle_);
+	void updateChapterCount(int chapterCount_);
+	void updateCurrentChapter(int currentChapter_);
+	void updateAngleCount(int angleCount_);
+	void updateCurrentAngle(int currentAngle_);
+	void updateDvdMenu(bool dvdMenu_);
+	void updateVideoSize(const QSize &videoSize_);
+
+private:
+	enum PendingUpdate
 	{
 		PlaybackFinished = (1 << 0),
 		UpdatePlaybackStatus = (1 << 1),
@@ -82,28 +103,40 @@ public:
 		UpdateTitles = (1 << 8),
 		UpdateChapters = (1 << 9),
 		UpdateAngles = (1 << 10),
-		UpdateDvdPlayback = (1 << 11),
+		UpdateDvdMenu = (1 << 11),
 		UpdateVideoSize = (1 << 12),
-		InvalidateState = (UpdatePlaybackStatus | UpdateTotalTime | UpdateCurrentTime |
+		ResetState = (UpdatePlaybackStatus | UpdateTotalTime | UpdateCurrentTime |
 			UpdateSeekable | UpdateMetadata | UpdateAudioChannels | UpdateSubtitles |
-			UpdateTitles | UpdateChapters | UpdateAngles | UpdateDvdPlayback |
+			UpdateTitles | UpdateChapters | UpdateAngles | UpdateDvdMenu |
 			UpdateVideoSize)
 	};
 
-	Q_DECLARE_FLAGS(DirtyFlags, DirtyFlag)
+	Q_DECLARE_FLAGS(PendingUpdates, PendingUpdate)
 
-protected:
-	void addDirtyFlags(DirtyFlags additionalDirtyFlags);
-
-private:
+	void addPendingUpdate(PendingUpdate pendingUpdate);
 	void customEvent(QEvent *event);
 
-	QAtomicInt dirtyFlags;
 	MediaWidget *mediaWidget;
+	PendingUpdates pendingUpdates;
+	MediaWidget::PlaybackStatus playbackStatus;
+	int totalTime;
+	int currentTime;
+	bool seekable;
+	QMap<MediaWidget::MetadataType, QString> metadata;
+	QStringList audioChannels;
+	int currentAudioChannel;
+	QStringList subtitles;
+	int currentSubtitle;
+	int titleCount;
+	int currentTitle;
+	int chapterCount;
+	int currentChapter;
+	int angleCount;
+	int currentAngle;
+	bool dvdMenu;
+	QSize videoSize;
 };
 
-Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractMediaWidget::DirtyFlags)
-
 class DummyMediaWidget : public AbstractMediaWidget
 {
 public:
@@ -112,23 +145,6 @@ public:
 
 	// zero-based numbering is used everywhere (e.g. first audio channel = 0)
 
-	MediaWidget::PlaybackStatus getPlaybackStatus();
-	int getTotalTime(); // milliseconds
-	int getCurrentTime(); // milliseconds
-	bool isSeekable();
-	QMap<MediaWidget::MetadataType, QString> getMetadata();
-	QStringList getAudioChannels();
-	int getCurrentAudioChannel();
-	QStringList getSubtitles();
-	int getCurrentSubtitle();
-	int getTitleCount();
-	int getCurrentTitle();
-	int getChapterCount();
-	int getCurrentChapter();
-	int getAngleCount();
-	int getCurrentAngle();
-	bool hasMenu();
-	QSize getVideoSize();
 	void setMuted(bool muted);
 	void setVolume(int volume); // [0 - 200]
 	void setAspectRatio(MediaWidget::AspectRatio aspectRatio);
diff --git a/src/backend-mplayer/mplayermediawidget.cpp b/src/backend-mplayer/mplayermediawidget.cpp
index 72aa82d..7c90e96 100644
--- a/src/backend-mplayer/mplayermediawidget.cpp
+++ b/src/backend-mplayer/mplayermediawidget.cpp
@@ -26,10 +26,9 @@
 #include "../log.h"
 #include "mplayervideowidget.h"
 
-MPlayerMediaWidget::MPlayerMediaWidget(QWidget *parent) : AbstractMediaWidget(parent), volume(0),
-	muted(false), aspectRatio(MediaWidget::AspectRatioAuto), playbackStatus(MediaWidget::Idle),
-	playingDvd(false), totalTime(0), currentTime(0), videoWidth(0), videoHeight(0),
-	videoAspectRatio(1)
+MPlayerMediaWidget::MPlayerMediaWidget(QWidget *parent) : AbstractMediaWidget(parent),
+	muted(false), volume(0), aspectRatio(MediaWidget::AspectRatioAuto), videoWidth(0),
+	videoHeight(0), videoAspectRatio(1)
 {
 	videoWidget = new MPlayerVideoWidget(this);
 	standardError.open(stderr, QIODevice::WriteOnly);
@@ -51,107 +50,6 @@ MPlayerMediaWidget *MPlayerMediaWidget::createMPlayerMediaWidget(QWidget *parent
 	return new MPlayerMediaWidget(parent);
 }
 
-MediaWidget::PlaybackStatus MPlayerMediaWidget::getPlaybackStatus()
-{
-	return playbackStatus;
-}
-
-int MPlayerMediaWidget::getTotalTime()
-{
-	return totalTime;
-}
-
-int MPlayerMediaWidget::getCurrentTime()
-{
-	return currentTime;
-}
-
-bool MPlayerMediaWidget::isSeekable()
-{
-	return false;
-	// FIXME
-}
-
-QMap<MediaWidget::MetadataType, QString> MPlayerMediaWidget::getMetadata()
-{
-	QMap<MediaWidget::MetadataType, QString> metadata;
-	return metadata;
-	// FIXME
-}
-
-QStringList MPlayerMediaWidget::getAudioChannels()
-{
-	QStringList audioChannels;
-	return audioChannels;
-	// FIXME
-}
-
-int MPlayerMediaWidget::getCurrentAudioChannel()
-{
-	return 0;
-	// FIXME
-}
-
-QStringList MPlayerMediaWidget::getSubtitles()
-{
-	QStringList subtitles;
-	return subtitles;
-	// FIXME
-}
-
-int MPlayerMediaWidget::getCurrentSubtitle()
-{
-	return 0;
-	// FIXME
-}
-
-int MPlayerMediaWidget::getTitleCount()
-{
-	return 0;
-	// FIXME
-}
-
-int MPlayerMediaWidget::getCurrentTitle()
-{
-	return -1;
-	// FIXME
-}
-
-int MPlayerMediaWidget::getChapterCount()
-{
-	return 0;
-	// FIXME
-}
-
-int MPlayerMediaWidget::getCurrentChapter()
-{
-	return -1;
-	// FIXME
-}
-
-int MPlayerMediaWidget::getAngleCount()
-{
-	return 0;
-	// FIXME
-}
-
-int MPlayerMediaWidget::getCurrentAngle()
-{
-	return -1;
-	// FIXME
-}
-
-bool MPlayerMediaWidget::hasMenu()
-{
-	return playingDvd;
-}
-
-QSize MPlayerMediaWidget::getVideoSize()
-{
-	return QSize();
-	// FIXME
-}
-
 void MPlayerMediaWidget::setMuted(bool muted_)
 {
 	muted = muted_;
@@ -178,19 +76,17 @@ void MPlayerMediaWidget::setDeinterlacing(bool deinterlacing)
 
 void MPlayerMediaWidget::play(const MediaSource &source)
 {
-	QByteArray url = source.url.toEncoded();
-	playbackStatus = MediaWidget::Playing;
-	playingDvd = false;
-	totalTime = 0;
-	currentTime = 0;
+	resetState();
 	videoWidth = 0;
 	videoHeight = 0;
 	videoAspectRatio = 1;
+	updateVideoWidgetGeometry();
+	QByteArray url = source.url.toEncoded();
 
 	switch (source.type) {
 	case MediaSource::Url:
 		if (url.endsWith(".iso")) {
-			playingDvd = true;
+			updateDvdMenu(true);
 		}
 
 		break;
@@ -217,41 +113,41 @@ void MPlayerMediaWidget::play(const MediaSource &source)
 			url = "dvdnav:///";
 		}
 
-		playingDvd = true;
+		updateDvdMenu(true);
 		break;
 	}
 
+	updatePlaybackStatus(MediaWidget::Playing);
 	process.write("loadfile " + url + '\n');
+	process.write("pausing_keep_force get_property path\n");
 	sendCommand(SetVolume);
 }
 
 void MPlayerMediaWidget::stop()
 {
-	playbackStatus = MediaWidget::Idle;
-	playingDvd = false;
-	totalTime = 0;
-	currentTime = 0;
+	resetState();
 	videoWidth = 0;
 	videoHeight = 0;
 	videoAspectRatio = 1;
+	updateVideoWidgetGeometry();
 	sendCommand(Stop);
 }
 
 void MPlayerMediaWidget::setPaused(bool paused)
 {
-	switch (playbackStatus) {
+	switch (getPlaybackStatus()) {
 	case MediaWidget::Idle:
 		break;
 	case MediaWidget::Playing:
 		if (paused) {
-			playbackStatus = MediaWidget::Paused;
+			updatePlaybackStatus(MediaWidget::Paused);
 			sendCommand(TogglePause);
 		}
 
 		break;
 	case MediaWidget::Paused:
 		if (!paused) {
-			playbackStatus = MediaWidget::Playing;
+			updatePlaybackStatus(MediaWidget::Playing);
 			sendCommand(TogglePause);
 		}
 
@@ -342,14 +238,10 @@ void MPlayerMediaWidget::readStandardOutput()
 		}
 
 		if (line == "ANS_path=(null)") {
-			playbackStatus = MediaWidget::Idle;
-			playingDvd = false;
-			totalTime = 0;
-			currentTime = 0;
+			resetState();
 			videoWidth = 0;
 			videoHeight = 0;
 			videoAspectRatio = 1;
-			invalidateState();
 			updateVideoWidgetGeometry();
 		}
 
@@ -461,7 +353,7 @@ void MPlayerMediaWidget::updateVideoWidgetGeometry()
 
 	QRect geometry(QPoint(0, 0), size());
 
-	if (playbackStatus == MediaWidget::Idle) {
+	if (getPlaybackStatus() == MediaWidget::Idle) {
 		geometry.setSize(QSize(0, 0));
 	} else if (effectiveAspectRatio > 0) {
 		int newWidth = (geometry.height() * effectiveAspectRatio + 0.5);
diff --git a/src/backend-mplayer/mplayermediawidget.h b/src/backend-mplayer/mplayermediawidget.h
index 1e9fc90..5070b4c 100644
--- a/src/backend-mplayer/mplayermediawidget.h
+++ b/src/backend-mplayer/mplayermediawidget.h
@@ -38,25 +38,6 @@ public:
 
 	static MPlayerMediaWidget *createMPlayerMediaWidget(QWidget *parent); // returns NULL if init fails
 
-	// zero-based numbering is used everywhere (e.g. first audio channel = 0)
-
-	MediaWidget::PlaybackStatus getPlaybackStatus();
-	int getTotalTime(); // milliseconds
-	int getCurrentTime(); // milliseconds
-	bool isSeekable();
-	QMap<MediaWidget::MetadataType, QString> getMetadata();
-	QStringList getAudioChannels();
-	int getCurrentAudioChannel();
-	QStringList getSubtitles();
-	int getCurrentSubtitle();
-	int getTitleCount();
-	int getCurrentTitle();
-	int getChapterCount();
-	int getCurrentChapter();
-	int getAngleCount();
-	int getCurrentAngle();
-	bool hasMenu();
-	QSize getVideoSize();
 	void setMuted(bool muted);
 	void setVolume(int volume); // [0 - 200]
 	void setAspectRatio(MediaWidget::AspectRatio aspectRatio);
@@ -99,13 +80,9 @@ private:
 	QWidget *videoWidget;
 	QProcess process;
 	QFile standardError;
-	int volume;
 	bool muted;
+	int volume;
 	MediaWidget::AspectRatio aspectRatio;
-	MediaWidget::PlaybackStatus playbackStatus;
-	bool playingDvd;
-	int totalTime;
-	int currentTime;
 	int videoWidth;
 	int videoHeight;
 	float videoAspectRatio;
diff --git a/src/mediawidget.cpp b/src/mediawidget.cpp
index 6e8c041..f5545e5 100644
--- a/src/mediawidget.cpp
+++ b/src/mediawidget.cpp
@@ -44,11 +44,11 @@
 #include "osdwidget.h"
 
 MediaWidget::MediaWidget(KMenu *menu_, KToolBar *toolBar, KActionCollection *collection,
-	QWidget *parent) : QWidget(parent), menu(menu_), backendPlaybackStatus(Idle),
-	displayMode(NormalMode), automaticResize(ResizeOff), source(Playlist),
-	blockBackendUpdates(false), muted(false), screenSaverSuspended(false), backendTotalTime(0),
-	backendCurrentTime(0), showElapsedTime(true), backendSeekable(false),
-	currentBackendAudioChannel(-1), currentDvbAudioChannel(-1), currentBackendSubtitle(-1),
+	QWidget *parent) : QWidget(parent), menu(menu_), displayMode(NormalMode),
+	automaticResize(ResizeOff), source(Playlist),
+	blockBackendUpdates(false), muted(false), screenSaverSuspended(false),
+	showElapsedTime(true),
+	currentDvbAudioChannel(-1),
 	currentDvbSubtitle(-1), currentExternalSubtitle(-1)
 {
 	QBoxLayout *layout = new QVBoxLayout(this);
@@ -334,8 +334,6 @@ MediaWidget::MediaWidget(KMenu *menu_, KToolBar *toolBar, KActionCollection *col
 	QTimer *timer = new QTimer(this);
 	timer->start(50000);
 	connect(timer, SIGNAL(timeout()), this, SLOT(checkScreenSaver()));
-
-	backend->invalidateState();
 }
 
 MediaWidget::~MediaWidget()
@@ -463,7 +461,6 @@ void MediaWidget::play(Source source_, const KUrl &url, const KUrl &subtitleUrl)
 	}
 
 	backend->play(mediaSource);
-	backend->invalidateState();
 }
 
 void MediaWidget::play(const KUrl &url, const KUrl &subtitleUrl)
@@ -572,7 +569,7 @@ void MediaWidget::updateDvbSubtitles(const QStringList &dvbSubtitles_, int curre
 
 MediaWidget::PlaybackStatus MediaWidget::getPlaybackStatus() const
 {
-	return backendPlaybackStatus;
+	return backend->getPlaybackStatus();
 }
 
 int MediaWidget::getVolume() const
@@ -582,7 +579,7 @@ int MediaWidget::getVolume() const
 
 int MediaWidget::getPosition() const
 {
-	return backendCurrentTime;
+	return backend->getCurrentTime();
 }
 
 void MediaWidget::play()
@@ -665,7 +662,7 @@ void MediaWidget::next()
 
 void MediaWidget::stop()
 {
-	switch (backendPlaybackStatus) {
+	switch (backend->getPlaybackStatus()) {
 	case Idle:
 		break;
 	case Playing:
@@ -675,7 +672,6 @@ void MediaWidget::stop()
 	}
 
 	backend->stop();
-	backend->invalidateState();
 }
 
 void MediaWidget::increaseVolume()
@@ -694,7 +690,7 @@ void MediaWidget::checkScreenSaver()
 {
 	bool suspendScreenSaver = false;
 
-	switch (backendPlaybackStatus) {
+	switch (backend->getPlaybackStatus()) {
 	case Idle:
 	case Paused:
 		break;
@@ -822,7 +818,7 @@ void MediaWidget::autoResizeTriggered(QAction *action)
 
 void MediaWidget::pausedChanged(bool paused)
 {
-	switch (backendPlaybackStatus) {
+	switch (backend->getPlaybackStatus()) {
 	case Idle:
 		emit playlistPlay();
 		break;
@@ -842,7 +838,7 @@ void MediaWidget::timeButtonClicked()
 void MediaWidget::longSkipBackward()
 {
 	int longSkipDuration = Configuration::instance()->getLongSkipDuration();
-	int currentTime = (backendCurrentTime - 1000 * longSkipDuration);
+	int currentTime = (backend->getCurrentTime() - 1000 * longSkipDuration);
 
 	if (currentTime < 0) {
 		currentTime = 0;
@@ -854,7 +850,7 @@ void MediaWidget::longSkipBackward()
 void MediaWidget::shortSkipBackward()
 {
 	int shortSkipDuration = Configuration::instance()->getShortSkipDuration();
-	int currentTime = (backendCurrentTime - 1000 * shortSkipDuration);
+	int currentTime = (backend->getCurrentTime() - 1000 * shortSkipDuration);
 
 	if (currentTime < 0) {
 		currentTime = 0;
@@ -866,13 +862,13 @@ void MediaWidget::shortSkipBackward()
 void MediaWidget::shortSkipForward()
 {
 	int shortSkipDuration = Configuration::instance()->getShortSkipDuration();
-	backend->seek(backendCurrentTime + 1000 * shortSkipDuration);
+	backend->seek(backend->getCurrentTime() + 1000 * shortSkipDuration);
 }
 
 void MediaWidget::longSkipForward()
 {
 	int longSkipDuration = Configuration::instance()->getLongSkipDuration();
-	backend->seek(backendCurrentTime + 1000 * longSkipDuration);
+	backend->seek(backend->getCurrentTime() + 1000 * longSkipDuration);
 }
 
 void MediaWidget::jumpToPosition()
@@ -907,11 +903,11 @@ void MediaWidget::currentSubtitleChanged(int currentSubtitle)
 	if (dvbSubtitles.isEmpty()) {
 		int oldExternalSubtitle = currentExternalSubtitle;
 
-		if (currentSubtitle < backendSubtitles.size()) {
+		if (currentSubtitle < backend->getSubtitles().size()) {
 			currentExternalSubtitle = -1;
 			backend->setCurrentSubtitle(currentSubtitle);
 		} else {
-			currentExternalSubtitle = (currentSubtitle - backendSubtitles.size());
+			currentExternalSubtitle = (currentSubtitle - backend->getSubtitles().size());
 		}
 
 		if (currentExternalSubtitle != oldExternalSubtitle) {
@@ -971,8 +967,8 @@ void MediaWidget::updateAudioChannelUi()
 	audioChannelBox->clear();
 
 	if (dvbAudioChannels.isEmpty()) {
-		audioChannelBox->addItems(backendAudioChannels);
-		audioChannelBox->setCurrentIndex(currentBackendAudioChannel);
+		audioChannelBox->addItems(backend->getAudioChannels());
+		audioChannelBox->setCurrentIndex(backend->getCurrentAudioChannel());
 	} else {
 		audioChannelBox->addItems(dvbAudioChannels);
 		audioChannelBox->setCurrentIndex(currentDvbAudioChannel);
@@ -989,7 +985,7 @@ void MediaWidget::updateSubtitleUi()
 	subtitleBox->addItem(textSubtitlesOff);
 
 	if (dvbSubtitles.isEmpty()) {
-		subtitleBox->addItems(backendSubtitles);
+		subtitleBox->addItems(backend->getSubtitles());
 
 		foreach (const KUrl &subtitleUrl, externalSubtitles) {
 			subtitleBox->addItem(subtitleUrl.fileName());
@@ -998,9 +994,9 @@ void MediaWidget::updateSubtitleUi()
 		int currentIndex;
 
 		if (currentExternalSubtitle < 0) {
-			currentIndex = (currentBackendSubtitle + 1);
+			currentIndex = (backend->getCurrentSubtitle() + 1);
 		} else {
-			currentIndex = (currentExternalSubtitle + backendSubtitles.size() + 1);
+			currentIndex = (currentExternalSubtitle + backend->getSubtitles().size() + 1);
 		}
 
 		subtitleBox->setCurrentIndex(currentIndex);
@@ -1015,8 +1011,8 @@ void MediaWidget::updateSubtitleUi()
 
 void MediaWidget::updateCurrentTotalTimeUi()
 {
-	int currentTime = backendCurrentTime;
-	int totalTime = backendTotalTime;
+	int currentTime = backend->getCurrentTime();
+	int totalTime = backend->getTotalTime();
 
 	switch (source) {
 	case Playlist:
@@ -1047,7 +1043,7 @@ void MediaWidget::updateCurrentTotalTimeUi()
 
 void MediaWidget::updateSeekableUi()
 {
-	bool seekable = backendSeekable;
+	bool seekable = backend->isSeekable();
 
 	switch (source) {
 	case Playlist:
@@ -1114,7 +1110,7 @@ void MediaWidget::resizeEvent(QResizeEvent *event)
 void MediaWidget::wheelEvent(QWheelEvent *event)
 {
 	int shortSkipDuration = Configuration::instance()->getShortSkipDuration();
-	int currentTime = (backendCurrentTime - ((25 * shortSkipDuration * event->delta()) / 3));
+	int currentTime = (backend->getCurrentTime() - ((25 * shortSkipDuration * event->delta()) / 3));
 
 	if (currentTime < 0) {
 		currentTime = 0;
@@ -1140,12 +1136,11 @@ void MediaWidget::playbackFinished()
 	}
 }
 
-void MediaWidget::updatePlaybackStatus(PlaybackStatus playbackStatus)
+void MediaWidget::updatePlaybackStatus()
 {
-	backendPlaybackStatus = playbackStatus;
 	bool playing = true;
 
-	switch (playbackStatus) {
+	switch (backend->getPlaybackStatus()) {
 	case Idle:
 		emit changeCaption(QString());
 		actionPlayPause->setIcon(iconPlay);
@@ -1217,17 +1212,11 @@ void MediaWidget::updatePlaybackStatus(PlaybackStatus playbackStatus)
 	timeButton->setEnabled(playing);
 }
 
-void MediaWidget::updateTotalTime(int totalTime)
+void MediaWidget::updateTotalTime()
 {
-	if (totalTime < 0) {
-		totalTime = 0;
-	}
-
-	backendTotalTime = totalTime;
-
 	switch (source) {
 	case Playlist:
-		emit playlistTrackLengthChanged(backendTotalTime);
+		emit playlistTrackLengthChanged(backend->getTotalTime());
 		break;
 	case AudioCd:
 	case VideoCd:
@@ -1240,22 +1229,15 @@ void MediaWidget::updateTotalTime(int totalTime)
 	updateCurrentTotalTimeUi();
 }
 
-void MediaWidget::updateCurrentTime(int currentTime)
+void MediaWidget::updateCurrentTime()
 {
-	if (currentTime < 0) {
-		currentTime = 0;
-	}
-
-	if (currentTime > backendTotalTime) {
-		currentTime = backendTotalTime;
-	}
-
-	backendCurrentTime = currentTime;
 	updateCurrentTotalTimeUi();
 }
 
-void MediaWidget::updateMetadata(const QMap<MetadataType, QString> &metadata)
+void MediaWidget::updateMetadata()
 {
+	QMap<MediaWidget::MetadataType, QString> metadata = backend->getMetadata();
+
 	switch (source) {
 	case Playlist:
 		emit playlistTrackMetadataChanged(metadata);
@@ -1289,48 +1271,44 @@ void MediaWidget::updateMetadata(const QMap<MetadataType, QString> &metadata)
 	}
 }
 
-void MediaWidget::updateSeekable(bool seekable)
+void MediaWidget::updateSeekable()
 {
-	backendSeekable = seekable;
 	updateSeekableUi();
 }
 
-void MediaWidget::updateAudioChannels(const QStringList &audioChannels, int currentAudioChannel)
+void MediaWidget::updateAudioChannels()
 {
-	backendAudioChannels = audioChannels;
-	currentBackendAudioChannel = currentAudioChannel;
 	updateAudioChannelUi();
 }
 
-void MediaWidget::updateSubtitles(const QStringList &subtitles, int currentSubtitle)
+void MediaWidget::updateSubtitles()
 {
-	backendSubtitles = subtitles;
-	currentBackendSubtitle = currentSubtitle;
-
 	if (!dvbSubtitles.isEmpty()) {
 		// subtitles are overriden --> automatically choose appropriate subtitle
 		int selectedSubtitle = -1;
 
 		if (currentDvbSubtitle >= 0) {
-			selectedSubtitle = (backendSubtitles.size() - 1);
+			selectedSubtitle = (backend->getSubtitles().size() - 1);
 		}
 
-		if (currentBackendSubtitle != selectedSubtitle) {
-			// FIXME
-			// backend->setCurrentSubtitle(selectedSubtitle);
+		if (backend->getCurrentSubtitle() != selectedSubtitle) {
+			backend->setCurrentSubtitle(selectedSubtitle);
 		}
 	}
 
 	updateSubtitleUi();
 }
 
-void MediaWidget::updateDvdPlayback(bool playingDvd)
+void MediaWidget::updateDvdMenu()
 {
-	menuAction->setEnabled(playingDvd);
+	menuAction->setEnabled(backend->hasDvdMenu());
 }
 
-void MediaWidget::updateTitles(int titleCount, int currentTitle)
+void MediaWidget::updateTitles()
 {
+	int titleCount = backend->getTitleCount();
+	int currentTitle = backend->getCurrentTitle();
+
 	if (titleCount > 1) {
 		QList<QAction *> actions = titleGroup->actions();
 
@@ -1363,8 +1341,11 @@ void MediaWidget::updateTitles(int titleCount, int currentTitle)
 	}
 }
 
-void MediaWidget::updateChapters(int chapterCount, int currentChapter)
+void MediaWidget::updateChapters()
 {
+	int chapterCount = backend->getChapterCount();
+	int currentChapter = backend->getCurrentChapter();
+
 	if (chapterCount > 1) {
 		QList<QAction *> actions = chapterGroup->actions();
 
@@ -1397,8 +1378,11 @@ void MediaWidget::updateChapters(int chapterCount, int currentChapter)
 	}
 }
 
-void MediaWidget::updateAngles(int angleCount, int currentAngle)
+void MediaWidget::updateAngles()
 {
+	int angleCount = backend->getAngleCount();
+	int currentAngle = backend->getCurrentAngle();
+
 	if (angleCount > 1) {
 		QList<QAction *> actions = angleGroup->actions();
 
diff --git a/src/mediawidget.h b/src/mediawidget.h
index 6dbc835..2274087 100644
--- a/src/mediawidget.h
+++ b/src/mediawidget.h
@@ -204,17 +204,17 @@ private slots:
 
 private:
 	void playbackFinished();
-	void updatePlaybackStatus(MediaWidget::PlaybackStatus playbackStatus);
-	void updateTotalTime(int totalTime);
-	void updateCurrentTime(int currentTime);
-	void updateMetadata(const QMap<MediaWidget::MetadataType, QString> &metadata);
-	void updateSeekable(bool seekable);
-	void updateAudioChannels(const QStringList &audioChannels, int currentAudioChannel);
-	void updateSubtitles(const QStringList &subtitles, int currentSubtitle);
-	void updateTitles(int titleCount, int currentTitle);
-	void updateChapters(int chapterCount, int currentChapter);
-	void updateAngles(int angleCount, int currentAngle);
-	void updateDvdPlayback(bool playingDvd);
+	void updatePlaybackStatus();
+	void updateTotalTime();
+	void updateCurrentTime();
+	void updateMetadata();
+	void updateSeekable();
+	void updateAudioChannels();
+	void updateSubtitles();
+	void updateTitles();
+	void updateChapters();
+	void updateAngles();
+	void updateDvdMenu();
 	void updateVideoSize();
 
 	void updateCurrentTotalTimeUi();
@@ -268,7 +268,6 @@ private:
 	KAction *jumpToPositionAction;
 	QPushButton *timeButton;
 
-	PlaybackStatus backendPlaybackStatus;
 	DisplayMode displayMode;
 	ResizeFactor automaticResize;
 	Source source;
@@ -276,20 +275,13 @@ private:
 	bool muted;
 	bool screenSaverSuspended;
 
-	int backendTotalTime; // milliseconds
-	int backendCurrentTime; // milliseconds
 	bool showElapsedTime;
-	bool backendSeekable;
 
-	QStringList backendAudioChannels;
 	QStringList dvbAudioChannels;
-	int currentBackendAudioChannel; // first audio channel = 0
 	int currentDvbAudioChannel; // first audio channel = 0
 
-	QStringList backendSubtitles;
 	QStringList dvbSubtitles;
 	QList<KUrl> externalSubtitles;
-	int currentBackendSubtitle; // first subtitle = 0
 	int currentDvbSubtitle; // first subtitle = 0
 	int currentExternalSubtitle; // first subtitle = 0
 };

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic