diff options
author | Gareth Stockwell <gareth.stockwell@sosco.com> | 2009-08-20 16:24:55 (GMT) |
---|---|---|
committer | Gareth Stockwell <gareth.stockwell@sosco.com> | 2009-08-20 16:24:55 (GMT) |
commit | 2150242ddbe66c5d4c440599f1282580be013e61 (patch) | |
tree | d0eefc4aa67a121987f8b74822e558603d3cedc1 | |
parent | ee990e2ed366a16605afb6a13edd9c59b1bcc33d (diff) | |
download | Qt-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.cpp | 34 | ||||
-rw-r--r-- | src/3rdparty/phonon/mmf/abstractmediaplayer.h | 7 | ||||
-rw-r--r-- | src/3rdparty/phonon/mmf/audioplayer.cpp | 9 | ||||
-rw-r--r-- | src/3rdparty/phonon/mmf/backend.cpp | 9 | ||||
-rw-r--r-- | src/3rdparty/phonon/mmf/mediaobject.cpp | 4 | ||||
-rw-r--r-- | src/3rdparty/phonon/mmf/videoplayer.cpp | 88 | ||||
-rw-r--r-- | src/3rdparty/phonon/mmf/videowidget.cpp | 5 | ||||
-rw-r--r-- | src/3rdparty/phonon/mmf/videowidget.h | 2 |
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 |