summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/3rdparty/phonon/mmf/TODO.txt5
-rw-r--r--src/3rdparty/phonon/mmf/abstractmediaplayer.cpp28
-rw-r--r--src/3rdparty/phonon/mmf/abstractmediaplayer.h1
-rw-r--r--src/3rdparty/phonon/mmf/abstractplayer.cpp12
-rw-r--r--src/3rdparty/phonon/mmf/abstractplayer.h7
-rw-r--r--src/3rdparty/phonon/mmf/dummyplayer.cpp10
-rw-r--r--src/3rdparty/phonon/mmf/dummyplayer.h3
-rw-r--r--src/3rdparty/phonon/mmf/mmf_videoplayer.cpp14
8 files changed, 51 insertions, 29 deletions
diff --git a/src/3rdparty/phonon/mmf/TODO.txt b/src/3rdparty/phonon/mmf/TODO.txt
index 2c13632..a2b1865 100644
--- a/src/3rdparty/phonon/mmf/TODO.txt
+++ b/src/3rdparty/phonon/mmf/TODO.txt
@@ -3,8 +3,13 @@ TODO list for MMF Phonon backend
The following items are in rough order of priority.
+* Activating full-screen video playback in qmediaplayer causes the app to crash
+This may be symptomatic of more general problems with re-sizing / re-positioning video while playing.
+
* Implement audio effects
+* Support for playing "file:" URLs
+
* Support for network streaming playback
The main question here is how best to implement the MIME type detection for streams. The OpenUrlL functions only take a URL, whereas the corresponding OpenFileL functions have overloads for filenames and for open RFile handles. This is because files support random access whereas streams do not. A naieve approach to MIME type detection for streams is as follows; is there a more efficient approach?
1. Open network connection
diff --git a/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp b/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp
index e8f8a67..8fe1e4d 100644
--- a/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp
+++ b/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp
@@ -41,7 +41,6 @@ const int NullMaxVolume = -1;
MMF::AbstractMediaPlayer::AbstractMediaPlayer() :
m_playPending(false)
, m_tickTimer(new QTimer(this))
- , m_volume(InitialVolume)
, m_mmfMaxVolume(NullMaxVolume)
{
connect(m_tickTimer.data(), SIGNAL(timeout()), this, SLOT(tick()));
@@ -51,7 +50,6 @@ MMF::AbstractMediaPlayer::AbstractMediaPlayer(const AbstractPlayer& player) :
AbstractPlayer(player)
, m_playPending(false)
, m_tickTimer(new QTimer(this))
- , m_volume(InitialVolume)
, m_mmfMaxVolume(NullMaxVolume)
{
connect(m_tickTimer.data(), SIGNAL(timeout()), this, SLOT(tick()));
@@ -296,7 +294,7 @@ void MMF::AbstractMediaPlayer::volumeChanged(qreal volume)
TRACE_CONTEXT(AbstractMediaPlayer::volumeChanged, EAudioInternal);
TRACE_ENTRY("state %d", privateState());
- m_volume = volume;
+ AbstractPlayer::volumeChanged(volume);
doVolumeChanged();
TRACE_EXIT_0();
@@ -373,17 +371,21 @@ void MMF::AbstractMediaPlayer::changeState(PrivateState newState)
setState(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_0("play was called while loading; starting playback now");
- m_playPending = false;
- play();
- }
+ LoadingState == oldPhononState
+ and StoppedState == newPhononState
+ ) {
+ // Ensure initial volume is set on MMF API before starting playback
+ doVolumeChanged();
+
+ // Check whether play() was called while clip was being loaded. If so,
+ // playback should be started now
+ if (m_playPending) {
+ TRACE_0("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 20109ef..698b899 100644
--- a/src/3rdparty/phonon/mmf/abstractmediaplayer.h
+++ b/src/3rdparty/phonon/mmf/abstractmediaplayer.h
@@ -104,7 +104,6 @@ private:
QScopedPointer<QTimer> m_tickTimer;
- qreal m_volume;
int m_mmfMaxVolume;
MediaSource m_source;
diff --git a/src/3rdparty/phonon/mmf/abstractplayer.cpp b/src/3rdparty/phonon/mmf/abstractplayer.cpp
index 0d97272..62fccef 100644
--- a/src/3rdparty/phonon/mmf/abstractplayer.cpp
+++ b/src/3rdparty/phonon/mmf/abstractplayer.cpp
@@ -34,6 +34,7 @@ MMF::AbstractPlayer::AbstractPlayer()
: m_videoOutput(0)
, m_state(GroundState)
, m_error(NoError)
+ , m_volume(InitialVolume)
, m_tickInterval(DefaultTickInterval)
, m_transitionTime(0)
, m_prefinishMark(0)
@@ -45,6 +46,7 @@ MMF::AbstractPlayer::AbstractPlayer(const AbstractPlayer& player)
: m_videoOutput(player.m_videoOutput)
, m_state(GroundState)
, m_error(NoError)
+ , m_volume(player.m_volume)
, m_tickInterval(player.tickInterval())
, m_transitionTime(player.transitionTime())
, m_prefinishMark(player.prefinishMark())
@@ -89,6 +91,16 @@ void MMF::AbstractPlayer::setTransitionTime(qint32 time)
//-----------------------------------------------------------------------------
+// VolumeObserver
+//-----------------------------------------------------------------------------
+
+void MMF::AbstractPlayer::volumeChanged(qreal volume)
+{
+ m_volume = volume;
+}
+
+
+//-----------------------------------------------------------------------------
// Video output
//-----------------------------------------------------------------------------
diff --git a/src/3rdparty/phonon/mmf/abstractplayer.h b/src/3rdparty/phonon/mmf/abstractplayer.h
index 9f9057d..276a47d 100644
--- a/src/3rdparty/phonon/mmf/abstractplayer.h
+++ b/src/3rdparty/phonon/mmf/abstractplayer.h
@@ -85,6 +85,9 @@ public:
virtual void setFileSource(const Phonon::MediaSource&, RFile&) = 0;
virtual void setNextSource(const Phonon::MediaSource &) = 0;
+ // VolumeObserver
+ virtual void volumeChanged(qreal volume);
+
void setVideoOutput(VideoOutput* videoOutput);
/**
@@ -143,7 +146,9 @@ private:
protected:
// Not owned
VideoOutput* m_videoOutput;
-
+
+ qreal m_volume;
+
private:
PrivateState m_state;
Phonon::ErrorType m_error;
diff --git a/src/3rdparty/phonon/mmf/dummyplayer.cpp b/src/3rdparty/phonon/mmf/dummyplayer.cpp
index afe4771..4c059c4 100644
--- a/src/3rdparty/phonon/mmf/dummyplayer.cpp
+++ b/src/3rdparty/phonon/mmf/dummyplayer.cpp
@@ -115,16 +115,6 @@ void MMF::DummyPlayer::setNextSource(const MediaSource &)
//-----------------------------------------------------------------------------
-// VolumeObserver
-//-----------------------------------------------------------------------------
-
-void MMF::DummyPlayer::volumeChanged(qreal)
-{
-
-}
-
-
-//-----------------------------------------------------------------------------
// AbstractPlayer
//-----------------------------------------------------------------------------
diff --git a/src/3rdparty/phonon/mmf/dummyplayer.h b/src/3rdparty/phonon/mmf/dummyplayer.h
index 52399ba..9ff9f78 100644
--- a/src/3rdparty/phonon/mmf/dummyplayer.h
+++ b/src/3rdparty/phonon/mmf/dummyplayer.h
@@ -62,9 +62,6 @@ public:
virtual void setFileSource(const Phonon::MediaSource&, RFile&);
virtual void setNextSource(const MediaSource &source);
- // VolumeObserver
- virtual void volumeChanged(qreal volume);
-
// AbstractPlayer
virtual void doSetTickInterval(qint32 interval);
diff --git a/src/3rdparty/phonon/mmf/mmf_videoplayer.cpp b/src/3rdparty/phonon/mmf/mmf_videoplayer.cpp
index 8a38b76..64e6568 100644
--- a/src/3rdparty/phonon/mmf/mmf_videoplayer.cpp
+++ b/src/3rdparty/phonon/mmf/mmf_videoplayer.cpp
@@ -147,10 +147,22 @@ void MMF::VideoPlayer::doStop()
void MMF::VideoPlayer::doSeek(qint64 ms)
{
TRACE_CONTEXT(VideoPlayer::doSeek, EVideoApi);
+
+ bool wasPlaying = false;
+ if(state() == PlayingState) {
+ // The call to SetPositionL does not have any effect if playback is
+ // ongoing, so we pause before seeking.
+ doPause();
+ wasPlaying = true;
+ }
TRAPD(err, m_player->SetPositionL(TTimeIntervalMicroSeconds(ms * 1000)));
- if (KErrNone != err) {
+ if(KErrNone == err) {
+ if(wasPlaying)
+ doPlay();
+ }
+ else {
TRACE("SetPositionL error %d", err);
setError(NormalError);
}