97 if (toState != state) {
98 const auto fromState = std::exchange(state, toState);
99 if (toState == QMediaPlayer::PlayingState || fromState == QMediaPlayer::PlayingState)
100 Q_EMIT q->playingChanged(toState == QMediaPlayer::PlayingState);
101 Q_EMIT q->playbackStateChanged(toState);
121 using namespace QtMultimediaPrivate;
123 setError(QMediaPlayer::NoError, {});
128 media = m_sourceResolver->resolve(media);
130 std::unique_ptr<QFile> file;
135 if (!media.isEmpty() && !stream && media.scheme() == u"qrc" && !
control->canPlayQrc()) {
138 control->mediaStatusChanged(QMediaPlayer::LoadingMedia);
140 file.reset(
new QFile(QLatin1Char(
':') + media.path()));
141 if (!file->open(QFile::ReadOnly)) {
143 control->setInvalidMediaWithError(
144 QMediaPlayer::ResourceError,
145 QMediaPlayer::tr(
"Attempting to play invalid Qt resource"));
147 }
else if (
control->streamPlaybackSupported()) {
148 control->setMedia(media, file.get());
150 auto extractedQrcMedia = qCopyQrcToTemporaryFile(*file, media);
151 if (!extractedQrcMedia) {
152 control->setInvalidMediaWithError(QMediaPlayer::ResourceError,
153 extractedQrcMedia.error());
156 file =
std::move(extractedQrcMedia->file);
157 control->setMedia(extractedQrcMedia->url,
nullptr);
161 QUrl url = qMediaFromUserInput(media);
162 if (url.scheme() == u"content" && !stream) {
163 file.reset(
new QFile(media.url()));
167 control->setMedia(url, stream);
189QMediaPlayer::QMediaPlayer(QObject *parent)
190 : QObject(*
new QMediaPlayerPrivate, parent)
194 auto maybeControl = QPlatformMediaIntegration::instance()->createPlayer(
this);
196 d->control = maybeControl.value();
197 d->state = d->control->state();
199 qWarning() <<
"Failed to initialize QMediaPlayer" << maybeControl.error();
200 d->setError(QMediaPlayer::ResourceError, maybeControl.error());
598void QMediaPlayer::setSourceDevice(QIODevice *device,
const QUrl &sourceUrl)
602 if (d->source == sourceUrl && d->stream == device)
606 d->source = sourceUrl;
609 d->setMedia(d->source, device);
610 Q_EMIT sourceChanged(d->source);
663void QMediaPlayer::setAudioBufferOutput(QAudioBufferOutput *output)
667 QAudioBufferOutput *oldOutput = d->audioBufferOutput;
668 if (oldOutput == output)
671 d->audioBufferOutput = output;
674 auto oldPlayer = QAudioBufferOutputPrivate::exchangeMediaPlayer(*oldOutput,
this);
676 oldPlayer->setAudioBufferOutput(
nullptr);
680 d->control->setAudioBufferOutput(output);
682 Q_EMIT audioBufferOutputChanged();
710void QMediaPlayer::setAudioOutput(QAudioOutput *output)
713 auto oldOutput = d->audioOutput;
714 if (oldOutput == output)
716 d->audioOutput = output;
718 d->control->setAudioOutput(
nullptr);
720 oldOutput->setDisconnectFunction({});
722 output->setDisconnectFunction([
this](){ setAudioOutput(
nullptr); });
724 d->control->setAudioOutput(output->handle());
726 Q_EMIT audioOutputChanged();
962void QMediaPlayer::setVideoOutput(QObject *output)
965 if (d->videoOutput == output)
968 auto *sink = qobject_cast<QVideoSink *>(output);
969 if (!sink && output) {
970 auto *mo = output->metaObject();
971 mo->invokeMethod(output,
"videoSink", Q_RETURN_ARG(QVideoSink *, sink));
973 d->videoOutput = output;
974 d->setVideoSink(sink);
1176void QMediaPlayer::setPlaybackOptions(
const QPlaybackOptions &options)
1179 if (std::exchange(d->playbackOptions, options) != options)
1180 Q_EMIT playbackOptionsChanged();
1183void QMediaPlayer::resetPlaybackOptions()
1186 QPlaybackOptions defaultOptions{ };
1187 if (std::exchange(d->playbackOptions, defaultOptions) != defaultOptions)
1188 Q_EMIT playbackOptionsChanged();