summaryrefslogtreecommitdiffstats
path: root/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayersession.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayersession.cpp')
-rw-r--r--plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayersession.cpp410
1 files changed, 55 insertions, 355 deletions
diff --git a/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayersession.cpp b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayersession.cpp
index 3cef38b3f8..79638d00eb 100644
--- a/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayersession.cpp
+++ b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayersession.cpp
@@ -39,19 +39,13 @@
**
****************************************************************************/
-#include "s60mediaplayersession.h"
-#include "s60mmtrace.h"
-
-#include <QtCore/qdebug.h>
-#include <QtCore/qdir.h>
-#include <QtCore/qvariant.h>
-#include <QtCore/qtimer.h>
+#include <QtCore/QDir>
+#include <QtCore/QTimer>
#include <mmf/common/mmferrors.h>
#include <qmediatimerange.h>
-
-/*!
- Construct a media playersession with the given \a parent.
-*/
+#include "s60mediaplayersession.h"
+#include "s60mediaplayerutils.h"
+#include "s60mmtrace.h"
S60MediaPlayerSession::S60MediaPlayerSession(QObject *parent)
: QObject(parent)
@@ -70,44 +64,28 @@ S60MediaPlayerSession::S60MediaPlayerSession(QObject *parent)
, m_progressduration(0)
{
TRACE("S60MediaPlayerSession::S60MediaPlayerSession" << qtThisPtr());
-
connect(m_progressTimer, SIGNAL(timeout()), this, SLOT(tick()));
connect(m_stalledTimer, SIGNAL(timeout()), this, SLOT(stalled()));
}
-/*!
- Destroys a media playersession.
-*/
-
S60MediaPlayerSession::~S60MediaPlayerSession()
{
TRACE("S60MediaPlayerSession::~S60MediaPlayerSession" << qtThisPtr());
}
-/*!
- * \return the audio volume of a player session.
-*/
int S60MediaPlayerSession::volume() const
{
return m_volume;
}
-/*!
- Sets the audio \a volume of a player session.
-*/
-
void S60MediaPlayerSession::setVolume(int volume)
{
if (m_volume == volume)
return;
-
TRACE("S60MediaPlayerSession::setVolume" << qtThisPtr() << "volume" << volume);
-
m_volume = volume;
emit volumeChanged(m_volume);
-
- // Dont set symbian players volume until media loaded.
- // Leaves with KerrNotReady although documentation says otherwise.
+ // Don't set player volume until media loaded
if (!m_muted &&
( mediaStatus() == QMediaPlayer::LoadedMedia
|| (mediaStatus() == QMediaPlayer::StalledMedia && state() != QMediaPlayer::StoppedState)
@@ -119,94 +97,55 @@ void S60MediaPlayerSession::setVolume(int volume)
}
}
-/*!
- \return the mute state of a player session.
-*/
-
bool S60MediaPlayerSession::isMuted() const
{
return m_muted;
}
-/*!
- Identifies if the current media is seekable.
-
- \return true if it possible to seek within the current media, and false otherwise.
-*/
-
bool S60MediaPlayerSession::isSeekable() const
{
return m_seekable;
}
-/*!
- Sets the \a status of the current media.
-*/
-
void S60MediaPlayerSession::setMediaStatus(QMediaPlayer::MediaStatus status)
{
if (m_mediaStatus == status)
return;
-
TRACE("S60MediaPlayerSession::setMediaStatus" << qtThisPtr() << "status" << status);
-
m_mediaStatus = status;
-
emit mediaStatusChanged(m_mediaStatus);
-
if (m_play_requested && m_mediaStatus == QMediaPlayer::LoadedMedia)
play();
}
-/*!
- Sets the \a state on media player.
-*/
-
void S60MediaPlayerSession::setState(QMediaPlayer::State state)
{
if (m_state == state)
return;
-
TRACE("S60MediaPlayerSession::setMediaStatus" << qtThisPtr() << "state" << state);
-
m_state = state;
emit stateChanged(m_state);
}
-/*!
- \return the state of a player session.
-*/
-
QMediaPlayer::State S60MediaPlayerSession::state() const
{
return m_state;
}
-/*!
- \return the status of the current media.
-*/
-
QMediaPlayer::MediaStatus S60MediaPlayerSession::mediaStatus() const
{
return m_mediaStatus;
}
-/*!
- * Loads the \a url for playback.
- * If \a url is local file then it loads audio playersesion if its audio file.
- * If it is a local video file then loads the video playersession.
-*/
-
void S60MediaPlayerSession::load(const QMediaContent source)
{
TRACE("S60MediaPlayerSession::load" << qtThisPtr()
<< "source" << source.canonicalUrl().toString());
-
m_source = source;
setMediaStatus(QMediaPlayer::LoadingMedia);
startStalledTimer();
- m_stream = (source.canonicalUrl().scheme() == "file")?false:true;
- m_UrlPath = source.canonicalUrl();
+ m_stream = (source.canonicalUrl().scheme() != "file");
+ m_url = source.canonicalUrl();
TRAPD(err,
if (m_stream)
doLoadUrlL(QString2TPtrC(source.canonicalUrl().toString()));
@@ -216,35 +155,32 @@ void S60MediaPlayerSession::load(const QMediaContent source)
m_isaudiostream = false;
}
+bool S60MediaPlayerSession::getIsSeekable() const
+{
+ return ETrue;
+}
+
TBool S60MediaPlayerSession::isStreaming()
{
return m_stream;
}
-/*!
- Start or resume playing the current source.
-*/
void S60MediaPlayerSession::play()
{
TRACE("S60MediaPlayerSession::play" << qtThisPtr()
<< "state" << state() << "mediaStatus" << mediaStatus());
-
- if ( (state() == QMediaPlayer::PlayingState && m_play_requested == false)
+ if ( (state() == QMediaPlayer::PlayingState && m_play_requested == false)
|| mediaStatus() == QMediaPlayer::UnknownMediaStatus
|| mediaStatus() == QMediaPlayer::NoMedia
|| mediaStatus() == QMediaPlayer::InvalidMedia)
return;
-
setState(QMediaPlayer::PlayingState);
-
if (mediaStatus() == QMediaPlayer::LoadingMedia ||
(mediaStatus() == QMediaPlayer::StalledMedia &&
- state() == QMediaPlayer::StoppedState))
- {
+ state() == QMediaPlayer::StoppedState)) {
m_play_requested = true;
return;
}
-
m_play_requested = false;
m_duration = duration();
setVolume(m_volume);
@@ -253,38 +189,25 @@ void S60MediaPlayerSession::play()
doPlay();
}
-/*!
- Pause playing the current source.
-*/
-
void S60MediaPlayerSession::pause()
{
TRACE("S60MediaPlayerSession::pause" << qtThisPtr());
-
if (state() != QMediaPlayer::PlayingState)
return;
-
if (mediaStatus() == QMediaPlayer::NoMedia ||
mediaStatus() == QMediaPlayer::InvalidMedia)
return;
-
setState(QMediaPlayer::PausedState);
stopProgressTimer();
TRAP_IGNORE(doPauseL());
m_play_requested = false;
}
-/*!
- Stop playing, and reset the play position to the beginning.
-*/
-
void S60MediaPlayerSession::stop()
{
TRACE("S60MediaPlayerSession::stop" << qtThisPtr());
-
if (state() == QMediaPlayer::StoppedState)
return;
-
m_play_requested = false;
m_state = QMediaPlayer::StoppedState;
if (mediaStatus() == QMediaPlayer::BufferingMedia ||
@@ -300,129 +223,99 @@ void S60MediaPlayerSession::stop()
emit stateChanged(m_state);
}
-/*!
- * Sets \a renderer as video renderer.
-*/
-
void S60MediaPlayerSession::setVideoRenderer(QObject *renderer)
{
TRACE("S60MediaPlayerSession::setVideoRenderer" << qtThisPtr()
<< "videoRenderer" << renderer);
-
Q_UNUSED(renderer);
}
-/*!
- * the percentage of the temporary buffer filled before playback begins.
-
- When the player object is buffering; this property holds the percentage of
- the temporary buffer that is filled. The buffer will need to reach 100%
- filled before playback can resume, at which time the MediaStatus will be
- BufferedMedia.
-
- \sa mediaStatus()
-*/
-
int S60MediaPlayerSession::bufferStatus()
{
if (state() ==QMediaPlayer::StoppedState)
return 0;
-
if( mediaStatus() == QMediaPlayer::LoadingMedia
|| mediaStatus() == QMediaPlayer::UnknownMediaStatus
|| mediaStatus() == QMediaPlayer::NoMedia
|| mediaStatus() == QMediaPlayer::InvalidMedia)
return 0;
-
int progress = 0;
TRAPD(err, progress = doGetBufferStatusL());
// If buffer status query not supported by codec return 100
// do not set error
- if(err == KErrNotSupported)
+ if (err == KErrNotSupported)
return 100;
-
setError(err);
return progress;
}
-/*!
- * return TRUE if Meta data is available in current media source.
-*/
-
bool S60MediaPlayerSession::isMetadataAvailable() const
{
return !m_metaDataMap.isEmpty();
}
-/*!
- * \return the \a key meta data.
-*/
QVariant S60MediaPlayerSession::metaData(const QString &key) const
{
return m_metaDataMap.value(key);
}
-/*!
- * \return the \a key meta data as QString.
-*/
-
QVariant S60MediaPlayerSession::metaData(QtMultimediaKit::MetaData key) const
{
return metaData(metaDataKeyAsString(key));
}
-/*!
- * \return List of all available meta data from current media source.
-*/
-
QList<QtMultimediaKit::MetaData> S60MediaPlayerSession::availableMetaData() const
{
QList<QtMultimediaKit::MetaData> metaDataTags;
if (isMetadataAvailable()) {
- for (int i = QtMultimediaKit::Title; i <= QtMultimediaKit::ThumbnailImage; i++) {
+ for (int i=QtMultimediaKit::Title; i<=QtMultimediaKit::ThumbnailImage; ++i) {
QString metaDataItem = metaDataKeyAsString((QtMultimediaKit::MetaData)i);
if (!metaDataItem.isEmpty()) {
- if (!metaData(metaDataItem).isNull()) {
+ if (!metaData(metaDataItem).isNull())
metaDataTags.append((QtMultimediaKit::MetaData)i);
- }
}
}
}
-
return metaDataTags;
}
-/*!
- * \return all available extended meta data of current media source.
-*/
-
QStringList S60MediaPlayerSession::availableExtendedMetaData() const
{
return m_metaDataMap.keys();
}
-/*!
- * \return meta data \a key as QString.
-*/
-
QString S60MediaPlayerSession::metaDataKeyAsString(QtMultimediaKit::MetaData key) const
{
switch(key) {
- case QtMultimediaKit::Title: return "title";
- case QtMultimediaKit::AlbumArtist: return "artist";
- case QtMultimediaKit::Comment: return "comment";
- case QtMultimediaKit::Genre: return "genre";
- case QtMultimediaKit::Year: return "year";
- case QtMultimediaKit::Copyright: return "copyright";
- case QtMultimediaKit::AlbumTitle: return "album";
- case QtMultimediaKit::Composer: return "composer";
- case QtMultimediaKit::TrackNumber: return "albumtrack";
- case QtMultimediaKit::AudioBitRate: return "audiobitrate";
- case QtMultimediaKit::VideoBitRate: return "videobitrate";
- case QtMultimediaKit::Duration: return "duration";
- case QtMultimediaKit::MediaType: return "contenttype";
- case QtMultimediaKit::CoverArtImage: return "attachedpicture";
- case QtMultimediaKit::SubTitle: // TODO: Find the matching metadata keys
+ case QtMultimediaKit::Title:
+ return "title";
+ case QtMultimediaKit::AlbumArtist:
+ return "artist";
+ case QtMultimediaKit::Comment:
+ return "comment";
+ case QtMultimediaKit::Genre:
+ return "genre";
+ case QtMultimediaKit::Year:
+ return "year";
+ case QtMultimediaKit::Copyright:
+ return "copyright";
+ case QtMultimediaKit::AlbumTitle:
+ return "album";
+ case QtMultimediaKit::Composer:
+ return "composer";
+ case QtMultimediaKit::TrackNumber:
+ return "albumtrack";
+ case QtMultimediaKit::AudioBitRate:
+ return "audiobitrate";
+ case QtMultimediaKit::VideoBitRate:
+ return "videobitrate";
+ case QtMultimediaKit::Duration:
+ return "duration";
+ case QtMultimediaKit::MediaType:
+ return "contenttype";
+ case QtMultimediaKit::CoverArtImage:
+ return "attachedpicture";
+ case QtMultimediaKit::SubTitle:
case QtMultimediaKit::Description:
case QtMultimediaKit::Category:
case QtMultimediaKit::Date:
@@ -462,21 +355,15 @@ QString S60MediaPlayerSession::metaDataKeyAsString(QtMultimediaKit::MetaData key
default:
break;
}
-
return QString();
}
-/*!
- Sets the \a muted state of a player session.
-*/
-
void S60MediaPlayerSession::setMuted(bool muted)
{
if (muted != m_muted) {
TRACE("S60MediaPlayerSession::setMuted" << qtThisPtr() << "muted" << muted);
m_muted = muted;
emit mutedChanged(m_muted);
-
if( m_mediaStatus == QMediaPlayer::LoadedMedia
|| (m_mediaStatus == QMediaPlayer::StalledMedia && state() != QMediaPlayer::StoppedState)
|| m_mediaStatus == QMediaPlayer::BufferingMedia
@@ -488,10 +375,6 @@ void S60MediaPlayerSession::setMuted(bool muted)
}
}
-/*!
- \return the duration of the current media in milliseconds.
-*/
-
qint64 S60MediaPlayerSession::duration() const
{
if( mediaStatus() == QMediaPlayer::LoadingMedia
@@ -500,16 +383,11 @@ qint64 S60MediaPlayerSession::duration() const
|| (mediaStatus() == QMediaPlayer::StalledMedia && state() == QMediaPlayer::StoppedState)
|| mediaStatus() == QMediaPlayer::InvalidMedia)
return -1;
-
qint64 pos = 0;
TRAP_IGNORE(pos = doGetDurationL());
return pos;
}
-/*!
- \return the current playback position in milliseconds.
-*/
-
qint64 S60MediaPlayerSession::position() const
{
if( mediaStatus() == QMediaPlayer::LoadingMedia
@@ -518,7 +396,6 @@ qint64 S60MediaPlayerSession::position() const
|| (mediaStatus() == QMediaPlayer::StalledMedia && state() == QMediaPlayer::StoppedState)
|| mediaStatus() == QMediaPlayer::InvalidMedia)
return 0;
-
qint64 pos = 0;
TRAP_IGNORE(pos = doGetPositionL());
if (pos < m_progressduration)
@@ -526,64 +403,39 @@ qint64 S60MediaPlayerSession::position() const
return pos;
}
-/*!
- Sets the playback \a pos of the current media. This will initiate a seek and it may take
- some time for playback to reach the position set.
-*/
-
void S60MediaPlayerSession::setPosition(qint64 pos)
{
if (position() == pos)
return;
-
TRACE("S60MediaPlayerSession::setPosition" << qtThisPtr() << "pos" << pos);
-
QMediaPlayer::State originalState = state();
-
if (originalState == QMediaPlayer::PlayingState)
pause();
-
TRAPD(err, doSetPositionL(pos * 1000));
setError(err);
-
if (err == KErrNone) {
if (mediaStatus() == QMediaPlayer::EndOfMedia)
setMediaStatus(QMediaPlayer::LoadedMedia);
- }
- else if (err == KErrNotSupported) {
+ } else if (err == KErrNotSupported) {
m_seekable = false;
emit seekableChanged(m_seekable);
}
-
if (originalState == QMediaPlayer::PlayingState)
play();
-
TRAP_IGNORE(m_progressduration = doGetPositionL());
emit positionChanged(m_progressduration);
}
-/*!
- * Set the audio endpoint to \a audioEndpoint.
-*/
-
void S60MediaPlayerSession::setAudioEndpoint(const QString& audioEndpoint)
{
TRACE("S60MediaPlayerSession::setAudioEndpoint" << qtThisPtr()
<< "audioEndpoint" << audioEndpoint);
-
doSetAudioEndpoint(audioEndpoint);
}
-/*!
- * Loading of media source is completed.
- * And ready for playback. Updates all the media status, state, settings etc.
- * And emits the signals.
-*/
-
void S60MediaPlayerSession::loaded()
{
TRACE("S60MediaPlayerSession::loaded" << qtThisPtr());
-
stopStalledTimer();
if (m_error == KErrNone || m_error == KErrMMPartialPlayback) {
setMediaStatus(QMediaPlayer::LoadedMedia);
@@ -594,86 +446,51 @@ void S60MediaPlayerSession::loaded()
emit videoAvailableChanged(isVideoAvailable());
emit audioAvailableChanged(isAudioAvailable());
emit mediaChanged();
-
m_seekable = getIsSeekable();
}
}
-/*!
- * Playback is completed as medai source reached end of media.
-*/
void S60MediaPlayerSession::endOfMedia()
{
TRACE("S60MediaPlayerSession::endOfMedia" << qtThisPtr());
-
+ stopProgressTimer();
m_state = QMediaPlayer::StoppedState;
setMediaStatus(QMediaPlayer::EndOfMedia);
- //there is a chance that user might have called play from EOF callback
- //if we are already in playing state, do not send state change callback
+ // There is a chance that user might have called play from EOF callback.
+ // If we are already in playing state, do not send state change callback.
emit positionChanged(m_duration);
- if(m_state == QMediaPlayer::StoppedState)
+ if (m_state == QMediaPlayer::StoppedState)
emit stateChanged(QMediaPlayer::StoppedState);
}
-/*!
- * The percentage of the temporary buffer filling before playback begins.
-
- When the player object is buffering; this property holds the percentage of
- the temporary buffer that is filled. The buffer will need to reach 100%
- filled before playback can resume, at which time the MediaStatus will be
- BufferedMedia.
-
- \sa mediaStatus()
-*/
-
void S60MediaPlayerSession::buffering()
{
TRACE("S60MediaPlayerSession::buffering" << qtThisPtr());
-
startStalledTimer();
setMediaStatus(QMediaPlayer::BufferingMedia);
-
-//Buffering cannot happen in stopped state. Hence update the state
+ // Buffering cannot happen in stopped state. Hence update the state
if (state() == QMediaPlayer::StoppedState)
setState(QMediaPlayer::PausedState);
}
-/*!
- * Buffer is filled with data and to for continuing/start playback.
-*/
-
void S60MediaPlayerSession::buffered()
{
TRACE("S60MediaPlayerSession::buffered" << qtThisPtr());
-
stopStalledTimer();
setMediaStatus(QMediaPlayer::BufferedMedia);
}
-/*!
- * Sets media status as stalled as waiting for the buffer to be filled to start playback.
-*/
-
void S60MediaPlayerSession::stalled()
{
TRACE("S60MediaPlayerSession::stalled" << qtThisPtr());
-
setMediaStatus(QMediaPlayer::StalledMedia);
}
-/*!
- * \return all the meta data entries in the current media source.
-*/
-
-QMap<QString, QVariant>& S60MediaPlayerSession::metaDataEntries()
+QMap<QString, QVariant> &S60MediaPlayerSession::metaDataEntries()
{
return m_metaDataMap;
}
-/*!
- * \return Error by converting Symbian specific error to Multimedia error.
-*/
-
QMediaPlayer::Error S60MediaPlayerSession::fromSymbianErrorToMultimediaError(int error)
{
switch(error) {
@@ -736,24 +553,14 @@ QMediaPlayer::Error S60MediaPlayerSession::fromSymbianErrorToMultimediaError(int
}
}
-/*!
- * \return error.
- */
-
int S60MediaPlayerSession::error() const
{
return m_error;
}
-/*!
- * Sets the error.
- * * If playback complete/prepare complete ..., etc with successful then sets error as ZERO
- * else Multimedia error.
-*/
-
void S60MediaPlayerSession::setError(int error, const QString &errorString, bool forceReset)
{
- if( forceReset ) {
+ if (forceReset) {
TRACE("S60MediaPlayerSession::setError" << qtThisPtr() << "forceReset");
m_error = KErrNone;
emit this->error(QMediaPlayer::NoError, QString());
@@ -800,142 +607,35 @@ void S60MediaPlayerSession::setAndEmitError(int error)
emit this->error(rateError, symbianError);
}
-/*!
- * emits the signal if there is a changes in position and buffering status.
- */
-
void S60MediaPlayerSession::tick()
{
m_progressduration = position();
emit positionChanged(m_progressduration);
-
if (bufferStatus() < 100)
emit bufferStatusChanged(bufferStatus());
}
-/*!
- * Starts the timer once the media source starts buffering.
-*/
-
void S60MediaPlayerSession::startProgressTimer()
{
TRACE("S60MediaPlayerSession::startProgressTimer" << qtThisPtr());
-
m_progressTimer->start(500);
}
-/*!
- * Stops the timer once the media source finished buffering.
-*/
-
void S60MediaPlayerSession::stopProgressTimer()
{
TRACE("S60MediaPlayerSession::stopProgressTimer" << qtThisPtr());
-
m_progressduration = 0;
m_progressTimer->stop();
}
-/*!
- * Starts the timer while waiting for some events to happen like source buffering or call backs etc.
- * So that if the events doesn't occur before stalled timer stops, it'll set the error/media status etc.
-*/
-
void S60MediaPlayerSession::startStalledTimer()
{
TRACE("S60MediaPlayerSession::startStalledTimer" << qtThisPtr());
-
m_stalledTimer->start(30000);
}
-/*!
- * Stops the timer when some events occurred while waiting for them.
- * media source started buffering or call back is received etc.
-*/
-
void S60MediaPlayerSession::stopStalledTimer()
{
TRACE("S60MediaPlayerSession::stopStalledTimer" << qtThisPtr());
-
m_stalledTimer->stop();
}
-
-/*!
- * \return Converted Symbian specific Descriptor to QString.
-*/
-
-QString S60MediaPlayerSession::TDesC2QString(const TDesC& aDescriptor)
-{
- return QString::fromUtf16(aDescriptor.Ptr(), aDescriptor.Length());
-}
-
-/*!
- * \return Converted QString to non-modifiable pointer Descriptor.
-*/
-
-TPtrC S60MediaPlayerSession::QString2TPtrC( const QString& string )
-{
- // Returned TPtrC is valid as long as the given parameter is valid and unmodified
- return TPtrC16(static_cast<const TUint16*>(string.utf16()), string.length());
-}
-
-/*!
- * \return Converted Symbian TRect object to QRect object.
-*/
-
-QRect S60MediaPlayerSession::TRect2QRect(const TRect& tr)
-{
- return QRect(tr.iTl.iX, tr.iTl.iY, tr.Width(), tr.Height());
-}
-
-/*!
- * \return converted QRect object to Symbian specific TRec object.
- */
-
-TRect S60MediaPlayerSession::QRect2TRect(const QRect& qr)
-{
- return TRect(TPoint(qr.left(), qr.top()), TSize(qr.width(), qr.height()));
-}
-
-/*!
- \fn bool S60MediaPlayerSession::isVideoAvailable();
-
-
- Returns TRUE if Video is available.
-*/
-
-/*!
- \fn bool S60MediaPlayerSession::isAudioAvailable();
-
-
- Returns TRUE if Audio is available.
-*/
-
-/*!
- \fn void S60MediaPlayerSession::setPlaybackRate (qreal rate);
-
-
- Sets \a rate play back rate on media source. getIsSeekable
-*/
-
-/*!
- \fn bool S60MediaPlayerSession::getIsSeekable () const;
-
-
- \return TRUE if Seekable possible on current media source else FALSE.
-*/
-
-/*!
- \fn QString S60MediaPlayerSession::activeEndpoint () const;
-
-
- \return active end point name..
-*/
-
-/*!
- \fn QString S60MediaPlayerSession::defaultEndpoint () const;
-
-
- \return default end point name.
-*/
-