106 if (toState != state) {
107 const auto fromState = std::exchange(state, toState);
108 if (toState == QMediaPlayer::PlayingState || fromState == QMediaPlayer::PlayingState)
109 emit q->playingChanged(toState == QMediaPlayer::PlayingState);
110 emit q->playbackStateChanged(toState);
130 setError(QMediaPlayer::NoError, {});
135 media = m_sourceResolver->resolve(media);
137 std::unique_ptr<QFile> file;
142 if (!media.isEmpty() && !stream && media.scheme() == QLatin1String(
"qrc")
146 control->mediaStatusChanged(QMediaPlayer::LoadingMedia);
148 file.reset(
new QFile(QLatin1Char(
':') + media.path()));
149 if (!file->open(QFile::ReadOnly)) {
151 control->setInvalidMediaWithError(
152 QMediaPlayer::ResourceError,
153 QObject::tr(
"Attempting to play invalid Qt resource"));
155 }
else if (
control->streamPlaybackSupported()) {
156 control->setMedia(media, file.get());
158#if QT_CONFIG(temporaryfile)
159#if defined(Q_OS_ANDROID)
160 QString tempFileName = QDir::tempPath() + media.path();
161 QDir().mkpath(QFileInfo(tempFileName).path());
162 std::unique_ptr<QTemporaryFile> tempFile { QTemporaryFile::createNativeFile(*file) };
163 if (tempFile.get() ==
nullptr) {
164 control->setInvalidMediaWithError(
165 QMediaPlayer::ResourceError,
166 QObject::tr(
"Failed to establish temporary file during playback"));
169 if (!tempFile->rename(tempFileName)) {
170 control->setInvalidMediaWithError(
171 QMediaPlayer::ResourceError,
172 QStringLiteral(
"Could not rename temporary file to: %1").arg(tempFileName));
176 std::unique_ptr<QTemporaryFile> tempFile = std::make_unique<QTemporaryFile>();
180 const QString suffix = QFileInfo(*file).suffix();
181 if (!suffix.isEmpty())
182 tempFile->setFileTemplate(tempFile->fileTemplate() + QLatin1Char(
'.') + suffix);
185 if (!tempFile->open()) {
186 control->setInvalidMediaWithError(QMediaPlayer::ResourceError,
187 tempFile->errorString());
193 qint64 len = file->read(buffer,
sizeof(buffer));
196 tempFile->write(buffer, len);
200 file = std::move(tempFile);
201 control->setMedia(QUrl(QUrl::fromLocalFile(file->fileName())),
nullptr);
203 qWarning(
"Qt was built with -no-feature-temporaryfile: playback from resource file is not supported!");
208 QUrl url = qMediaFromUserInput(media);
209 if (url.scheme() == QLatin1String(
"content") && !stream) {
210 file.reset(
new QFile(media.url()));
214 control->setMedia(url, stream);
236QMediaPlayer::QMediaPlayer(QObject *parent)
237 : QObject(*
new QMediaPlayerPrivate, parent)
241 auto maybeControl = QPlatformMediaIntegration::instance()->createPlayer(
this);
243 d->control = maybeControl.value();
244 d->state = d->control->state();
246 qWarning() <<
"Failed to initialize QMediaPlayer" << maybeControl.error();
247 d->setError(QMediaPlayer::ResourceError, maybeControl.error());
652void QMediaPlayer::setSourceDevice(QIODevice *device,
const QUrl &sourceUrl)
657 if (d->source == sourceUrl && d->stream == device)
660 d->source = sourceUrl;
663 d->setMedia(d->source, device);
664 emit sourceChanged(d->source);
717void QMediaPlayer::setAudioBufferOutput(QAudioBufferOutput *output)
721 QAudioBufferOutput *oldOutput = d->audioBufferOutput;
722 if (oldOutput == output)
725 d->audioBufferOutput = output;
728 auto oldPlayer = QAudioBufferOutputPrivate::exchangeMediaPlayer(*oldOutput,
this);
730 oldPlayer->setAudioBufferOutput(
nullptr);
734 d->control->setAudioBufferOutput(output);
736 emit audioBufferOutputChanged();
764void QMediaPlayer::setAudioOutput(QAudioOutput *output)
767 auto oldOutput = d->audioOutput;
768 if (oldOutput == output)
770 d->audioOutput = output;
772 d->control->setAudioOutput(
nullptr);
774 oldOutput->setDisconnectFunction({});
776 output->setDisconnectFunction([
this](){ setAudioOutput(
nullptr); });
778 d->control->setAudioOutput(output->handle());
780 emit audioOutputChanged();
999void QMediaPlayer::setVideoOutput(QObject *output)
1002 if (d->videoOutput == output)
1005 auto *sink = qobject_cast<QVideoSink *>(output);
1006 if (!sink && output) {
1007 auto *mo = output->metaObject();
1008 mo->invokeMethod(output,
"videoSink", Q_RETURN_ARG(QVideoSink *, sink));
1010 d->videoOutput = output;
1011 d->setVideoSink(sink);
1213void QMediaPlayer::setPlaybackOptions(
const QPlaybackOptions &options)
1216 if (std::exchange(d->playbackOptions, options) != options)
1217 emit playbackOptionsChanged();
1220void QMediaPlayer::resetPlaybackOptions()
1223 QPlaybackOptions defaultOptions{ };
1224 if (std::exchange(d->playbackOptions, defaultOptions) != defaultOptions)
1225 emit playbackOptionsChanged();