97 if (toState != state) {
98 const auto fromState = std::exchange(state, toState);
99 if (toState == QMediaPlayer::PlayingState || fromState == QMediaPlayer::PlayingState)
100 emit q->playingChanged(toState == QMediaPlayer::PlayingState);
101 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());
605void QMediaPlayer::setSourceDevice(QIODevice *device,
const QUrl &sourceUrl)
610 if (d->source == sourceUrl && d->stream == device)
613 d->source = sourceUrl;
616 d->setMedia(d->source, device);
617 emit sourceChanged(d->source);
670void QMediaPlayer::setAudioBufferOutput(QAudioBufferOutput *output)
674 QAudioBufferOutput *oldOutput = d->audioBufferOutput;
675 if (oldOutput == output)
678 d->audioBufferOutput = output;
681 auto oldPlayer = QAudioBufferOutputPrivate::exchangeMediaPlayer(*oldOutput,
this);
683 oldPlayer->setAudioBufferOutput(
nullptr);
687 d->control->setAudioBufferOutput(output);
689 emit audioBufferOutputChanged();
717void QMediaPlayer::setAudioOutput(QAudioOutput *output)
720 auto oldOutput = d->audioOutput;
721 if (oldOutput == output)
723 d->audioOutput = output;
725 d->control->setAudioOutput(
nullptr);
727 oldOutput->setDisconnectFunction({});
729 output->setDisconnectFunction([
this](){ setAudioOutput(
nullptr); });
731 d->control->setAudioOutput(output->handle());
733 emit audioOutputChanged();
969void QMediaPlayer::setVideoOutput(QObject *output)
972 if (d->videoOutput == output)
975 auto *sink = qobject_cast<QVideoSink *>(output);
976 if (!sink && output) {
977 auto *mo = output->metaObject();
978 mo->invokeMethod(output,
"videoSink", Q_RETURN_ARG(QVideoSink *, sink));
980 d->videoOutput = output;
981 d->setVideoSink(sink);
1183void QMediaPlayer::setPlaybackOptions(
const QPlaybackOptions &options)
1186 if (std::exchange(d->playbackOptions, options) != options)
1187 emit playbackOptionsChanged();
1190void QMediaPlayer::resetPlaybackOptions()
1193 QPlaybackOptions defaultOptions{ };
1194 if (std::exchange(d->playbackOptions, defaultOptions) != defaultOptions)
1195 emit playbackOptionsChanged();