Skip to content

Commit 79f20ff

Browse files
author
Qt Continuous Integration System
committed
Merge branch '4.6' of scm.dev.nokia.troll.no:qt/qt-s60-public into 4.6-integration
* '4.6' of scm.dev.nokia.troll.no:qt/qt-s60-public: Added qmake check for presence of RHttpDownloadMgr header qmediaplayer: show buffer status of 0% Progressive download in Phonon MMF backend: integrated with player Progressive download in Phonon MMF backend: added download managers
2 parents 46822d7 + 71af72b commit 79f20ff

12 files changed

+572
-64
lines changed

demos/qmediaplayer/mediaplayer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -716,7 +716,7 @@ void MediaPlayer::openFile()
716716

717717
void MediaPlayer::bufferStatus(int percent)
718718
{
719-
if (percent == 0 || percent == 100)
719+
if (percent == 100)
720720
progressLabel->setText(QString());
721721
else {
722722
QString str = QString::fromLatin1("(%1%)").arg(percent);

src/3rdparty/phonon/mmf/abstractmediaplayer.cpp

Lines changed: 155 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,15 @@ MMF::AbstractMediaPlayer::AbstractMediaPlayer
5151
, m_parent(parent)
5252
, m_pending(NothingPending)
5353
, m_positionTimer(new QTimer(this))
54+
, m_position(0)
5455
, m_bufferStatusTimer(new QTimer(this))
5556
, m_mmfMaxVolume(NullMaxVolume)
5657
, m_prefinishMarkSent(false)
5758
, m_aboutToFinishSent(false)
59+
#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
60+
, m_download(0)
61+
, m_downloadStalled(false)
62+
#endif
5863
{
5964
connect(m_positionTimer.data(), SIGNAL(timeout()), this, SLOT(positionTick()));
6065
connect(m_bufferStatusTimer.data(), SIGNAL(timeout()), this, SLOT(bufferStatusTick()));
@@ -183,6 +188,7 @@ void MMF::AbstractMediaPlayer::seek(qint64 ms)
183188
}
184189

185190
doSeek(ms);
191+
m_position = ms;
186192
resetMarksIfRewound();
187193

188194
if(wasPlaying && state() != ErrorState) {
@@ -207,6 +213,11 @@ bool MMF::AbstractMediaPlayer::isSeekable() const
207213
return true;
208214
}
209215

216+
qint64 MMF::AbstractMediaPlayer::currentTime() const
217+
{
218+
return m_position;
219+
}
220+
210221
void MMF::AbstractMediaPlayer::doSetTickInterval(qint32 interval)
211222
{
212223
TRACE_CONTEXT(AbstractMediaPlayer::doSetTickInterval, EAudioApi);
@@ -247,7 +258,19 @@ void MMF::AbstractMediaPlayer::open()
247258
symbianErr = openFile(*file);
248259
if (KErrNone != symbianErr)
249260
errorMessage = tr("Error opening file");
250-
} else {
261+
}
262+
#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
263+
else if (url.scheme() == QLatin1String("http")) {
264+
Q_ASSERT(!m_download);
265+
m_download = new Download(url, this);
266+
connect(m_download, SIGNAL(lengthChanged(qint64)),
267+
this, SLOT(downloadLengthChanged(qint64)));
268+
connect(m_download, SIGNAL(stateChanged(Download::State)),
269+
this, SLOT(downloadStateChanged(Download::State)));
270+
m_download->start();
271+
}
272+
#endif
273+
else {
251274
symbianErr = openUrl(url.toString());
252275
if (KErrNone != symbianErr)
253276
errorMessage = tr("Error opening URL");
@@ -288,6 +311,16 @@ void MMF::AbstractMediaPlayer::open()
288311
TRACE_EXIT_0();
289312
}
290313

314+
void MMF::AbstractMediaPlayer::close()
315+
{
316+
doClose();
317+
#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
318+
delete m_download;
319+
m_download = 0;
320+
#endif
321+
m_position = 0;
322+
}
323+
291324
void MMF::AbstractMediaPlayer::volumeChanged(qreal volume)
292325
{
293326
TRACE_CONTEXT(AbstractMediaPlayer::volumeChanged, EAudioInternal);
@@ -374,7 +407,8 @@ void MMF::AbstractMediaPlayer::bufferingComplete()
374407
{
375408
stopBufferStatusTimer();
376409
emit MMF::AbstractPlayer::bufferStatus(100);
377-
changeState(m_stateBeforeBuffering);
410+
if (!progressiveDownloadStalled())
411+
changeState(m_stateBeforeBuffering);
378412
}
379413

380414
void MMF::AbstractMediaPlayer::maxVolumeChanged(int mmfMaxVolume)
@@ -385,13 +419,30 @@ void MMF::AbstractMediaPlayer::maxVolumeChanged(int mmfMaxVolume)
385419

386420
void MMF::AbstractMediaPlayer::loadingComplete(int error)
387421
{
388-
Q_ASSERT(Phonon::LoadingState == state());
389-
390-
if (KErrNone == error) {
391-
updateMetaData();
392-
changeState(StoppedState);
422+
TRACE_CONTEXT(AbstractMediaPlayer::loadingComplete, EAudioApi);
423+
TRACE_ENTRY("state %d error %d", state(), error);
424+
if (progressiveDownloadStalled()) {
425+
Q_ASSERT(Phonon::BufferingState == state());
426+
if (KErrNone == error) {
427+
bufferingComplete();
428+
doSeek(m_position);
429+
startPlayback();
430+
#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
431+
m_downloadStalled = false;
432+
#endif
433+
}
393434
} else {
394-
setError(tr("Loading clip failed"), error);
435+
Q_ASSERT(Phonon::LoadingState == state());
436+
if (KErrNone == error) {
437+
updateMetaData();
438+
changeState(StoppedState);
439+
} else {
440+
if (isProgressiveDownload() && KErrCorrupt == error) {
441+
setProgressiveDownloadStalled();
442+
} else {
443+
setError(tr("Loading clip failed"), error);
444+
}
445+
}
395446
}
396447
}
397448

@@ -415,8 +466,12 @@ void MMF::AbstractMediaPlayer::playbackComplete(int error)
415466
QMetaObject::invokeMethod(m_parent, "switchToNextSource", Qt::QueuedConnection);
416467
}
417468
else {
418-
setError(tr("Playback complete"), error);
419-
emit finished();
469+
if (isProgressiveDownload() && KErrCorrupt == error) {
470+
setProgressiveDownloadStalled();
471+
} else {
472+
setError(tr("Playback complete"), error);
473+
emit finished();
474+
}
420475
}
421476
}
422477

@@ -425,15 +480,36 @@ qint64 MMF::AbstractMediaPlayer::toMilliSeconds(const TTimeIntervalMicroSeconds
425480
return in.Int64() / 1000;
426481
}
427482

483+
bool MMF::AbstractMediaPlayer::isProgressiveDownload() const
484+
{
485+
#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
486+
return (0 != m_download);
487+
#else
488+
return false;
489+
#endif
490+
}
491+
492+
bool MMF::AbstractMediaPlayer::progressiveDownloadStalled() const
493+
{
494+
#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
495+
return m_downloadStalled;
496+
#else
497+
return false;
498+
#endif
499+
}
500+
428501
//-----------------------------------------------------------------------------
429502
// Slots
430503
//-----------------------------------------------------------------------------
431504

432505
void MMF::AbstractMediaPlayer::positionTick()
433506
{
434-
const qint64 current = currentTime();
435-
emitMarksIfReached(current);
436-
emit MMF::AbstractPlayer::tick(current);
507+
const qint64 pos = getCurrentTime();
508+
if (pos > m_position) {
509+
m_position = pos;
510+
emitMarksIfReached(m_position);
511+
emit MMF::AbstractPlayer::tick(m_position);
512+
}
437513
}
438514

439515
void MMF::AbstractMediaPlayer::emitMarksIfReached(qint64 current)
@@ -458,7 +534,7 @@ void MMF::AbstractMediaPlayer::emitMarksIfReached(qint64 current)
458534

459535
void MMF::AbstractMediaPlayer::resetMarksIfRewound()
460536
{
461-
const qint64 current = currentTime();
537+
const qint64 current = getCurrentTime();
462538
const qint64 total = totalTime();
463539
const qint64 remaining = total - current;
464540

@@ -487,10 +563,74 @@ void MMF::AbstractMediaPlayer::startPlayback()
487563
changeState(PlayingState);
488564
}
489565

566+
void MMF::AbstractMediaPlayer::setProgressiveDownloadStalled()
567+
{
568+
#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
569+
TRACE_CONTEXT(AbstractMediaPlayer::setProgressiveDownloadStalled, EAudioApi);
570+
TRACE_ENTRY("state %d", state());
571+
Q_ASSERT(isProgressiveDownload());
572+
m_downloadStalled = true;
573+
doClose();
574+
bufferingStarted();
575+
// Video player loses window handle when closed - need to reapply it here
576+
videoOutputChanged();
577+
m_download->resume();
578+
#endif
579+
}
580+
490581
void MMF::AbstractMediaPlayer::bufferStatusTick()
491582
{
492-
emit MMF::AbstractPlayer::bufferStatus(bufferStatus());
583+
// During progressive download, there is no way to detect the buffering status.
584+
// Phonon does not support a "buffering; amount unknown" signal, therefore we
585+
// return a buffering status of zero.
586+
const int status = progressiveDownloadStalled() ? 0 : bufferStatus();
587+
emit MMF::AbstractPlayer::bufferStatus(status);
588+
}
589+
590+
#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
591+
void MMF::AbstractMediaPlayer::downloadLengthChanged(qint64 length)
592+
{
593+
TRACE_CONTEXT(AbstractMediaPlayer::downloadLengthChanged, EAudioApi);
594+
TRACE_ENTRY("length %Ld", length);
595+
Q_UNUSED(length)
596+
if (m_downloadStalled) {
597+
bufferingComplete();
598+
int err = m_parent->openFileHandle(m_download->targetFileName());
599+
if (KErrNone == err)
600+
err = openFile(*m_parent->file());
601+
if (KErrNone != err)
602+
setError(tr("Error opening file"));
603+
}
604+
}
605+
606+
void MMF::AbstractMediaPlayer::downloadStateChanged(Download::State state)
607+
{
608+
TRACE_CONTEXT(AbstractMediaPlayer::downloadStateChanged, EAudioApi);
609+
TRACE_ENTRY("state %d", state);
610+
switch (state) {
611+
case Download::Idle:
612+
case Download::Initializing:
613+
break;
614+
case Download::Downloading:
615+
{
616+
int err = m_parent->openFileHandle(m_download->targetFileName());
617+
if (KErrNone == err)
618+
err = openFile(*m_parent->file());
619+
else if (KErrCorrupt == err)
620+
// Insufficient data downloaded - enter Buffering state
621+
setProgressiveDownloadStalled();
622+
if (KErrNone != err)
623+
setError(tr("Error opening file"));
624+
}
625+
break;
626+
case Download::Complete:
627+
break;
628+
case Download::Error:
629+
setError(tr("Download error"));
630+
break;
631+
}
493632
}
633+
#endif // PHONON_MMF_PROGRESSIVE_DOWNLOAD
494634

495635
Phonon::State MMF::AbstractMediaPlayer::phononState(PrivateState state) const
496636
{

src/3rdparty/phonon/mmf/abstractmediaplayer.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ along with this library. If not, see <http://www.gnu.org/licenses/>.
2323
#include <QScopedPointer>
2424
#include <e32std.h>
2525
#include "abstractplayer.h"
26+
#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
27+
# include "download.h"
28+
#endif
2629

2730
class RFile;
2831

@@ -48,13 +51,15 @@ class AbstractMediaPlayer : public AbstractPlayer
4851

4952
public:
5053
virtual void open();
54+
virtual void close();
5155

5256
// MediaObjectInterface
5357
virtual void play();
5458
virtual void pause();
5559
virtual void stop();
5660
virtual void seek(qint64 milliseconds);
5761
virtual bool isSeekable() const;
62+
virtual qint64 currentTime() const;
5863
virtual void volumeChanged(qreal volume);
5964

6065
protected:
@@ -68,12 +73,15 @@ class AbstractMediaPlayer : public AbstractPlayer
6873
virtual void doStop() = 0;
6974
virtual void doSeek(qint64 pos) = 0;
7075
virtual int setDeviceVolume(int mmfVolume) = 0;
76+
virtual int openFile(const QString &fileName) = 0;
7177
virtual int openFile(RFile& file) = 0;
7278
virtual int openUrl(const QString& url) = 0;
7379
virtual int openDescriptor(const TDesC8 &des) = 0;
7480
virtual int bufferStatus() const = 0;
81+
virtual void doClose() = 0;
7582

7683
void updateMetaData();
84+
virtual qint64 getCurrentTime() const = 0;
7785
virtual int numberOfMetaDataEntries() const = 0;
7886
virtual QPair<QString, QString> metaDataEntry(int index) const = 0;
7987

@@ -86,6 +94,9 @@ class AbstractMediaPlayer : public AbstractPlayer
8694

8795
static qint64 toMilliSeconds(const TTimeIntervalMicroSeconds &);
8896

97+
bool isProgressiveDownload() const;
98+
bool progressiveDownloadStalled() const;
99+
89100
private:
90101
void startPositionTimer();
91102
void stopPositionTimer();
@@ -96,6 +107,7 @@ class AbstractMediaPlayer : public AbstractPlayer
96107
void emitMarksIfReached(qint64 position);
97108
void resetMarksIfRewound();
98109
void startPlayback();
110+
void setProgressiveDownloadStalled();
99111

100112
enum Pending {
101113
NothingPending,
@@ -108,13 +120,18 @@ class AbstractMediaPlayer : public AbstractPlayer
108120
private Q_SLOTS:
109121
void positionTick();
110122
void bufferStatusTick();
123+
#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
124+
void downloadLengthChanged(qint64);
125+
void downloadStateChanged(Download::State);
126+
#endif
111127

112128
private:
113129
MediaObject *const m_parent;
114130

115131
Pending m_pending;
116132

117133
QScopedPointer<QTimer> m_positionTimer;
134+
qint64 m_position;
118135

119136
QScopedPointer<QTimer> m_bufferStatusTimer;
120137
PrivateState m_stateBeforeBuffering;
@@ -127,6 +144,11 @@ private Q_SLOTS:
127144
// Used for playback of resource files
128145
TPtrC8 m_buffer;
129146

147+
#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
148+
Download *m_download;
149+
bool m_downloadStalled;
150+
#endif
151+
130152
QMultiMap<QString, QString> m_metaData;
131153

132154
};

0 commit comments

Comments
 (0)