Index: phonon/xine/xinestream.h =================================================================== --- phonon/xine/xinestream.h (revision 924144) +++ phonon/xine/xinestream.h (revision 924145) @@ -86,7 +86,6 @@ //void needRewire(AudioPostList *postList); void useGaplessPlayback(bool); void useGapOf(int gap); - void gaplessSwitchTo(const QUrl &url); void gaplessSwitchTo(const QByteArray &mrl); void closeBlocking(); void aboutToDeleteVideoWidget(); @@ -141,7 +140,6 @@ void unload(); public slots: - void setUrl(const QUrl &url); void setMrl(const QByteArray &mrl, StateForNewMrl = StoppedState); void play(); void pause(); Index: phonon/xine/mediaobject.cpp =================================================================== --- phonon/xine/mediaobject.cpp (revision 924144) +++ phonon/xine/mediaobject.cpp (revision 924145) @@ -317,6 +317,20 @@ setSourceInternal(source, HardSwitch); } +static QByteArray mrlEncode(QByteArray mrl) +{ + for (int i = 0; i < mrl.size(); ++i) { + const unsigned char c = static_cast(mrl.at(i)); + if (c & 0x80 || c == '\\' || c < 32 || c == '%') { + char enc[4]; + qsnprintf(enc, 4, "%%%02X", c); + mrl = mrl.left(i) + QByteArray(enc, 3) + mrl.mid(i + 1); + i += 2; + } + } + return mrl; +} + void MediaObject::setSourceInternal(const MediaSource &source, HowToSetTheUrl how) { //debug() << Q_FUNC_INFO; @@ -340,13 +354,18 @@ m_stream->setError(Phonon::NormalError, tr("Cannot open media data at '%1'").arg(source.url().toString(QUrl::RemovePassword))); return; } - switch (how) { - case GaplessSwitch: - m_stream->gaplessSwitchTo(source.url()); - break; - case HardSwitch: - m_stream->setUrl(source.url()); - break; + { + const QByteArray &mrl = (source.url().scheme() == QLatin1String("file") ? + "file:/" + mrlEncode(QFile::encodeName(source.url().toLocalFile())) : + source.url().toEncoded()); + switch (how) { + case GaplessSwitch: + m_stream->gaplessSwitchTo(mrl); + break; + case HardSwitch: + m_stream->setMrl(mrl); + break; + } } break; case MediaSource::Disc: Index: phonon/xine/xinestream.cpp =================================================================== --- phonon/xine/xinestream.cpp (revision 924144) +++ phonon/xine/xinestream.cpp (revision 924145) @@ -619,12 +619,6 @@ } // called from main thread -void XineStream::gaplessSwitchTo(const QUrl &url) -{ - gaplessSwitchTo(url.toEncoded()); -} - -// called from main thread void XineStream::gaplessSwitchTo(const QByteArray &mrl) { QCoreApplication::postEvent(this, new GaplessSwitchEvent(mrl)); @@ -1707,12 +1701,6 @@ } // called from main thread -void XineStream::setUrl(const QUrl &url) -{ - setMrl(url.toEncoded()); -} - -// called from main thread void XineStream::setMrl(const QByteArray &mrl, StateForNewMrl sfnm) { debug() << Q_FUNC_INFO << mrl << ", " << sfnm;