summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGareth Stockwell <gareth.stockwell@sosco.com>2009-08-20 16:24:55 (GMT)
committerGareth Stockwell <gareth.stockwell@sosco.com>2009-08-20 16:24:55 (GMT)
commit2150242ddbe66c5d4c440599f1282580be013e61 (patch)
treed0eefc4aa67a121987f8b74822e558603d3cedc1
parentee990e2ed366a16605afb6a13edd9c59b1bcc33d (diff)
downloadQt-2150242ddbe66c5d4c440599f1282580be013e61.zip
Qt-2150242ddbe66c5d4c440599f1282580be013e61.tar.gz
Qt-2150242ddbe66c5d4c440599f1282580be013e61.tar.bz2
Started fleshing out the VideoPlayer implementation
Now loads, prepares and plays a clip, but the video is not visible because it's not yet wired up to a VideoWidget. Video 'playback' can be tested using the demos/mediaplayer application, but the menus are not displayed properly, so a video clip filename must be hardcoded in main.cpp and passed to the MediaPlayer constructor.
-rw-r--r--src/3rdparty/phonon/mmf/abstractmediaplayer.cpp34
-rw-r--r--src/3rdparty/phonon/mmf/abstractmediaplayer.h7
-rw-r--r--src/3rdparty/phonon/mmf/audioplayer.cpp9
-rw-r--r--src/3rdparty/phonon/mmf/backend.cpp9
-rw-r--r--src/3rdparty/phonon/mmf/mediaobject.cpp4
-rw-r--r--src/3rdparty/phonon/mmf/videoplayer.cpp88
-rw-r--r--src/3rdparty/phonon/mmf/videowidget.cpp5
-rw-r--r--src/3rdparty/phonon/mmf/videowidget.h2
8 files changed, 118 insertions, 40 deletions
diff --git a/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp b/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp
index a86f634..dbb4d2d 100644
--- a/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp
+++ b/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp
@@ -70,12 +70,15 @@ void MMF::AbstractMediaPlayer::play()
switch(m_state)
{
case GroundState:
- case LoadingState:
// Is this the correct error? Really we want 'NotReadyError'
m_error = NormalError;
changeState(ErrorState);
break;
-
+
+ case LoadingState:
+ m_playPending = true;
+ break;
+
case StoppedState:
case PausedState:
doPlay();
@@ -102,6 +105,8 @@ void MMF::AbstractMediaPlayer::pause()
TRACE_CONTEXT(AbstractMediaPlayer::pause, EAudioApi);
TRACE_ENTRY("state %d", m_state);
+ m_playPending = false;
+
switch(m_state)
{
case GroundState:
@@ -132,6 +137,8 @@ void MMF::AbstractMediaPlayer::stop()
TRACE_CONTEXT(AbstractMediaPlayer::stop, EAudioApi);
TRACE_ENTRY("state %d", m_state);
+ m_playPending = false;
+
switch(m_state)
{
case GroundState:
@@ -375,16 +382,29 @@ void MMF::AbstractMediaPlayer::changeState(PrivateState newState)
// TODO: add some invariants to check that the transition is valid
- const Phonon::State currentPhononState = phononState(m_state);
+ const Phonon::State oldPhononState = phononState(m_state);
const Phonon::State newPhononState = phononState(newState);
- if(currentPhononState != newPhononState)
+ if(oldPhononState != newPhononState)
{
- TRACE("emit stateChanged(%d, %d)", newPhononState, currentPhononState);
- emit stateChanged(newPhononState, currentPhononState);
+ TRACE("emit stateChanged(%d, %d)", newPhononState, oldPhononState);
+ emit stateChanged(newPhononState, oldPhononState);
}
m_state = newState;
-
+
+ // Check whether play() was called while clip was being loaded. If so,
+ // playback should be started now
+ if(
+ LoadingState == oldPhononState
+ and StoppedState == newPhononState
+ and m_playPending
+ )
+ {
+ TRACE("Play was called while loading; starting playback now");
+ m_playPending = false;
+ play();
+ }
+
TRACE_EXIT_0();
}
diff --git a/src/3rdparty/phonon/mmf/abstractmediaplayer.h b/src/3rdparty/phonon/mmf/abstractmediaplayer.h
index 0c233c9..9e0d3c8 100644
--- a/src/3rdparty/phonon/mmf/abstractmediaplayer.h
+++ b/src/3rdparty/phonon/mmf/abstractmediaplayer.h
@@ -127,6 +127,13 @@ namespace Phonon
PrivateState m_state;
Phonon::ErrorType m_error;
+ /**
+ * This flag is set to true if play is called when the object is
+ * in a Loading state. Once loading is complete, playback will
+ * be started.
+ */
+ bool m_playPending;
+
QScopedPointer<QTimer> m_tickTimer;
int m_mmfMaxVolume;
diff --git a/src/3rdparty/phonon/mmf/audioplayer.cpp b/src/3rdparty/phonon/mmf/audioplayer.cpp
index f7ab0df..8d8eb53 100644
--- a/src/3rdparty/phonon/mmf/audioplayer.cpp
+++ b/src/3rdparty/phonon/mmf/audioplayer.cpp
@@ -124,9 +124,7 @@ void MMF::AudioPlayer::seek(qint64 ms)
bool MMF::AudioPlayer::hasVideo() const
{
- TRACE_CONTEXT(AudioPlayer::hasVideo, EAudioApi);
- TRACE_ENTRY("state %d", state());
- TRACE_RETURN("%d", false);
+ return false;
}
qint64 MMF::AudioPlayer::currentTime() const
@@ -137,9 +135,10 @@ qint64 MMF::AudioPlayer::currentTime() const
TTimeIntervalMicroSeconds us;
const TInt err = m_player->GetPosition(us);
- qint64 result = -1;
+ qint64 result = 0;
- if(KErrNone == err) {
+ if(KErrNone == err)
+ {
result = toMilliSeconds(us);
}
diff --git a/src/3rdparty/phonon/mmf/backend.cpp b/src/3rdparty/phonon/mmf/backend.cpp
index 7a0f3f5..9494c65 100644
--- a/src/3rdparty/phonon/mmf/backend.cpp
+++ b/src/3rdparty/phonon/mmf/backend.cpp
@@ -22,6 +22,7 @@ along with this library. If not, see <http://www.gnu.org/licenses/>.
#include "backend.h"
#include "audiooutput.h"
#include "mediaobject.h"
+#include "videowidget.h"
using namespace Phonon;
using namespace Phonon::MMF;
@@ -55,15 +56,13 @@ QObject *Backend::createObject(BackendInterface::Class c, QObject *parent, const
break;
case VolumeFaderEffectClass:
- /* Fallthrough. */
case VisualizationClass:
- /* Fallthrough. */
case VideoDataOutputClass:
- /* Fallthrough. */
case EffectClass:
- /* Fallthrough. */
+ break;
+
case VideoWidgetClass:
- result = NULL;
+ result = new VideoWidget(qobject_cast<QWidget *>(parent));
break;
default:
diff --git a/src/3rdparty/phonon/mmf/mediaobject.cpp b/src/3rdparty/phonon/mmf/mediaobject.cpp
index 0336109..8ac9441 100644
--- a/src/3rdparty/phonon/mmf/mediaobject.cpp
+++ b/src/3rdparty/phonon/mmf/mediaobject.cpp
@@ -30,7 +30,7 @@ using namespace Phonon::MMF;
// Constructor / destructor
//-----------------------------------------------------------------------------
-MMF::MediaObject::MediaObject(QObject *parent) : QObject::QObject(parent)
+MMF::MediaObject::MediaObject(QObject *parent) : QObject(parent)
, m_recognizerOpened(false)
{
m_player.reset(new DummyPlayer());
@@ -224,7 +224,7 @@ void MMF::MediaObject::setSource(const MediaSource &source)
void MMF::MediaObject::createPlayer(const MediaSource &source)
{
- TRACE_CONTEXT(AudioPlayer::createPlayer, EAudioApi);
+ TRACE_CONTEXT(MediaObject::createPlayer, EAudioApi);
TRACE_ENTRY("state %d source.type %d", state(), source.type());
TRACE_ENTRY("source.type %d", source.type());
diff --git a/src/3rdparty/phonon/mmf/videoplayer.cpp b/src/3rdparty/phonon/mmf/videoplayer.cpp
index b0c786b..6e6bcb2 100644
--- a/src/3rdparty/phonon/mmf/videoplayer.cpp
+++ b/src/3rdparty/phonon/mmf/videoplayer.cpp
@@ -97,42 +97,53 @@ MMF::VideoPlayer::~VideoPlayer()
void MMF::VideoPlayer::doPlay()
{
- // TODO
+ m_player->Play();
}
void MMF::VideoPlayer::doPause()
{
- // TODO
+ TRAPD(err, m_player->PauseL());
+ if(KErrNone != err)
+ {
+ setError(NormalError);
+ }
}
void MMF::VideoPlayer::doStop()
{
- // TODO
+ m_player->Stop();
}
int MMF::VideoPlayer::doSetMmfVolume(int mmfVolume)
{
- // TODO
- Q_UNUSED(mmfVolume);
- return KErrNotSupported;
+ TRAPD(err, m_player->SetVolumeL(mmfVolume));
+ return err;
}
int MMF::VideoPlayer::openFile(RFile& file)
{
- // TODO
- Q_UNUSED(file);
- return KErrNotSupported;
+ TRAPD(err, m_player->OpenFileL(file));
+ return err;
}
void MMF::VideoPlayer::close()
{
-
+ m_player->Close();
}
void MMF::VideoPlayer::seek(qint64 ms)
{
- // TODO
- Q_UNUSED(ms);
+ TRACE_CONTEXT(VideoPlayer::seek, EAudioApi);
+ TRACE_ENTRY("state %d pos %Ld", state(), ms);
+
+ TRAPD(err, m_player->SetPositionL(TTimeIntervalMicroSeconds(ms)));
+
+ if(KErrNone != err)
+ {
+ setError(NormalError);
+ }
+
+ TRACE_EXIT_0();
}
bool MMF::VideoPlayer::hasVideo() const
@@ -142,14 +153,32 @@ bool MMF::VideoPlayer::hasVideo() const
qint64 MMF::VideoPlayer::currentTime() const
{
- // TODO
- return 0;
+ TTimeIntervalMicroSeconds us;
+ TRAPD(err, us = m_player->PositionL())
+
+ qint64 result = 0;
+
+ if(KErrNone == err)
+ {
+ result = toMilliSeconds(us);
+ }
+
+ return result;
}
qint64 MMF::VideoPlayer::totalTime() const
{
- // TODO
- return 0;
+ qint64 result = 0;
+ TRAPD(err, result = toMilliSeconds(m_player->DurationL()));
+
+ if(KErrNone != err)
+ {
+ // If we don't cast away constness here, we simply have to ignore
+ // the error.
+ const_cast<VideoPlayer*>(this)->setError(NormalError);
+ }
+
+ return result;
}
@@ -162,7 +191,17 @@ void MMF::VideoPlayer::MvpuoOpenComplete(TInt aError)
TRACE_CONTEXT(VideoPlayer::MvpuoOpenComplete, EVideoApi);
TRACE_ENTRY("state %d error %d", state(), aError);
- // TODO
+ __ASSERT_ALWAYS(LoadingState == state(), Utils::panic(InvalidStatePanic));
+
+ if(KErrNone == aError)
+ {
+ m_player->Prepare();
+ }
+ else
+ {
+ // TODO: set different error states according to value of aError?
+ setError(NormalError);
+ }
TRACE_EXIT_0();
}
@@ -172,7 +211,20 @@ void MMF::VideoPlayer::MvpuoPrepareComplete(TInt aError)
TRACE_CONTEXT(VideoPlayer::MvpuoPrepareComplete, EVideoApi);
TRACE_ENTRY("state %d error %d", state(), aError);
- // TODO
+ __ASSERT_ALWAYS(LoadingState == state(), Utils::panic(InvalidStatePanic));
+
+ if(KErrNone == aError)
+ {
+ initVolume(m_player->MaxVolume());
+
+ emit totalTimeChanged();
+ changeState(StoppedState);
+ }
+ else
+ {
+ // TODO: set different error states according to value of aError?
+ setError(NormalError);
+ }
TRACE_EXIT_0();
}
diff --git a/src/3rdparty/phonon/mmf/videowidget.cpp b/src/3rdparty/phonon/mmf/videowidget.cpp
index 3628470..3438aaa 100644
--- a/src/3rdparty/phonon/mmf/videowidget.cpp
+++ b/src/3rdparty/phonon/mmf/videowidget.cpp
@@ -40,8 +40,9 @@ static const qreal DefaultSaturation = 1.0;
// Constructor / destructor
//-----------------------------------------------------------------------------
-MMF::VideoWidget::VideoWidget()
- : m_aspectRatio(DefaultAspectRatio)
+MMF::VideoWidget::VideoWidget(QWidget* parent)
+ : QWidget(parent)
+ , m_aspectRatio(DefaultAspectRatio)
, m_brightness(DefaultBrightness)
, m_scaleMode(DefaultScaleMode)
, m_contrast(DefaultContrast)
diff --git a/src/3rdparty/phonon/mmf/videowidget.h b/src/3rdparty/phonon/mmf/videowidget.h
index 1ed23e2..3c33a56 100644
--- a/src/3rdparty/phonon/mmf/videowidget.h
+++ b/src/3rdparty/phonon/mmf/videowidget.h
@@ -34,7 +34,7 @@ namespace Phonon
Q_INTERFACES(Phonon::VideoWidgetInterface)
public:
- VideoWidget();
+ VideoWidget(QWidget* parent);
~VideoWidget();
// VideoWidgetInterface