131 setError(QMediaPlayer::NoError, {});
136 media = m_sourceResolver->resolve(media);
138 std::unique_ptr<QFile> file;
143 if (!media.isEmpty() && !stream && media.scheme() == QLatin1String(
"qrc")
147 control->mediaStatusChanged(QMediaPlayer::LoadingMedia);
149 file.reset(
new QFile(QLatin1Char(
':') + media.path()));
150 if (!file->open(QFile::ReadOnly)) {
152 control->setInvalidMediaWithError(
153 QMediaPlayer::ResourceError,
154 QMediaPlayer::tr(
"Attempting to play invalid Qt resource"));
156 }
else if (
control->streamPlaybackSupported()) {
157 control->setMedia(media, file.get());
159#if QT_CONFIG(temporaryfile)
160#if defined(Q_OS_ANDROID)
161 std::unique_ptr<QTemporaryFile> tempFile { QTemporaryFile::createNativeFile(*file) };
163 control->setInvalidMediaWithError(
164 QMediaPlayer::ResourceError,
165 QMediaPlayer::tr(
"Failed to establish temporary file during playback"));
170 const QFileInfo mediaInfo(media.path());
171 const QString targetDirPath = QDir::tempPath() + mediaInfo.path();
172 if (!QDir().mkpath(targetDirPath)) {
173 control->setInvalidMediaWithError(
174 QMediaPlayer::ResourceError,
175 QStringLiteral(
"Could not create a temporary directory: %1")
176 .arg(targetDirPath));
181 const QString baseName = mediaInfo.completeBaseName() + QLatin1Char(
'_')
182 + QString::number(QRandomGenerator::global()->generate(), 16);
185 const QString suffix = mediaInfo.suffix();
187 const QString newName = targetDirPath + QLatin1Char(
'/') + baseName
188 + (suffix.isEmpty() ? QString() : QLatin1Char(
'.') + suffix);
190 if (!tempFile->rename(newName)) {
191 control->setInvalidMediaWithError(
192 QMediaPlayer::ResourceError,
193 QStringLiteral(
"Could not rename temporary file to: %1").arg(newName));
197 std::unique_ptr<QTemporaryFile> tempFile = std::make_unique<QTemporaryFile>();
201 const QString suffix = QFileInfo(*file).suffix();
202 if (!suffix.isEmpty())
203 tempFile->setFileTemplate(tempFile->fileTemplate() + QLatin1Char(
'.') + suffix);
206 if (!tempFile->open()) {
207 control->setInvalidMediaWithError(QMediaPlayer::ResourceError,
208 tempFile->errorString());
214 qint64 len = file->read(buffer,
sizeof(buffer));
217 tempFile->write(buffer, len);
221 file = std::move(tempFile);
222 control->setMedia(QUrl(QUrl::fromLocalFile(file->fileName())),
nullptr);
224 qWarning(
"Qt was built with -no-feature-temporaryfile: playback from resource file is not supported!");
229 QUrl url = qMediaFromUserInput(media);
230 if (url.scheme() == QLatin1String(
"content") && !stream) {
231 file.reset(
new QFile(media.url()));
235 control->setMedia(url, stream);
257QMediaPlayer::QMediaPlayer(QObject *parent)
258 : QObject(*
new QMediaPlayerPrivate, parent)
262 auto maybeControl = QPlatformMediaIntegration::instance()->createPlayer(
this);
264 d->control = maybeControl.value();
265 d->state = d->control->state();
267 qWarning() <<
"Failed to initialize QMediaPlayer" << maybeControl.error();
268 d->setError(QMediaPlayer::ResourceError, maybeControl.error());
738void QMediaPlayer::setAudioBufferOutput(QAudioBufferOutput *output)
742 QAudioBufferOutput *oldOutput = d->audioBufferOutput;
743 if (oldOutput == output)
746 d->audioBufferOutput = output;
749 auto oldPlayer = QAudioBufferOutputPrivate::exchangeMediaPlayer(*oldOutput,
this);
751 oldPlayer->setAudioBufferOutput(
nullptr);
755 d->control->setAudioBufferOutput(output);
757 emit audioBufferOutputChanged();
785void QMediaPlayer::setAudioOutput(QAudioOutput *output)
788 auto oldOutput = d->audioOutput;
789 if (oldOutput == output)
791 d->audioOutput = output;
793 d->control->setAudioOutput(
nullptr);
795 oldOutput->setDisconnectFunction({});
797 output->setDisconnectFunction([
this](){ setAudioOutput(
nullptr); });
799 d->control->setAudioOutput(output->handle());
801 emit audioOutputChanged();
1037void QMediaPlayer::setVideoOutput(QObject *output)
1040 if (d->videoOutput == output)
1043 auto *sink = qobject_cast<QVideoSink *>(output);
1044 if (!sink && output) {
1045 auto *mo = output->metaObject();
1046 mo->invokeMethod(output,
"videoSink", Q_RETURN_ARG(QVideoSink *, sink));
1048 d->videoOutput = output;
1049 d->setVideoSink(sink);