95 if (toState != state) {
96 const auto fromState = std::exchange(state, toState);
97 if (toState == QMediaPlayer::PlayingState || fromState == QMediaPlayer::PlayingState)
98 emit q->playingChanged(toState == QMediaPlayer::PlayingState);
99 emit q->playbackStateChanged(toState);
119 using namespace QtMultimediaPrivate;
121 setError(QMediaPlayer::NoError, {});
126 media = m_sourceResolver->resolve(media);
128 std::unique_ptr<QFile> file;
133 if (!media.isEmpty() && !stream && media.scheme() == u"qrc" && !
control->canPlayQrc()) {
136 control->mediaStatusChanged(QMediaPlayer::LoadingMedia);
138 file.reset(
new QFile(QLatin1Char(
':') + media.path()));
139 if (!file->open(QFile::ReadOnly)) {
141 control->setInvalidMediaWithError(
142 QMediaPlayer::ResourceError,
143 QMediaPlayer::tr(
"Attempting to play invalid Qt resource"));
145 }
else if (
control->streamPlaybackSupported()) {
146 control->setMedia(media, file.get());
148 auto extractedQrcMedia = qCopyQrcToTemporaryFile(*file, media);
149 if (!extractedQrcMedia) {
150 control->setInvalidMediaWithError(QMediaPlayer::ResourceError,
151 extractedQrcMedia.error());
154 file =
std::move(extractedQrcMedia->file);
155 control->setMedia(extractedQrcMedia->url,
nullptr);
159 QUrl url = qMediaFromUserInput(media);
160 if (url.scheme() == u"content" && !stream) {
161 file.reset(
new QFile(media.url()));
165 control->setMedia(url, stream);
187QMediaPlayer::QMediaPlayer(QObject *parent)
188 : QObject(*
new QMediaPlayerPrivate, parent)
192 auto maybeControl = QPlatformMediaIntegration::instance()->createPlayer(
this);
194 d->control = maybeControl.value();
195 d->state = d->control->state();
197 qWarning() <<
"Failed to initialize QMediaPlayer" << maybeControl.error();
198 d->setError(QMediaPlayer::ResourceError, maybeControl.error());
603void QMediaPlayer::setSourceDevice(QIODevice *device,
const QUrl &sourceUrl)
608 if (d->source == sourceUrl && d->stream == device)
611 d->source = sourceUrl;
614 d->setMedia(d->source, device);
615 emit sourceChanged(d->source);
668void QMediaPlayer::setAudioBufferOutput(QAudioBufferOutput *output)
672 QAudioBufferOutput *oldOutput = d->audioBufferOutput;
673 if (oldOutput == output)
676 d->audioBufferOutput = output;
679 auto oldPlayer = QAudioBufferOutputPrivate::exchangeMediaPlayer(*oldOutput,
this);
681 oldPlayer->setAudioBufferOutput(
nullptr);
685 d->control->setAudioBufferOutput(output);
687 emit audioBufferOutputChanged();
715void QMediaPlayer::setAudioOutput(QAudioOutput *output)
718 auto oldOutput = d->audioOutput;
719 if (oldOutput == output)
721 d->audioOutput = output;
723 d->control->setAudioOutput(
nullptr);
725 oldOutput->setDisconnectFunction({});
727 output->setDisconnectFunction([
this](){ setAudioOutput(
nullptr); });
729 d->control->setAudioOutput(output->handle());
731 emit audioOutputChanged();
967void QMediaPlayer::setVideoOutput(QObject *output)
970 if (d->videoOutput == output)
973 auto *sink = qobject_cast<QVideoSink *>(output);
974 if (!sink && output) {
975 auto *mo = output->metaObject();
976 mo->invokeMethod(output,
"videoSink", Q_RETURN_ARG(QVideoSink *, sink));
978 d->videoOutput = output;
979 d->setVideoSink(sink);
1181void QMediaPlayer::setPlaybackOptions(
const QPlaybackOptions &options)
1184 if (std::exchange(d->playbackOptions, options) != options)
1185 emit playbackOptionsChanged();
1188void QMediaPlayer::resetPlaybackOptions()
1191 QPlaybackOptions defaultOptions{ };
1192 if (std::exchange(d->playbackOptions, defaultOptions) != defaultOptions)
1193 emit playbackOptionsChanged();