[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