diff options
Diffstat (limited to 'src/multimedia/playback')
-rw-r--r-- | src/multimedia/playback/qmedianetworkplaylistprovider.cpp | 3 | ||||
-rw-r--r-- | src/multimedia/playback/qmediaplayer.cpp | 102 | ||||
-rw-r--r-- | src/multimedia/playback/qmediaplayer.h | 11 | ||||
-rw-r--r-- | src/multimedia/playback/qmediaplaylist.h | 10 | ||||
-rw-r--r-- | src/multimedia/playback/qmediaplaylistnavigator.cpp | 5 | ||||
-rw-r--r-- | src/multimedia/playback/qplaylistfileparser.cpp | 2 |
6 files changed, 119 insertions, 14 deletions
diff --git a/src/multimedia/playback/qmedianetworkplaylistprovider.cpp b/src/multimedia/playback/qmedianetworkplaylistprovider.cpp index a4ad97251..3f24d0f55 100644 --- a/src/multimedia/playback/qmedianetworkplaylistprovider.cpp +++ b/src/multimedia/playback/qmedianetworkplaylistprovider.cpp @@ -42,6 +42,7 @@ #include "qmediacontent.h" #include "qmediaobject_p.h" #include "qplaylistfileparser_p.h" +#include "qrandom.h" QT_BEGIN_NAMESPACE @@ -266,7 +267,7 @@ void QMediaNetworkPlaylistProvider::shuffle() QList<QMediaContent> resources; while (!d->resources.isEmpty()) { - resources.append(d->resources.takeAt(qrand() % d->resources.size())); + resources.append(d->resources.takeAt(QRandomGenerator::global()->bounded(d->resources.size()))); } d->resources = resources; diff --git a/src/multimedia/playback/qmediaplayer.cpp b/src/multimedia/playback/qmediaplayer.cpp index 16fdec8ea..01c91babc 100644 --- a/src/multimedia/playback/qmediaplayer.cpp +++ b/src/multimedia/playback/qmediaplayer.cpp @@ -49,6 +49,7 @@ #include <qmediaplaylistsourcecontrol_p.h> #include <qmedianetworkaccesscontrol.h> #include <qaudiorolecontrol.h> +#include <qcustomaudiorolecontrol.h> #include <QtCore/qcoreevent.h> #include <QtCore/qmetaobject.h> @@ -111,6 +112,7 @@ public: : provider(0) , control(0) , audioRoleControl(0) + , customAudioRoleControl(0) , playlist(0) , networkAccessControl(0) , state(QMediaPlayer::StoppedState) @@ -124,6 +126,7 @@ public: QMediaServiceProvider *provider; QMediaPlayerControl* control; QAudioRoleControl *audioRoleControl; + QCustomAudioRoleControl *customAudioRoleControl; QString errorString; QPointer<QObject> videoOutput; @@ -616,6 +619,15 @@ QMediaPlayer::QMediaPlayer(QObject *parent, QMediaPlayer::Flags flags): if (d->audioRoleControl) { connect(d->audioRoleControl, &QAudioRoleControl::audioRoleChanged, this, &QMediaPlayer::audioRoleChanged); + + d->customAudioRoleControl = qobject_cast<QCustomAudioRoleControl *>( + d->service->requestControl(QCustomAudioRoleControl_iid)); + if (d->customAudioRoleControl) { + connect(d->customAudioRoleControl, + &QCustomAudioRoleControl::customAudioRoleChanged, + this, + &QMediaPlayer::customAudioRoleChanged); + } } } if (d->networkAccessControl != 0) { @@ -641,6 +653,8 @@ QMediaPlayer::~QMediaPlayer() d->service->releaseControl(d->control); if (d->audioRoleControl) d->service->releaseControl(d->audioRoleControl); + if (d->customAudioRoleControl) + d->service->releaseControl(d->customAudioRoleControl); d->provider->releaseService(d->service); } @@ -718,7 +732,17 @@ void QMediaPlayer::setNetworkConfigurations(const QList<QNetworkConfiguration> & QMediaPlayer::State QMediaPlayer::state() const { - return d_func()->state; + Q_D(const QMediaPlayer); + + // In case if EndOfMedia status is already received + // but state is not. + if (d->control != 0 + && d->status == QMediaPlayer::EndOfMedia + && d->state != d->control->state()) { + return d->control->state(); + } + + return d->state; } QMediaPlayer::MediaStatus QMediaPlayer::mediaStatus() const @@ -1150,8 +1174,13 @@ void QMediaPlayer::setAudioRole(QAudio::Role audioRole) { Q_D(QMediaPlayer); - if (d->audioRoleControl) + if (d->audioRoleControl) { + if (d->customAudioRoleControl != nullptr && d->audioRoleControl->audioRole() != audioRole) { + d->customAudioRoleControl->setCustomAudioRole(QString()); + } + d->audioRoleControl->setAudioRole(audioRole); + } } /*! @@ -1172,6 +1201,48 @@ QList<QAudio::Role> QMediaPlayer::supportedAudioRoles() const return QList<QAudio::Role>(); } +QString QMediaPlayer::customAudioRole() const +{ + Q_D(const QMediaPlayer); + + if (audioRole() != QAudio::CustomRole) + return QString(); + + if (d->customAudioRoleControl != nullptr) + return d->customAudioRoleControl->customAudioRole(); + + return QString(); +} + +void QMediaPlayer::setCustomAudioRole(const QString &audioRole) +{ + Q_D(QMediaPlayer); + + if (d->customAudioRoleControl) { + Q_ASSERT(d->audioRoleControl); + setAudioRole(QAudio::CustomRole); + d->customAudioRoleControl->setCustomAudioRole(audioRole); + } +} + +/*! + Returns a list of supported custom audio roles. An empty list may + indicate that the supported custom audio roles aren't known. The + list may not be complete. + + \since 5.11 + \sa customAudioRole +*/ +QStringList QMediaPlayer::supportedCustomAudioRoles() const +{ + Q_D(const QMediaPlayer); + + if (d->customAudioRoleControl) + return d->customAudioRoleControl->supportedCustomAudioRoles(); + + return QStringList(); +} + // Enums /*! \enum QMediaPlayer::State @@ -1279,6 +1350,14 @@ QList<QAudio::Role> QMediaPlayer::supportedAudioRoles() const \since 5.6 */ +/*! + \fn void QMediaPlayer::customAudioRoleChanged(const QString &role) + + Signals that the audio \a role of the media player has changed. + + \since 5.11 +*/ + // Properties /*! \property QMediaPlayer::state @@ -1461,11 +1540,30 @@ QList<QAudio::Role> QMediaPlayer::supportedAudioRoles() const The audio role must be set before calling setMedia(). + customAudioRole is cleared when this property is set to anything other than + QAudio::CustomRole. + \since 5.6 \sa supportedAudioRoles() */ /*! + \property QMediaPlayer::customAudioRole + \brief the role of the audio stream played by the media player. + + It can be set to specify the type of audio being played when the backend supports + audio roles unknown to Qt. Specifying a role allows the system to make appropriate + decisions when it comes to volume, routing or post-processing. + + The audio role must be set before calling setMedia(). + + audioRole is set to QAudio::CustomRole when this property is set. + + \since 5.11 + \sa supportedCustomAudioRoles() +*/ + +/*! \fn void QMediaPlayer::durationChanged(qint64 duration) Signal the duration of the content has changed to \a duration, expressed in milliseconds. diff --git a/src/multimedia/playback/qmediaplayer.h b/src/multimedia/playback/qmediaplayer.h index f23a94104..e69a32ee4 100644 --- a/src/multimedia/playback/qmediaplayer.h +++ b/src/multimedia/playback/qmediaplayer.h @@ -73,7 +73,8 @@ class Q_MULTIMEDIA_EXPORT QMediaPlayer : public QMediaObject Q_PROPERTY(qreal playbackRate READ playbackRate WRITE setPlaybackRate NOTIFY playbackRateChanged) Q_PROPERTY(State state READ state NOTIFY stateChanged) Q_PROPERTY(MediaStatus mediaStatus READ mediaStatus NOTIFY mediaStatusChanged) - Q_PROPERTY(QAudio::Role audioRole READ audioRole WRITE setAudioRole) + Q_PROPERTY(QAudio::Role audioRole READ audioRole WRITE setAudioRole NOTIFY audioRoleChanged) + Q_PROPERTY(QString customAudioRole READ customAudioRole WRITE setCustomAudioRole NOTIFY customAudioRoleChanged) Q_PROPERTY(QString error READ errorString) Q_ENUMS(State) Q_ENUMS(MediaStatus) @@ -119,7 +120,7 @@ public: MediaIsPlaylist }; - explicit QMediaPlayer(QObject *parent = Q_NULLPTR, Flags flags = Flags()); + explicit QMediaPlayer(QObject *parent = nullptr, Flags flags = Flags()); ~QMediaPlayer(); static QMultimedia::SupportEstimate hasSupport(const QString &mimeType, @@ -162,6 +163,9 @@ public: QAudio::Role audioRole() const; void setAudioRole(QAudio::Role audioRole); QList<QAudio::Role> supportedAudioRoles() const; + QString customAudioRole() const; + void setCustomAudioRole(const QString &audioRole); + QStringList supportedCustomAudioRoles() const; public Q_SLOTS: void play(); @@ -174,7 +178,7 @@ public Q_SLOTS: void setPlaybackRate(qreal rate); - void setMedia(const QMediaContent &media, QIODevice *stream = Q_NULLPTR); + void setMedia(const QMediaContent &media, QIODevice *stream = nullptr); void setPlaylist(QMediaPlaylist *playlist); void setNetworkConfigurations(const QList<QNetworkConfiguration> &configurations); @@ -200,6 +204,7 @@ Q_SIGNALS: void playbackRateChanged(qreal rate); void audioRoleChanged(QAudio::Role role); + void customAudioRoleChanged(const QString &role); void error(QMediaPlayer::Error error); diff --git a/src/multimedia/playback/qmediaplaylist.h b/src/multimedia/playback/qmediaplaylist.h index b16e734f8..4eb93bd02 100644 --- a/src/multimedia/playback/qmediaplaylist.h +++ b/src/multimedia/playback/qmediaplaylist.h @@ -67,7 +67,7 @@ public: enum PlaybackMode { CurrentItemOnce, CurrentItemInLoop, Sequential, Loop, Random }; enum Error { NoError, FormatError, FormatNotSupportedError, NetworkError, AccessDeniedError }; - explicit QMediaPlaylist(QObject *parent = Q_NULLPTR); + explicit QMediaPlaylist(QObject *parent = nullptr); virtual ~QMediaPlaylist(); QMediaObject *mediaObject() const override; @@ -96,11 +96,11 @@ public: bool removeMedia(int start, int end); bool clear(); - void load(const QNetworkRequest &request, const char *format = Q_NULLPTR); - void load(const QUrl &location, const char *format = Q_NULLPTR); - void load(QIODevice *device, const char *format = Q_NULLPTR); + void load(const QNetworkRequest &request, const char *format = nullptr); + void load(const QUrl &location, const char *format = nullptr); + void load(QIODevice *device, const char *format = nullptr); - bool save(const QUrl &location, const char *format = Q_NULLPTR); + bool save(const QUrl &location, const char *format = nullptr); bool save(QIODevice * device, const char *format); Error error() const; diff --git a/src/multimedia/playback/qmediaplaylistnavigator.cpp b/src/multimedia/playback/qmediaplaylistnavigator.cpp index 192fd463c..0966c9396 100644 --- a/src/multimedia/playback/qmediaplaylistnavigator.cpp +++ b/src/multimedia/playback/qmediaplaylistnavigator.cpp @@ -43,6 +43,7 @@ #include "qmediaobject_p.h" #include <QtCore/qdebug.h> +#include <QtCore/qrandom.h> QT_BEGIN_NAMESPACE @@ -124,7 +125,7 @@ int QMediaPlaylistNavigatorPrivate::nextItemPos(int steps) const randomModePositions.append(-1); int res = randomModePositions[randomPositionsOffset+steps]; if (res<0 || res >= playlist->mediaCount()) { - res = qrand() % playlist->mediaCount(); + res = QRandomGenerator::global()->bounded(playlist->mediaCount()); randomModePositions[randomPositionsOffset+steps] = res; } @@ -177,7 +178,7 @@ int QMediaPlaylistNavigatorPrivate::previousItemPos(int steps) const int res = randomModePositions[randomPositionsOffset-steps]; if (res<0 || res >= playlist->mediaCount()) { - res = qrand() % playlist->mediaCount(); + res = QRandomGenerator::global()->bounded(playlist->mediaCount()); randomModePositions[randomPositionsOffset-steps] = res; } diff --git a/src/multimedia/playback/qplaylistfileparser.cpp b/src/multimedia/playback/qplaylistfileparser.cpp index 47a3d239e..0d33f040d 100644 --- a/src/multimedia/playback/qplaylistfileparser.cpp +++ b/src/multimedia/playback/qplaylistfileparser.cpp @@ -551,7 +551,7 @@ void QPlaylistFileParser::start(const QNetworkRequest& request, const QString &m if (!d->m_currentParser.isNull()) { abort(); - d->m_pendingJob = { Q_NULLPTR, QMediaResource(request, mimeType) }; + d->m_pendingJob = { nullptr, QMediaResource(request, mimeType) }; return; } |