Ignore:
Timestamp:
May 5, 2011, 5:36:53 AM (14 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

Location:
trunk
Files:
23 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/3rdparty/phonon/mmf/abstractaudioeffect.cpp

    r769 r846  
    185185{
    186186    // Default implementation
     187    Q_UNUSED(param)
     188    Q_UNUSED(value)
    187189    Q_ASSERT_X(false, Q_FUNC_INFO, "Effect has no parameters");
    188190    return 0;
  • trunk/src/3rdparty/phonon/mmf/abstractaudioeffect.h

    r769 r846  
    119119// in the implementations of the backend effect nodes.
    120120
     121#ifdef Q_CC_NOKIAX86
     122#   pragma warn_illtokenpasting off
     123#endif
     124
    121125#define PHONON_MMF_DEFINE_EFFECT_FUNCTIONS(Effect)                      \
    122126                                                                        \
  • trunk/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp

    r769 r846  
    1717*/
    1818
     19#include <QResource>
    1920#include <QUrl>
    2021
     
    2324#include "mediaobject.h"
    2425#include "utils.h"
     26#include <cdbcols.h>
     27#include <cdblen.h>
     28#include <commdb.h>
    2529
    2630QT_BEGIN_NAMESPACE
     
    5155        ,   m_pending(NothingPending)
    5256        ,   m_positionTimer(new QTimer(this))
     57        ,   m_position(0)
    5358        ,   m_bufferStatusTimer(new QTimer(this))
    5459        ,   m_mmfMaxVolume(NullMaxVolume)
    5560        ,   m_prefinishMarkSent(false)
    5661        ,   m_aboutToFinishSent(false)
     62#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
     63        ,   m_download(0)
     64        ,   m_downloadStalled(false)
     65#endif
    5766{
    5867    connect(m_positionTimer.data(), SIGNAL(timeout()), this, SLOT(positionTick()));
     
    183192
    184193        doSeek(ms);
     194        m_position = ms;
    185195        resetMarksIfRewound();
    186196
     
    207217}
    208218
     219qint64 MMF::AbstractMediaPlayer::currentTime() const
     220{
     221    return m_position;
     222}
     223
    209224void MMF::AbstractMediaPlayer::doSetTickInterval(qint32 interval)
    210225{
     
    217232}
    218233
    219 void MMF::AbstractMediaPlayer::open(const MediaSource &source, RFile& file)
    220 {
    221     TRACE_CONTEXT(AbstractMediaPlayer::setFileSource, EAudioApi);
     234void MMF::AbstractMediaPlayer::open()
     235{
     236    TRACE_CONTEXT(AbstractMediaPlayer::open, EAudioApi);
     237    const MediaSource source = m_parent->source();
    222238    TRACE_ENTRY("state %d source.type %d", privateState(), source.type());
    223239
     
    230246    switch (source.type()) {
    231247    case MediaSource::LocalFile: {
    232         symbianErr = openFile(file);
     248        RFile *const file = m_parent->file();
     249        Q_ASSERT(file);
     250        symbianErr = openFile(*file);
    233251        if (KErrNone != symbianErr)
    234252            errorMessage = tr("Error opening file");
     
    238256    case MediaSource::Url: {
    239257        const QUrl url(source.url());
    240 
    241258        if (url.scheme() == QLatin1String("file")) {
    242             symbianErr = openFile(file);
     259            RFile *const file = m_parent->file();
     260            Q_ASSERT(file);
     261            symbianErr = openFile(*file);
    243262            if (KErrNone != symbianErr)
    244263                errorMessage = tr("Error opening file");
    245         } else {
    246             symbianErr = openUrl(url.toString());
     264        }
     265#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
     266        else if (url.scheme() == QLatin1String("http")) {
     267            Q_ASSERT(!m_download);
     268            m_download = new Download(url, this);
     269            connect(m_download, SIGNAL(lengthChanged(qint64)),
     270                    this, SLOT(downloadLengthChanged(qint64)));
     271            connect(m_download, SIGNAL(stateChanged(Download::State)),
     272                    this, SLOT(downloadStateChanged(Download::State)));
     273            int iap = m_parent->currentIAP();
     274            TRACE("HTTP Url: Using IAP %d", iap);
     275            m_download->start(iap);
     276        }
     277#endif
     278        else {
     279            int iap = m_parent->currentIAP();
     280            TRACE("Using IAP %d", iap);
     281            symbianErr = openUrl(url.toString(), iap);
    247282            if (KErrNone != symbianErr)
    248283                errorMessage = tr("Error opening URL");
    249284        }
    250285
     286        break;
     287    }
     288
     289    case MediaSource::Stream: {
     290        QResource *const resource = m_parent->resource();
     291        if (resource) {
     292            m_buffer.Set(resource->data(), resource->size());
     293            symbianErr = openDescriptor(m_buffer);
     294            if (KErrNone != symbianErr)
     295                errorMessage = tr("Error opening resource");
     296        } else {
     297            errorMessage = tr("Error opening source: resource not opened");
     298        }
    251299        break;
    252300    }
     
    271319}
    272320
     321void MMF::AbstractMediaPlayer::close()
     322{
     323    doClose();
     324#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
     325    delete m_download;
     326    m_download = 0;
     327#endif
     328    m_position = 0;
     329}
     330
    273331void MMF::AbstractMediaPlayer::volumeChanged(qreal volume)
    274332{
     
    357415    stopBufferStatusTimer();
    358416    emit MMF::AbstractPlayer::bufferStatus(100);
    359     changeState(m_stateBeforeBuffering);
     417    if (!progressiveDownloadStalled())
     418        changeState(m_stateBeforeBuffering);
    360419}
    361420
     
    368427void MMF::AbstractMediaPlayer::loadingComplete(int error)
    369428{
    370     Q_ASSERT(Phonon::LoadingState == state());
    371 
    372     if (KErrNone == error) {
    373         updateMetaData();
    374         changeState(StoppedState);
     429    TRACE_CONTEXT(AbstractMediaPlayer::loadingComplete, EAudioApi);
     430    TRACE_ENTRY("state %d error %d", state(), error);
     431    if (progressiveDownloadStalled()) {
     432        Q_ASSERT(Phonon::BufferingState == state());
     433        if (KErrNone == error) {
     434            bufferingComplete();
     435            doSeek(m_position);
     436            startPlayback();
     437#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
     438            m_downloadStalled = false;
     439#endif
     440        }
    375441    } else {
    376         setError(tr("Loading clip failed"), error);
     442        Q_ASSERT(Phonon::LoadingState == state());
     443        if (KErrNone == error) {
     444            updateMetaData();
     445            changeState(StoppedState);
     446        } else {
     447            if (isProgressiveDownload() && KErrCorrupt == error) {
     448                setProgressiveDownloadStalled();
     449            } else {
     450                setError(tr("Loading clip failed"), error);
     451            }
     452        }
    377453    }
    378454}
     
    398474    }
    399475    else {
    400         setError(tr("Playback complete"), error);
    401         emit finished();
     476        if (isProgressiveDownload() && KErrCorrupt == error) {
     477            setProgressiveDownloadStalled();
     478        } else {
     479            setError(tr("Playback complete"), error);
     480            emit finished();
     481        }
    402482    }
    403483}
     
    408488}
    409489
     490bool MMF::AbstractMediaPlayer::isProgressiveDownload() const
     491{
     492#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
     493    return (0 != m_download);
     494#else
     495    return false;
     496#endif
     497}
     498
     499bool MMF::AbstractMediaPlayer::progressiveDownloadStalled() const
     500{
     501#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
     502    return m_downloadStalled;
     503#else
     504    return false;
     505#endif
     506}
     507
    410508//-----------------------------------------------------------------------------
    411509// Slots
     
    414512void MMF::AbstractMediaPlayer::positionTick()
    415513{
    416     const qint64 current = currentTime();
    417     emitMarksIfReached(current);
    418     emit MMF::AbstractPlayer::tick(current);
     514    const qint64 pos = getCurrentTime();
     515    if (pos > m_position) {
     516        m_position = pos;
     517        emitMarksIfReached(m_position);
     518        emit MMF::AbstractPlayer::tick(m_position);
     519    }
    419520}
    420521
     
    441542void MMF::AbstractMediaPlayer::resetMarksIfRewound()
    442543{
    443     const qint64 current = currentTime();
     544    const qint64 current = getCurrentTime();
    444545    const qint64 total = totalTime();
    445546    const qint64 remaining = total - current;
     
    470571}
    471572
     573void MMF::AbstractMediaPlayer::setProgressiveDownloadStalled()
     574{
     575#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
     576    TRACE_CONTEXT(AbstractMediaPlayer::setProgressiveDownloadStalled, EAudioApi);
     577    TRACE_ENTRY("state %d", state());
     578    Q_ASSERT(isProgressiveDownload());
     579    m_downloadStalled = true;
     580    doClose();
     581    bufferingStarted();
     582    // Video player loses window handle when closed - need to reapply it here
     583    videoOutputChanged();
     584    m_download->resume();
     585#endif
     586}
     587
    472588void MMF::AbstractMediaPlayer::bufferStatusTick()
    473589{
    474     emit MMF::AbstractPlayer::bufferStatus(bufferStatus());
    475 }
     590    // During progressive download, there is no way to detect the buffering status.
     591    // Phonon does not support a "buffering; amount unknown" signal, therefore we
     592    // return a buffering status of zero.
     593    const int status = progressiveDownloadStalled() ? 0 : bufferStatus();
     594    emit MMF::AbstractPlayer::bufferStatus(status);
     595}
     596
     597#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
     598void MMF::AbstractMediaPlayer::downloadLengthChanged(qint64 length)
     599{
     600    TRACE_CONTEXT(AbstractMediaPlayer::downloadLengthChanged, EAudioApi);
     601    TRACE_ENTRY("length %Ld", length);
     602    Q_UNUSED(length)
     603    if (m_downloadStalled) {
     604        bufferingComplete();
     605        int err = m_parent->openFileHandle(m_download->targetFileName());
     606        if (KErrNone == err)
     607            err = openFile(*m_parent->file());
     608        if (KErrNone != err)
     609            setError(tr("Error opening file"));
     610    }
     611}
     612
     613void MMF::AbstractMediaPlayer::downloadStateChanged(Download::State state)
     614{
     615    TRACE_CONTEXT(AbstractMediaPlayer::downloadStateChanged, EAudioApi);
     616    TRACE_ENTRY("state %d", state);
     617    switch (state) {
     618    case Download::Idle:
     619    case Download::Initializing:
     620        break;
     621    case Download::Downloading:
     622        {
     623        int err = m_parent->openFileHandle(m_download->targetFileName());
     624        if (KErrNone == err)
     625            err = openFile(*m_parent->file());
     626        else if (KErrCorrupt == err)
     627            // Insufficient data downloaded - enter Buffering state
     628            setProgressiveDownloadStalled();
     629        if (KErrNone != err)
     630            setError(tr("Error opening file"));
     631        }
     632        break;
     633    case Download::Complete:
     634        break;
     635    case Download::Error:
     636        setError(tr("Download error"));
     637        break;
     638    }
     639}
     640#endif // PHONON_MMF_PROGRESSIVE_DOWNLOAD
    476641
    477642Phonon::State MMF::AbstractMediaPlayer::phononState(PrivateState state) const
  • trunk/src/3rdparty/phonon/mmf/abstractmediaplayer.h

    r769 r846  
    2424#include <e32std.h>
    2525#include "abstractplayer.h"
     26#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
     27#   include "download.h"
     28#endif
    2629
    2730class RFile;
     
    4851
    4952public:
    50     virtual void open(const Phonon::MediaSource&, RFile&);
     53    virtual void open();
     54    virtual void close();
    5155
    5256    // MediaObjectInterface
     
    5660    virtual void seek(qint64 milliseconds);
    5761    virtual bool isSeekable() const;
     62    virtual qint64 currentTime() const;
    5863    virtual void volumeChanged(qreal volume);
    5964
     
    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;
    72     virtual int openUrl(const QString& url) = 0;
     78    virtual int openUrl(const QString& url, int iap) = 0;
     79    virtual int openDescriptor(const TDesC8 &des) = 0;
    7380    virtual int bufferStatus() const = 0;
    74     virtual void close() = 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;
     
    8795    static qint64 toMilliSeconds(const TTimeIntervalMicroSeconds &);
    8896
     97    bool isProgressiveDownload() const;
     98    bool progressiveDownloadStalled() const;
     99
    89100private:
    90101    void startPositionTimer();
     
    97108    void resetMarksIfRewound();
    98109    void startPlayback();
     110    void setProgressiveDownloadStalled();
    99111
    100112    enum Pending {
     
    109121    void positionTick();
    110122    void bufferStatusTick();
     123#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
     124    void downloadLengthChanged(qint64);
     125    void downloadStateChanged(Download::State);
     126#endif
    111127
    112128private:
     
    116132
    117133    QScopedPointer<QTimer>      m_positionTimer;
     134    qint64                      m_position;
    118135
    119136    QScopedPointer<QTimer>      m_bufferStatusTimer;
     
    124141    bool                        m_prefinishMarkSent;
    125142    bool                        m_aboutToFinishSent;
     143
     144    // Used for playback of resource files
     145    TPtrC8                      m_buffer;
     146
     147#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD
     148    Download                    *m_download;
     149    bool                        m_downloadStalled;
     150#endif
    126151
    127152    QMultiMap<QString, QString> m_metaData;
  • trunk/src/3rdparty/phonon/mmf/abstractplayer.h

    r769 r846  
    2727#include "abstractvideooutput.h"
    2828
    29 class RFile;
    30 
    3129QT_BEGIN_NAMESPACE
    3230
     
    5553    AbstractPlayer(const AbstractPlayer *player);
    5654
    57     virtual void open(const Phonon::MediaSource&, RFile&) = 0;
     55    virtual void open() = 0;
     56    virtual void close() = 0;
    5857
    5958    // MediaObjectInterface (implemented)
  • trunk/src/3rdparty/phonon/mmf/abstractvideooutput.cpp

    r769 r846  
    6161    ,   m_scaleMode(DefaultScaleMode)
    6262{
    63 
     63    // Ensure that this widget has a native window handle
     64    winId();
    6465}
    6566
     
    161162#ifndef QT_NO_DEBUG
    162163    TRACE_CONTEXT(AbstractVideoOutput::dump, EVideoInternal);
    163 
    164164    QScopedPointer<ObjectDump::QVisitor> visitor(new ObjectDump::QVisitor);
    165165    visitor->setPrefix("Phonon::MMF"); // to aid searchability of logs
    166166    ObjectDump::addDefaultAnnotators(*visitor);
    167 
    168     if (QWidget *window = QApplication::activeWindow()) {
    169         TRACE("Dumping from root window 0x%08x:", window);
    170         ObjectDump::dumpTreeFromLeaf(*window, *visitor);
    171     }
    172 
    173     TRACE("Dumping tree from leaf 0x%08x:", this);
    174167    ObjectDump::dumpTreeFromLeaf(*this, *visitor);
    175 
    176     QScopedPointer<ObjectDump::QDumper> dumper(new ObjectDump::QDumper);
    177     dumper->setPrefix("Phonon::MMF"); // to aid searchability of logs
    178     ObjectDump::addDefaultAnnotators(*dumper);
    179     TRACE_0("Dumping AbstractVideoOutput:");
    180     dumper->dumpObject(*this);
    181168#endif
    182169}
  • trunk/src/3rdparty/phonon/mmf/abstractvideoplayer.cpp

    r769 r846  
    1717*/
    1818
     19#include <QDir>
    1920#include <QUrl>
    2021#include <QTimer>
     
    6768    createPlayer();
    6869
     70    m_player->RegisterForVideoLoadingNotification(*this);
     71
    6972    TRACE_EXIT_0();
    7073}
     
    131134}
    132135
     136int MMF::AbstractVideoPlayer::openFile(const QString &fileName)
     137{
     138    const QHBufC nativeFileName(QDir::toNativeSeparators(fileName));
     139    TRAPD(err, m_player->OpenFileL(*nativeFileName));
     140    return err;
     141}
     142
    133143int MMF::AbstractVideoPlayer::openFile(RFile &file)
    134144{
     
    137147}
    138148
    139 int MMF::AbstractVideoPlayer::openUrl(const QString &url)
    140 {
    141     TRAPD(err, m_player->OpenUrlL(qt_QString2TPtrC(url)));
     149int MMF::AbstractVideoPlayer::openUrl(const QString &url, int iap)
     150{
     151    TRAPD(err, m_player->OpenUrlL(qt_QString2TPtrC(url), iap));
     152    return err;
     153}
     154
     155int MMF::AbstractVideoPlayer::openDescriptor(const TDesC8 &des)
     156{
     157    TRAPD(err, m_player->OpenDesL(des));
    142158    return err;
    143159}
     
    150166}
    151167
    152 void MMF::AbstractVideoPlayer::close()
     168void MMF::AbstractVideoPlayer::doClose()
    153169{
    154170    m_player->Close();
     
    160176}
    161177
    162 qint64 MMF::AbstractVideoPlayer::currentTime() const
    163 {
    164     TRACE_CONTEXT(AbstractVideoPlayer::currentTime, EVideoApi);
     178qint64 MMF::AbstractVideoPlayer::getCurrentTime() const
     179{
     180    TRACE_CONTEXT(AbstractVideoPlayer::getCurrentTime, EVideoApi);
    165181
    166182    TTimeIntervalMicroSeconds us;
     
    212228    TRACE_ENTRY("state %d aspectRatio %d", state());
    213229
    214     updateScaleFactors(m_videoOutput->videoWindowSize());
     230    if (m_videoOutput)
     231        updateScaleFactors(m_videoOutput->videoWindowSize());
    215232
    216233    TRACE_EXIT_0();
     
    222239    TRACE_ENTRY("state %d", state());
    223240
    224     updateScaleFactors(m_videoOutput->videoWindowSize());
     241    if (m_videoOutput)
     242        updateScaleFactors(m_videoOutput->videoWindowSize());
    225243
    226244    TRACE_EXIT_0();
     
    237255    TRACE_ENTRY("state %d error %d", state(), aError);
    238256
    239     __ASSERT_ALWAYS(LoadingState == state(), Utils::panic(InvalidStatePanic));
     257    __ASSERT_ALWAYS(LoadingState == state() ||
     258                    progressiveDownloadStalled() && BufferingState == state(),
     259                    Utils::panic(InvalidStatePanic));
    240260
    241261    if (KErrNone == aError)
     
    252272    TRACE_ENTRY("state %d error %d", state(), aError);
    253273
    254     __ASSERT_ALWAYS(LoadingState == state(), Utils::panic(InvalidStatePanic));
     274    __ASSERT_ALWAYS(LoadingState == state() ||
     275                    progressiveDownloadStalled() && BufferingState == state(),
     276                    Utils::panic(InvalidStatePanic));
    255277
    256278    TRAPD(err, getVideoClipParametersL(aError));
     
    358380void MMF::AbstractVideoPlayer::initVideoOutput()
    359381{
     382    Q_ASSERT(m_videoOutput);
     383
    360384    bool connected = connect(
    361385        m_videoOutput, SIGNAL(videoWindowChanged()),
     
    379403    Q_UNUSED(connected);
    380404
    381     // Do these after all connections are complete, to ensure
    382     // that any signals generated get to their destinations.
    383     m_videoOutput->winId();
    384405    m_videoOutput->setVideoSize(m_videoFrameSize);
    385406}
     
    401422void MMF::AbstractVideoPlayer::updateScaleFactors(const QSize &windowSize, bool apply)
    402423{
     424    Q_ASSERT(m_videoOutput);
     425
    403426    if (m_videoFrameSize.isValid()) {
    404427        QRect videoRect;
     
    460483void MMF::AbstractVideoPlayer::parametersChanged(VideoParameters parameters)
    461484{
    462     if (state() == LoadingState)
     485    if (state() == LoadingState || progressiveDownloadStalled() && BufferingState == state())
    463486        m_pendingChanges |= parameters;
    464487    else
  • trunk/src/3rdparty/phonon/mmf/abstractvideoplayer.h

    r769 r846  
    6565    virtual void doSeek(qint64 milliseconds);
    6666    virtual int setDeviceVolume(int mmfVolume);
     67    virtual int openFile(const QString &fileName);
    6768    virtual int openFile(RFile &file);
    68     virtual int openUrl(const QString &url);
     69    virtual int openUrl(const QString &url, int iap);
     70    virtual int openDescriptor(const TDesC8 &des);
    6971    virtual int bufferStatus() const;
    70     virtual void close();
     72    virtual void doClose();
    7173
    7274    // MediaObjectInterface
    7375    virtual bool hasVideo() const;
    74     virtual qint64 currentTime() const;
    7576    virtual qint64 totalTime() const;
    7677
     
    7980
    8081    // AbstractMediaPlayer
     82    virtual qint64 getCurrentTime() const;
    8183    virtual int numberOfMetaDataEntries() const;
    8284    virtual QPair<QString, QString> metaDataEntry(int index) const;
  • trunk/src/3rdparty/phonon/mmf/audiooutput.cpp

    r561 r846  
    7979    Q_ASSERT_X(index == AudioOutputDeviceID, Q_FUNC_INFO,
    8080               "We only support one output device, with id 0");
     81#ifdef QT_NO_DEBUG
     82    Q_UNUSED(index)
     83#endif
    8184    return true;
    8285}
  • trunk/src/3rdparty/phonon/mmf/audioplayer.cpp

    r769 r846  
    1717*/
    1818
     19#include <QDir>
    1920#include <QUrl>
    2021
     
    110111}
    111112
     113int MMF::AudioPlayer::openFile(const QString &fileName)
     114{
     115    const QHBufC nativeFileName(QDir::toNativeSeparators(fileName));
     116    TRAPD(err, m_player->OpenFileL(*nativeFileName));
     117    return err;
     118}
     119
    112120int MMF::AudioPlayer::openFile(RFile& file)
    113121{
     
    127135}
    128136
    129 int MMF::AudioPlayer::openUrl(const QString& /*url*/)
     137int MMF::AudioPlayer::openUrl(const QString& /*url*/, int /*iap*/)
    130138{
    131139    // Streaming playback is generally not supported by the implementation
     
    138146}
    139147
     148int MMF::AudioPlayer::openDescriptor(const TDesC8 &des)
     149{
     150    TRAPD(err, m_player->OpenDesL(des));
     151    return err;
     152}
     153
    140154int MMF::AudioPlayer::bufferStatus() const
    141155{
     
    145159}
    146160
    147 void MMF::AudioPlayer::close()
     161void MMF::AudioPlayer::doClose()
    148162{
    149163    m_player->Close();
     
    155169}
    156170
    157 qint64 MMF::AudioPlayer::currentTime() const
    158 {
    159     TRACE_CONTEXT(AudioPlayer::currentTime, EAudioApi);
     171qint64 MMF::AudioPlayer::getCurrentTime() const
     172{
     173    TRACE_CONTEXT(AudioPlayer::getCurrentTime, EAudioApi);
    160174
    161175    TTimeIntervalMicroSeconds us;
     
    198212    TRACE_ENTRY("state %d error %d", state(), aError);
    199213
    200     __ASSERT_ALWAYS(LoadingState == state(), Utils::panic(InvalidStatePanic));
     214    __ASSERT_ALWAYS(LoadingState == state() ||
     215                    progressiveDownloadStalled() && BufferingState == state(),
     216                    Utils::panic(InvalidStatePanic));
    201217
    202218    if (KErrNone == aError) {
  • trunk/src/3rdparty/phonon/mmf/audioplayer.h

    r561 r846  
    6666    virtual void doSeek(qint64 milliseconds);
    6767    virtual int setDeviceVolume(int mmfVolume);
     68    virtual int openFile(const QString &fileName);
    6869    virtual int openFile(RFile& file);
    69     virtual int openUrl(const QString& url);
     70    virtual int openUrl(const QString& url, int iap);
     71    virtual int openDescriptor(const TDesC8 &des);
    7072    virtual int bufferStatus() const;
    71     virtual void close();
     73    virtual void doClose();
    7274
    7375    // MediaObjectInterface
    7476    virtual bool hasVideo() const;
    75     virtual qint64 currentTime() const;
    7677    virtual qint64 totalTime() const;
    7778
    7879    // AbstractMediaPlayer
     80    virtual qint64 getCurrentTime() const;
    7981    virtual int numberOfMetaDataEntries() const;
    8082    virtual QPair<QString, QString> metaDataEntry(int index) const;
  • trunk/src/3rdparty/phonon/mmf/bassboost.cpp

    r651 r846  
    5050    QList<EffectParameter> &parameters)
    5151{
     52    Q_UNUSED(parameters)
    5253    QScopedPointer<CBassBoost> effect;
    5354    TRAPD(err, effect.reset(CBassBoost::NewL(*stream)));
  • trunk/src/3rdparty/phonon/mmf/dummyplayer.cpp

    r561 r846  
    9393}
    9494
    95 void MMF::DummyPlayer::open(const Phonon::MediaSource &, RFile &)
     95void MMF::DummyPlayer::open()
    9696{
    9797
    9898}
    9999
     100void MMF::DummyPlayer::close()
     101{
     102
     103}
    100104
    101105//-----------------------------------------------------------------------------
  • trunk/src/3rdparty/phonon/mmf/dummyplayer.h

    r561 r846  
    5858
    5959    // AbstractPlayer
    60     virtual void open(const Phonon::MediaSource&, RFile&);
     60    virtual void open();
     61    virtual void close();
    6162    virtual void doSetTickInterval(qint32 interval);
    6263};
  • trunk/src/3rdparty/phonon/mmf/effectfactory.cpp

    r651 r846  
    184184    data.m_parameters.append(param);
    185185
    186     if (data.m_supported = BackendNode::getParameters
    187             (stream.data(), data.m_parameters)) {
     186    data.m_supported = BackendNode::getParameters(stream.data(),
     187                                                  data.m_parameters);
     188    if (data.m_supported) {
    188189        const QString description = QCoreApplication::translate
    189190            ("Phonon::MMF::EffectFactory", BackendNode::description());
  • trunk/src/3rdparty/phonon/mmf/loudness.cpp

    r651 r846  
    5050    QList<EffectParameter> &parameters)
    5151{
     52    Q_UNUSED(parameters)
    5253    QScopedPointer<CLoudness> effect;
    5354    TRAPD(err, effect.reset(CLoudness::NewL(*stream)));
  • trunk/src/3rdparty/phonon/mmf/mediaobject.cpp

    r769 r846  
    3535
    3636#include <QDir>
     37#include <QResource>
    3738#include <QUrl>
     39#include <cdbcols.h>
     40#include <cdblen.h>
     41#include <commdb.h>
     42#include <mmf/common/mmfcontrollerframeworkbase.h>
    3843
    3944QT_BEGIN_NAMESPACE
     
    5358                                               , m_recognizerOpened(false)
    5459                                               , m_nextSourceSet(false)
     60                                               , m_file(0)
     61                                               , m_resource(0)
    5562{
    5663    m_player.reset(new DummyPlayer());
     
    5966    TRACE_ENTRY_0();
    6067
    61     Q_UNUSED(parent);
     68    const int err = m_fileServer.Connect();
     69    QT_TRAP_THROWING(User::LeaveIfError(err));
     70
     71    parent->installEventFilter(this);
     72    m_iap = KUseDefaultIap;
    6273
    6374    TRACE_EXIT_0();
     
    6980    TRACE_ENTRY_0();
    7081
    71     m_file.Close();
     82    parent()->removeEventFilter(this);
     83    delete m_resource;
     84
     85    if (m_file)
     86        m_file->Close();
     87    delete m_file;
     88
    7289    m_fileServer.Close();
    7390    m_recognizer.Close();
     
    89106        if (KErrNone != err) {
    90107            TRACE("RApaLsSession::Connect error %d", err);
    91             return false;
    92         }
    93 
    94         err = m_fileServer.Connect();
    95         if (KErrNone != err) {
    96             TRACE("RFs::Connect error %d", err);
    97108            return false;
    98109        }
     
    120131
    121132    if (openRecognizer()) {
    122 
    123         const QHBufC fileNameSymbian(QDir::toNativeSeparators(fileName));
    124 
    125         m_file.Close();
    126         TInt err = m_file.Open(m_fileServer, *fileNameSymbian, EFileRead | EFileShareReadersOnly);
    127 
     133        TInt err = openFileHandle(fileName);
     134        const QHBufC nativeFileName(QDir::toNativeSeparators(fileName));
    128135        if (KErrNone == err) {
    129136            TDataRecognitionResult recognizerResult;
    130             err = m_recognizer.RecognizeData(m_file, recognizerResult);
     137            err = m_recognizer.RecognizeData(*m_file, recognizerResult);
    131138            if (KErrNone == err) {
    132139                const TPtrC mimeType = recognizerResult.iDataType.Des();
    133140                result = Utils::mimeTypeToMediaType(mimeType);
    134141            } else {
    135                 TRACE("RApaLsSession::RecognizeData filename %S error %d", fileNameSymbian.data(), err);
     142                TRACE("RApaLsSession::RecognizeData filename %S error %d", nativeFileName.data(), err);
    136143            }
    137144        } else {
    138             TRACE("RFile::Open filename %S error %d", fileNameSymbian.data(), err);
     145            TRACE("RFile::Open filename %S error %d", nativeFileName.data(), err);
    139146        }
    140147    }
     
    143150}
    144151
     152int MMF::MediaObject::openFileHandle(const QString &fileName)
     153{
     154    TRACE_CONTEXT(MediaObject::openFileHandle, EAudioInternal);
     155    const QHBufC nativeFileName(QDir::toNativeSeparators(fileName));
     156    TRACE_ENTRY("filename %S", nativeFileName.data());
     157    if (m_file)
     158        m_file->Close();
     159    delete m_file;
     160    m_file = 0;
     161    m_file = new RFile;
     162    TInt err = m_file->Open(m_fileServer, *nativeFileName, EFileRead | EFileShareReadersOrWriters);
     163    return err;
     164}
     165
     166MMF::MediaType MMF::MediaObject::bufferMediaType(const uchar *data, qint64 size)
     167{
     168    TRACE_CONTEXT(MediaObject::bufferMediaType, EAudioInternal);
     169    MediaType result = MediaTypeUnknown;
     170    if (openRecognizer()) {
     171        TDataRecognitionResult recognizerResult;
     172        const TPtrC8 des(data, size);
     173        const TInt err = m_recognizer.RecognizeData(KNullDesC, des, recognizerResult);
     174        if (KErrNone == err) {
     175            const TPtrC mimeType = recognizerResult.iDataType.Des();
     176            result = Utils::mimeTypeToMediaType(mimeType);
     177        } else {
     178            TRACE("RApaLsSession::RecognizeData error %d", err);
     179        }
     180    }
     181    return result;
     182}
    145183
    146184//-----------------------------------------------------------------------------
     
    229267void MMF::MediaObject::switchToSource(const MediaSource &source)
    230268{
     269    if (m_file)
     270        m_file->Close();
     271    delete m_file;
     272    m_file = 0;
     273
     274    delete m_resource;
     275    m_resource = 0;
     276
    231277    createPlayer(source);
    232278    m_source = source;
    233     m_player->open(m_source, m_file);
     279    m_player->open();
    234280    emit currentSourceChanged(m_source);
    235281}
     
    273319    case MediaSource::Invalid:
    274320    case MediaSource::Disc:
     321        errorMessage = tr("Error opening source: type not supported");
     322        break;
     323
    275324    case MediaSource::Stream:
    276         errorMessage = tr("Error opening source: type not supported");
     325        {
     326            const QString fileName = source.url().toLocalFile();
     327            if (fileName.startsWith(QLatin1String(":/")) || fileName.startsWith(QLatin1String("qrc://"))) {
     328                Q_ASSERT(!m_resource);
     329                m_resource = new QResource(fileName);
     330                if (m_resource->isValid()) {
     331                    if (m_resource->isCompressed())
     332                        errorMessage = tr("Error opening source: resource is compressed");
     333                    else
     334                        mediaType = bufferMediaType(m_resource->data(), m_resource->size());
     335                } else {
     336                    errorMessage = tr("Error opening source: resource not valid");
     337                }
     338            } else {
     339                errorMessage = tr("Error opening source: type not supported");
     340            }
     341        }
    277342        break;
    278343
     
    281346        break;
    282347    }
     348
     349    if (oldPlayer)
     350        oldPlayer->close();
    283351
    284352    AbstractPlayer* newPlayer = 0;
     
    372440}
    373441
     442RFile* MMF::MediaObject::file() const
     443{
     444    return m_file;
     445}
     446
     447QResource* MMF::MediaObject::resource() const
     448{
     449    return m_resource;
     450}
     451
    374452//-----------------------------------------------------------------------------
    375453// MediaNode
     
    422500
    423501//-----------------------------------------------------------------------------
     502// IAP support
     503//-----------------------------------------------------------------------------
     504
     505int MMF::MediaObject::currentIAP() const
     506{
     507    return m_iap;
     508}
     509
     510bool MMF::MediaObject::eventFilter(QObject *watched, QEvent *event)
     511{
     512    if (event->type() == QEvent::DynamicPropertyChange ) {
     513        QDynamicPropertyChangeEvent* dynamicEvent = static_cast<QDynamicPropertyChangeEvent*>(event);
     514        if (dynamicEvent->propertyName() == "InternetAccessPointName") {
     515            QVariant value = watched->property("InternetAccessPointName");
     516            if (value.isValid()) {
     517                QString iapName = value.toString();
     518                TRAPD(err, setIAPIdFromNameL(iapName));
     519                if (err)
     520                    m_player->setError(tr("Failed to set requested IAP"), err);
     521            }
     522        }
     523    }
     524    return false;
     525}
     526
     527void MMF::MediaObject::setIAPIdFromNameL(const QString& iapString)
     528{
     529    TRACE_CONTEXT(MediaObject::getIapIdFromName, EVideoInternal);
     530    TBuf<KCommsDbSvrMaxColumnNameLength> iapDes = qt_QString2TPtrC(iapString);
     531    CCommsDatabase *commsDb = CCommsDatabase::NewL(EDatabaseTypeIAP);
     532    CleanupStack::PushL(commsDb);
     533    commsDb->ShowHiddenRecords();
     534    CCommsDbTableView *view = commsDb->OpenTableLC(TPtrC(IAP));
     535    for (TInt l = view->GotoFirstRecord(); l != KErrNotFound; l = view->GotoNextRecord()) {
     536        TBuf<KCommsDbSvrMaxColumnNameLength> iapName;
     537        view->ReadTextL(TPtrC(COMMDB_NAME), iapName);
     538        TRACE("found IAP %S", &iapName);
     539        if (iapName.CompareF(iapDes) == 0) {
     540            TUint32 uiap;
     541            view->ReadUintL(TPtrC(COMMDB_ID), uiap);
     542            TRACE("matched IAP %S, setting m_iap %d", &iapName, uiap);
     543            m_iap = uiap;
     544            break;
     545        }
     546    }
     547    CleanupStack::PopAndDestroy(2); // commsDb, view
     548}
     549
     550//-----------------------------------------------------------------------------
    424551// Other private functions
    425552//-----------------------------------------------------------------------------
  • trunk/src/3rdparty/phonon/mmf/mediaobject.h

    r769 r846  
    2424#include <QScopedPointer>
    2525#include <QTimer>
     26#include <QString>
    2627
    2728// For recognizer
     
    3334
    3435QT_BEGIN_NAMESPACE
     36
     37class QResource;
    3538
    3639namespace Phonon
     
    8891    void setVideoOutput(AbstractVideoOutput* videoOutput);
    8992
     93    int openFileHandle(const QString &fileName);
     94    RFile* file() const;
     95    QResource* resource() const;
     96    int currentIAP() const;
     97
    9098public Q_SLOTS:
    9199    void volumeChanged(qreal volume);
     
    108116    void tick(qint64 time);
    109117
     118protected:
     119    bool eventFilter(QObject *watched, QEvent *event);
     120
    110121private Q_SLOTS:
    111122    void handlePrefinishMarkReached(qint32);
     
    115126    void createPlayer(const MediaSource &source);
    116127    bool openRecognizer();
     128    void setIAPIdFromNameL(const QString& iapString);
    117129
    118130    // Audio / video media type recognition
    119131    MediaType fileMediaType(const QString& fileName);
     132    MediaType bufferMediaType(const uchar *data, qint64 size);
    120133    // TODO: urlMediaType function
    121134
     
    133146    bool                                m_nextSourceSet;
    134147
    135     // Storing the file handle here to work around KErrInUse error
    136     // from MMF player utility OpenFileL functions
    137     RFile                               m_file;
     148    RFile*                              m_file;
     149    QResource*                          m_resource;
    138150
    139151    QScopedPointer<AbstractPlayer>      m_player;
     152    int                                 m_iap;
    140153
    141154};
  • trunk/src/3rdparty/phonon/mmf/videoplayer_dsa.cpp

    r769 r846  
    6262void MMF::DsaVideoPlayer::videoWindowScreenRectChanged()
    6363{
     64    Q_ASSERT(m_videoOutput);
     65
    6466    QRect windowRect = static_cast<DsaVideoOutput *>(m_videoOutput)->videoWindowScreenRect();
    6567
     
    125127    // CVideoPlayerUtility::NewL starts DSA
    126128    m_dsaActive = true;
    127 
    128     m_player->RegisterForVideoLoadingNotification(*this);
    129129}
    130130
    131131void MMF::DsaVideoPlayer::initVideoOutput()
    132132{
     133    Q_ASSERT(m_videoOutput);
     134
    133135    bool connected = connect(
    134136        m_videoOutput, SIGNAL(videoWindowScreenRectChanged()),
     
    157159void MMF::DsaVideoPlayer::prepareCompleted()
    158160{
    159     videoWindowScreenRectChanged();
     161    if (m_videoOutput)
     162        videoWindowScreenRectChanged();
    160163}
    161164
  • trunk/src/3rdparty/phonon/mmf/videoplayer_surface.cpp

    r769 r846  
    6060void MMF::SurfaceVideoPlayer::videoWindowSizeChanged()
    6161{
    62     updateScaleFactors(m_videoOutput->videoWindowSize());
     62    if (m_videoOutput)
     63        updateScaleFactors(m_videoOutput->videoWindowSize());
    6364}
    6465
     
    8182void MMF::SurfaceVideoPlayer::initVideoOutput()
    8283{
     84    Q_ASSERT(m_videoOutput);
     85
    8386    bool connected = connect(
    8487        m_videoOutput, SIGNAL(videoWindowSizeChanged()),
     
    105108void MMF::SurfaceVideoPlayer::handleParametersChanged(VideoParameters parameters)
    106109{
     110    TRACE_CONTEXT(SurfaceVideoPlayer::handleParametersChanged, EVideoApi);
     111    TRACE_ENTRY("parameters 0x%x", parameters.operator int());
     112
    107113    TRect rect;
    108114    if (m_videoOutput) {
     
    116122        int err = KErrNone;
    117123        if (parameters & WindowHandle) {
    118             if (m_displayWindow)
    119                 player->RemoveDisplayWindow(*m_displayWindow);
    120 
    121             RWindow *window = static_cast<RWindow *>(m_window);
    122             if (window) {
    123                 window->SetBackgroundColor(TRgb(0, 0, 0, 255));
    124                 TRAP(err, player->AddDisplayWindowL(m_wsSession, m_screenDevice, *window, rect, rect));
    125                 if (KErrNone != err) {
    126                     setError(tr("Video display error"), err);
    127                     window = 0;
    128                 }
    129             }
    130             m_displayWindow = window;
     124            removeDisplayWindow();
     125            addDisplayWindow(rect);
    131126        }
    132127
    133128        if (KErrNone == err) {
    134129            if (parameters & ScaleFactors) {
     130                if (!m_displayWindow)
     131                    addDisplayWindow(rect);
    135132                Q_ASSERT(m_displayWindow);
    136133                TRAP(err, player->SetVideoExtentL(*m_displayWindow, rect));
     
    144141        }
    145142    }
     143
     144    TRACE_EXIT_0();
     145}
     146
     147void MMF::SurfaceVideoPlayer::addDisplayWindow(const TRect &rect)
     148{
     149    TRACE_CONTEXT(SurfaceVideoPlayer::addDisplayWindow, EVideoApi);
     150    TRACE_ENTRY("rect %d %d - %d %d", rect.iTl.iX, rect.iTl.iY, rect.iBr.iX, rect.iBr.iY);
     151
     152    Q_ASSERT(!m_displayWindow);
     153    RWindow *window = static_cast<RWindow *>(m_window);
     154
     155    TRACE("window 0x%08x", window);
     156
     157    if (window) {
     158        window->SetBackgroundColor(TRgb(0, 0, 0, 255));
     159        CVideoPlayerUtility2 *player = static_cast<CVideoPlayerUtility2 *>(m_player.data());
     160        Q_ASSERT(player);
     161        TRAPD(err, player->AddDisplayWindowL(m_wsSession, m_screenDevice, *window, rect, rect));
     162        if (KErrNone == err)
     163            m_displayWindow = window;
     164        else
     165            setError(tr("Video display error"), err);
     166        TRACE("err %d", err);
     167    }
     168
     169    TRACE_EXIT_0();
     170}
     171
     172void MMF::SurfaceVideoPlayer::removeDisplayWindow()
     173{
     174    TRACE_CONTEXT(SurfaceVideoPlayer::removeDisplayWindow, EVideoApi);
     175    TRACE("player 0x%08x window 0x%08x", m_player.data(), m_displayWindow);
     176
     177    CVideoPlayerUtility2 *player = static_cast<CVideoPlayerUtility2 *>(m_player.data());
     178    if (player && m_displayWindow) {
     179        player->RemoveDisplayWindow(*m_displayWindow);
     180        m_displayWindow = 0;
     181    }
    146182}
    147183
  • trunk/src/3rdparty/phonon/mmf/videoplayer_surface.h

    r769 r846  
    6363    void handleParametersChanged(VideoParameters parameters);
    6464
     65    void addDisplayWindow(const TRect &rect);
     66    void removeDisplayWindow();
     67
    6568private:
    6669    // Window handle which has been passed to the MMF via
  • trunk/src/3rdparty/phonon/mmf/videowidget.cpp

    r769 r846  
    6565    TRACE_CONTEXT(VideoWidget::VideoWidget, EVideoApi);
    6666    TRACE_ENTRY_0();
     67
     68    parent->setProperty("_q_DummyWindowSurface", true);
    6769
    6870    TRACE_EXIT_0();
Note: See TracChangeset for help on using the changeset viewer.